Algorithm Karatsuba乘法优化
我玩围棋已经有几个星期了,我实现了一个版本的Karatsuba乘法: 这就提出了两个问题:我的实现真的很糟糕吗?我能做些什么来改善它?big.Mul使用什么算法Algorithm Karatsuba乘法优化,algorithm,go,biginteger,Algorithm,Go,Biginteger,我玩围棋已经有几个星期了,我实现了一个版本的Karatsuba乘法: 这就提出了两个问题:我的实现真的很糟糕吗?我能做些什么来改善它?big.Mul使用什么算法 非常感谢您的帮助,非常感谢对于第二个问题,请检查来源:他们也使用Karatsuba算法。然而,他们用它来计算非常大的数字。在其他情况下,使用更简单的算法。看看这里的理想银行,这是非常有帮助的。 package karatsuba import ( "math" "math/big" ) func k_multiply
非常感谢您的帮助,非常感谢对于第二个问题,请检查来源:他们也使用Karatsuba算法。然而,他们用它来计算非常大的数字。在其他情况下,使用更简单的算法。看看这里的理想银行,这是非常有帮助的。
package karatsuba
import (
"math"
"math/big"
)
func k_multiply(a, b *big.Int) *big.Int {
if a.Cmp(big.NewInt(10)) < 1 || b.Cmp(big.NewInt(10)) < 1 {
return mul(a, b)
}
m := _pivot(a, b)
leftA, rightA := _split(a, uint(m))
leftB, rightB := _split(b, uint(m))
z0 := k_multiply(leftA, leftB)
z1 := k_multiply(rightA, rightB)
z2 := k_multiply(add(leftA, rightA), add(leftB, rightB))
z2 = sub(z2, add(z0, z1))
temp0 := mul(z0, big.NewInt(int64(math.Pow(10.0, 2.0*float64(m)))))
temp1 := mul(z2, big.NewInt(int64(math.Pow(10.0, float64(m)))))
temp2 := add(temp0, temp1)
return add(temp2, z1)
}
func _split(a *big.Int, m uint) (left, right *big.Int) {
denominator := big.NewInt(int64(math.Pow(10.0, float64(m))))
left = big.NewInt(0).Div(a, denominator)
right = sub(a, big.NewInt(0).Mul(left, denominator))
return
}
func _pivot(a, b *big.Int) int {
len_a := len(a.String())
len_b := len(b.String())
if len_a > len_b {
return len_a/2 + len_a%2
} else {
return len_b/2 + len_b%2
}
}
func add(a, b *big.Int) *big.Int {
return big.NewInt(0).Add(a, b)
}
func mul(a, b *big.Int) *big.Int {
return big.NewInt(0).Mul(a, b)
}
func sub(a, b *big.Int) *big.Int {
return big.NewInt(0).Sub(a, b)
}
BenchmarkMultiply 5000000 490 ns/op
BenchmarkKaratsubaMultiply 5000 485348 ns/op