如何从不平衡转换为平衡三元?

时间:2014-10-19 23:37:03

标签: algorithm math ternary

我的目标是将十进制数转换为平衡三进制数。从十进制转换为非平衡三元仅需要除以3并跟踪余数。一旦我得到数字的不平衡三元表示,我似乎无法弄清楚如何“平衡”它。

例如:15位十进制在非平衡三元组中为120,在平衡三元组中为+ - 0。我如何从120到+ - 0?我无法弄清楚如何在不平衡的三元表示中处理2s。

谢谢!

5 个答案:

答案 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)

偏三元组与平衡三元组

道格拉斯·W·琼斯(Douglas W. Jones)撰写的

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转换为平衡三进制

  • 计算n,即i的平衡三进制表示形式中的位数。
    通过| i |解决≤(3 n -1)/ 2对于n我们知道n =⌈log 3 (2 | x | +1)⌉。
  • 计算偏差b =(3 n -1)/ 2。
  • 然后将i + b转换为n位数字的三进制字符串(前导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"