平衡三进位

平衡三进制（balanced ternary）是一种非标准的计数进位制，它是一种基数为$3$的进位制系统，其中用于计数的符码为${ -1, 0, 1 }$，与标准基数 3 进制系统对比：其中的计数符号为${ 0, 1, 2 }$。以平衡三进制所记录的数字可以表达出全部整数，由于$-1$的引入，而且对负数不必使用额外的负号；应用在于解决秤重问题，或在一些早期的计算机中使用。

有些地方使用不同符码来表示平衡三进制中的三个数符。本文中以 T（连在 1 上方的负号）表示 $-1$，而 $0$和 $1$表示自身。其他约定包括使用 '-' 和 '+'分别表示 $-1$和 $1$，或使用希腊字母 Θ（于圆圈中的负号）来表示 $-1$ 到底是希腊字母 $\Theta$ 还是带圈的负号 $\ominus$?。在 Setun计算机中 $-1$表示为倒转的阿拉伯数字一：“1”。

平衡三进制在 Michael Stifel（1544）的书《Arithmetica Integra》中出现过。它也曾出现在 Kepler和 LéonLalanne 的作品中。对负数不必使用额外的负号这一点，使得平衡三进制在四则运算的加、减、乘法效率，会比二进制高。美国著名计算机学家高德纳在《编程的艺术》一书中指出，“也许最美的进制是平衡三进制”。

## 数的表示方法

### 整数的转换

平衡三进制和其他进制一样，各位的数字和位权相乘然后叠加起来，就是该数的数值。数字下标 bal3 表示为平衡三进制，而下标 dec 则为十进制：

10bal3 = 1×31 + 0×30 = 3dec

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

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

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

平衡三进制不需要额外的符号就可以表示负数。左起第一位若非 0 而是 T 的即为负数，若是 1 的则是正数。

在平衡三进制中，各位上的数字之和为偶数的整数是偶数；各位上的数字之和为奇数的整数是奇数。

比如：

十进制｜平衡三进制｜转换展开｜十进制｜平衡三进制｜转换展开

0｜0｜0

1｜1｜+1｜-1｜T｜-1

2｜1T｜+3-1｜-2｜T1｜-3+1

3｜10｜+3｜-3｜T0｜-3

4｜11｜+3+1｜-4｜TT｜-3-1

5｜1TT｜+9-3-1｜-5｜T11｜-9+3+1

6｜1T0｜+9-3｜-6｜T10｜-9+3

7｜1T1｜+9-3+1｜-7｜T1T｜-9+3-1

8｜10T｜+9-1｜-8｜T01｜-9+1

9｜100｜+9｜-9｜T00｜-9

10｜101｜+9+1｜-10｜T0T｜-9-1

11｜11T｜+9+3-1｜-11｜TT1｜-9-3+1

12｜110｜+9+3｜-12｜TT0｜-9-3

13｜111｜+9+3+1｜-13｜TTT｜-9-3-1

### 小数

平衡三进制和十进制一样，用小数点分隔整数部分和小数部分。

十进制｜−0.9｜−0.8｜−0.7｜−0.6｜−0.5｜−0.4｜−0.3｜−0.2｜−0.1｜0

平衡三进制｜T.010T｜T.1TT1｜T.10T0｜T.11TT｜0.T or T.1｜0.TT11｜0.T010｜0.T11T｜0.0T01｜0

十进制｜0.9｜0.8｜0.7｜0.6｜0.5｜0.4｜0.3｜0.2｜0.1｜0

平衡三进制｜1.0T01｜1.T11T｜1.T010｜1.TT11｜0.1 or 1.T｜0.11TT｜0.10T0｜0.1TT1｜0.010T｜0

在平衡三进制中，四舍五入和截位的操作是等效的。

#### 分数的小数化

平衡三进制可以像十进制一样，可以用小数来表示分数，例如⅓=0.1bal3。

十进制分数｜平衡三进制｜十进制分数｜平衡三进制

1/1｜1｜1/11｜0.01T11

1/2｜0.1｜1.T｜1/12｜0.01T

1/3｜0.1｜1/13｜0.01T

1/4｜0.1T｜1/14｜0.01T0T1

1/5｜0.1TT1｜1/15｜0.01TT1

1/6｜0.01｜0.1T｜1/16｜0.01TT

1/7｜0.0110TT｜1/17｜0.01TTT10T0T111T01

1/8｜0.01｜1/18｜0.001｜0.01T

1/9｜0.01｜1/19｜0.00111T10100TTT1T0T

