Karatsuba算法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、知识准备
1.基本认识:
Karatsuba算法是一种快速相乘算法,它将两个n位数字相乘所需的一位数乘法次数减少到了至多2log3 1.5858。
因此它比要2n次个位数乘法
n n
3*3*
的经典算法要快。
值得一提的是,Karatsuba算法是第一个比小学二次乘法算法渐进快速的算法。
这个计算方式的时间复杂度是 O(n²),Karatsuba算法可以加速相乘的计算速度。
可以注意到 AD +BC 这个计算需要两个 O(n²/4) 的乘法和一个 O(n) 的加法;Karatsuba 把这个原始的计算改成下面这个计算,因为 AC 和 BD 是已知的,因此现在的 AD +BC 的时间复杂度变成了一个 O(n²/4) 的乘法和四个 O(n) 的加法或减法,时间复杂度减小到2log3
O n。
()
2.算法步骤
1)分解。
将大整数X、Y(分别为n,m位)分别为A、B、C、D。
值得注意的是如果位数n或m为奇数,则A为前n/2+1或m/2+1位,n/2或m/2向下取整;
2)计算。
分别计算AC、BD,并且利用AC和BD计算AD+BC;
3)求解。
二、实验过程
1.拆分输入:
2.计算三个乘积:
3.计算中间项:
4.计算最终乘积:
三、总结
虽然 Karatsuba 乘法执行时所需的单精度乘法比 Comba 方法少,但是也多了一项 O(n) 级别的开销来解一个方程组,用于计算中间项以及合并最后的结果,这就使得 Karatsuba 乘法在应对输入比较小的数字时所需的计算时间会更多。
因此在实际操作中,递归计算到一定大小后,就应该改用Comba 方法计算了。
一般分割点大小是 80(字长为 32 bit 时)或 64(字
长为 64 bit 时),当输入两个数的规模有一个小于分割点时,就应该改用Comba 方法计算乘法,只有当两个数的规模大于或等于分割点才使用Karatsuba 方法递归计算。
Karatsuba 算法是比较简单的递归乘法,把输入拆分成 2 部分,不过对于更大的数,可以把输入拆分成 3 部分甚至 4 部分。
拆分为 3 部分时,可以使用 Toom-Cook 3-way 乘法,复杂度降低到 O(n^1.465)。
拆分为 4 部分时,使用 Toom-Cook 4-way 乘法,复杂度进一步下降到 O(n^1.404)。
对于更大的数字,可以拆成 100 段,使用快速傅里叶变换,复杂度接近线性,大约是 O(n^1.149)。
可以看出,分割越大,时间复杂度就越低,但是所要计算的中间项以及合并最终结果的过程就会越复杂,开销会增加,因此分割点上升,对于公钥加密,暂时用不到太大的整数,所以使用 Karatsuba 就合适了,不用再去弄更复杂的递归乘法。