PS:以下内容均为本人原创,未经授权及许可,严禁引图、转载或加工,违者必究。
————2024年6月13号
1、图灵机的概述
图灵机(Turing machine)是一种理论计算模型,由英国数学家阿兰·图灵(Alan Turing)于1936年提出。它被用来研究计算过程的基本性质和计算理论的极限。图灵机被认为是现代计算机的理论基础。
1.1图灵机的组成部分:
- 无限长的纸带: 纸带被划分成一系列的方格,每个方格可以包含一个符号(例如0或1),纸带既可以向左也可以向右移动。
- 读写头: 读写头可以在纸带上移动,读取或写入符号。
- 状态寄存器: 状态寄存器存储着图灵机当前的状态。状态是有限的,可以是预定义的某一个状态集合中的一个。
- 状态转移函数: 这是一组规则,决定了图灵机在给定状态和读取到的符号时如何行动。规则包括:
- 写入符号
- 移动读写头(向左或向右)
- 进入下一个状态
1.2图灵机的运行过程:
- 读写头读取纸带上的当前符号。
- 根据当前符号和当前状态,查找状态转移函数,决定接下来要执行的操作。
- 执行操作,更新纸带上的符号,移动读写头,更新状态寄存器中的状态。
- 重复上述步骤,直到达到某个停止状态(如果有的话)。
图灵机的主要意义在于它能够模拟任何计算过程,因此被称为通用图灵机(Universal Turing Machine)。任何可以被计算的问题,理论上都可以由图灵机来解决。这使得图灵机成为计算理论中的一个重要工具,用来定义和研究可计算性、算法的复杂性以及计算的极限。
2、平衡三进制图灵机的感想来源
平时就喜欢逛blbl看看科普视频,是《苏联的三进制电脑》差评君写的,好像是几年前的视频了,那时就想那么厉害的东西没了真可惜,后面又看到很多人去辩论,呈现两边极化的现象,可见都没见过这东西,真不好评价。后面又详细的查了一下前苏联的资料,发现这东西是真的有趣,还发现很多人都想重新将这三进制计算捞回来。
但是,三进制是它的优点也是它的缺点,自然界中太多都是两态的,如何做到三种稳定的状态是个问题,原生的三进制比二进制每1位多一状态,也就说信息密度更大,同时算的也多,理论上讲会快1.6倍左右,能实现所使用的零件也会更少,但前提是能实现,反正现在没人实现。
2.1平衡三进制的模拟
因为硬件发展不起来,所以就不会有相应的系统与软件,就形成不了生态,简单来说,平衡三进制计算没戏,处非有研制硬件出来,而我又太想知道前苏联的三进制是怎样的,所以走了模拟一条路,虽然性能肯定不如原生的三进制计算机,但能先将它重现出来,后面如何优化,那就是后面的事了。
道家说“道生一,一生二,二生三,三生万物”,儒家有“三人为众”及“三人行必有我师”,可见“三” 在我国传统文化中有着崇高的地位,现在就是二生三,用二进制来模拟三进制,如果能跑起来就会有优化的空间,从而不断的叠代,就像一个观点,人工智能不管你用的是什么进制,它的关键是你用的是什么样的算法。
2.2平衡三进制的二进制转述
先看这有关三进制计算实现的一些猜想!,现在就是这样子弄;对于理论满分但从未实操过人来说,想在二进制的硬件上尽可能的高效的模拟平衡三进制,这就目前的最优法;虽然说弄出来的机器可能比原来的二进制效率还低,但是它能跑呀,如果硬件发展起来,那就可以替换,直接完成一波反超。
二进制的1位,称为bit,可以表示0或1,然后8个bit表示1个字节(byte);相应的平衡三进制也这样的设定,1位三进制位,称为trit,可以表示T(-1)、0、1,然后6个trit表示1个三进制字节tryte;要用二进制的数,模拟平衡三进制的1位三进制位,至少要用2bit,所以在本文中:2bit=1trit;这种方法是可以跑来的,我已经用这种方式在图灵游戏中成功构建出平衡三进制全加法器,就是下图这样子的:
2.3平衡三进制的二进制编码
使用的二进制编码为:T(00)、0(01或10)、1(11),这种方式的编码是我试了很多方案得到的最优解,这样的编码方式能极大的简化硬件的设计,对于0它为什么会有两个编码,最开始是不知道用那个好,图省事就放一起了,后面发现这两个放一起确实很好用,所以就固定一起了,平衡三进制最重要的一点就是对称,这就很平衡三进制了。
也可以用非位置化系统来解释,00得为0、01或10得为1、11得为2,刚好是0、1、2是标准三进制的表示,转成平衡三进制就是T、0、1,再看看这文章:有趣的平衡三进制!!!,看平衡三进制的逻辑门部分,用什么样的编码方式能最简化表示,很多次尝试下来,就是上面的编码方式,先看下图:
举个逻辑与为例子:
- 当T(00)与T(00)时,两个二进制的AND门,得到结果为T(00)
- 当T(00)与0(01)时,两个二进制的AND门,得到结果为T(00)
- 当T(00)与1(11)时,两个二进制的AND门,得到结果为T(00)
- 当0(01)与T(00)时,两个二进制的AND门,得到结果为T(00)
- 当0(01)与0(01)时,两个二进制的AND门,得到结果为0(01)
- 当0(01)与1(11)时,两个二进制的AND门,得到结果为0(01)
- 当1(11)与T(00)时,两个二进制的AND门,得到结果为T(00)
- 当1(11)与0(01)时,两个二进制的AND门,得到结果为0(01)
- 当1(11)与1(11)时,两个二进制的AND门,得到结果为1(11)
基本上没有问题了,但注意了0有两个编码,第五条,当0同时为01或10时,得到结果正确,但一个是01另一个是10,得到结果就是T(00)了,所以这种情况要单独处理,只要处理了0与0的情况,只一个或输出01或10即可,这样就得到了一个平衡三进制的与门了。
同样的用两个或门、两个或非门、两个与非门,同样可以得到剩下的三个表,非门也很简单就是每一位取反,T(00)取反得1(11)、1(11)取反得T(00)、0(01)取反得0(10),看0它有两个编码的好处就体现出来了,量子计算机有叠加态,那三进制计算的0有两个编码(状态)也是正常的,就像它的布尔值:FALSE(T)、UNKNOWN(0)、TRUE(1),T表示假,0表示“二者”,1表示真。
3、平衡三进制基础门的构建
先看上图,这个定律在二进制是管用的,也就是可以取反输入或输出就转换门的类型,然后我用上述二进制构建出来的平衡三进制门,也是管用的这没有想到吧,这是用二进制模拟的三进制,低层仍是二进制,但逻辑是平衡三进制,所以说原生的平衡三进制也是管用的,这个定律在平衡三进制上得到了扩展。
3.1平衡三进制逻辑与门

