我正在尝试使用BigInteger类在Java中实现Fermat,Miller-Rabin或AKS算法。
我认为我已经实现了Fermat test,除了BigInteger类不允许BigIntegers获得BigIntegers的强大功能(人们只能将BigIntegers带入原始int的强大功能)。 有解决方法吗?
有问题的行在我的代码中表示:
public static boolean fermatPrimalityTest(BigInteger n)
{
BigInteger a;
Random rand = new Random();
int maxIterations = 100000;
for (int i = 0; i < maxIterations; i++) {
a = new BigInteger(2048, rand);
// PROBLEM WITH a.pow(n) BECAUSE n IS NOT A BigInteger
boolean test = ((a.pow(n)).minus(BigInteger.ONE)).equals((BigInteger.ONE).mod(n));
if (!test)
return false;
}
return true;
}
答案 0 :(得分:5)
我认为BigInteger.modPow
可能就是你要找的东西。请注意费马测试中的“mod m”。
答案 1 :(得分:1)
其中一个素性测试内置于BigInteger.isProbablePrime()
。不知道哪一个,你必须看看来源。
此外,您可以通过乘以一个数字来增加功率。例如:2^100 = 2^50 * 2^50
。因此,拔出你的BigInteger
电源并循环,直到你用完它为止。但是你确定你不打算使用BigInteger.modPow()
,这需要BigInteger
吗?根据您的测试,它看起来像你。
答案 2 :(得分:0)
您必须实施自己的pow()方法。查看BigInteger.pow()的来源作为起点。