gpt4 book ai didi

algorithm - 在 Haskell 中实现 Karatsuba 算法

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:05:38 25 4
gpt4 key购买 nike

我刚刚了解 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 位甚至更大的数字时,这比普通 * 慢很多。我该如何改进这个算法?

最佳答案

实际上我怀疑你能否提高性能以击败天真的运算符 - Haskell 使用 GMP在引擎盖下,当算法在值范围内运行良好时,它应该自动使用 Toom-3 或其他算法。幼稚的 Karatsuba 可能甚至不会被使用,但据说 Toom 系列在算法上接近它。如果您仔细想想,GHC 没有理由不使用一些高级算法进行乘法运算,因为他们已经开箱即用地支持它。

我上次检查时,GMP 非常快,即使在正常的 double 范围内使用,也至少与 gcc 的编译结果一样快。

有一个 proposal关于从 GHC 中删除 GMP,但它似乎相当不活跃。

编辑:感谢@danvari,这里是 GMP 使用的不同算法:http://gmplib.org/manual/Multiplication-Algorithms.html#Multiplication-Algorithms .当数字足够小时,似乎 Karatsuba 确实会被使用,除了通常的 Toom-Cook 系列外,还使用 ​​FFT。

关于algorithm - 在 Haskell 中实现 Karatsuba 算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16989852/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com