簡體   English   中英

是否有自然數的代數表示形式允許並行加法?

[英]Is there any algebraic representation of natural numbers that allow for parallel addition?

自然數可以使用二進制表示形式(在這里為little-endian)在對數空間中表示:

-- The type of binary numbers; little-endian; O = Zero, I = One
data Bin = O Bin | I Bin | End

的加成ab然后可以實現,例如,通過調用successor函數( O(log(N)) a上時間b 這種實現方式的問題在於它本質上是順序的。 為了添加2個數字, suc調用按順序鏈接。 add其他實現(例如使用進位)也遇到相同的問題。 很容易看出添加不能與該表示並行執行。 使用代數數據類型有沒有自然數的表示形式?它需要對數空間,並且可以並行進行加法運算?

說明代碼:

-- The usual fold  
fold :: Bin -> (t -> t) -> (t -> t) -> t -> t
fold (O bin) zero one end = zero (fold bin zero one end)
fold (I bin) zero one end = one (fold bin zero one end)
fold E zero one end       = end

-- Successor of `Bin` - `O(log(N))`
suc :: Bin -> Bin
suc (O bin) = I bin
suc (I bin) = O (suc bin)
suc E       = E

-- Calls a function `a` times
times :: Bin -> (t -> t) -> t -> t
times a f x     = fold a zero one end f where 
    one bin fs  = fs (bin (fs . fs))
    zero bin fs = bin (fs . fs)
    end fs      = x

-- Adds 2 binary numbers
add :: Bin -> Bin -> Bin
add a b = (a `times` suc) b

-- 1001 + 1000 = 0101
main = print $ add (I (O (O (I E)))) (I (O (O (O E))))

有許多並行加法器體系結構。 1996年,德克薩斯大學奧斯汀分校的托馬斯·沃克·林奇(Thomas Walker Lynch)的碩士學位論文獲得了出色的評價。 請參閱第9.1節,其中他總結了最壞情況下的路徑長度。

Lynch和Swartzlander加法器(L&S)的最壞情況下路徑長度為2 * ceil(log4(N))+ 2,其中N是該位數。 他們的論文“生成樹攜帶前瞻加法器”中提出了該體系結構。

通過搜索“快速加法器”,您可以找到有關許多簡單體系結構的出色解釋。

您並不是說每個自然數都必須具有唯一的表示形式。 因此,這是另一種選擇。 (我沒有發明它,但是我不記得它叫什么,所以我不得不重新構造它的工作方式。)

以二進制形式將數字表示為以2為底的數字字符串,除了二進制(而不是限於數字0和1)之外,我們還被允許使用數字2。因此,例如,數字2具有兩種表示形式,即10和2 。

要添加以這種方式表示的兩個數字,只需將它們按數字方向相加而不帶進位即可。 顯然,我們可以並行高效地執行此操作(使用線性尺寸,恆定深度的電路)。 好吧,現在我們有一個問題:結果數字具有正確的以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

新數字具有相同的以2為底的值,並且由於由0、1或2的數字與0或1的數字之和構成,因此其數字現在在0到3的范圍內。結果的每個數字僅取決於相應的數字和步驟中數字右側的數字,因此這可以通過另一個線性大小,恆定深度的電路來實現。

這還不夠好,所以讓我們再一次進行相同的進位傳播。 現在,4不再是可能的輸入數字,因此我們攜帶的數字永遠不能為2,只能是0或1。因此,此過程將導致以2為基數的表示形式僅使用數字0、1和2。這就是我們想要的。 在上面的示例中,結果將為1210110 (當然,其他具有相同基數2值的表示形式也是正確的。)

(對於基數和最大位數的其他組合,您可能只需要進行一次進位傳播。例如,如果使用數字0、1、2、3和4表示基數為3的數字,則總和中出現的最大位數為8 ,因此,進位傳播通道中涉及的兩個數字都將在0、1、2范圍內,並且它們的總和將已不超過4。)


現在,如果您要對該表示形式進行其他操作,例如比較兩個數字是否相等,則一種選擇是轉換為二進制,既可以線性時間串行轉換,也可以使用Lior Kogan答案中所述的快速加法器並行轉換為二進制。 實際上,將這種表示形式轉換為二進制基本上等於在二進制中加上數字的問題,因為我們可以將像212001這樣的表示形式視為“形式加法” 101000 + 111001 但是,您可能無法像在二進制文件中那樣以恆定的深度測試此表示形式中的相等性。 我想在給定其他約束的情況下,無論是加法還是相等測試,“硬度”都是必不可少的,盡管我不確定。

描述自然數並行加法的一種簡單方法是:如果看完整的加法器電路 ,它有3個輸入位,並且輸出一個2位數字,表示多少個輸入位為1。這也是為什么有時稱為3:2壓縮器 通過它們,我們可以創建一個電路,該電路並行添加3個二進制數以產生2個二進制數。 這也稱為進位保存加法器電路,因為我們沒有傳播進位,而是將它們保留為另一個單獨的數字。 每個數字然后(冗余地)表示為一對二進制數字。 當添加k個自然數時,在每一步我們都可以將三元組減少為元組,只需要O(log k)個時間步長。

但是問題是,如果我們僅限於ADT,則我們有一組固定的構造函數,每個構造函數都有有限數量的記錄。 因此,無論如何,這種結構的深度將為O(log n) 我們必須執行O(log n)步驟才能遍歷結構。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM