自然数可以使用二进制表示形式在对数空间中表示(此处为little-endian):
-- The type of binary numbers; little-endian; O = Zero, I = One
data Bin = O Bin | I Bin | End
然后可以实施a
和b
的添加,例如,在{{1}上调用successor
函数(O(log(N))
)a
次}}。这种实现的问题在于它本质上是顺序的。为了添加2个数字,b
个调用按顺序链接。 suc
的其他实现(例如使用carry)遭受同样的问题。很容易看出,添加不能与该表示并行实现。 是否有自然数的表示,使用代数数据类型,它采用对数空间,并且可以并行添加?
插图代码:
add
答案 0 :(得分:4)
有许多并行加法器架构。 Thomas Walker Lynch's master's thesis at the university of Texas at Austin, 1996给出了一个很好的评论。参见9.1节,他总结了最坏情况下的路径长度。
Lynch和Swartzlander加法器(L& S)的最坏情况路径长度为2 * ceil(log4(N))+ 2,其中N是该位数。该架构在他们的论文 A Spanning Tree Carry Lookahead Adder 中提供。
您可以通过Google搜索“快速加法器”找到有关许多简单架构的出色解释。
答案 1 :(得分:1)
您没有说每个自然数必须具有唯一的表示。所以,这是另一种选择。 (我没有发明它,但我不记得它叫什么,所以我不得不重建它是如何工作的。)
将数字表示为基数2中的数字串,如二进制,除了不限于数字0和1,我们还允许使用数字2.例如,数字2有两个表示, 10和2。
要添加以这种方式表示的两个数字,只需按数字方式添加它们而不携带。显然,我们可以并行有效地做到这一点(线性尺寸,恒定深度电路)。那么,现在我们遇到了一个问题:结果数字具有正确的base-2值,但其数字不一定是0,1或2,但可能大到4。
所以让我们通过以下进位传播来解决这个问题:将结果的每个数字写成两位二进制数,其中第二个数字是0或1,第一个数字可以是0,1或2.(所以0 - > 00,1 - > 01,2 - > 10,3 - > 11,4 - > 20.)现在“携带”每个这两位数字的第一个数字到左边,离开在第二个数字后面,但没有执行任何其他结果。例如,如果我们从数字
开始 314102 (perhaps from the original problem of computing 212001 + 102101)
我们执行总和
11 = 3
01 = 1
20 = 4
01 = 1
00 = 0
10 = 2
-------
1130110
新数字具有相同的base-2值,其数字现在在0到3的范围内,因为它们是由0,1或2的数字和0的数字之和形成的1.此外,结果的每个数字仅取决于相应的数字和步骤中数字右侧的数字,因此可通过另一个线性尺寸,恒定深度电路实现。
这还不够好,所以让我们再一次进行相同的进位传播。现在,4不再是一个可能的输入数字,所以我们携带的数字永远不会是2,只有0或1.所以这次程序将导致只使用数字0,1和2的基数2表示,这就是我们想要的。在上面的示例中,结果将为1210110
。 (当然,具有相同base-2值的任何其他表示也是正确的。)
(对于基数和最大数字的其他组合,您可能只需要一个进位传播通道。例如,如果您使用数字0,1,2,3和4表示基数3中的数字,则出现在sum是8,因此进位传播传递中涉及的两个数字将在0,1,2范围内,并且它们的总和最多为4。)
现在,如果你想对这种表示做其他操作,例如比较两个数字是否相等,一个选项是按线性时间串行转换为二进制,或者使用Lior Kogan所描述的快速加法器并行转换为二进制回答。事实上,将此表示转换为二进制基本上等同于在二进制中添加数字的问题,因为我们可以将212001
之类的表示视为“正式加法”101000 + 111001
。但是,您可能无法像二进制一样在恒定深度中测试此表示中的相等性。我认为,考虑到你的其他限制因素,在这种加法或相等测试意义上的“硬度”是必不可少的,尽管我不确定。
答案 2 :(得分:0)
如何描述自然数的并行加法的一个简单方法是:如果你看full adder circuit,它有3个输入位,它输出一个2位数字,表示有多少输入位是1 。 这也是它有时被称为3:2 compressor的原因。从它们我们可以创建一个并行添加3个二进制数的电路,以产生2个二进制数。这也称为carry-save adder电路,因为我们将它们作为另一个独立的数字而不是传播进位。然后(冗余地)将每个数字表示为一对二进制数。当添加 k 自然数时,我们可以在每一步将三元组减少为元组,只需 O(log k)时间步。
但问题是,如果我们仅限于ADT,我们有一组固定的构造函数,每个构造函数都有有限数量的记录。所以无论如何,这种结构的深度将是 O(log n)。我们必须执行 O(log n)步骤才能遍历结构。