Java 大整数到大整数的幂

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

我试图用BigInteger类在Java中实现Fermat、Miller-Rabin或AKS算法

我想我已经实现了,除了BigInteger类不允许将BigInteger取为BigInteger的幂(只能将BigInteger取为原始整数的幂)有办法解决这个问题吗?

问题行在我的代码中表示:

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”就可以被识别出来。可能是