如上图所示,用上面的编码方式,只用了两个二进制的与门就完成电路的大部分逻辑的构建,其中的两个XOR与AND,是为了检测双0的输入情况,如果是双0输入则默认输出01,其它输出两个二进制的与门的结果。
3.1平衡三进制逻辑或门

如上图所示,电路并没有大的改变,只是将两个二进制的与门,换成了两个二进制的或门,就是那么简单,得到了平衡三进制的的或门(TOR),剩下的TNOR(或非)、TNAND(与非)、TXOR(异或)、TXNOR(同或)同理可得。
3.3平衡三进制与非门、或非门


3.4平衡三进制异或门、同或门


3.5平衡三进制摩根定律的应用
元件工坊构建出的平衡三进制础门,它们的真值表是对称的,这四个基础逻辑门分别是:TOR、TNOR、TNAND、TAND,你可以通过如下图所示的对输入取反(垂直箭头)或对输出取反(水平箭头)来转换它们。

先看它的取反,也就是T变1、1变T、0不变,用上述的编码方案,只要分别对每一位取反,即可得平衡三进制的非门,如下图所示:

也就是说,当它为TOR组件时,想变为TNAND组件,分别对它的两个输入,用TNOT组件取反,就得到了TNAND级件,如果对输出结果再取反,就变成了TAND组件,从或门变成了非门;同样的TXOR,对输出结果取反,就得到了TXNOR组件。
4、平衡三进制基础门构建2
4.1平衡三进制三与门


如上图所示,这个部件是将三个trit进行与操作;二进制的与门(两个才是真,一假则全假),平衡三进制的与门可以看上面的真值表,它也是类似,TAND它是如果一个输入为T则出T,两个输入为1则出1,其余都出0;然后先用两个平衡三进制与门得到结果,再用这个结果与第三个与门就可以得出结果;所以上述的部件分别判断了是否输入中有T、是否输入全为1、及其余情况的0,这样就可以得到平衡三进制的三与门了。
4.2平衡三进制三或门


如上图所示,这个部件是将三个trit进行或操作;与上面的方法类似,结合真值表,其中任意一个输入为1则出1,若三个输入都为T则出T,其它出0,这样就可以得到平衡三进制的三或门了。
4.3平衡三进制三态复用器
全称三态多路复用器,当我们要用解码或加法器时,就要用到它,也就是三选一,这里有T(00)、0(01或10)、1(11),在平衡三进制全加器中有详细讲到,按照这思路就可以三选1的电路,那一亮就是那一路的数据,如下图所示:



