我刚刚了解了 Karatsuba 算法,并尝试在 Haskell 中实现它。
这是我的代码:
(***) :: Integer -> Integer -> Integer
x *** y
| max x y < ub = x*y
| otherwise =z2*base*base + ((x1+x0)***(y1+y0)-z2-z0)*base + z0
where
base =10^((length . show $ max x y) `div` 2)
z2 =x1***y1
z0 = x0***y0
(x1, x0) = helper x
(y1, y0) = helper y
helper n = (n `div` base, n `mod` base)
ub = 10000
只要我检查像 20 -30 位这样的大数字并且对 10-20 位数字足够快,这就能准确地工作。*
但是,当 100 位甚至更大的数字时,这比正常情况要慢很多。我怎样才能改进这个算法?