# 2017q3 Homework1 (Ternary)
contributed by < `BreezeDa` >
## 作業要求
- [x] 解釋 Balanced Ternary 原理
- [ ] Balanced Ternary 的設計要解決什麼類型的問題,需要詳述實際應用案例 (如 IOTA/Tangle)。提示:從算術表達的精準度和空間使用效率去探討;
- [ ] 針對特定的領域 (如加密貨幣),列出在 GitHub 裡頭可找到的應用案例,不僅列出程式碼,還要解說
- [ ] 在研究的過程中,應該會對既有工具進行修改或者重新開發 (不限程式語言),也該一併指出,程式碼應該維護在 GitHub 上
> [time=Wed, Oct 2, 2017 1:52 PM] 1st version
## Ternary
在講到 Balanced Ternary 之前我們先簡介一下 ternary,ternary 是以 3 為基數的進位方式,中文稱為`三進制`,我們知道 binary 使用 0,1 表示一個數字,而在 ternary 中我們則使用 0,1,2 來表示一個數字。下方是個 10 進位轉三進位的說明。
## Balanced Ternary
### 簡介
Balanced Ternary 與 ternary 不同,數值表示不使用 0, 1, 2 , 而是 -1, 0, 1 ( 亦可標示為 T, 0, 1 或 -, 0, + )。而且由於 -1 的引入,這種進位不需要額外的符號就能直接表示負數。下方我們 基數符號使用 b3 表示 balanced ternary
### 數值表示
#### 整數
| decimal | balanced ternary |
|---------|------------------|
| -7 | T1T , -+\- |
| -5 | T11 , -++ |
| -2 | T1 , -+ |
| 2 | 1T , +\- |
| 5 | 1TT , +\-\- |
| 7 | 1T1 , +\-+ |
**解析**
$-7_{10} = T1T_{b3} = -1 \times 3 ^ 2 + 1 \times 3 ^ 1 + -1 \times 3 ^ 0$
$5_{10} = T1T_{b3} = 1 \times 3 ^ 2 + -1 \times 3 ^ 1 + -1 \times 3 ^ 0$
#### 小數
| decimal | balanced ternary |
|---------|------------------ |
| -0.5 | $\overline{0.T}$ or $\overline{T.1}$ |
| -0.4 | $\overline{0.TT11}$ |
| -0.1 | $\overline{0.0T01}$ |
| 0.1 | $\overline{0.010T}$ |
| 0.4 | $\overline{0.11TT}$ |
| 0.5 | $\overline{0.1}$ or $\overline{1.T}$ |
**解析**
* 一開始看到 $0.5_{10} = \overline{0.1}_{b3}$,還沒搞明白這兩個是怎麼個相等法,後來看到[benson326](https://hackmd.io/s/HJlqHCjqW)用等比級數的公式算一遍才頓悟。以下則是計算 $0.4_{10} =\overline{0.11TT}$ :
$\overline{0.11TT}_{b3} = 1 \times 3 ^ {-1} + 1 \times 3 ^ {-2} - 1 \times 3 ^ {-3} - 1 \times 3 ^ {-4} + 1 \times 3 ^ {-5} + 1 \times 3 ^ {-6} - 1 \times 3 ^ {-7} - 1 \times 3 ^ {-8} + ...\\
= 3 ^ {-1} + 3 ^ {-5} + 3 ^ {-9} +...\\
\ \ \ \ 3 ^ {-2} + 3 ^ {-6} + 3 ^ {-10} + ...\\
-(3 ^ {-3} + 3 ^ {-7} + 3 ^ {-11} + ...)\\
-(3 ^ {-4} + 3 ^ {-8} + 3 ^ {-12} + ...)$
$=\dfrac{3 ^ {-1}}{1-\dfrac{1}{3 ^ 4}} + \dfrac{3 ^ {-2}}{1-\dfrac{1}{3 ^ 4}} - \dfrac{3 ^ {-3}}{1-\dfrac{1}{3 ^ 4}} - \dfrac{3 ^ {-4}}{1-\dfrac{1}{3 ^ 4}} = 0.4_{10}$
* **由以上整數與小數的表示中可以看出正數與負數之間的轉換,其實只要將 1 轉成 T ,T 轉成 1 就可**
### 運算
latex 表格參考 [as23041248](https://hackmd.io/OwDmE4FMGMFZILQEMBGAmADAgLO7yBGFYBANm2jTBAGYUATSeoA=?both) 並增加減法,並分別給予一個計算範例
#### 加法
\begin{array}{c|ccc}
ADD & T & 0 & 1 \\
\hline
T & T1 & T & 0 \\
0 & T & 0 & 1 \\
1 & 0 & 1 & 1T
\end{array}
e.g. $T1TT + 1T1$
\begin{array}{ccccccccc}
& & & \tiny T \\
& & T & 1 & T & T\\
& + & & 1 & T & 1 \\
\hline
& & T & 1 & 1 & 0 \\
\end{array}
> $T+T = T1$ 我將 T 寫下一位上方
#### 減法
\begin{array}{c|ccc}
SUB & T & 0 & 1 \\
\hline
T & 0 & T & T1 \\
0 & 1 & 0 & T \\
1 & 1T & 1 & 0
\end{array}
>左欄減頂列
e.g. $T11T - 11TT$
\begin{array}{ccccccccc}
& & & & &\tiny T \\
& & & T & 1 & 1 & T\\
& - & & 1 & 1 & T & 1 \\
\hline
& & T & 1 & 0 & 1 & 1 \\
\end{array}
> $T -1 = T1$ 我將T寫在第二位的上方 => 第二位(由右往左數) $T + 1 -T = 1$
#### 乘法
\begin{array}{c|ccc}
MUL & T & 0 & 1 \\
\hline
T & 1 & 0 & T \\
0 & 0 & 0 & 0 \\
1 & T & 0 & 1
\end{array}
e.g. $T1T \times 1T$
\begin{array}{ccccccccc}
& & & T & 1 & T\\
& \times & & & 1 & T \\
\hline
& & & 1 & T & 1 \\
& + & & T & 1 & T\\
\hline
& & T & 1 & 1 & 1\\
\end{array}
### 效率
由 [Ripple Adder in Binary and Ternary Logic](https://www.youtube.com/watch?v=TfJxAb0owj8) 可以看出在 ripple adder 中同樣的運算,ternary logic 比標準 binary 來得快
:::danger
「所以應該」?這是理工人說的話嗎?
:notes:
:::
## 參考資料
[wikipedia: blanced ternary](https://en.wikipedia.org/wiki/Balanced_ternary)
[Ternary numeral system](https://en.wikipedia.org/wiki/Ternary_numeral_system)