Try   HackMD

2017q3 Homework1 (ternary)

tags: 進階電腦系統理論與實作 (Fall 2017)

contributed by < jcyztw >

Balanced ternary 原理介紹

balanced ternary 是以 3 為基底的數值系統,一個 trit (即此系統下一個數的 digit )有三種數值:-1、0、1 ( -1 可寫作

或 T,1 可寫作
+
)。

數的表示法

與 10 進位之間的轉換

以下簡單舉例:

9dec=1×32+0×31+0×30=T00bal3

10Tbal3=1×32+0×31+(1)×30=9+(1)=8dec

整數

(簡單以一些整數作例子)

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
T.010T
T.1TT1
T.10T0
T.11TT
0.T
or
T.1
0.TT11
0.T010
0.T11T
0.0T01
decimal 0.9 0.8 0.7 0.6 0.5 0.4 0.3 0.2 0.1
bal3
1.0T01
1.T11T
1.T010
1.TT11
0.1
or
1.T
0.11TT
0.10T0
0.1TT1
0.010T

從任何整數基底轉換為 balanced ternary

透過以下公式,可轉換成 balanced ternaryl:

(anan1a1a0.c1c2c3)b=k=0nakbk+k=1ckbk

其中

anan1a1a0.c1c2c3 為該數在原來數值系統的表示方式,
b
為原來的基底,
ak
為小數點左邊第 k 位數值,
ck
為小數點右邊第 k 位數值。

以下示範將一個十進位的數轉為 balanced ternary:

25.4dec=(2×101+5×100+4×101)dec=(1T×1011+1TT×1010+11×1011)=(1T×1011+1TT+11÷101)=10T1.11TT=T01T.TT11

邏輯運算

在 Balanced ternary 的邏輯 AND,OR,NOT 運算中,若-1、0、1分別代表 false,unknown,true,則

ABC=MIN(A,B,C,)
ABC=MAX(A,B,C,)

以下表格為上述三個邏輯運算的 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運算

NOT(A)

A
¬A
F T
U U
T F

四則運算

Single-trit 運算

加法

+
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

Multi-trit 運算(以下簡單舉例)

加法

1TT1TT.1TT1+      11T1.T 1T0T10.0TT1+     1T()  1T1110.0TT1+      T()  1T0110.0TT1

減法

1TT1TT.1TT1         1TT1TT.1TT1     11T1.T+      TT1T.1           1T1001.TTT1     +    T   T1()           1110TT.TTT1     + T      1()              1100T.TTT1

乘法

            1TT1.TT×            T11T.1                 1TT.1TT( 1)            T11T.11( T)         1TT1T.T( 1)       1TT1TT( 1)     T11T11( T)      0T0000T.10T

除法
若 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

1TTT11\encloselongdiv1T01T1T=1T1T.01>1Tset 11101TT101TT10<T1set TTTTT11TT11<T1set TTTTTTTT<T1set TTT0

Balanced ternary 可用來解決什麼樣的問題?

應用案例:IOTA / Tangle

在 IOTA 其 GitHub 中,搜尋 "ternary",可在 "kerl" 目錄中找到此關鍵字。
IOTA Kerl 依據其簡介,是用來作 ternary 轉換的 hashing function (基於 Keccak/SHA-3 演算法),其 README 中有更詳細的規格以及實作的介紹。

以下摘錄自其 Kerl 實作的 Java 範例

public void absorb(final int[] trits, int offset, int length) { if (length % 243 != 0) throw new RuntimeException("Illegal length: " + length); do { //copy trits[offset:offset+length] System.arraycopy(trits, offset, trit_state, 0, HASH_LENGTH); //convert to bits trit_state[HASH_LENGTH - 1] = 0; byte[] bytes = convertBigintToBytes(convertTritsToBigint(trit_state, 0, HASH_LENGTH), BYTE_HASH_LENGTH); //run keccak keccak.update(bytes); offset += HASH_LENGTH; } while ((length -= HASH_LENGTH) > 0); }

對既有工具進行修改或者重新開發

  • (pending)

參考資料