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

标签 java biginteger largenumber

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

我尝试使用 BIGINTEGER,但是它为大除数提供了相同的输出。我不确定 BIGINTEGER 是否可以做到这一点。我已经尝试了所有其他 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

最佳答案

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

说你有

(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 指出的,您的示例足够小,可以使用简单的 double 表达式进行计算。

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。

关于java - 如何使用java计算极大指数数的余数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17616483/

相关文章:

java - 线程 "main"java.lang.NumberFormatException : Radix out of range 中的异常

Android SQLiteDatabase - 存储和比较大数

python - 为什么 python 不能在所有领域处理非常大的数字?

java - Java中1.5亿位数字的平方

C++ BigInteger 类似于 Chew Keong TAN 的 C# 版本

java - Java中的文件操作

java - 无法通过 Selenium Webdriver 中的 Java 中的任何命令找到按钮

algorithm - 算法的运行时间?

java - DataInputStream 给出 java.io.EOFException

java - 在 Julia 套装中制作不同颜色的色调。