我一直在用Pascal开发程序来生成大质数。经过多次尝试,我成功(我希望)使用蒙哥马利指数算法实现模幂运算。它比我的测试中的right-to-left binary method快。我使用Handbook of Applied Cryptography chapter 14中的算法,因为我使用http://www.javascripter.net/math/calculators/100digitbigintcalculator.htm来检查错误,它基本上是大数字的唯一在线计算器。
类似100位数字(base,exp,mod)的模块化取幂大约需要300ms,甚至比javascript版本还要大。这感觉很慢。我尝试使用我的代码分析并修复了几个瓶颈,但与javascript实现相比,它仍然相当慢。分析显示大多数调用用于基本乘法(vynasob函数)和减法(odecti函数),但我不知道如何更快地进行调用。是因为我在数组中将数字表示为基数10吗?我不认为这是一个很大的问题。这是我的代码https://github.com/Honzaik/PPrime/blob/master/pprime.lpr如果你找到了一些可能会有所帮助的奇怪的东西,那就是那种人,并且撇去了。遗憾的是,这段代码在捷克。但重要的功能是:
isPrime = Rabin-Miller
montExp = Montgomery Exponentiation
montMult = Montgomery Multiplication
secti = addition
odecti = subtraction
vynasob = multiplication
vydel = division
modulus = modulus
正如我所说,我将数字表示为基数为10的数组。例如10587 = [7,8,5,0,1]
感谢您的回复
答案 0 :(得分:1)
改进的答案/建议是尽可能使用最大的基础。我将基数10更改为基数2097151,300ms变为8ms。谢谢大家对建议的评论