【问题标题】:BigIntegers to the power of BigIntegersBigIntegers 到 BigIntegers 的力量
【发布时间】:2010-10-26 17:12:52
【问题描述】:

我正在尝试使用 BigInteger 类在 Java 中实现 Fermat、Miller-Rabin 或 AKS 算法。

我想我已经实现了Fermat test,除了 BigInteger 类不允许将 BigIntegers 带到 BigIntegers 的力量(只能将 BigIntegers 带到原始整数的力量)。 有没有办法解决这个问题?

我的代码中指出了有问题的行:

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;
}

【问题讨论】:

标签: java math primes biginteger


【解决方案1】:

我认为BigInteger.modPow 可能是您正在寻找的。注意费马检验中的“mod m”。

【讨论】:

  • 我在看 modPow;但是,我不确定如何将“a^(n-1) = 1 mod n”更改为使用 modPow。我对模运算不太熟悉。
  • base.modPow(exponent, modulus),所以在你的情况下a.modPow(n-1, n)
  • 还要注意 a.pow(n),一般来说,可能非常大。您可能没有足够的磁盘空间以二进制形式保存该数字!确实有必要做一些更复杂的事情,例如 modPow。
【解决方案2】:

其中一个素数测试内置于BigInteger.isProbablePrime()。不知道是哪一个,你得看源码。

此外,您还可以通过乘法将数字乘以幂。例如:2^100 = 2^50 * 2^50。所以拔出你的BigInteger 电源并循环,直到你用完它。但是你确定你不是要使用BigInteger.modPow(),它需要BigIntegers?根据您的测试,您似乎是。

【讨论】:

  • 我想建立自己的素性测试,而不是使用预先存在的测试。我在看 modPow;但是,我不确定如何将“a^(n-1) = 1 mod n”更改为使用 modPow。我对模运算不太熟悉。
  • 如果,例如,这是一个家庭作业,使用内置测试不会减少它。当然是假设性的。
  • 鸭子通常不需要在它们身上贴上“鸭子”的标签来识别。
【解决方案3】:

您必须实现自己的 pow() 方法。查看 BigInteger.pow() 的来源作为起点。

【讨论】:

  • 对于非常大的整数,这将是不必要的昂贵,特别是当算法只关心特定模数的幂时。
猜你喜欢
  • 2014-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多