可以看上面的三个图,都是三选1基础件,这个基础件的作用就是:输入00第一路亮绿灯,其它路红灯;输入01或10第二路亮绿灯,其它路红灯;输入11第三路亮绿灯,其它路红灯;这样再加上六个通路切换嚣,就可以构建出一个三态多路复用器,可以作为加法器的基础了,如下图所示:

这样就有三选1数据选择器了,看过平衡三进制加法器文章的,这个就是三态多路复用器;当输入T/0/1时,数据从第1/2/3路输出,因为2位bit代表1trit,所以它有10个引脚;有了这组件,平衡三进制的全加器也可以弄出来了,二进制的加法器方案放这里不管用,所以要上述的的平衡三进制加法器文章中的加法器。
4.4平衡三进制左偏门、右偏门
这里的左偏与右偏门在全加器有用到,所以现在弄成一个基础件,它可以转换输入,从而简化输入,例如右偏:当输入T时,输出0;当输入0时,输出1;当输入1时,输出T;下面就是它的输入与输出真值表。



如上图所示,平衡三进制左右偏门都用到了前面的三选1基础件1,当然也可以用三选1基础件2,效果一样,这样确实是零件多了,但是确实也是简化了输入。
4.5平衡三进制最小门、最大门
如上图所示,在平衡三进制全加器中,还用到了最大门与最小门,它的构建可以用类似于左偏门和右偏门的方法,这样也就形成了Max(A,0)与Min(A,0),如下图所示:


说完了Max(A,0)与Min(A,0),其实平衡三进制与门和或或门,最可以当做逻辑最大门及逻辑最小门,它其实是从不同角度来解释的,思路与下面的截图来自于文章三生万物,请看下图:
在这我们要明确一点,逻辑是逻辑,数值是数值,明白这一点很重要; 当从逻辑上去想,那么T表示假,0表示两都,1表示真,那么得到的就是平衡进制的与门及或或门; 当从数值上去想,那么T表示-1,0表示0,1表示1,那么得到的就是平衡进制的最小门及或或门,也就是与门成为了Min(A,B)及或门成为了Max(A,B),也就是说这两个门可以比较大小,输出最大或最小值,同样也可以用来构建Max(A,0)与Min(A,0),如下图所示:

这样最后得到的设计,就非常简便了,简便是简便了,但是门的数量比上面的多,延迟也大,不建议使用。
用这个Min(A,B)门及Max(A,B)门,也就是与门及或门,可以制作一个对比数字大小的电路,对比两个数的大小有:0与0、正数与负数、0与负数、0与正数、正数与正数、负数与负数,总共6种情况,从最高位左起第一位若非 0 值,就可判断它的正负性,是 T 即为负数,是 1 即为正数。
这样就可以解决:0与0、正数与负数、0与负数、0与正数,这些情况的判断了,剩下的双正与双负的判断,可以先在前面补0让两个数对齐,然后从最高位开始,依次对比每一位大小,相同时跳过进行下一位,只要路径中有一位大于另一位则出结果,不然全部对比完都相同,则两都数都是相同的。
5、平衡三进制加法器
在前面平衡三进制全加器,我们已经给出它的真值表及设计图,现在就可以实现它了,它需要左偏门(A-1)、右偏门(A+1)、最大门Min(A,0)、最小门Max(A,0)门、三态复用器3Mux1,按照下面的思路就可以弄出来了。

5.1平衡三进制半加器


如上图所示,半加器的真值表及它最初版的的图片,它没有分加和位与进位位,后面重新设计后,分开后更好的构建全加器,因为半加器作用真的不太,不能串联就不能多位计算与相加,重新设计后的半加器,如下图所示:


5.2平衡三进制全加器

只要其中一张就可以表示所有的输出结果了,这样将它的加法位与进位位分开,就得了它的输入逻辑了,如下图所示:

