固定一个整数时的整数乘法


35

令为大小为位的固定正整数。ñAn

允许对这个整数进行适当的预处理。

给定另一个大小为位的正整数,乘法的复杂度是多少?M A BBmAB

请注意,我们已经有算法。这里的查询是我们是否可以通过任何更聪明的方法使\ epsilon = 0(max(n,m))1+ϵϵ=0


6
给定A,只需构造一个具有2n个条目的查找表。(显然,这不是您想要的,但是我认为您应该使您的要求更具体...)
Jukka Suomela 2010年

9
我认为这个问题在标准布尔电路模型中是完全合理的。
诺姆

4
您能总结一下明显的上限和下限以及您知道的最佳结果吗?它表明您关心问题并已经考虑了问题,并且它给其他所有人提供了更多考虑问题的动力。
罗宾·科塔里

4
我认为问问者暗含意味着预处理部分必须仅占用nO(1)空间。(矩阵矢量多重性具有该属性。)
Ryan Williams 2010年

我想知道你想要什么。我觉得我可以经历无休止的案例。这是我的第一个答案,因此,我特别高兴能为您提供尽可能多的信息。如果愿意,您可以通过mgroff100@hotmail.com给我发送电子邮件,我很乐意与您合作。
马特·格罗夫

Answers:


20

尽管它不一定总是最有效的算法,但这个问题与加法链有非常密切的关系。通过加法链快速计算任何算法都可以转换为通过重复加法计算的算法(每个加法当然是运算)。相反,对于任何,一种用于计算的快速算法都会导致一种用于计算的快速算法,但是当然,该算法不一定必须具有加法链的形式。不过,这似乎是一个不错的起点。看看http://en.wikipedia.org/wiki/Addition_chain或查看第一卷。2之Af(B)=ABO(n)ABBA有关更多详细信息,请参见计算机编程艺术


17

为了扩展史蒂文·斯塔德尼基(Steven Stadnicki)的想法,我们可以快速构造一个天真算法,该算法比使用离散傅立叶变换的矩阵乘法要好。

我们计算的个数。如果少于一半的位是1,我们将构造一个位置链表。要相乘,我们只需将左移列表中的每个位置(乘以表示的那个位)并相加结果。AB

如果一半以上的位为1,则与上述相同,但是我们使用零代替填充位置列表。想法是,我们将从所有乘积中获得的总和中减去该总和。为了让所有的人的总和,我们转向通过的位数和减去来源于此。然后我们可以减去从链表中获得的总和。BAB

我们可以称其为朴素的链表算法。在最坏的情况下,它的运行时间为,但在平均情况下,它的运行时间为,对于小情况,它的运行时间比DFT快。O(n2)O(|B||A|2π)|A|

为了最佳地使用列表的思想,我们使用了分而治之。我们将分成两半,并使用朴素算法找到关联列表的大小。如果它们大于5,则在大于5的一半处再次调用朴素算法,直到我们设法将所有一半减为小于5。(这是因为我们可以将其减少为4个减法)A

更好的是,我们改进了分治法。我们遍历分支的所有可能组合,并贪婪地选择最佳分支。此预处理与实际乘法大约需要相同的时间。

如果允许预处理具有无限的自由度,则可以针对所有分支优化求解最优的分治算法。在最坏的情况下,这需要花费时间,但是通过加法链方法应该是最佳的。O(2|A|)

我正在为上述算法计算更精确的值。


嗨,马特:什么是和?|A||B|
T ....

|A|是的大小,在元件的基本数。这等于您的,即。相同 。但是,当与和不同时,该公式仍然成立。AAn|A|n|B|nAB
马特·格罗夫

17

名为乘以常数的乘是亚线性PDF)的论文给出了移位/加法运算的算法,其中是常数的大小。O(nlogn)n

本质上,它的工作原理是寻找在恒定-Bits,移位和添加数量为那些仅被乘以在恒定比特(如长乘法二进制,其中位在底部数相乘的装置顶部不会移位和添加,而位表示顶部已移位和添加)。但是,这仍然是,因为常量中可以有。1101O(n)O(n) 1

纸张然后谈到改变常数的数字表示到双基数系统,其中,显然,非 -Bits是稀疏,如果转换正确地完成(它是一个非常冗余数系统)。他们计算出它的稀疏程度。非零位数的数量限制为小于,因此需要一个亚线性的加法数。但是,由于每次加法的成本(其中是以下项的大小),它仍然是实际操作常数,是其他数字的大小)。0O(n)O(nmlogn)O(m)nm

因此,要回答您的问题,是的,与矩阵向量乘法的结果相似,如果常数不变,则会得到加速。但是当然,这种加速仅是通过天真的长乘法实现的,并且存在比您可以得到的更好的乘法算法。此算法。lognO(n2logn)


@JAS是我的专长:D。
Realz Slaw

3
这在ARITH 2007中以dx.doi.org/10.1109/ARITH.2007.24的形式出现(出于完整性考虑)。
2013年

10

正如Matt Groff所建议的那样,您可能有兴趣向实践社区寻求灵感(或者您所处环境中的是否在当前CPU的位宽范围内)。确实,许多编译器作者和电路设计人员已经考虑了将常量乘以整数的问题,尽管他们通常对“无乘数乘法器”(使用移位,加法和减法进行乘法)感兴趣。我知道的早期参考资料之一是(我从Hacker's Delight 8.4节中学到了这一点):n

Bernstein,R.(1986),乘以整数常数。软件:实践与经验,16:16:641–652。doi:10.1002 / spe.4380160704

文森特·莱夫弗尔(VincentLefèvre)的更多现代作品可以在这里找到(一定要看他的后续作品),他还注意到一个有关有效电路综合的CMU项目(请参见那里的参考资料)。后一个项目甚至考虑同时乘以一组常数。

PS我鼓励您考虑将用户名更改为可识别的名称。


8

我不确定这是否与问题直接相关,但以下基本结果可能会引起人们的兴趣。给定固定的自然数,只要以反向二进制符号(即,最低有效位在前)写入,就可以通过顺序自动机来实现操作。自动机的状态数是,其中是除的最大幂。例如,通过以下自动机来实现的运算。 knknnk/2r2r2kn6n在此处输入图片说明

例如,和。因此,在反向二进制,被写为和(坏的选择,我知道...)为。在此自动机上处理条目给出了路径 185=1+8+16+32+1286×185=1110=2+4+16+64+10241851001110111100110101000110011101

0011101000011110211200110201
可提供正确的输出。我在这里使用的顺序自动机的类型被Schützenberger 称为后继自动机:如您所见,有一个初始前缀(绿色)和一个终端输出功能01101010001(也是绿色)。有关如何以系统方式计算此顺序机器的更多详细信息,请参见此链接

您能详细说明一下吗?
J.-E.

k是质数。>2
T ....

可以对任意完成实现操作的顺序自动机。但是,对于素数,计算此自动机可能会更容易。nknkk
J.-E.

k2r是指数的。
T ....

k是一个固定常数,与不相关。n
J.-E.
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.