如何使用java计算超大指数数的余数?

如何使用java计算超大指数数的余数?,java,biginteger,largenumber,Java,Biginteger,Largenumber,如何使用java计算超大指数数的余数? 例如(48^26)/2401 我尝试使用BIGINTEGER,但是它对大除数给出了相同的输出。我不确定BIG INTEGER是否可以做到这一点。我尝试了所有其他基本数据类型。它们似乎不够 仅供参考,它尝试了以下代码: BigInteger a = new BigInteger("48"); a = a.pow(26); BigInteger b = new BigInteger("2401");//49*49 a = a.mod(b); System.ou

如何使用java计算超大指数数的余数? 例如(48^26)/2401

我尝试使用BIGINTEGER,但是它对大除数给出了相同的输出。我不确定BIG INTEGER是否可以做到这一点。我尝试了所有其他基本数据类型。它们似乎不够

仅供参考,它尝试了以下代码:

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

试着用a表示大的十进制数。由于其数据的存储方式,它不容易出现诸如
double
float
之类的错误。此外,它(可能)有无限多的小数位数。

您可以使用较小数字的重复模数

 BigDecimal b= BigDecimal.valueOf(Math.pow(48,26) %2401);

output b = 1128.0
说你有

(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
作为

正如@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;
    }
}
换句话说,任何48的幂都可以达到33。

这对我很有用

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时遇到了什么麻烦。你能解释一下什么不起作用吗?

使用biginger.modPow()


答案是1128。请注意,BigInteger是不可变的,因此对象a、b和c不能修改。

您甚至不需要一个
BigInteger
为此,您可以利用
mod
操作的以下属性,使用BigMod分治算法计算该值

(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

进一步解释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);
inta=48;
int c=26;
int n=2401;
int a_mod n=a%n;
int result=a_mod n;
for(int i=1;i
48
不明确,因为
a
a%n
都是
48

上面的Java代码严格遵循方程式
((a^(c-2)%n*a%n)%n*a%n)%n
,这样更容易理解。

你用
biginger
做了什么尝试?结果是1254,用bg整数计算,效果很好。你说的是Big Mod吗?有一种分而治之的方法来实现BiInteger必须起作用。你能提供你使用的代码吗?你说它给出了不正确的结果:“大除数的输出相同”?你还记得BigInteger是不可变的,对吧?我建议你运行这个,看看你得到了什么。我已经运行了,得到的答案是1128.0。@PeterLawrey你的方法在这里给出了相同的答案+1你可能对这个例子有很好的看法。我已经更新了我的答案,以表明最高33倍的功率可以工作。@Ruchira是的,但Pater Lawrey的例子是正确的,请将48^26与所涉及的数字进行比较。您非常幸运地得到了正确的结果,并且根本不使用BigDecimal。@在除法方面,Newidiot BigInteger与BigDecimal有很大的不同。您的速度更快,代码也更优雅。我不会重复你所说的。这并不是因为它很小,它的作用是双倍的,它完全有可能失去精度(改为尝试模2400或2402)。谢谢你的解决方案。@blue潜伏者你可以通过点击左边的勾号来接受答案。
(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
(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
(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
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);