这样就可以完成设计了,也就是下图所示:
如上图所示,有6个输入,最上面的2个输入代表进位位,后面的4个输入代表,可以输入两个平衡三进制数;有4个输出,上面是加和位,下面是进位位,跟二进制的加法器很想,但只是每一位trit都要2bit来表示,经过测试这个电路完全符合预期的标准,对加位的电路做了优化,也就是将输出的结果进行了左偏与右偏,再用第三位做选择,就可以少用一些电路,但对于进位位,它不能这样做,因为它偏置操作也得不到想要的数据,所以用偏置后错误的数据,再用第三位选择也得不到正确的结果。
5.3平衡三进制多位加法器
为什么是4位加法器,在二进制中1byte=8bit,在这里用2bit代表1trit,所以只能1byte=4trit,和前苏联的三进制计算机相比,还少了2trit,标准的是6个trit=1个三进制字节tryte;如果想达到标准的6个trit,那需要12bit才行,图灵完备只有8bit,所以只能弄4trit的平衡三进制加法器了;二进制的8位全加器串联可计算255以内的加法,也就是2个byte输入及1个进位输入,输出是1个byte输出及1个进位输出,所以设计也要类似就行,如下图所示:
这就是类似于二进制的平衡三进制加法器了,它可以计算(-81到81)以内的加减法,是的,加减法,这个就是它的优点,加法器与减法器都是它,现在就可以试试它的计算功能了,如下图所示:
看完了上面,是否感觉,算的太少了,那就再串联一次,这样就得到了8trit的平衡三进制加法器了,下面的8trit加法可以算(-6561~6561)内的加减法,如果还不够可以继续串联,如下图所示的方法:
5.4平衡三进制全加器优化
再看上面的图,它的真值表有很多部分是重叠的,所以如果用半加器的输出结果,也就是Cin=0中间的表为中心,这样就可以提出一个新的方案,让中间的表交换输出,可以得到类似于Cin=-1及Cin=1的表,只要部分稍加转换,如下图所示:
因为,这样就是在第二层的时候,不进行数据选择,而用用Cin值来控制,应该输出怎样的表格,用进位位来举例,也就是说:
当Cin=T时,当A=T时,要输出(0,T,0)、当A=0时,进位位要输出(0,0,0)、当A=1时,进位位要输出(1,0,0);
当Cin=0时,当A=T时,要输出(T,0,0)、当A=0时,进位位要输出(0,0,0)、当A=1时,进位位要输出(0,0,1);
当Cin=1时,当A=T时,要输出(0,0,T)、当A=0时,进位位要输出(0,0,0)、当A=1时,进位位要输出(0,1,0);
按照这个思路就可以,弄一个三进三出的零件了,
当Cin=0时,按顺序出;
当Cin=T时,1路出3路,2路出1路,3路出2路;
当Cin=1时,1路出2路,2路出3路,3路出1路;

然后,输出后其实差不多,就是进位位不同,所以只在特定的情况下,也就是Cin=0及Cin=-1的情况,分别对其左偏和右偏,当Cin=0时就原样输出,所以又可以建立两个零件,如下图所示:
最后就可以,建立新的平衡三进制全加器,测试过了,结果也是一样的,原来的是188个门,现在是170个门,那就是少了18个门,那4trit的门就少了72个门,8trit的门就少了144个门,优化应该极限了,如果有更好的方法,那当我没说,新的平衡三进制全加器,如下图所示:
5.5平衡三进制逻辑引擎(4Trit)
要弄出平衡三进制逻辑引擎,要用到前面的四种基础门,然而后面感觉这前面的基础门设计的太繁杂了,也就是门太多了,有18个,仔细分析了一下:前面两个与门是最基础的门,用了2个门;然后判断双0输入,用了 两个异或门及一个与门,用了11个门;最后是判断那一路输出,用了5个门,总共18个门。
前面发现,异或门占了太多门,如果可以解决双0输入就可以,但只有这种方式,所以只能换一种方式,类似于之前的三与门,也就是其中一个为T则出T、双1才出1、都不是则出0,这样就得到了一种新的与门,从18门12延迟减少到了13个门8延迟,如下图所示:




然后是多位的与、或、与非、或非,因为这游戏不能自定义输入与输出,16位的输出不够详细,所以只能用8位,也就是只能弄4trit的机器了,所以可以结合前面的平衡三进制摩根定律,就可以弄出平衡三进制的逻辑引擎,现在不知道,指令是用平衡三进制数好,还是二进制好,但二进制更简约,后面再看看改不改,目前是,00表示T0R、01表示TNOR、10表示TNAND、11表示TAND,如下图所示:


6、平衡三进制的存储与计算
前面说了,模拟平衡三进制用的是两位二进制的编码方式,虽然逻辑是平衡三进制,本质来说还是二进制,如果要弄寄存器,那就是将寄存器存的数量翻一倍;还有个问题,指令是用平衡三进制数好,还是二进制好,答案是平衡三进制数好,这是为了统一性考虑,如果可以转来转去,那开销会更大,这里用就是平衡三进制数的二进制的编码方式。

如上图所示,这个是原版的图灵完备--寄存器之间,它有5个寄存器,每个寄存器可以存8bit,然后可以将数据从源拷贝到目的地,其中输入也可以作为源,输出可以作为目的,原理也很简单,也就是打开一个存一个,8bit前两位表示模式不用管,后面的6bit,前面3bit是作为源的地址,再后面3bit是作为目的地址。
这上面用到了3-8译码器,也就是给3bit然后有8种情况,相应的每一种情况只会有一路绿灯,其它为红灯,也就是前面3bit决定了加载那一路的数据,后面3bit决定了将数据保存在那,用到了寄存器数据读取与保存功能,寄存器数据每一刻只能有一路数据,否则就造成了回路,在游戏中是不行了,在现实中则会短路,所以按照上面的思路就可以设计平衡三进制的寄存器之间了。
6.1平衡三进制的寄存器

如上图所示,用了2个Trit来表示9组选项,寄存器有7个、输入与输出占了1个、还有1个未使用,如果是3个Trit,那就是27组选项了太多了,问题来了平衡三进制是三种布尔值的,然而控制寄存器的存储用的是二进制,你这平衡三进制怎么用,多了个两者态,怎么看都不行呀,先别急去看看之前平衡三进制三态复用器,这样就有办法了。

想到了吧,就是将3种状态转化成了3组布尔值,然后平衡三进制的二进制的编码方式,不用重新转成二进制,就可以弄出2-Trit的2-9译码器,有9组布尔值输出,同样的,3Trit有27组布尔值输出,如下图所示:

6.2平衡三进制寄存器之间
有了前面的2Trit-9译码器,就可以弄平衡三进制寄存器之间了,现在只要用原版的16位寄存器就可,这也是用二进制模拟平衡三进制的好处,不用考虑存储的问题,只要无脑叠加就行了,也就是16位寄存器,可以存8Trit,目前而言是够用了,如下图所示:

这图灵完备的游戏还是有点不完善,它的存储器探针只能检测最多8位,超过的不行,如果是16位,也就是前面的8位不检测,只检测后面的8bit,所以存储器探针在16位寄存器上,数值显示不准就没用了,就不加存储器探针了,结合上面的2Trit-9译码器及16位寄存器,就可以完成平衡三进制寄存器之间 ,如下图所示:

6.3平衡三进制算术引擎(8Trit)
前面弄了4Trit是逻辑引擎,但并不完善,指令也没有设计,因为之前不知怎么用平衡三进制操作二进制,现在有了上面的寄存器之间的实现思路,就可以将3种状态转化成了3组布尔值,这样就真正的可以实现8-Trit的算术引擎了,要弄8-Trit的算术引擎,那8TOR、8TNAND组件要弄出来,也就是8位Trit按位或操作等,如下图所示:


弄完8TOR及8TNAND后,要再弄出8-Trit的加法器,这个加法器可以计算加法,同时也可以计算减法,得益于平衡三进制的对称性,你只要将一个8-Trit的数,按位取反就可以得它的相反数,如13(111)取反后为-13(TTT),所以可以定义出一个数取反后相加的操作,也可以是相加后再取反的操作,8-Trit的加法器,如下图所示:
最后,就可以弄出8-Trit的算术引擎了,按照前面的地址来说,它的指令也是一一对应的,所以设计算术引擎指今集,也可以参考图灵完备的来设计,如下图所示:
所以,按照上面的指令集,可以设计如下8-Trit的算术引擎,注意了,因为T(00)、0(01或10)、1(11)的编码方式,所以8-Trit的加法器的进位那不输入,就默认输入T(00),这样就多了个T,这个坑到了我,我说怎么算都不对的,所以要给它输入0(01)才行,不然就单独的将进位脚引出来,8-Trit的算术引擎如下图所示:

测试过了,运行起来很稳定,结果也是正确的,这样8Trit的算术引擎的弄好了,最上面的操作码是给计算单元设计的,所以输入也是16位,但用到只是16位最后的4位,即8-Trit的操作数最后的2-Trit。
6.4平衡三进制指令集
可以看Setun三进制计算机模拟器的第三部分,同样结合了图灵完备思路来设计,但是复制也要复制的明白,差不多的8-Trit,最前面的2-Trit也是来模式选择的,原本的设计思路,如下图所示:
结合之前的设想、与实际的需求、原本的设计,就可以设计如下指令集,如下图所示:
这里的立即数设计很有趣,即然是立即数,当然是输入什么就输出什么,但是有最前面的的模式选择在,会受到模式选择最前面2位的影响,所以最好的办法就是将它最高2位置为0,所以00为立即数模式,如果是其它三种都会影响输入的效果;这样平衡三进制的设计,也要是立即数模式最高2-Trit要为00(0101),所以只能将指令集移到中间去,这样对输入的立即数也没有影响,这样就指令集就设计好了。
6.5平衡三进制计算单元
是时候合体了,将之前弄的平衡三进制寄存器之间及8-Trit的算术引擎结合一下,成为平衡三进制的计算单元了,如下图所示:

现在,平衡三进制的计算单元弄出来了,再弄个立即数和条件跳转,那么平衡三进制图灵机差不多,就可以筹出来了,操作码那就是用来输入指令集的,目前有了复制模式与计算模式,其实已经可以弄简单的平衡三进制计算了,也就是用复制模式,将输入分别存入REG1寄存器、REG2寄存器中,然后用计算模式将两者相加,得到结果输出到REG3寄存器中去保存,最后用复制模式将REG3寄存器的值,输出到输出端口就行了。
7、平衡三进制计算架构
这个架构参考了Setun的24条单播指今,最值的借鉴的指令,就是类似于累加计算的指令,如:(S)+(A*)=>(S)、(A*)+(S)(R)=>(S)、(S)+(A*)(R)=>(S),它的操作大大提升了数据的操作性,将复制模式的输入与算术模式半结合的方式,少了取值的过程,加快了运算的效率,所以指今集也可以重新设计了,如下图所示:
7.1平衡三进制立即数模式
前面的2-Trit设为(00),即为立即数模式,后面的6-Trit可以直接将其保存到REG0中去,可以保存起来备用,如下图所示:

7.2平衡三进制算术地址模式
将复制模式的输入与算术模式半结合的方式,有利于累加计算,可加快运算的效率,去原来的设计,这样就可以输入任意一个寄存器的地址,输出它的值与S寄存器相加,再存回S寄存器中;注意,使用S寄存器前,需用合适的值覆盖S寄存器的中值,得如下设计:
7.3平衡三进制条件跳转模式
想设计条件跳转,就先直接复制过去,要足够的抽象,逻辑是可以移过去的,但电路不行,这两者不是同一个物种,就拿正负性判断来讲,二进制只要判断最高位是不是1(0为正数,1为负数),就可以知道它是不是负数;若要判断一个平衡三进制数的正负性,可判断数字符号的最高有效数字的值,左起第一位若非 0 而是 T 的即为负数,若是 1 的则是正数,不是固定的位置,判断一个平衡三进制数的正负性的实现,也可以用逻辑非零门,请看平衡三进制计算机模拟2的逻辑非零门部分,现在先大概的将它移过来,如下图所示:
想一下之前的3选1基础件,是不是就有思路了,也就是1Trit变成3组布尔值:当为T时,第一路亮绿灯、当为0时,第二路亮绿灯、当为1时,第三路亮绿灯,每当且只有一路亮绿灯,这样就可以判断它的正负性了,当然这只是1Trit的正负性判断。
线路(亮绿灯) | 数字正负性的判断 |
---|---|
第一路(T) | 值为负数 |
第二路(0) | 值为0 |
第三路(1) | 值为正数 |
所以,就可以用多个三选1基础件3,然后16的输入3位的输出,也就是输入8-Trit,然后输出类似上面的1Trit的正负性判断,这样就可以实现一个8Trit的正负性判断,它是零还是正数还是负数,难点也有,就是先要找到最高有效位,才能判断它的正负性,当然这难不倒聪明的我,这有点像递归的过程但又不是,它的过程是从高位到低位,依次对下去,若为0则是无效位,不为0则判断出来,记录下最高有效位的位置,然后去相应的位置去读取最高有效位,再判断1Trit的正负性,这样一层按一层,就可以判断一位8-Trit数的正负性了,如下图所示:


如上图所示,9MUX2有9组布尔值,额外的1位判断是否为0,当额外的1位为false时,输入8位的布尔值组,输入的8位只有一路亮绿灯,这样那一路亮绿灯就输出那一路的数据;额外的1位为true时,输入8位的布尔值组全为false,则输出01;最后跟8个1Trit的正负性判断,就可以得到上面的第二张图,也就是用了从最高位判断是否为零,若为零传输的信号会中断,全部为零则会传输到最后,不然就是在与中断信号做AND比较,这样会得到8位的布尔值组,只有一路会亮绿灯,而亮绿灯那一路就是最高有效位的位置,可以将位置读取出来加上最后面的信号有没有传输到最后的判断,这样就可以读取到最高有效位的数据,再将它简单判断一下,就知道它是正是负是零了,同样的化简一下可以读取最高有效位的数据,如下图所示:

也可以不读取数据,直接进行正常负性的判断,效果两者差不多,门与延迟也差不多,用到的就是8OR1,设计如下所示:


