1. 算法思路
基本思想:
给定两个 n 位整数 x 和 y,将它们各自拆分成两部分:
其中 ,a, b, c, d分别表示整数 x 和 y 的高位和低位部分。
按照普通乘法的公式:
传统方法需要计算 4 个大数乘法:a×c 、a×d 、b×c 和 b×d 。
Karatsuba的优化思路在于减少乘法次数。注意到:
因此可以推出:
这样只需计算三个乘法:
-
ac=a×c
-
bd=b×d
-
(a+b)(c+d)
然后利用上述关系,计算中间项,从而减少乘法运算的次数。
2. 理论推导与时间复杂度
分治递归关系的推导:
设 T(n) 表示两个 n 位数相乘的时间复杂度。按照 Karatsuba 算法的步骤:
-
将每个整数分成两部分,需要 O(1) 或 O(n) 时间(主要是分割字符串或位运算)。
-
进行 3 次递归乘法,规模为 n/2,每次时间为 T(n/2)。
-
加法、减法和移位操作需要 O(n) 时间。
因此递归关系为:
T(n)=3T(n2)+O(n)
利用主定理分析:
对于递归关系 ,这里 a=3 ,b=2 ,d=1 。
计算临界指数:
因为 (即 d),所以根据主定理:
这比传统的 O(n²) 算法更高效,尤其在大整数乘法中优势明显。
3. 算法步骤
-
基本情况:
-
如果 n 足够小(例如 n = 1 或 n低于某个阈值),直接使用常规乘法返回结果。
-
-
分解数字:
-
设 m = ⌈n/2⌉,将整数 x 和 y 分解为:
-
-
递归计算三个乘积:
-
计算
。
-
计算
。
-
计算
。
-
-
合并中间结果:
-
计算中间项:
-
计算最终结果:
-
-
返回结果:
-
返回合并后的结果。
-
算法总结
-
算法思路: 利用分治思想,将大整数分解为高低位两部分,通过三个子问题(而不是四个)递归计算乘积,利用加减法合并结果。
-
理论推导: 递归关系为 T(n)=3T(n/2)+O(n) ,由主定理得出时间复杂度为
。
-
算法步骤: 包括基本情况处理、分解数字、递归计算、合并结果以及返回最终乘积。