用Rust写平衡三进制除法器

1、除法的本质

        除法的本质是减法,也就是一个大的数减去一个小的数,比如:10/2,也就是10-2-2-2-2-2=0,所以商5余0,10/3,也就是10-3-3-3=1,所以商3余1,这也是很常见的方法,但如果引入负数,情况又会有些变化,分成4种总结为2种:

10/2=10-(2*1)-2-2-2-2=0  商5余0,

-10/-2=-10-(-2*1)+2+2+2+2=0 商5余0,

10/-2=10-(-2*-1)-2-2-2-2=0 商-5余0,

-10/2=-10-(2*-1)+2+2+2+2=0 商-5余0,

        通过上面示例,可看出双正双负,得的商是正数,而一正一负,得的商是负数,仔细看10/-2及-10/2这两个例子,拿10/-2举例,10-(-2)=12越来越大了,与实际情况不符,所以要乘于-1即,10-(-2*-1)=8与实际情况相符,所以商是负数正确;对于平衡三进制同样适用,被除数与除数相减后变余数,被除数(余数)与除数同种符号,上1反之上T,这样才能保证两者越来越趋向于0,所以最简单粗暴方法就是,用减法来做加法 ,详情请看:二进制如何做除法?及 平衡三进制四则运算 文章。

2、平衡三进制除法器:减法器版

        平衡三进制的好处就是对称,但也特别的有特点,比如它的减法器,在平衡三进制加法器中它是正向进位的,而减法器它可以负向进位,你没听错是负向进位,当初的我算也不会算,后面得益于我的初中知识,有公式:被减数 + 取反的要减数=  被减数 - 要减数,即12-6=6相当于12+(-6)=6,负负得正了,这确很方便了,只要被减数加上取反的要减数,就可以得到结果,但其实它的减法表也是可以用,不过太反直觉了,并不建议使用,减法器版除法器,原理如下所示:

用Rust写平衡三进制除法器_第1张图片

        可得代码:不想写了


3、平衡三进制除法器:试商版

        说实话,其实这才是最常用的,就像10/2=5,没人会10-2-2-2-2-2=0这样算,但对于平衡三进制来说,不理解它的话,这样是最简单的,用十进制的试商方法,刚开始算了很多次,都无从下手,不是结果不对,就是不知道商是+0-,直到我看到了这文章托马斯·福勒的三元计算机,才知道这还真能算,我差点就觉得它压根算了,但它实现是太规整,如下图所示:

用Rust写平衡三进制除法器_第2张图片

        它算的是280/5=35,过程很清楚,即216+72+0+8=280,中间结果余数是允许有负的,就像上面的-8,这里有三个点要注意,首先是减法太麻烦了,当商上+时,应是写成(+0++0+)-(+0-000),现在变成了(+0++0+)+(-0+000),这就是相减变成加上它的相反数,所以商为+时,出相反数,商为-时,直接照样写;然后就是对位要齐,若对不齐就会导致算错,这里+0-后面,跟了多少个0,每多1个0,那就要多乘3,可出列表格:

平衡三进制数 十进制 
+0-000 216(8*3*3*3)
+0-00 72(8*3*3)
+0- 8

还有就就是商要怎么上,就是要余数趋于0,规则如下所示:

被除数(余数)与除数互为相反数,商就上- ;

中间结果移动了两位数字,上0先对齐;

当被除数(余数)与除数的符号,都为正数或负数,商就上+;

感觉学会了,下面来用一下吧,比如10/2和4/2的平衡三进制除法:

用Rust写平衡三进制除法器_第3张图片

没想到吧,10/2可以取18这个数,比10都大,但是结果就是正确的,其它都不行,这是怎么想到的,也就是+-后面加0,即+-为2、+-0为6、+-00为18,商是+--,所以结果是18-6-2=10,也就是10-18+6+2=0;同样的,4/2相当于4-6+2=0,商就是+-,6不6,太难算了。


4、九九乘法表:拼好数版

用Rust写平衡三进制除法器_第4张图片

将九九乘法表,转成了平衡三进制的版本,发现一些有趣的特性,那就是拼好数,例如:

用Rust写平衡三进制除法器_第5张图片


5、拼好数:找最小商

        大概思路是寻找最小商,如果能找到最小商,比如(+0-000)、(-++0)、(-+0),目前没发现什么规律,只知道a*b得c,结果c的位数,肯定是大于或等于a及b的位数的,其实最常用的对齐方式,就是与被除数同样长度,结果不对再被除数前面加0,以下是一些运算:

用Rust写平衡三进制除法器_第6张图片

你可能感兴趣的:(三进制,平衡三进制,三进制,运维,服务器)