我的目标是将十进制数转换为平衡三进制数。从十进制转换为非平衡三元仅需要除以3并跟踪余数。一旦我得到数字的不平衡三元表示,我似乎无法弄清楚如何“平衡”它。
例如:15位十进制在非平衡三元组中为120,在平衡三元组中为+ - 0。我如何从120到+ - 0?我无法弄清楚如何在不平衡的三元表示中处理2s。
谢谢!
答案 0 :(得分:4)
注意,三元组中的2是+ - 平衡三元组,或小数组2 = 3 - 1.所以如果你从一个填充0s,1s和2s的数组开始,只需用-1替换每个2并添加1到左边的数字。 (确保在数字的开头有一个额外的0,至少如果以2开头。)根据你的替换方式,你可能还需要用0替换3s,像往常一样在左边加1。然后重复该过程,直到不再有2s(或3s)。
答案 1 :(得分:2)
一种看待它的方法是,如果你得到剩余商2
的余数x
,则相当于剩余的-1
剩余商数为x+1
String output="";
while (n>0) {
rem = n%3;
n = n/3;
if (rem == 2) {
rem = -1;
n++;
}
output = (rem==0?'0':(rem==1)?'+':'-') + output;
}
。
转换它就像是简单地转换为三元基,只需要额外检查一下。
@states_nationalities.to_json
可以找到正在运行的程序here。
答案 2 :(得分:0)
由于我在互联网上缺少此信息,因此我在Pari / GP中的实现-
data3 = data2.str.slice(0,-1)
然后
{balanced_ternary(x,maxdigits=20,chars=["y","0","1"])=my(res,st,dez,dig);
dez=floor(log(abs(2*x))/log(3));
res=x/3^dez;
st="";
for(k=0,maxdigits,
if(k==dez+1,st=Str(st,"."));
dig = if(res>1/2
,res--;chars[2+1]
,if(res<-1/2
,res++;chars[2-1]
,chars[2+0]
));
st=Str(st,dig);res*=3
);
return(st);}
仅是问答,并非所有“特殊情况”都已检查/编码。
答案 3 :(得分:0)
我知道这个问题是关于从常规三元数转换的,但是FWIW,您也可以通过从十进制直接转换为平衡三元数来实现既定目标,例如通过以下程序
答案 4 :(得分:0)
The Ternary Manifesto是有关(平衡)三进制表示的极好的信息来源。作者指出
平衡三进制编码完全等同于偏置编码
有偏编码是一种使用偏移量b在(有界)无符号数字中对有符号数字进行编码的方法。要读取有偏差的数字,请照常读取它,然后减去b以得到表示的值。
道格拉斯·W·琼斯(Douglas W. Jones)对connection between ternary biased and balanced numbers的描述如下,举了一个带有两个三进制数字(= trits )的示例。
Decimal Biased Balanced 4 22 ++ 3 21 +0 2 20 +- 1 12 0+ 0 11 00 -1 10 0- -2 02 -+ -3 01 -0 -4 00 --
[...]
n-trit三进制数的自然偏差b均为1:
b =⌊3 n /2⌋=(3 n -1)/ 2
[...]
要将有偏数转换为平衡数,请从每个数字中减去1,因此2变为+1
(表示为+
),1变为0
(表示为0
),以及0变为–1
(表示为-
)。
[...]
这仅仅是与数字关联的符号的变化,与数字在页面上的打印方式有关,而与数字在某种机制内的表示方式无关。偏见和平衡表示之间的差异可以认为完全是装饰性的
要将整数i转换为平衡三进制
0
很重要!),012
替换为-0+
。Java的jshell中的示例实现:
import static java.lang.Math.*;
String balTer(int i) {
// n=…+1 and ….substring(1) ensure leading zeroes
int n = max(1, (int) ceil(log(2 * abs(i) + 1) / log(3))) + 1;
int b = ((int) pow(3, n) - 1) / 2;
return Integer.toString(i + b, 3).substring(1)
.replace('0', '-').replace('1', '0').replace('2', '+');
}
balTer(15) // returns "+--0"