这样完成这个组件,接下的平衡三进制条件跳转模式就可以实现了,先设计好跳转的指今,如下表所示:
平衡三进制 | 跳转指令 |
---|---|
TT | Never |
T0 | REG=0时跳转 |
T1 | REG<=0时跳转 |
0T | REG<0时跳转 |
00 | Always |
01 | REG>0时跳转 |
1T | REG>=0时跳转 |
10 | REG!=0时跳转 |
11 | 未使用 |
可以实现条件跳转的基础件COND,如下图所示:

要加入平衡三进制条件跳转模式,那指今集就要更新,如果可以的话,感觉可以缩减成6Trit的指令集,那二进制输入与输出就是12位,会更精简,指今集如下图所示:

这样平衡三进制条件跳转模式,就完成了,如下图所示:

7.4平衡三进制的程序
想一台完整的平衡三进制图灵机,手动的输入指今是一件很麻烦的事,所以要弄成程序保存起来,这里的程序指的就保存的指令集,一条一条指令集提取,然后一条一条指令的执行,就像是原版的二进制图灵机,如下图所示:
它有一个计数器,每运行一刻,它就取一条指令进行执行,同时还可以不用步进模式,而用覆盖模式,今步进计数器开启覆盖模式,就可以用条件跳转模式重复执行同一条指令,这在循环中会用到,或是跳转任意一处的的指令进行执行,而要用这程序来输入,就要先构建出程序的组件,也就是输入一个地址,获取这个地址的值然后输出,这里就弄个3Trit的程序存储器,可以存27条指令,所以要弄一个指令地址解析器,如下图所示:

这上面用了3AND来判断,1Trit用三选1基础件3变成三组布尔值,有9条线路,共有27个输出,一个输出用1个3AND来判断,感觉门有点多了,所以优化一下,如下图所示:

DEC2_9_NoDisable是一个不带禁用开关的2Trit解释器,可将2Trit转成9种结果,所以上述的3Trit指令地址解析器,就可以化简了,先用DEC2_9先弄9条线路,然后用一个Mux 3将3条线路,这样就是12条线路,就可以不用3AND,只用AND来判断27种结果,这样简化后的硬件,如下图所示:

所以有了指令地址解析器,就可以弄出程序的组件了,用多个16位常量组件来存储值,然后输入地址,就输出一条指今,共27个为了简便就用了5个,如下图所示:

7.5平衡三进制计数器
首先不要有惯性思维,这平衡三进制的计数器不是从0开始的,它是从负数开始,1Trit就是T到1共3个数,2Trit就是TT到11共9个数,3Trit就是TTT到111共27个数,现在是3Trit,所以从TTT开始不断的加1,也就是从TTT到000,再从000到111的过程,如下图所示:
因为,我使用的二进制编码是:T(00)、0(01或10)、1(11),而二进制默认为0,也就是默认从T开始,所以从TTT开始不用初始化,然后不断的加一,从TTT加到111,最后再加一,进1变为1TTT,但进位位舍弃了,又变成了TTT,这样就是TTT到000到111,然后加一又变成TTT,不断的循环,这样弄出3Trit的加法器,如下图所示:

有了3Trit加法器,就可以弄出3Trit的计数器了,从TTT开始,依次是TT0、TT1......0TT、0T0......1TT、1T0等,最前面的2位不用,3Trit的计数器,如下图所示:

这样,图灵完备的零就弄好了,在第9小节就可以组装了,很快就可以得到一台平衡三进制图灵机了。
8、平衡三进制输入与输出
前面说了,平衡三进制的二进制编码方式为:T(00)、0(01或10)、1(11),这种编码方式是简化了硬件的设计,但同时也给输入与输出带来了烦索的问题,特别是输入与输出是,去辨认01或是10的设计麻烦死了,天天对照个没完,还能容易对错,所以能不能出现一种固定的新编码表示形式,也就是运行还是原来的二进制编码方式,这种标准化可有可无,去掉也不影响平衡三进制计算的运算,只是为了好辨认,将输入与输出换成固定的新编码,如下表所示:
运行时: | 输入输出时: |
---|---|
T(00) | T(10) |
0(01或10) | 0(00) |
1(11) | 1(01) |
8.1平衡三进制转换输出
这种新的编码方式,是在研究条件跳转时无意发现的,它只要较少许的组件,就可以实现两种编码的输出转换,即:T(00)输出T(10)、0(01或10)输出0(00)、1(11)输出(01),这样输出的编码固定且好读取,结合了前面的三选1基础件3组件的设计思路,编码转换输出如下图所示:

然后化简一下,得以下设计:

8.2平衡三进制转换输入
输入与输出可以统一,也可以使用原来的输入,但更建议统一的输入与输出,所以输入也标准化吧,即:T(10)输出T(00)、0(00)输出0(01)、1(01)输出1(11),其中不合法输入11,输出结果也是0(01),编码转换输入如下所示:

