Java 大整数到大整数的幂
我试图用BigInteger类在Java中实现Fermat、Miller-Rabin或AKS算法 我想我已经实现了,除了BigInteger类不允许将BigInteger取为BigInteger的幂(只能将BigInteger取为原始整数的幂)有办法解决这个问题吗? 问题行在我的代码中表示:Java 大整数到大整数的幂,java,math,primes,biginteger,Java,Math,Primes,Biginteger,我试图用BigInteger类在Java中实现Fermat、Miller-Rabin或AKS算法 我想我已经实现了,除了BigInteger类不允许将BigInteger取为BigInteger的幂(只能将BigInteger取为原始整数的幂)有办法解决这个问题吗? 问题行在我的代码中表示: public static boolean fermatPrimalityTest(BigInteger n) { BigInteger a; Random rand = new Rando
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;
}
公共静态布尔fermatPrimalityTest(BigInteger n)
{
大整数a;
Random rand=新的Random();
int=100000;
对于(int i=0;i
我想这可能就是你要找的。注意Fermat测试中的“mod m”。您必须实现自己的pow()方法。以BigInteger.pow()的源代码为起点。其中一个素性测试内置于BigInteger.isProbablePrime()
中。不确定是哪一个,你得看看来源
此外,还可以通过乘法将数字提升为幂。例如:
2^100=2^50*2^50
。所以,拿出你的biginger
电源和环路,直到你用完它。但是您确定您不是要使用biginger.modPow()
,它需要biginger
s吗?根据您的测试,您看起来是这样的。对于非常大的整数,这将是不必要的昂贵,特别是当算法只关心特定模上的幂时;但是,我不知道如何将“a^(n-1)=1 mod n”更改为使用modPow。我对模运算不太熟悉。base.modPow(指数,模)
,所以在你的例子中,a.modPow(n-1,n)
还要注意,a.pow(n)通常会非常大。您可能没有足够的磁盘空间以二进制形式保存该数字!做一些更复杂的事情,比如modPow,是非常必要的。我想建立自己的素性测试,而不是使用预先存在的测试。我看着莫德波;但是,我不知道如何将“a^(n-1)=1 mod n”更改为使用modPow。我对模运算不太熟悉。例如,如果这是一个家庭作业,使用内置测试不会减少它。当然,假设是这样。鸭子通常不需要标签上写着“duck”就可以被识别出来。可能是