我有两个简单的Java代码。第一个将恒定功率定义为power = a.pow(b);
import java.math.BigInteger; public class FermatOne { public static void main(String[] args) { BigInteger a = new BigInteger ("2"); BigInteger k = new BigInteger ("15"); BigInteger c = new BigInteger ("1"); int b = 332192810; BigInteger n = new BigInteger ("2"); BigInteger power; power = a.pow(b); BigInteger exponent; exponent = k.multiply(power); BigInteger mod; mod = exponent.add(c); BigInteger result = n.modPow(exponent,mod); System.out.println("Result is ==> " + result); } }
第二个将恒定功率定义为power = BigInteger.ONE.shiftLeft(b)
import java.math.BigInteger; public class FermatOne { public static void main(String[] args) { BigInteger k = new BigInteger ("15"); BigInteger c = new BigInteger ("1"); int b = 332192810; BigInteger n = new BigInteger ("2"); BigInteger power; power = BigInteger.ONE.shiftLeft(b); BigInteger exponent; exponent = k.multiply(power); BigInteger mod; mod = exponent.add(c); BigInteger result = n.modPow(exponent,mod); System.out.println("Result is ==> " + result); } }
在命令行中设置内存标志- Xmx1024m,第一个代码可以正常工作,但是第二个代码却出现错误:java.lang.OutOfMemoryError:Java堆空间
我的问题:我应该在第二个代码中更改什么以避免java.lang.OutOfMemoryError?
您正在尝试计算类似的数字2 ^ (15 * 2 ^ 332192809)。我不知道你是否可以在宇宙中找到这样的数字!也许答案仅仅是… 42?;-)
2 ^ (15 * 2 ^ 332192809)
42
更严重的是,计算此数字确实会遇到麻烦。 以位进行编码,15 * 2 ^ 332192810本身将需要近一个千兆字节。然后再提升到2那种力量,我不想知道…
15 * 2 ^ 332192810
2
在一个更严重的是,当你钻进去执行java.math.BigInteger,我认为你正好碰上这样的错误 更快 与左移,为实现更高效,比功率的方法。话虽如此,您是否尝试过使用代码强制垃圾回收System.gc()?
java.math.BigInteger
System.gc()
更新 :我原来的推理可能是错误的。2 ^ 332192809可以用1GB计算。java.math.BigInteger尽管我相信此计算可能要花一些时间,但总的结果可能会被有效地“修改” 。
2 ^ 332192809