目前我正在使用GMP的mpz_pown函数,但是它有点慢。我认为它太慢的原因是因为与软件PFGW进行完整的素性测试相比,对GMP的modpow的函数调用速度更慢(所以明确一下,这只是GMP的modpow部分,而不是我正在比较的整个自定义素性测试例程)。PFGW被认为是其领域中最快的,并且对于我的用例,它使用Brillhart-Lehmer-Selfridge素性测试-该测试也使用modpow过程-因此并非由于数学上的聪明才智使PFGW在这方面更快(如果我错了,请纠正我)。看起来GMP的瓶颈是modpow操作。对于具有略多于20,000位数字的数字,例如运行时间:GMP的modpow操作需要约45秒,而PFGW在9秒内完成了整个素性测试(涉及modpow)。随着数字变得更大,差异变得更加显著。GMP对于此测试比较使用FFT乘法和Montgomery减少,详见下文评论。
我做了一些研究。到目前为止,我了解到modpow算法使用平方求幂、整数乘法和模数规约——这些听起来都很熟悉。几个帮助方法可以提高整数乘法的运行时间: 为了改善平方求幂部分的运行时间,可以使用有符号数字表示法来减少乘法的次数(即将位表示为0、1或-1,并以这种方式表示位串,使其包含比其原始基数2表示中更多的零——这减少了平方求幂的运行时间)。为了优化操作的模数部分,我知道以下方法: 所以这里是一个价值150,000美元的问题:是否有一个软件库能够高效地执行modpow运算,给定一个非常大的底数、指数和模数?(我希望能处理几百万位数)。如果您想提出建议,请尝试解释针对具有数百万位数的基数、模数和指数的情况的算法内部工作原理,因为一些库根据数字数量使用不同的算法。基本上,我正在寻找一个支持上述技术(或可能更聪明的技术)的库,它应该在运行算法时表现良好(至少比GMP好)。到目前为止,我已经搜索、发现并尝试了GMP和PFGW,但没有找到令人满意的解决方案(PFGW很快,但我只对modpow操作感兴趣,而且没有直接的编程接口)。我希望领域内的专家可以建议一个具备这些功能的库,因为似乎很少有库能够处理这些要求。
mpn_powm
会使用一般的mpn_mul
和mpn_sqr
,如果乘数的大小超过了 Toom-Cook 阈值,则会使用 FFT。除非 GMP 被编译时使用了--disable-fft
。mpn_powm
使用 Montgomery 模约简,包括偶模情况。因为mpz_powm
会将模数分解为奇数因子和偶数 (2^i) 因子,然后对结果应用中国剩余定理。如果操作数很大,Montgomery 模约简例程mpn_redc_n
也将使用 FFT。 - Brett Halempn_powm
没有文档记录(如此提到)。该页面称mpn_powm
比mpz_powm
更快。您是否知道原因以及两者之间的区别?GMP函数索引也没有提到mpn_redc_n
,听起来非常有用!我在哪里可以找到您提到的这些函数的文档?谢谢! - webdevelopersdiarympz_
函数是推荐的接口。mpn_
函数执行底层例程,实现真正的工作。尽管如此,mpz_
函数也设置工作内存、处理数据、为操作数选择最佳例程等。对于这样一个大型计算,绕过 MPZ 接口并不会节省任何东西,而且你还必须基本上复制设置代码。 - Brett Hale