如何使用java计算极大指数数的余数? 例如。 (48 ^ 26)/ 2401
我尝试使用BIGINTEGER,但它为大除数提供了相同的输出。我不确定BIG INTEGER是否可以做到这一点。我已经尝试了所有其他PRIMITIVE数据类型。他们似乎不够。
仅供参考,它尝试了以下代码:
BigInteger a = new BigInteger("48");
a = a.pow(26);
BigInteger b = new BigInteger("2401");//49*49
a = a.mod(b);
System.out.println(a);
我不知道为什么我每次都得到相同的输出,现在它工作得很好很奇怪。 答案是1128
答案 0 :(得分:9)
您可以使用较小数字的重复模数。
说你有
(a * b) % n
((A * n + AA) * (B * n + BB)) % n | AA = a %n & BB = b % n
(A * B * n^2 + A * N * BB + AA * B * n + AA * BB) % n
AA * BB % n since x * n % n == 0
(a % n) * (b % n) % n
在你的情况下,你可以写
48^26 % 2401
(48^2) ^ 13 % 2401
作为
int n = 48;
for (int i = 1; i < 26; i++)
n = (n * 48) % 2401;
System.out.println(n);
int n2 = 48 * 48;
for (int i = 1; i < 13; i++)
n2 = (n2 * 48 * 48) % 2401;
System.out.println(n2);
System.out.println(BigInteger.valueOf(48).pow(26).mod(BigInteger.valueOf(2401)));
打印
1128
1128
1128
正如@Ruchina指出的那样,你的例子足够小,可以用一个简单的双重表达来计算。
for (int i = 1; i < 100; i++) {
BigInteger mod = BigInteger.valueOf(48).pow(i).mod(BigInteger.valueOf(2401));
double x = Math.pow(48, i) % 2401;
if (mod.intValue() != x) {
System.out.println(i + ": " + mod + " vs " + x);
break;
}
}
打印
34: 736 vs 839.0
换句话说,任何48的幂都可以达到33。
答案 1 :(得分:3)
这对我有用。
import java.math.BigInteger;
public class BigMod{
public static void main (String[] args){
BigInteger b1 = new BigInteger ("48");
BigInteger b2 = new BigInteger ("2401");
BigInteger b3 = b1.pow(26);
BigInteger result = b3.mod(b2);
System.out.println(result);
}
}
不确定BigInteger遇到了什么麻烦。你能解释什么不起作用吗?
答案 2 :(得分:2)
使用BigInteger.modPow()。
BigInteger a = new BigInteger("48");
BigInteger b = new BigInteger("26");
BigInteger c = new BigInteger("2401");
BigInteger answer = a.modPow(b, c);
答案是1128.请注意,BigInteger是不可变的,因此无法修改对象a,b和c。
答案 3 :(得分:2)
你甚至不需要BigInteger
,你可以使用BigMod分而治之算法计算该值,利用mod
操作的以下属性
(A * B) mod n = ((A mod n) * (B mod n)) mod n
然后可以将(B ^ c) mod n
视为该属性的特例:
(B ^ c) mod n = ((B mod n) * (B mod n) ... c times) mod n
以下代码进行计算:
public class BigModExample {
public static long bigMod(long b, long c, int n) {
if (c == 0) {
return 1;
}
// Returns: (b ^ c/2) mod n
long b2 = bigMod(b, c / 2, n);
// Even exponent
if ((c & 1) == 0) {
// [((b ^ c/2) mod n) * ((b ^ c/2) mod n)] mod n
return (b2 * b2) % n;
} else {
// Odd exponent
// [(b mod n) * ((b ^ c/2) mod n) * ((b ^ c/2) mod n)] mod n
return ((b % n) * (b2 * b2)) % n;
}
}
public static void main(String... args) {
System.out.println(bigMod(48, 26, 2401));
}
}
打印
1128
答案 4 :(得分:2)
对Peter Lawrey的解决方案的进一步解释。
(a*b)%n
= ((A*n + AA) * (B*n + BB))%n where a=A*n+AA, AA=a%n & b=B*n+BB, BB=b%n
= (A*B*n^2 + A*n*BB + AA*B*n + AA*BB)%n
= (AA*BB)%n
= (a%n * b%n)%n
(a^c)%n
= (a^(c-1) * a)%n
= ((a^(c-1))%n * a%n)%n
= ((a^(c-2)*a)%n * a%n)%n
= ((a^(c-2)%n * a%n)%n * a%n)%n
示例1:当c为3时
(a^3)%n
= ((a^2)*a)%n
= ((a^2)%n * a%n)%n
= ((a*a)%n * a%n)%n
= ((a%n * a%n)%n * a%n)%n
示例2:当c为4时
(a^4)%n
= ((a^3)*a)%n
= ((a^3)%n * a%n)%n
= ((a^2 * a)%n * a%n)%n
= (((a^2)%n * a%n)%n * a%n)%n
= (((a*a)%n * a%n)%n * a%n)%n
= ((a%n * a%n)%n * a%n)%n * a%n)%n
java代码:
int a = 48;
int c = 26;
int n = 2401;
int a_mod_n = a%n;
int result = a_mod_n;
for (int i = 1; i < c; i++) {
result = (result * a_mod_n) % n;
}
System.out.println("result: " + result);
48
含糊不清,因为a
和a%n
都是48
。
上面的Java代码严格遵循等式((a^(c-2)%n * a%n)%n * a%n)%n
,以便更容易理解。
答案 5 :(得分:1)
BigDecimal b= BigDecimal.valueOf(Math.pow(48,26) %2401);
output b = 1128.0
答案 6 :(得分:0)
尝试使用BigDecimal表示大十进制数。由于存储数据的方式,它不容易出现double
和float
之类的错误。此外,它有(可能)无限量的小数位。