作为一个爱好项目,我正在努力寻找非常大的素数。素数测试包含模幂计算,即 a^e mod n。让我们将其称为 modpow 操作以保持解释简单。我想加快这个特定的计算。
目前我正在使用GMP的mpz_pown函数,但是它有点慢。我认为它太慢的原因是因为对 GMP 的 modpow 的函数调用比对相同数量的名为PFGW的软件的全面素性测试要慢。(所以要清楚,这只是 GMP 的 modpow 部分,而不是我正在比较的整个自定义素数测试例程)。PFGW 被认为是该领域中最快的,对于我的用例,它使用Brillhart-Lehmer-Selfridge素数测试——它也使用 modpow 程序——所以 PFGW 在这方面更快并不是因为数学上的聪明(如果我在这里错了,请纠正我)。看起来 GMP 的瓶颈是 modpow 操作。具有超过 20,000 位数字的示例运行时:GMP 的 modpow 操作大约需要 45 秒,而 PFGW 在 9 秒内完成整个素数测试(涉及 modpow)。更大的数字使差异变得更加令人印象深刻。GMP 使用 FFT 乘法和蒙哥马利减少进行此测试比较,请参阅下面这篇文章的评论。
我做了一些研究。到目前为止,我了解到 modpow 算法通过平方、整数乘法和模约简来使用幂 - 这些对我来说听起来很熟悉。几个辅助方法可以提高整数乘法的运行时间:
为了通过平方部分来提高求幂的运行时间,可以使用有符号数字表示来减少乘法的次数(即位表示为 0、1 或 -1,并且位串以这样的方式表示:它包含比原始 base-2 表示更多的零 - 这通过平方减少了求幂的运行时间)。
为了优化运算的模部分,我知道这些方法:
所以这是150,000美元问题:在给定非常大的基数、指数和模数的情况下,是否有可用于有效执行 modpow 操作的软件库?(我的目标是几百万位数)。如果您想建议一个选项,请尝试解释算法的内部工作原理,以数百万位为基数、模数和指数的情况,因为一些库根据位数使用不同的算法。基本上我正在寻找一个支持上述技术(或者可能更聪明的技术)的库,并且它应该在运行算法时表现良好(嗯,至少比 GMP 更好)。到目前为止,我已经搜索、找到并尝试了 GMP 和 PFGW,但没有发现这些令人满意(PFGW 很快,但我只是对 modpow 操作感兴趣,并且没有直接的编程接口)。
编辑:使问题更简洁,因为它被标记得太宽泛。