進階電腦系統理論與實作 (Fall 2017)
contributed by < jcyztw
>
balanced ternary 是以 3 為基底的數值系統,一個 trit (即此系統下一個數的 digit )有三種數值:-1、0、1 ( -1 可寫作或 T,1 可寫作)。
以下簡單舉例:
(簡單以一些整數作例子)
decimal | -12 | -11 | -10 | -9 | -8 | -7 | -6 | -5 | -4 | -3 | -2 | -1 | 0 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
bal3 | TT0 | TT1 | T0T | T00 | T01 | T1T | T10 | T11 | TT | T0 | T1 | T | 0 |
decimal | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
bal3 | 110 | 11T | 101 | 100 | 10T | 1T1 | 1T0 | 1TT | 11 | 10 | 1T | 1 |
(簡單以一些小數作例子)
decimal | -0.9 | -0.8 | -0.7 | -0.6 | -0.5 | -0.4 | -0.3 | -0.2 | -0.1 |
---|---|---|---|---|---|---|---|---|---|
bal3 | or |
decimal | 0.9 | 0.8 | 0.7 | 0.6 | 0.5 | 0.4 | 0.3 | 0.2 | 0.1 |
---|---|---|---|---|---|---|---|---|---|
bal3 | or |
透過以下公式,可轉換成 balanced ternaryl:
其中 為該數在原來數值系統的表示方式, 為原來的基底, 為小數點左邊第 k 位數值, 為小數點右邊第 k 位數值。
以下示範將一個十進位的數轉為 balanced ternary:
在 Balanced ternary 的邏輯 AND,OR,NOT 運算中,若-1、0、1分別代表 false,unknown,true,則
以下表格為上述三個邏輯運算的 truth table:(F: false, U: unknown, T: true)
AND運算
F | U | T | |
---|---|---|---|
F | F | F | F |
U | F | U | U |
T | F | U | T |
OR運算
F | U | T | |
---|---|---|---|
F | F | U | T |
U | U | U | T |
T | T | T | T |
NOT運算
F | T |
U | U |
T | F |
加法
T | 0 | 1 | |
---|---|---|---|
T | T1 | T | 0 |
0 | T | 0 | 1 |
1 | 0 | 1 | 1T |
減法 | |||
(與除法一樣,最左方行為第 1 個運算元,最上方列為第 2 個運算元,且無交換性。例如 1-T 的答案在表格左下角那格,所以 1-T = 1T) | |||
T | 0 | 1 | |
:-: | :-: | :-: | :-: |
T | 0 | T | T1 |
0 | 1 | 0 | T |
1 | 1T | 1 | 0 |
乘法 | |||
T | 0 | 1 | |
:-: | :-: | :-: | :-: |
T | 1 | 0 | T |
0 | 0 | 0 | 0 |
1 | T | 0 | 1 |
除法 | |||
T | 0 | 1 | |
:-: | :-: | :-: | :-: |
T | 1 | NaN | T |
0 | 0 | NaN | 0 |
1 | T | NaN | 1 |
加法
減法
乘法
除法
若 dividend 小於一半除數的絕對值,則商數的該 trit 不是 1 就是 T (取決於 dividend 是正數或負數);若 dividend 大於一半除數的絕對值,則該 trit 為 0。而在決定商數的每個 trit 之前,dividend 都要先跟一半的除數先比較大小。
上述原文:
If the dividend over the plus or minus half divisor, the trit of the quotient must be 1 or T. If the dividend is between the plus and minus of half the divisor, the trit of the quotient is 0. The magnitude of the dividend must be compared with that of half the divisor before setting the quotient trit.
以下簡單舉例:
divisor: 11
0.5 divisor: 1T
在 IOTA 其 GitHub 中,搜尋 "ternary",可在 "kerl" 目錄中找到此關鍵字。
IOTA Kerl 依據其簡介,是用來作 ternary 轉換的 hashing function (基於 Keccak/SHA-3 演算法),其 README 中有更詳細的規格以及實作的介紹。
以下摘錄自其 Kerl 實作的 Java 範例: