多精度算术是指算法数据结构可用于实现算术值大于可以存储在登记中央处理器,通常在16到64之间通常指整数算术,但浮点也是可能的。一些人将此称为任意精度我不喜欢算术,因为作为一台计算机有限状态机,不可能支持真正的任意精度。(正是这样的事情让我迂腐的猛拉,BTW)。

这些技术在一些特定领域很有用。我了解他们的唯一原因是因为我需要实施公钥密码学对于我正在研究的加密库。它们也可能在建模或AI等方面有潜在的用处。此外,一些程序设计语言,例如方案,始终使用多精度算法。

我们将k个单词的整数x表示为单词数组,k-1…0,其中0是最不重要的单词。出于速度目的,明智的做法是选择数组大小与CPU寄存器的大小协同响应。在所有情况下,我们假设使用的基数是2的幂。基数是单词的最大值加1。例如,如果您使用的是32位单词,则基数为2^32。

这些算法是用一种可以合理理解的语言编写的C类-像伪码

算法假定其输入是无符号的。考虑到这些算法,很容易理解如何处理符号,因此留给读者练习。还要注意的是,虽然这些算法相当快,至少对于中等大小的输入来说,有大量可能的优化。我知道一些,我相信还有很多我还不知道的。这里有一个值得思考的提示:SIMD(单指令多数据)说明。

添加

加法就像你手工做的一样,只是它使用了一个更大的基数(2^16或2^32对10纯粹的人类).

输入:x和y,大小均为n(如果大小不同,请用0填充较小的)。

输出:w=x+y,大小(最多)n+1个单词。

进位=0对于从0到n-1的i,请执行以下操作:w[i]=(x[i]+y[i]+进位)模b如果((x[i]+y[i]+进位)<b)则进位=0其他进位=1w[n]=进位返回w

减法

输入:x和y,大小均为n(如果大小不同,请用0填充较小的)。必须是x>=y的情况。

输出:w=x-y,大小(最多)n个字。

进位=0对于从0到n-1的i,请执行以下操作:w[i]=(x[i]-y[i]+进位)mod b如果((x[i]-y[i]+进位)>=0)则进位=0其他进位=-1返回w

乘法运算

这不是最快的乘法方法,但它是最容易描述的HAC公司). 也可以考虑使用卡塔萨巴香椿厨师,其中包括渐近地速度更快,但对于较小的数字,在实践中通常较慢。使用这两种方法的技术,对于较小的数字使用经典算法,对于较大的数字使用Karatsuba方法,特别有效。组合乘法适用于某些大小的输入(特别是4x4->8或8x8->16组合乘法非常快)。我所知道的关于Comba乘法的唯一参考文献是Comba在国际商用机器公司系统日志,至少在有人将其节点化之前。

输入:x和y,其中x有n个数字,y有t个数字。

输出:w=x*y,大小为n+t个字。

对于从0到t-1的i,请执行以下操作:进位=0对于从0到n-1的j,执行以下操作:(uv)=w[i+j]+x[j]*y[i]+进位w[i+j]=v进位=uw[i+n+1]=u返回w

在上述符号中,(uv)指的是“双字”值,即至少是常规字长的两倍。

除法/模数

分裂相当严重;尽可能避免。如果用一个模多次进行模运算,巴雷特减少可以用来加快速度。

输入:x,大小为n,y,大小为t。n>=t>=1,y{t}!=0

输出:商q=(q{n-t},…,q{1},q{0})和余数r=(r{t}

当(x>=yb^(n-t))时:q[n-t]=q[n-t]+1;x=x-yb^(n-t)对于从n到(t+1)的i,请执行以下操作:如果(x[i]==y[t])则q[i-t-1]=b-1否则q[i-t-1]=楼层((x[i]*b+x[i-1])/y{t})而(q[i-t-1]*(y[t]*b+y[t-1])>x[i]*b^2+x[i-1]*b+x[i-2])q[i-t-1]=q[i-t-1]-1x=x-q[i-t-1]*y*b^(i-t-1)如果(x<0)那么x=x+y*b^(i-t-1)q[i-t-1]=q[i-t-1]-1r=x回报(q,r)

当使用多精度算法时,其他一些有用的算法是二进制GCD算法,的二进制扩展GCD算法,的平方和乘法求幂算法、和Miller-Rabin素性检验

我从应用密码学手册。有关多精度算术的更多详细信息,请阅读。

我可能在这里犯了一两个转录错误,如果要实现这些算法,请对照原始源代码对其进行双重检查。如果你发现任何错误,请给我发短信。

登录登记在这里写点什么或联系作者。