BigIntegers对BigIntegers的力量

时间:2010-10-26 17:12:52

标签: java math primes biginteger

我正在尝试使用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;
}

3 个答案:

答案 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()的来源作为起点。