1/10｜0.010T｜1/20｜0.0011

十进制分数｜平衡三进制｜十进制分数｜平衡三进制

0/1｜0｜10/11｜1.0T1TT

1/2｜0.1｜1.T｜11/12｜1.0T1

2/3｜0.1｜12/13｜1.0T1

3/4｜0.1T｜13/14｜1.0T101T

4/5｜0.1TT1｜14/15｜1.0T11T

5/6｜1.0T｜1.T1｜15/16｜1.0T11

6/7｜1.0TT011｜16/17｜1.0T111T0101TTT10T

7/8｜1.0T｜17/18｜1.00T｜1.0T1

8/9｜1.0T｜18/19｜1.00TTT1T0T00111T101

9/10｜1.0T01｜19/20｜1.00TT

与十进制、二进制类似，部分分数有两种表达形式。在十进制、二进制中，最小的数码是0，因此小数点后最右边无限循环的0可以省略掉，从而变成一个整数或有限小数；而在平衡三进制中，小数点后最右边无限循环的T不能省略，因而不能变成整数或有限小数。

#### 无理数

无论对于十进制、平衡三进制还是其他以有理数为底数的记数系统，所有的无理数都只能表示成无限不循环小数。下表列出了一些代数无理数和超越无理数的十进制与平衡三进制的表示。

代数数｜十进制｜平衡三进制

$\sqrt{2}$｜1.41421356237309... (≈ 1.414)｜1.11T1TT00T00T01T0T00T00T01T...

$\sqrt{3}$｜1.73205080756887... (≈ 1.732)｜1T.T1TT10T0000TT1100T0TTT011T...

$\sqrt{5}$｜2.2360679774997... (≈ 2.236)｜1T.1T0101010TTT1TT11010TTT01T...

φ（黄金分割，$\tfrac{1+\sqrt{5}}{2}$）｜1.6180339887498... (≈ 1.618)｜1T.T0TT01TT0T10TT11T0011T1001...

超越无理数｜十进制｜平衡三进制

π（圆周率）｜3.1415926535897932384626433...(≈ 3.1416)｜10.011T111T000T011T1101T11111...

e（自然对数的底）｜2.718281828459045... (≈ 2.718)｜10.T0111TT0T0T111T0111T000T11...

下面是另一个重要常数欧拉-马斯刻若尼常数在十进制与平衡三进制中的表示（现在仍无法确定其是有理数还是无理数）：

数｜十进制｜平衡三进制

γ（欧拉-马歇罗尼常数）｜0.57721566490153... (≈ 0.577)｜1.TT1TT1T1010001T0T00111TTT0...

### 十进制到平衡三进制的转换

十进制转化为平衡三进制，可参照下述方法，先圆整后，再分别对整数部分和小数部分进行连除法和连乘法即可。

-25.4

```
        -25.4,圆整<sup>#</sup>为-25;  ‡                       余,-0.4;♦
   -25÷3=-8⅓, 圆整为- 8;余,-1↑;  ‡   -0.4×3=-1.2,  圆整为-1|;余,-0.2;
   - 8÷3=-2⅔, 圆整为- 3;余, 1|;   ‡   -0.2×3=-0.6,  圆整为-1 (原为0,底下进T,则为T)|;余, -0.6;
   - 3÷3=-1 ,  圆整为- 1;余, 0|;   ‡   -0.6×3= -1.8, 圆整为1  (原为-1,底下进T,为-2再改为1,再向上进T)|;余, -0.8;
   - 1÷3=- ⅓, 圆整为  0;余,-1|;   ‡   -0.8×3= -2.4, 圆整为1  (原为-2,-2改为1,向上进T)↓;余,-0.4;跳入循环
       -25.4<sub>10</sub>=T01T.<span style="text-decoration: overline">TT11</span><sub>3</sub>
```

- 圆整到最近的整数

当然，也可以采用另一种方法。

```
     -25.4<sub>10</sub>=-(1T*101<sup>1</sup>+1TT*101<sup>0</sup>+11*101<sup>T</sup>)
                      =-(1T*101+1TT+11/101)
                      =-10T1.<span style="text-decoration: overline">11TT</span>
                      =T01T.<span style="text-decoration: overline">TT11</span>
```

### 三进制计算机中数的表示

