# 2017q3 Homework1 (ternary) contributed by <`yusihlin`> ### Reviewed by `tina0405` * 在介紹真值表,和電路實現上很清楚,只可惜缺乏實際應用的案例和對針對程式碼需求的修改 ## Balanced Ternary 介紹 三位元數值系統由三種符號組成,直觀上會以 0,1,2 來表示三進制,然而 Balanced Ternary 以 -1,0,+1 三種符號代表,由於 -1 的存在不需多餘的符號即可表示負數。 ### **數值轉換** *(-1 記為 T)* $\begin{split}193_{dec} &= 1\times2^7 + 1\times2^6 + 0\times2^5 + 0\times2^4 + 0\times2^3 + 0\times2^2 + 0\times2^1 + 1\times2^0 = 11000001_{2}\\ &= 2\times3^4 + 1\times3^3 + 0\times3^2 + 1\times3^1 + 1\times3^0 = 21011_{3}\\ &= 1\times3^5 + (-1)\times3^4 + 1\times3^3 + 0\times3^2 + 1\times3^1 + 1\times3^0 = 1T1011_{bal3}\end{split}$ * 透過觀察可知使用 2 進位表示 193 這個數字需要 8 個位元,而使用 Balanced Ternary 只需要 6 個位元,至於 $21011_{3}$ 到 $1T1011_{bal3}$ 的轉換可以參考 [zhanyangch](https://hackmd.io/s/SyEBnPzsW) 同學的共筆,根據 $2\times3^k = (3-1)\times3^k = 1\times3^{k+1} + (-1)\times3^k$ 我們可以用**1T表示2**(同理可用T1表示 -2),在 [wikipedia](https://en.wikipedia.org/wiki/Balanced_ternary) 中對 Balanced Ternary 的介紹還有一種方法是先 +1 並允許進位,接著再 -1 不允許借位,本來範圍由 0,1,2 平移到 -1,0,1 ,以下為說明: $21011_{3} + 11111_{3} = 102122_{3}\\ 102122_{3} - 11111_{3} = 1T1011_{bal3}$ $-193_{dec} = (-1)\times3^5 + 1\times3^4 + (-1)\times3^3 + 0\times3^2 + (-1)\times3^1 + (-1)\times3^0 = T1T0TT_{bal3}$ * 由正負數的比較可以看出差別只在 +1 和 -1 的對換,優點是不用像二進位需透過補數來表示負數。 ### **運算** * 邏輯概念:如果 Ternary 的3個邏輯概念為 true, unknown, false ,則會有以下關係 |Balanced|Logic |Unsigned| |:------:|:-----:|:------:| |T |False |0 | |0 |Unknown|1 | |1 |True |2 | * 邏輯 NOT, AND, OR, XOR * NOT |$a$|$\bar a$| |:-:|:------:| |T |1 | |0 |0 | |1 |T | * Min or AND |c |T|0|1| |:---:|-|-|-| |**T**|T|T|T| |**0**|T|0|0| |**1**|T|0|1| $c\ =\ (a \wedge b)\ =\ min(a,b)$ * Max or OR |c |T|0|1| |:---:|-|-|-| |**T**|T|0|1| |**0**|0|0|1| |**1**|1|1|1| $c\ =\ (a \vee b)\ =\ max(a,b)$ :::info $(a \vee b)\ =\ -(-a \wedge -b)\ \ or\ \ max(a,b)\ =\ -min(-a,-b)\\ (a \wedge b)\ =\ -(-a \vee -b)\ \ or\ \ min(a,b)\ =\ -max(-a,-b)$ 滿足 DeMorgan's laws ,所以我們只需 max 或 min 並將符號反相即可得另一個。 ::: * XOR |c |T|0|1| |:---:|-|-|-| |**T**|T|0|1| |**0**|0|0|0| |**1**|1|0|T| $c\ =\ (a \oplus b)$ * 加法器 * Half-adder |$\mathbf{a_i}$|$\mathbf{b_i}$|$\mathbf{s_i}$|$\mathbf{c_{i+1}}$| |:------------:|:------------:|:------------:|:----------------:| |T |T |1 |T | |T |0 |T |0 | |T |1 |0 |0 | |0 |T |T |0 | |0 |0 |0 |0 | |0 |1 |1 |0 | |1 |T |0 |0 | |1 |0 |1 |0 | |1 |1 |T |1 | 分別看 $\mathbf{s_i}$ 和 $\mathbf{c_{i+1}}$ |$\mathbf{s_i}$|T|0|1| |:------------:|-|-|-| |**T** |1|T|0| |**0** |T|0|1| |**1** |0|1|T| $s_i\ =\ (a+b)\ =\ (\ (a=T)\wedge(b-1)\ )\vee(\ (a=0)\wedge(b))\wedge((a=1)\vee(b+1)\ )$ :::info 在二進位中我們是以 $\mathbf{s_i\ =\ a_i \oplus b_i }$ 來表示,但由真值表可看出 $\mathbf{s_i\ \neq\ a_i \oplus b_i }$ ::: 當我們以 [Sum-of-products canonical form](https://courses.cs.washington.edu/courses/cse370/97au/admin/Slides/Week2Lecture3/sld003.htm) 做化簡時 T 會被消除,此時剩下 6 個 minterms ,在布林邏輯中每個 minterms 有兩個輸入,但在這裡我們增加一個輸入常數以指向最後的輸出,所以會變成 $\begin{split}s_i\ =\ (a+b)\ &=\ (\ (a=T)\wedge(b=T))\wedge 1\ )\\ &\vee\ (\ (a=T)\wedge(b=1))\wedge 0\ )\\ &\vee\ (\ (a=0)\wedge(b=0))\wedge 0\ )\\ &\vee\ (\ (a=0)\wedge(b=1))\wedge 1\ )\\ &\vee\ (\ (a=1)\wedge(b=T))\wedge 0\ )\\ &\vee\ (\ (a=1)\wedge(b=0))\wedge 1\ )\\ \end{split}$ |$\mathbf{c_{i+1}}$|T|0|1| |:----------------:|-|-|-| |**T** |T|0|0| |**0** |0|0|0| |**1** |0|0|1| $c_{i+1}\ =\ a⊠b\ =\ (a\wedge b)\vee(\ (a\neq T)\wedge 0\ )\vee(\ (b\neq T)\wedge 0\ )$ 同理 $\mathbf{c_{i+1}}$ 也不像二進位為 a & b ,用前面的方法化簡的話會有 8 個 minterms ,這裡就不再列出。 雖說 Balanced Ternary 的空間使用度較佳,但也因為多狀態的存在使得電路設計複雜的多。 :::info 有了真值表後我們需要構建一個基本構件以實現半加法器,參考 [Ternary computing: basics](https://github.com/ssloy/tutorials/wiki/Ternary-computing:-basics) 設計了一個多工器,輸入一個進行基本運算的變數輸出對應的功能 ( [unary function](https://en.wikipedia.org/wiki/Unary_function) ) , 5 個引腳中一個接收三位元的輸入, inN, inO, inP 根據多工器所需功能而設定以產生相應的輸出。 ::: ![](https://raw.githubusercontent.com/ssloy/tutorials/master/ternary/doc/multiplexer.png) 透過上面的真值表設計 4 個不同功能的多工器 A+1, A+1, max(A,0), min(A,0) ,以下拿 max(A,0) 做說明 ![](https://raw.githubusercontent.com/ssloy/tutorials/master/ternary/doc/max(A%2C0).png) 前面已推導出 max 的真值表,這邊我們輸入 A 做引數,另一個輸入 B 為 0 ,則由真值表截取 B = 0 那行應有的輸出為 (0,0,1),所以如果我們要做出有 max(A,1) 的多工器,則產生的輸出應為 (1,1,1) 當作 inN, inO, inP 的輸入。 接下來就能透過多工器實現 $\mathbf{s_i}$ 和 $\mathbf{c_{i+1}}$ ![](https://raw.githubusercontent.com/ssloy/tutorials/master/ternary/doc/A%2BB.png) 這邊看會比較複雜一點,首先看真值表,不看 A 當 B 的輸入 (-1,0,1) 各會產生三個輸出,當 B 為 -1 時,需傳入的輸入為 (1,-1,0) ,所以在前一層我們須使用功能為 A-1 的多工器傳入第二層的 inN ,依此類推 inO 傳入 (-1,0,1) 也就是 A , inP 傳入 (0,1,-1) 也就是 A+1。 ![](https://raw.githubusercontent.com/ssloy/tutorials/master/ternary/doc/cons(A%2CB).png) $\mathbf{c_{i+1}}$ 的部分由真值表也可以知道分別需傳入 ( min(A,0),0,max(A,0) ) 以產生對應的真值表。 * Full-adder 與半加法器相較全加法器有三個輸入 $\mathbf{A, B, C_{in}}$ 及兩個輸出 $\mathbf{S, C_{out}}$ ![](https://raw.githubusercontent.com/ssloy/tutorials/master/ternary/doc/A%2BB%2BCin.png) **S** 的部分有三層,第一層輸入 **A** ,第二層輸入 **B** ,第三層輸入 $\mathbf{C_{in}}$ ,因此 function 為 $\mathbf{(A+B+C_{in})}$ ,將各層展開為圖中紅色字體,綠色區域為原本的半加法器,當 $\mathbf{C_{in}=0}$ 時會退化成半加法器。 ![](https://raw.githubusercontent.com/ssloy/tutorials/master/ternary/doc/overflow.png) 前面 **S** 的部分可以直接看出,在看 $\mathbf{C_{out}}$ 要搭配 [真值表](http://homepage.divms.uiowa.edu/~jones/ternary/arith.shtml),然後將 $\mathbf{C_{in} = (T,0,1)}$ 的部分取出來看 |$\mathbf{C_{in} = T}$|T|0|1| |:-------------------:|-|-|-| |**T** |T|T|0| |**0** |T|0|0| |**1** |0|0|0| 當 $\mathbf{C_{in} = T}$ 時有三個組合對應 (A,B) 分別為 (T,T),(T,0),(0,T) |$\mathbf{C_{in} = 0}$|T|0|1| |:-------------------:|-|-|-| |**T** |T|0|0| |**0** |0|0|0| |**1** |0|0|1| 當 $\mathbf{C_{in} = 0}$ 時與半加法器的 $\mathbf{c_{i+1}}$ 相同 |$\mathbf{C_{in} = 1}$|T|0|1| |:-------------------:|-|-|-| |**T** |0|0|0| |**0** |0|0|1| |**1** |0|1|1| 當 $\mathbf{C_{in} = 1}$ 時有三個組合對應 (A,B) 分別為 (0,1),(1,0),(1,1) ## Balanced Ternary 的設計要解決甚麼類型的問題 ### Radix Economy 基需 (Radix Economy) 的概念是指在一個固定基數下表示一個數需要的開銷。在表示一個數時同時考慮到基數與位數,例如要表示 0~9 時在基數為 2 下需要 4 位數,在基數為 10 下只需要 1 位數,綜合考量下對基需有明確定義,對於任意數 N,在基數為 R 下表示數字需要 $log_rN+1$ 位數,也就是 $E(r,N)\ =\ r\times(log_rN+1)$ 把上式看成連續函數的極值問題 $E(r,N)\ =\ r\times(log_rN+1)\ \approx\ r\times(log_rN)\ =\ (r/ln(r))\times ln(N)$ 則可以發現當 r = e 時值最小,再來是 3, 2, 4 ![](https://www.researchgate.net/profile/Sverre_Johnsen2/publication/308417722/figure/fig1/AS:409125361078272@1474554495314/Figure-21-Most-economical-radix-for-a-numbering-system-is-e-about-2718-when-economy.jpg) 透過數學證明在整數上三進制是最經濟的進制,可是為何如今的計算機結構仍採用二進制?在 [The most efficient radix is not e](http://hummusandmagnets.tumblr.com/post/48664858476/the-most-efficient-radix-is-not-e) 中對於 Radix Economy 有其他的看法 :::info 要判斷哪個基數比另一個更有效取決於你想表達的數字,這意味著如果你想要表示 $N$ 個值的範圍,則可以最有效地表示這些值的基數 $R$ 是對於某些 $k$, $R^k$ 最接近於 $N$ 的基數 $R$ ,他們可能是 2,3 或是 10,這一切都取決於 $N$ ,當 $N=10$ 為 radix-10 因為 $10=10^1$,當 $N=64$,則有 $64=2^6=4^3=8^2$。 ::: 如果這樣不就意味著最好的基數總會是想表達的數字 N 本身嗎?事實上的確是如此,但當你要使用它時必須先構建出可以與其搭配的硬體,基數越大難以量化,這表示為了實際目的 R 不能太大。 來比較 radix-2 [2, 4, 8, 16, 32, 64...]和 radix-3 [3, 9, 27, 81, 243, 729...],選擇一個隨機數 N,你可以預期 N 到下一個 $2^k$ 的距離較 $3^k$ 小,隨著基數增長差距越來越大。 ### **參考文獻** * [Douglas W. Jones on Ternary Logic](http://homepage.divms.uiowa.edu/~jones/ternary/logic.shtml) * [三生萬物](http://www.global-sci.org/mc/issues/5/no4/freepdf/79s.pdf) * [Brian Hayes_Third Base](http://bit-player.org/wp-content/extras/bph-publications/AmSci-2001-11-Hayes-ternary.pdf)(待閱讀) * [【獨家】化學計算、濕件計算、流體計算和三元計算,這些「非常規計算」將挑戰摩爾定律](http://oicwx.com/detail/221560)(待整理)