からつばアルゴリズムを知り、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 桁またはそれ以上の数値の場合、これは通常よりもかなり遅くなります。このアルゴリズムを改善するにはどうすればよいですか?