傅立叶分裂算法背后的逻辑是什么?

时间:2009-09-19 01:50:49

标签: algorithm math division largenumber fft

来自维基百科:fourier division

以下是相同的屏幕截图: alt textview in full-resolution

这种算法背后的逻辑是什么?

我知道它可用于划分非常大的数字,但它究竟是如何工作的?

2 个答案:

答案 0 :(得分:5)

这似乎是Long Division算法的巧妙转换。聪明的部分似乎是他们只使用第一个“数字”a1的除法运算,并且避免必须以相同的方式使用另一个a(x),通过减去它们在下一步中应用它们来自临时余数的产品(相对于部分商)。

这可以有效地完成并且它始终有效可能是由于“数字”(在这种情况下为基数100)不是真实数字并且可以合法地假设两者都大于其基数的事实(即,超过100)甚至不到零。这允许在操作中应用每个“数字”的定时具有更大的灵活性,例如,推迟除数的次要数字的应用(a(x> 1)),直到从该数字创建部分商数之后。先前步骤除以a(1),这反过来允许它们作为乘积减法应用,而不是除法运算。

答案 1 :(得分:4)

这是一个非常聪明的算法。我无法想象'JF如何设法得到它,因为即使你知道它存在,也很难看到发生关系。在我看来,他正式化了一种他用来做分割的方法 - 他必须在数字计算器之前的时代手工完成大量的计算,并且他可能更倾向于使用滑动规则,只是为了确定。

确实,人们可以在标准长除法算法的开头模糊地看到方法的轮廓,但这是唯一的线索。你可以在没有看到它的情况下长时间地搜索这种重复。涉及的人数太多了 - 看到关系会让人感到困惑。

通过研究标准乘法算法中的数据流,可以获得另一种直觉。如果你用计算机硬件写出来,你可以看到一个8位乘法单元的正方形阵列沿着它们的底部和右侧排列两个32位数字并向上和向左移动数据,从顶部边缘出来64位答案中的数组。最左边的单元使用被乘数的顶部数字传送产品的顶部两位(8位)数字,并从数组的其余部分向右移动。好?好吧,想象一下反向运行的数组将沿着上边缘的64位除数和32位除数作为输入,比如沿着数组的右边缘。然后它沿着底部边缘输出32位商(还需要生成余数......忘记mo的情况)。现在,数组中最左边的单位从数组的顶部获取被除数的前两位数,从数组的右侧获取除数的最高位,并将商DOWNWARDS的最高位数发送到数组(和底部)以及数组中的余数RIGHTWARDS。

呼!那仅仅是第一位数输出。这只是一个开始。傅立叶的天才在于看到人们如何能够在累积余数中进行输入以便将输入限制为仅限于三个(比如说8位)数字,并且输出仅限于两个(比如8位)数字。反向运行的乘法数组(现在我们可以称之为除法数组)。

当然,这就是我们如何在计算机ALU中进行硬件划分,不需要微码。

至少,我认为这种方法适用于避开微码以支持几十亿个晶体管的地方。我不知道最新CPU的内部,但它们有晶体管可以燃烧。