计算机的初期发展过程中，苏联有一些实验性质的计算机，是以平衡三进制而不是二进制来设计制造的，其中最著名的是由尼古拉·布鲁金索夫和谢尔盖·索博列夫建造的 Сетунь。与现在通行的二进制相比，平衡三进制的实验性设计具有许多计算科学上的优势。特别是，正负一致性可以加快多位乘法中的进位速率，而舍入截断当量则会减少对分数做舍入的进位次数。在平衡三进制中，单一位数的乘法表不需用到进位，而加法表只会有两个对称进位而不是三个。

注：以下部分以“'”为十进制数万位分隔符

#### 基本概念

位（trit）：对称三进制的数位。

字节（tryte）：莫斯科大学的Сетунь以6位为1个字节，单字节整数的表示范围为：-364~+364。

字（word）：参照二进制，以2个字节为1个字，单字整数的表示范围为：-26'5720~+26'5720;

#### 整数

纽约州立大学在1973年开发的测试机Ternac，采用24位表示一个整数，表示范围为-1412'1476'8240~+1412'1476'8240

#### 定点数

定点数的表示方法和整数一样。只是会预先指定小数点的位置。

比如采用48位表示一个实数，整数部分、小数部分各24位。则，表示范围为-1412'1476'8240.5~+1412'1476'8240.5，精度为3-24（3.54*10-12）

#### 浮点数

Ternac，采用48位表示一个实数，其中尾数42位，指数6位。

参照IEEE754的浮点数表示法，对称三进制的表示法如下：

1个符号位（整数部分）+尾数域41位（小数部分）+指数域6位

整数部分为1是正的规约数。表示范围为0.5*3-364+0.5*3-405~0.5*3365-0.5*3323

整数部分为0的是零附近的数，是非规约数。非规约数的指数固定为-364，指数域并入尾数。表示范围为0.5*3-411-0.5*3-364~0.5*3-364-0.5*3-411，精度为0.5*3-411。

## 逻辑常量

平衡三进制｜逻辑状态｜标准三进制

1｜True｜2

0｜Unknown｜1

T｜False｜0

三进制计算机，以三值逻辑为基础，有三个逻辑状态值——真、假、未知。我们用 $1$ 表示真、$0$ 表示未知，而 $T$ 则表示假。

## 三进制计算机中信息的表示

三进制计算机中，以平衡三进制为信息进行编码。

我们可以以12位为单位，对文字进行编码作为标准信息交换码（STUCII，Standard Ternary Unified Code for Information Interchange）。其容量为53'1441个字符，约是16bits容量的8.1倍。

## 运算

### 加减乘除四则运算

平衡三进制和二进制一样，乘法运算等效于移位叠加运算。

#### 单双位平衡三进制加法表、乘法表、除法表

+｜TT｜T0｜T1｜T｜0｜1｜1T｜10｜11 11｜0｜1｜1T｜10｜11｜1TT｜1T0｜1T1｜10T 10｜T｜0｜1｜1T｜10｜11｜1TT｜1T0 1T｜T1｜T｜0｜1｜1T｜10｜11 1｜T0｜T1｜T｜0｜1｜1T 0｜TT｜T0｜T1｜T｜0｜1 T｜T11｜TT｜T0｜T1｜T｜0 T1｜T10｜T11｜TT T0｜T1T｜T10 TT｜T01｜×｜TT｜T0｜T1｜T｜0｜1｜1T｜10｜11 11｜T11T｜TT0｜T01｜TT｜0｜11｜10T｜110｜1TT1 10｜TT0｜T00｜T10｜T0｜0｜10｜1T0｜100 1T｜T01｜T10｜TT｜T1｜0｜1T｜11 1｜TT｜T0｜T1｜T｜0｜1 0｜0｜0｜0｜0｜0｜0 T｜11｜10｜1T｜1｜0｜T T1｜10T｜1T0｜11 T0｜110｜100 TT｜1TT1

