因此,有一些数论应用,我们需要用大数模做模数,我们可以选择模数。有两组可以得到巨大的优化 - 费马和梅森。
所以让我们将N位序列称为一个块。 N通常不是单词大小的倍数。
对于费马,我们有M = 2 ^ N + 1,所以2 ^ N = -1 mod M,所以我们采用被除数的块并交替加减。
对于Mersenne,我们有M = 2 ^ N-1,所以2 ^ N = 1 mod M,所以我们总结了被除数的块。
在任何一种情况下,我们最终都会得到一个占用2个块的数字。如果需要,我们可以再次应用这个算法,最后做一个通用的模数算法。
由于交替加法和减法,费马将使结果平均变小。否定结果不是计算上昂贵的,您只需跟踪符号并在最终的模数步骤中修复它。但我认为bignum扣除比bignum加法慢一点。
Mersenne对所有块进行求和,因此结果有点大,但可以通过算法的第二次迭代来解决,无需额外费用。
那么到底哪个更快?
Schönhage–Strassen uses Fermat.除了表现之外,可能还有一些其他因素会让费马比梅森更好 - 或者可能只是直接加速。
答案 0 :(得分:1)
如果您需要素数模数,您将根据大小的方便性做出决定。
例如, 2 ^ 31-1 在64位体系结构上通常很方便,因为它非常贴合32位,并且其中两个的乘积适合64位字,无论是签名还是未签名。
在32位架构上, 2 ^ 16 + 1 具有类似的优势。当然,它并不适合16位,但如果你把0视为特殊情况,那么在32位字中将它们相乘仍然很容易。