8.3平衡三进制的输入与输出
请记住,内部的逻辑门设计是以T(00)、0(01或10)、1(11),这种二进制编码在运行的,但这种编码输入与输出时不好用,所以最后要进行转换,用少许的组件进行编码转换你就可以得到标准的输入与输出,而不是混乱的输入与输出情况,不好判断,下面是8Tirt的输入转换:
可以看到,这样0是要初始化为01或10的,现在也变相的初始化了,也不能手动初始化每一位了,因为图灵完备这游戏输出是没有16位的输出的,只有16位的数字输入,所以只能将16位输入值与输出对照,可以看到这转换输入的输出是正确的。
同样的,将原始输出进行转换后,就会得到一个易于读取的结果,它的编码固定,也不会有两种情况的出现,这样就完成了模拟的平衡三进制计算机,标准的输入与输出了。
9、平衡三进制图灵机
终于到这一步了。从此刻起,平衡三进制的图灵机再次浮现于世人眼中,它确实是独一无二的,虽然是模拟的,但它却是工程上就可能实现的方案,弄出来后就可以优化,优化后就能跑得更快,同时也会促进原生平衡三进制计算机的实现,平衡三进制计算机终将再次王者归来。
9.1平衡三进制指令集的使用
前面的,其实用了二种指令集,一种是图灵完备原来的设计,加法运算是将REG1寄存器与REG2寄存器的值相加后,将相加后的值给REG3寄存器;另一种就参考了前苏联的Setun三进制计算机的24条指令集,是一种快速累加计算的指令集,可以减少取数据的过程,下面用两种指令进行一次加法运算,如下所示:
普通指令集(加法运算)
- 复制模式 Input--->REG1
- 立即数械 ------>REG0
- 复制模式 Input--->REG2
- 算术模式 Add (REG1+REG2)--->REG3
- 复制模式 REG3--->Output
累加地址指令集(加法运算)
- 复制模式 Input--->REGS
- 立即数械 ------>REG0
- 算术地址模式 Add A*(REG0)+REGS--->REGS
- 复制模式 REGS--->Output
累加地址指令集可以少一条指令,完成普通指令集同样的事,当然两都的架构也是不一样的,若是多次的计算,累加地址指令集更有优势;如3次加法运算,普通指令集每次加法运算要3条指令:Copy REG3--->REG1,Copy Input-->REG2,Add (REG1+REG2)-->REG3,而累加地址指令集只有2条指令:Copy Input-->REG0,Add A*(REG0)+REGS--->REGS,它少了结果要转移的过程,这样3次加法运算,就会少了3条的指令、9次加法运算就是9条指令、100次加法运算就是100条指令。
9.2平衡三进制图灵机的使用
现在,是时候组装了,平衡三进制的程序组件、计数器组件和之前的框架合体,这样就是一台完整的平衡三进制图灵机了,可以进行编码做一些简单的事情了,如下图所示:

下面是一次简单的加法运算过程,共有5条指令,如下所示:


对照表格,翻译上述指令:
- 27327(00 000111)立即数模式 Input--->REG0
- 28686(0100 TT10)复制模式 REG0-->REGS
- 27136(00 00TTTT)立即数模式 Input--->REG0
- 49158(1T00 TT00)算术地址模式Add A*(REG0)+REGS--->REGS
- 289911(01TT 1011)复制模式 REGS-->Output
上面为了测试立即数模式,所以还加上了立即数模式,也就是简单的加运算,将0111+TTTT=T000,01是复制模式,后面的2Trit不用管,只有立即数模式用到了,其它三种模式都是无效位。
运行了4刻,就出结果了为43562(0000 T000),结果很正确,平衡三进制图灵机正确的运行了,如下图所示:
9.3平衡三进制计算机的优化
这下就可以用到标准化的输入与输出了,可以将Cin分别放到指令输入端及输入端,将Cout放到输出端,这样一个标准化的输入与输出的平衡三进制计算机就弄好了,如下图所示:
还有就是指令集的输入,不一定要用平衡三进制的计数器,也可以直接用二进制的计数器,相应的也用二进制程序组件,反正也是一条一条输入的,可以用更少的门来构建这台机器,但同时也会带来表示方法不一致,二进制与平衡三进制部分混用的问题,若用T(10)、0(00)、1(01)、11弃用,这种编码也行,可以看平衡三进制计算机模拟2,最后总结一下,所有构建用到的门吧,如下图所示:


结语:
太厉害了我,竟走出了一条模拟平衡三进制计算机的路。