TT｜T0｜T1｜T｜0｜1｜1T｜10｜11 TT｜0｜T｜T1｜T0｜TT｜T11｜T10｜T1T｜T01 T0｜1｜0｜T｜T1｜T0｜TT｜T11｜T10｜T1T T1｜1T｜1｜0｜T｜T1｜T0｜TT｜T11｜T10 T｜10｜1T｜1｜0｜T｜T1｜T0｜TT｜T11 0｜11｜10｜1T｜1｜0｜T｜T1｜T0｜TT 1｜1TT｜11｜10｜1T｜1｜0｜T｜T1｜T0 1T｜1T0｜1TT｜11｜10｜1T｜1｜0｜T｜T1 10｜1T1｜1T0｜1TT｜11｜10｜1T｜1｜0｜T 11｜10T｜1T1｜1T0｜1TT｜11｜10｜1T｜1｜0｜÷｜TT｜T0｜T1｜T｜0｜1｜1T｜10｜11 TT｜1｜1.1｜1T｜11｜-∞｜TT｜T1｜T.T｜T T0｜1.T1｜1｜1.1｜10｜-∞｜T0｜T.T｜T｜T.1T T1｜1.T｜1.T｜1｜1T｜-∞｜T1｜T｜T.1｜T.1 T｜0.1T｜0.1｜0.1｜1｜-∞｜T｜0.T｜0.T｜0.T1 0｜0｜0｜0｜0｜NaN｜0｜0｜0｜0 1｜0.T1｜0.T｜0.T｜T｜+∞｜1｜0.1｜0.1｜0.1T 1T｜T.1｜T.1｜T｜T1｜+∞｜1T｜1｜1.T｜1.T 10｜T.1T｜T｜T.T｜T0｜+∞｜10｜1.1｜1｜1.T1 11｜T｜T.T｜T1｜TT｜+∞｜11｜1T｜1.1｜1

注：减法是左列减去顶行，除法是左列除以顶行

÷｜TT｜T0｜T1｜T｜0｜1｜1T｜10｜11

TT｜1｜1.1｜1T｜11｜-∞｜TT｜T1｜T.T｜T

T0｜1.T1｜1｜1.1｜10｜-∞｜T0｜T.T｜T｜T.1T

T1｜1.T｜1.T｜1｜1T｜-∞｜T1｜T｜T.1｜T.1

T｜0.1T｜0.1｜0.1｜1｜-∞｜T｜0.T｜0.T｜0.T1

0｜0｜0｜0｜0｜NaN｜0｜0｜0｜0

1｜0.T1｜0.T｜0.T｜T｜+∞｜1｜0.1｜0.1｜0.1T

1T｜T.1｜T.1｜T｜T1｜+∞｜1T｜1｜1.T｜1.T

10｜T.1T｜T｜T.T｜T0｜+∞｜10｜1.1｜1｜1.T1

11｜T｜T.T｜T1｜TT｜+∞｜11｜1T｜1.1｜1

1从上表中可以看出，双位数相加可能会变成单位数，双位数相减可能会变成三位数，双位数相乘可能可能仍是双位数。这种情况在十进制和二进制中不会发生。

#### 多位数的加减法

就是逐位做加减法。

减法，亦可以逐位取反后，换做加法比如

```
     1TT1TT.1TT1       1TT1TT.1TT1      1TT1TT.1TT1     1TT1TT.1TT1
    +  11T1.T        -   11T1.T         - 11T1.T -> +     TT1T.1
    ------------     --------------                ---------------
     1T0T10.0TT1       1T1001.TTT1                      1T1001.TTT1
    +  1T            +  T  T1                        +   T  T1
    ------------     ----------------               ----------------
     1T1110.0TT1       1110TT.TTT1                      1110TT.TTT1
    +  T             + T   1                         +  T   1
    ------------     ----------------                ----------------
     1T0110.0TT1       01100T.TTT1                      01100T.TTT1
```

#### 乘法

可以采用类似于十进制的各种方法。

比如

```
     1TT1.TT
 ×   T11T.1
 ------------
      1TT.1TT
     T11T.11
    1TT1T.T
   1TT1TT
 +T11T11
 ------------
  0T0000T.10T
```

#### 除法

平衡三进制的除法和十进制的除法类似。

但是，大家已经知道，0.5在平衡三进制中有0.11111...和1.TTTT...两种表达式，也就是说，如果被除数超过除数的一半，商的当前位就要置1或T。

```
                1TT1.TT
            -------------        
    T11T.1  ) T0000T.10T        
             T11T1
            --------
              1T1T0
              1TT1T
             --------
                111T
               1TT1T
              ---------
                 T00.1
                T11T.1
               ---------
                 1T1.00
                 1TT.1T
                ---------
                  1T.T1T
                  1T.T1T
                 --------
                       0
```

