zl程序教程

您现在的位置是:首页 >  后端

当前栏目

1.3 整数乘法Karatsuba算法

算法 整数 1.3 乘法
2023-09-14 09:06:55 时间

  Karatsuba算法与复数乘法类似,都是通过巧妙的方式,将乘法次数由4次减少到3次。Karatsuba算法是将两个整数按高低位进行拆分。假设有以下两个数x和y,x的高位是 x 1 x_1 x1,低位是 x 0 x_0 x0,y的高位是 y 1 y_1 y1,低位是 y 0 y_0 y0,假设进制为二进制。
  假设低位的位数为m,那么传统乘法的计算方式是 x y = x 1 y 1 2 2 m + ( x 1 y 0 + x 0 y 1 ) 2 m + x 0 y 0 xy=x_1y_12^{2m}+(x_1y_0+x_0y_1)2^m+x_0y_0 xy=x1y122m+(x1y0+x0y1)2m+x0y0。这种方式用了4次乘法。
  Karatsuba算法采用三个变量,将乘法次数减少到三次,算法如下:
p 0 = x 0 y 0 p 1 = x 1 y 1 p 2 = ( x 1 + x 0 ) ( y 1 + y 0 ) − p 1 − p 0 x y = p 1 2 2 m + p 2 2 m + p 0 p_0=x_0y_0\\ p_1=x_1y_1\\ p_2=(x_1+x_0)(y_1+y_0)-p_1-p_0\\ xy=p_12^{2m}+p_22^m+p_0 p0=x0y0p1=x1y1p2=(x1+x0)(y1+y0)p1p0xy=p122m+p22m+p0
  算法比较简单:

# _*_ coding:utf-8 _*_

def mul(x0, x1, y0, y1, base, m):
    p0 = x0 * y0
    p1 = x1 * y1
    p2 = (x1 + x0) * (y1 + y0) - p1 - p0
    p = base ** m

    return p1 * p * p + p * p2 + p0


if __name__ == '__main__':
    # 1234 * 1432
    print(mul(34, 12, 32, 14, 10, 2))