【发布时间】:2022-06-27 10:38:23
【问题描述】:
我需要尽可能高效地将几个大长整数相乘。
我正在尝试实现 Harvey & van der Hoeven 2019 整数乘法算法,但我坚持理解其背后的定义和数学,尤其是 Agarwal-Cooley 算法。
任何有助于理解此算法的帮助,例如实际示例或一些伪代码,我们将不胜感激。
【问题讨论】:
我需要尽可能高效地将几个大长整数相乘。
我正在尝试实现 Harvey & van der Hoeven 2019 整数乘法算法,但我坚持理解其背后的定义和数学,尤其是 Agarwal-Cooley 算法。
任何有助于理解此算法的帮助,例如实际示例或一些伪代码,我们将不胜感激。
【问题讨论】:
请记住,Big O notation 被定义为存在一些 x≥x₀,对于所有这些 x,一些函数 |f(x)|≤εg(x)。
Harvey & van der Hoeven (2019) 算法的问题在于所涉及的 x₀ 非常大。因此,对于大多数输入,他们的算法提供了一种低效整数乘法的方法。但是,对于非常大的数字,该算法确实给出了 O(n log n) 算法。
但是这些数字有多大?作者之一大卫·哈维states:
新算法在当前形式下并不实用,因为我们论文中给出的证明仅适用于可笑的大数。即使每个数字都写在氢原子上,在可观测宇宙中也几乎没有足够的空间来写下它们。
另一方面,我们希望通过进一步改进,该算法可能对仅具有数十亿或数万亿位数的数字变得实用。如果是这样,它很可能会成为计算数学家武器库中不可或缺的工具。
因此,如果您对自己的既定目标很认真——快速将大数相乘——那么这个算法不是你应该做的。
【讨论】:
如果您的长整数小于 10000 位,并且您使用的是普通的 32 位或 64 位计算机,我建议使用 Karatsuba-Offman。它可以使用并行加速,例如多线程或GPU。 如果您想制作一个完全并行的定制芯片,请使用 4XY = (X+Y)^2-(X-Y)^2 并构建一个 Karatsuba-Offman 平方器。这需要更少的芯片面积,因为平方器只有 n 条输入线,而不是 2n 条
【讨论】: