基于FFT的大整数乘法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于FFT 的大整数乘法
1背景
对于两个长度为n 的大整数,普通的大整数乘法的时间复杂度是()2n O ,而采用一种精心构造的分治算法,则可以将时间复杂度降低为()()585.13log 2n O n O ≈。此处则是受到快速傅立叶变换算法的启发,提出一种新的大整数乘法,该算法基于模-p 的有限域运算,采用类似于FFT 的算法,可以将大整数乘法的时间复杂度降低为()
5.1n O ,甚至,从某种意义上说,可以达到()n n O log 。 2 基础
2.1 FFT (可以参考《算法导论》及《算法概论》相关内容)
对于两个n-1次多项式
3 基于FFT 的大整数乘法
3.1大整数的表示方法
为简便起见,这里只考虑10进制大整数,但是这样并不会失去其一般性。对于一个10进制整数,可以将其表示为:
()01221110101010a a a a A n n n n +⨯++⨯+⨯=----
这样,就可以将一个大整数对应到一个n-1次多项式上去:
()012211a x a x a x a x A N n n n n A ++++=---- ,其中{}9,8,7,6,5,4,3,2,1,0∈i a
3.2大整数的乘法
对于两个十进制大整数A N 和B N ,设A N 各个位上的数字如下:
0121a a a a n n --
而B N 各个位上的数字如下:
0121b b b b n n --
另外记多项式
()012211a x a x a x a x A n n n n ++++=---- ,
()012211b x b x b x b x B n n n n ++++=----
于是有()10A N A =,()10B N B =。
记大整数B A C N N N ⨯=,多项式()()()x B x A x C ∙=则有:
()()()101010C B A N N N B A C =⨯=⨯=
于是已知A N 和B N ,要得到C N ,可以采用如下方法:
于是,关键的问题是找到一个有效的算法以计算()()()x B x A x C ∙=。可惜的
是,传统的FFT 算法是基于复数上的n 次单位根n
i n n ππω2sin 2cos
+=的,因此必须要进行三角函数之类的浮点运算,从而会有一定程度的误差。那么问题在于能否找到一个合适的方法来进行整系数多项式的乘法而没有任何的误差呢?据笔者所知,还没有一种十分合适的类似于FFT 的针对于一般的整系数多项式的乘法。但是,大整数乘法中所要用到的多项式乘法十分特殊:即两个因子多项式中,每一个系数都不大于10. 因此下面所要找的, 就是对于这样一种特殊的整系数多项式的比较合适的乘法算法。
我们的工具是模-p 的有限域。首先,如果我们在模-p 的有限域上能够计算出: ()()()()p x B x A x C mod '∙≡
即有()220,m o d
'-≤≤≡n i p c c i i ,又根据多项式乘法可以知道,()1818199,1,0,1,0,1,0-≤=⨯≤=∑∑∑=+-≤≤=+-≤≤=+-≤≤n b a c i k j n k j i k j n k j i k j n k j k
j i ,因此如果我们挑选一个足
够大的p 使得()181->n p ,则可知p c i <,又有:p c i <',()p c c i i mod '≡,从而可知i i c c ='.
3.3关于p 的选择
于是我们现在需要做的就是对于给定的一个数p ,设计一个类似于FFT 的算法,求出()()()()p x B x A x C mod '∙≡。我们可以将p 的取值范围缩小一点,针对于p 为素数,且p 足够大(显然要大于2n-2)的情况来讨论。
这个任务其实就是要证明在模-p 的域上的“n 次单位根”具有与复数域上的n 次单位根类似的性质。即证明模-p 的域上的FFT 算法是合法的。
【定理1】模-p 乘法群是p-1阶循环群。
【证明】此定理等价于同余方程()p x p mod 11≡-有p-1次本原单位根。这个定理的证明可以参考《数论概论》中关于模-p 的本原根的内容。在一般的近世代数教材中也会有这一内容。■
由此,记m=p-1,于是可以找到一个次单位根ϖ。由于p>>n,所以m=p-1>n.从而A (x )和B (x )都可以表示成m-1次多项式。
()0111a a a A m m +++=--ωωϖ
将此()x A 分成两部分:
()()()()()
22211122121222x xA x A x a x x a x A m k k k m k k k +=+=
∑∑-≤++-≤ 于是
()()()2221x xA x A x A +=,()()()2221x xA x A x A -=-
由上式可知,要计算()x A 和()x A -,只需要先计算()21x A 和()
22x A ,然后再做一次乘法、一次加法和一次减法即可,要计算k 个自变量的函数,需要的时间是: ()()()()12/2Θ+Θ+=k k T k T ,
从而可得()()m m O m T log =。
由上面的式子可以看出,要想进行FFT 变换,其关键在于对于n 个自变量
m ωωω,...,,2
求它们的函数的问题可以转化为求
m ωωω,...,,42
对于另外一些多项式的函数问题。
但是问题是在进行逆变换时必须要满足()p m
k k mod 01≡∑=ω,根据等比数列公
式()()p m m k k
mod 0111≡--=∑=ωωωω,这样必有1=m ω,也就是说,必须找到n 次单位