大數的相乘Karatsuba算法

Karatsuba算法主要應用於兩個大數的相乘,原理是將大數分成兩段後變成較小的數位,然後做3次乘法,並附帶少量的加法操作和移位操作。
現有兩個大數,x,y。
首先將x,y分別拆開成爲兩部分,可得a,b,c,d。他們的關係如下:
x = a * 10m + b;
y = c * 10m + d。其中m爲正整數,m < n,且a,c 小於 10m。
那麼

xy = (a * 10^m + b)(c * 10^m + d)
xy = (10^m * a + b)(10^m * c + d)
xy = 10^2m * ac + 10^m * ad + 10^m * bc + bd
xy = 10^2m * ac + 10^m * (ad + bc) + bd
設:
z0 = ac
z1 = ad + bc
z2 = bd
利用(a + b)(c + d) = ac + ad + dc + bd 可以求得 z1
z1 = ad + bc = (a + b)(c + d) - ac - bd
最終
xy = 10^2m * ac + 10^m * ((a + b)(c + d) - ac - bd) + bd

實例展示
設x = 12345,y=6789,令m=3。那麼有:
12345 = 12 * 1000 + 345;
6789 = 6 * 1000 + 789。
下面計算:
z2 = 12 * 6 = 72;
z0 = 345 * 789 = 272205;
z1 = (12 + 345) * (6 + 789) - z2 - z0 = 11538。
然後我們按照移位公式(xy = z2 * 10^(2m) + z1 * 10^(m) + z0)可得:
xy = 72 * 1000000 + 11538 * 1000 + 272205 = 83810205。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章