关于算法:如何从不平衡三元转换为平衡三元?

How to convert from unbalanced to balanced ternary?

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

例如:十进制的 15 是不平衡三进制的 120 和平衡三进制的 --0。我如何从 120 转到 --0?我不知道如何处理不平衡三元表示中的 2。

谢谢!


请注意,三进制中的 2 是平衡三进制中的 - 或十进制中的 2 = 3 - 1。因此,如果您从一个填充有 0、1 和 2 的数组开始,只需将每个 2 替换为 -1 并添加 1到它左边的数字。 (确保在数字的开头有一个额外的 0,至少如果它以 2 开头。)根据您进行替换的方式,您可能还需要将 3 替换为 0,像往常一样在左侧添加 1。然后重复这个过程,直到没有更多的 2s(或 3s)。


一种看待它的方式是,如果您得到余数 2 余数为 x,则相当于余数 -1 余数为 x+1

然后将其转换为简单的三进制转换,需要额外的检查。

1
2
3
4
5
6
7
8
9
10
String output="";
while (n>0) {
   rem = n%3;
   n = n/3;
   if (rem == 2) {
       rem = -1;
       n++;
   }
   output = (rem==0?'0':(rem==1)?'+':'-') + output;
}

可以在此处找到正在运行的程序。


n


n


因为我在互联网上错过了这个,这里是我自己在 Pari/GP 中的实现 -

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{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);}

然后

1
2
3
4
5
6
7
8
9
balancedternary (1)    \\\\ %1002 ="1.00000000000000000000"
balancedternary (-1)   \\\\ %1003 ="y.00000000000000000000"
balancedternary (1.2)  \\\\ %1004 ="1.1yy11yy11yy11yy11yy1"
balancedternary (-1.2) \\\\ %1005 ="y.y11yy11yy11yy11yy11y"

balancedternary (27-3) \\\\ %1006 ="10y0.00000000000000000"
balancedternary (400)  \\\\ %1007 ="1yy0y11.00000000000000"
balancedternary (sqrt(3))   \\\\ %1008 ="1y.y1yy10y0000yy1100y0"
balancedternary (sqrt(3)/3) \\\\ %1009 ="1.yy1yy10y0000yy1100y0"

只是q