在n / 3比特6T(n / 3)karatsuba中的6个中乘以两个数

时间:2014-10-06 01:46:25

标签: algorithm math multiplication

两个数字相乘

x*y ----> x =(x0*10^(n/3)+x1*10^(n/3)+x2) and y=(y0*10^(n/3)+y1*10^(n/3)+y2)

10 ^ n / 3个数字的9次乘以9T(n / 3),但可以通过以下方法减少到5个。

x*y= x0*y0+x1*y1+x2*y2+x0*y1+x0*y2+x1*y0+x1*y3+x2*y0+x2*y1

我可以通过像Karatsuba算法这样的技巧将两个数字的乘法减少到5T(n / 3)

(x0+x1+x2)(y0+y1+y2)-x0*y0-x1*y1-x2*y2= x0*y1+x0*y2+x1*y0+x1*y3+x2*y0+x2*y1

所有和所有5个n / 3位的乘法编号为5T(n/3)+O(n),但我如何在6乘法中进行6T(n/3)+O(n)

Q1可以减少到6而不是5吗?

从Spektre的重新提问中复制的

[edit1] 更正

x和y有n位

x=x0*(10^2n/3)+x1*10^n/3+x2
y=y0*(10^2n/3)+y1*10^n/3+y2
x*y=x2y2+(x2y1+x1y2)10^n/3+(x2y0+x1y1+x0y2)10^2n/3+(x1y0+x0y1)10^n+x0y0*10^4n/3
  • 现在9运行时间为9T(n / 3)的n / 3位数乘以O(n ^ 2)

像Karatsuba的乘法这样的小技巧:

  • 首先计算x0y0,x1y1和x2y2这是n / 3位数的3次乘法
  • 然后使用x0y0,x1y1和x2y2来计算其他人:
  • x2y1+x1y2=(x1+x2)(y1+y2)-x1y1-x2y2 - >> 1乘以n / 3位数
  • x2y1+x1y1+x0y2=(x0+x2)(y0+y2)-x0y0-x2y2+x1y1 - >> 1乘以n / 3位数
  • x1y0+x0y1=(x0+x1)(y0+y1)-x0y0-x1y1 - >> 1乘以n / 3位数

递归求解6个子问题

  • 并将它们与O(n) - 数字上的7个加法组合。
  • 总共需要6个n / 3位数运行时间6T(n / 3)

Q2如何将此值减少到5倍而不是6?

  • 由于OP
  • 的错误,Q1现已过时

1 个答案:

答案 0 :(得分:0)

不是答案,但作为评论

,这是不可读的

如果您将数字分成3组,那么 greybeard 是正确的

a0=10^(2n/3)
a1=10^(1n/3)
a2=10^(0n/3)
x=x0*a0+x1*a1+x2*a2
y=y0*a0+y1*a1+y2*a2

所以乘法看起来像这样:

x*y=a0(x2*y2+x1*y2+x0*y2)
    +a1(x2*y1+x1*y1+x0*y1)
    +a2(x2*y0+x1*y0+x0*y0)

重写为数字:

b0=(x2*y2+x1*y2+x0*y2)
b1=(x2*y1+x1*y1+x0*y1)
b2=(x2*y0+x1*y0+x0*y0)
x*y=a0*b0+a1*b1+a2*b2

现在简化 b0,b1,b2

[提示]

  • 你利用了什么技巧?
  • 为什么你的结果没有数字重量 a0,a1,a2

[edit1]如果您想解决这个问题,请使用标准符号代替您的

较低的有效数字是较低的索引,所以:

a0=10^(0n/3)
a1=10^(1n/3)
a2=10^(2n/3) // this is max wieght for operand
a3=10^(3n/3)
a4=10^(4n/3)
a5=10^(5n/3) // this is max weight for multiplication result
x=x0*a0+x1*a1+x2*a2
y=y0*a0+y1*a1+y2*a2

所以乘法看起来像这样:

x*y=a0(x0*y0+x1*y0+x2*y0)
    +a1(x0*y1+x1*y1+x2*y1)
    +a2(x0*y2+x1*y2+x2*y2)

重写为数字:

b0=(x0*y0+x1*y0+x2*y0)
b1=(x0*y1+x1*y1+x2*y1)
b2=(x0*y2+x1*y2+x2*y2)
x*y=a0*b0+a1*b1+a2*b2
粗b0,b1,b2的

不在单个数字的范围内 - 相反,由于乘法,它们都是两位数

所以你必须把它们分成单数:

x*y=a0*B0+a1*B1+a2*B2+a3*B3+a4*B4+a5*B5

其中:

B0=(b0/a0)%a1
B1=(b0/a1+b1/a0)%a1
B2=(b0/a2+b1/a1+b2)%a1
B3=(b0/a3+b1/a2+b2/a1)%a1
B4=(b0/a4+b1/a3+b2/a2)%a1
B5=(b0/a5+b1/a4+b2/a3)%a1
  • 也不要忘记处理溢出......