Python Karotsuba乘法-找不到错误
我正在做斯坦福大学的算法MOOC,却被卡拉通巴乘法算法编程作业困住了。Python Karotsuba乘法-找不到错误,python,algorithm,multiplication,karatsuba,Python,Algorithm,Multiplication,Karatsuba,我正在做斯坦福大学的算法MOOC,却被卡拉通巴乘法算法编程作业困住了。 Karatsuba乘法是一种简单的两个整数的乘法算法,其速度比通常的乘法快 限制 我限制自己只使用单位数乘法和填充数(在末尾加零,即乘以10的幂),因此有3种基本情况 我还决定将数字转换成字符串,并取几个数字,而不是将其除以10的幂,但我尝试了另一种方法,它没有帮助 我还决定推广该算法,即不要假设number1和number2具有相似的长度,因此我同时使用n1和n2(参见代码) 由于上述原因,我也决定不使用高斯技巧 我知
Karatsuba乘法是一种简单的两个整数的乘法算法,其速度比通常的乘法快 限制
- 我限制自己只使用单位数乘法和填充数(在末尾加零,即乘以10的幂),因此有3种基本情况
- 我还决定将数字转换成字符串,并取几个数字,而不是将其除以10的幂,但我尝试了另一种方法,它没有帮助
- 我还决定推广该算法,即不要假设number1和number2具有相似的长度,因此我同时使用n1和n2(参见代码)
- 由于上述原因,我也决定不使用高斯技巧
def karatsuba(number1, number2):
n1 = len(str(number1)) # number of digits in the first number
n2 = len(str(number2)) # number of digits in the second number
if n1 == 1 and n2 == 1: # base case number 1 - both numbers are single-digit
kara = number1*number2
return kara
elif n1 == 1: # base case number 2 - only one number is single-digit
c = int(str(number2)[:(n2//2)])
d = int(str(number2)[(n2//2):])
kara = 10**((n2+1)//2)*c*number2 + d*number2
return kara
elif n2 == 1: # base case number 3 - only one number is single digit
a = int(str(number1)[:(n1//2)])
b = int(str(number1)[(n1//2):])
kara = 10**((n2+1)//2)*a*number2 + b*number2
return kara
elif n1 != 1 and n2 != 1: # loop
a = int(str(number1)[:(n1 // 2)])
b = int(str(number1)[(n1 // 2):])
c = int(str(number2)[:(n2 // 2)])
d = int(str(number2)[(n2 // 2):])
z1 = karatsuba(a, c)
z2 = karatsuba(a, d)
z3 = karatsuba(b, c)
z4 = karatsuba(b, d)
kara = 10**((n1+1)//2+(n2+1)//2)*z1 + 10**((n1+1)//2)*z2 + 10**((n2+1)//2)*z3 + z4
return kara
这不是卡拉祖巴算法。Karatzuba的要点是只进行3次递归调用;你做了四个。在您的符号中,递归调用应该是
karatzuba(a, c)
karatzuba(b, d)
karatzuba(a + b, c + d)
除此之外,基本情况2还有一个问题:
number1
根本不参与其中。这不是一个Karatzuba算法。Karatzuba的要点是只进行3次递归调用;你做了四个。在您的符号中,递归调用应该是
karatzuba(a, c)
karatzuba(b, d)
karatzuba(a + b, c + d)
除此之外,基本情况2还有一个问题:
number1
根本不参与其中。如果您还没有参与,这些错误需要纠正
在基本情况2中,kara=10**((n2+1)//2)*c*number1+d*number1
在基本情况3中,kara=10**((n1+1)//2)*a*number2+b*number2。你的代码有n2+1
传统的Karatsuba有3个递归。但我明白你为什么要进行4次递归。但不能说哪个更快
上面注释中给出的示例的工作代码
def karatsuba(编号1,编号2):
n1=len(str(number1))#第一个数字中的位数
n2=len(str(number2))#第二个数字中的位数
如果n1==1和n2==1:#基本情况编号1-两个数字都是一位数
卡拉=1号*2号
回程卡拉
elif n1==1:#基本案例编号2-只有一个数字是一位数
c=int(str(number2)[:(n2//2)])
d=int(str(number2)[(n2//2):]
kara=10**((n2+1)//2)*c*number1+d*number1#这里有个错误
回程卡拉
elif n2==1:#基本案例编号3-只有一个数字是一位数
a=int(str(number1)[:(n1//2)])
b=int(str(number1)[(n1//2):]
kara=10**((n1+1)//2)*a*number2+b*number2#这里有个错误
回程卡拉
elif n1!=1和n2!=1:#循环
a=int(str(number1)[:(n1//2)])
b=int(str(number1)[(n1//2):]
c=int(str(number2)[:(n2//2)])
d=int(str(number2)[(n2//2):]
z1=喀喇通(a,c)
z2=喀拉通巴(a,d)
z3=喀拉通巴(b,c)
z4=喀拉通巴(b,d)
kara=10**((n1+1)//2+(n2+1)//2)*z1+10**((n1+1)//2)*z2+10**((n2+1)//2)*z3+z4
回程卡拉
num1=31415926535897932384626433832795202884197169399375105820974944592
num2=271828182845904235360287471352662497757247093699959574966967627
k_res=喀拉祖巴(num1,num2)
ac_res=num1*num2
打印(k_res)
打印(ac_res)
断言k_res==ac_res
如果您还没有纠正这些错误,则需要纠正
在基本情况2中,kara=10**((n2+1)//2)*c*number1+d*number1
在基本情况3中,kara=10**((n1+1)//2)*a*number2+b*number2。你的代码有n2+1
传统的Karatsuba有3个递归。但我明白你为什么要进行4次递归。但不能说哪个更快
上面注释中给出的示例的工作代码
def karatsuba(编号1,编号2):
n1=len(str(number1))#第一个数字中的位数
n2=len(str(number2))#第二个数字中的位数
如果n1==1和n2==1:#基本情况编号1-两个数字都是一位数
卡拉=1号*2号
回程卡拉
elif n1==1:#基本案例编号2-只有一个数字是一位数
c=int(str(number2)[:(n2//2)])
d=int(str(number2)[(n2//2):]
kara=10**((n2+1)//2)*c*number1+d*number1#这里有个错误
回程卡拉
elif n2==1:#基本案例编号3-只有一个数字是一位数
a=int(str(number1)[:(n1//2)])
b=int(str(number1)[(n1//2):]
kara=10**((n1+1)//2)*a*number2+b*number2#这里有个错误
回程卡拉
elif n1!=1和n2!=1:#循环
a=int(str(number1)[:(n1//2)])
b=int(str(number1)[(n1//2):]
c=int(str(number2)[:(n2//2)])
d=int(str(number2)[(n2//2):]
z1=喀喇通(a,c)
z2=喀拉通巴(a,d)
z3=喀拉通巴(b,c)
z4=喀拉通巴(b,d)
kara=10**((n1+1)//2+(n2+1)//2)*z1+10**((n1+1)//2)*z2+10**((n2+1)//2)*z3+z4
回程卡拉
num1=31415926535897932384626433832795202884197169399375105820974944592
num2=271828182845904235360287471352662497757247093699959574966967627
k_res=喀拉祖巴(num1,num2)
ac_res=num1*num2
打印(k_res)
打印(ac_res)
断言k_res==ac_res
一个直接的问题:number1
根本不参与基本案例2。user58697谢谢,我已经解决了,但算法仍然不起作用。当我尝试用足够大的数字时,一些第一个数字是正确的,但是在中间存在不匹配。提出的代码,实现的算法与实现相同的其他算法没有任何关系。