当然，有着更简单的除法，它直接按规则运算，无需要对比余数大小，此方法源于Donald Knuth的 试商法，但此方法并不完善，后经其他学者改进，完全摒弃了半封闭区间的判断，改而用每轮除法余数最高位是否为0的条件，来判断这一轮除法是否结束，并命名为二重试商法：核心逻辑是将被除数拆分为两个向量（p和s)，其中 p 的位数最多与除数 q 相同，s 则是剩余位数的向量；然后根据规则（双正或双负得正商，一正一负得负商，其它为0）上商，每轮除法至多一次或两次相减，若相减一次后，余数 p 最高位仍不为0，则需再相减一次，得余数 p 最高位为0本轮除法结束，该位是二重商取双倍值，并把结果给到寄存器 r；然后余数 p 左移一位，丢弃上一轮除数的最高位（已为0），拉取一位 s 进行补充，得到新余数 p 转入下一轮，结果 r (3倍放大)右移一位补0，则当s 用尽时，结果 r 和被除数 p 构成最终的商和余数。

```
                                          + 
             ++0-                        ++       
            --------                    ------
        +0- )+0++0+                  +- )+0+ 
             -0+                         -+
            --------                    ------
             0+-+                        0++
              -0+                         -+
            --------                    ------       
              00-0                        +-
               000                        -+ 
            ---------                   ------
                -0+                        0
                +0-
            ---------                 0+与++相加，商得+--
                  0
```

#### 开平方

平衡三进制开平方和十进制、二进制类似。但和除法一样，要比较的是半除数。例如：

```
                             1. 1 1 T 1 T T 0 0 ...
                            ------------------------
                           √1T                          1<1T<11, 置 1
                             1
                            -----
                       10    1.0T                       1.0T>0.10, 置 1
                      1T0    1.T0
                            --------
                        110    1T0T                     1T0T>110, 置 1
                       10T0    10T0
                              --------
                        1110    T1T0T                   T1T0T<TTT0, 置 T
                       100T0    T0010
                               ---------
                        111T0    1TTT0T                 1TTT0T>111T0, 置 1
                       10T110    10T110
                                ----------
                        111T10    TT1TT0T               TT1TT0T<TTT1T0, 置 T
                       100TTT0    T001110
                                 -----------
                        111T1T0    T001TT0T             T001TT0T<TTT1T10, 置 T
                       10T11110    T01TTTT0
                                  ------------
                          111T1TT0    T001T0T           TTT1T110<T001T0T<111T1TT0, 置 0
                                            T
                                     -----------
                         111T1TT00    T001T000T         TTT1T1100<T001T000T<111T1TT00, 置 0
                                              T
                                     -------------
                        111T1TT000    T001T00000T
                                              ...
```

## 逻辑运算

平衡三进制逻辑门，在运算中起着至关重要的作用，使用非门从数值上，可正数变负数，负数也可变为正数；从逻辑上，假命题变成真命题，真命题变成假命题，两者则保持不变；基于此特性，减法可转成加其相反数，乘除法又是加减法的扩展，一切运算皆是加法运算，而对其逻辑门输入或输出取反操作符合德摩根定律，以下四种基础门均可用非门任意转换，以下是平衡三进制逻辑运算真值表。

∧｜T｜0｜1 T｜T｜T｜T 0｜T｜0｜0 1｜T｜0｜1｜∨｜T｜0｜1 T｜T｜0｜1 0｜0｜0｜1 1｜1｜1｜1｜↑｜T｜0｜1 T｜1｜1｜1 0｜1｜0｜0 1｜1｜0｜T｜↓｜T｜0｜1 T｜1｜0｜T 0｜0｜0｜T 1｜T｜T｜T｜¬｜T｜0｜1 1｜0｜T

同样的，对异或门输出取反操作，得同或门在乘法运算中有用到，以下是逻辑真值表。

⊕｜T｜0｜1 T｜T｜0｜1 0｜0｜0｜0 1｜1｜0｜T｜⊙｜T｜0｜1 T｜1｜0｜T 0｜0｜0｜0 1｜T｜0｜1

全加器是运算的基础，1个加和门与1个共识门组成半加器，而2个半加器与1个调和门组全加器，此结构类似于传统的二进制全加器，在前苏联的三进制计算机Сетунь有可能应用，在Douglas W. Jones的 文章中也有提及，而减法则是被减数使用反相器，获得相反数后相加，统一为加法运算，以下是逻辑真值表。

⊕₃｜T｜0｜1 T｜1｜T｜0 0｜T｜0｜1 1｜0｜1｜T｜⊠｜T｜0｜1 T｜T｜0｜0 0｜0｜0｜0 1｜0｜0｜1｜⊞｜T｜0｜1 T｜T｜T｜0 0｜T｜0｜1 1｜0｜1｜1

## 外部链接

- Standard Ternary Logic
- Balanced-ternary