Wolfram mathematica 如何在mathematica中以不同的基数显示重复小数

Wolfram mathematica 如何在mathematica中以不同的基数显示重复小数,wolfram-mathematica,Wolfram Mathematica,我读过关于在它们上显示和执行简单算术的文章,但我想知道,鉴于这一点(或者只是从头开始),当给定不同的基础时,如何显示并进一步类似地在它们上执行算术 比如说, (1/3)_2=0.01表示二进制形式的分数1/3重复二进制数字01 谢谢。'realdights'能够处理各种基数,例如 RealDigits[1/3, 2] {{{1, 0}}, -1} 有关可能获得的精确输出格式,请参阅。它可能相当复杂。这里是一个尝试。Wizard先生做了很多繁重的工作,尤其是在保基运算方面 rd[n_] :=

我读过关于在它们上显示和执行简单算术的文章,但我想知道,鉴于这一点(或者只是从头开始),当给定不同的基础时,如何显示并进一步类似地在它们上执行算术

比如说,

(1/3)_2=0.01
表示二进制形式的分数
1/3
重复二进制数字
01


谢谢。

'realdights'能够处理各种基数,例如

RealDigits[1/3, 2]

{{{1, 0}}, -1}

有关可能获得的精确输出格式,请参阅。它可能相当复杂。

这里是一个尝试。Wizard先生做了很多繁重的工作,尤其是在保基运算方面

rd[n_] := rd[n, 10]
rd[rd[n_, _], b_] := rd[n, b]

Format[rd[n_Integer | n_Real, base_]] := BaseForm[n, base]

Format[rd[q_Rational, base_]] :=
  Subscript[Row @ Flatten[{
     IntegerString[IntegerPart@q, base], ".",
     RealDigits[FractionalPart@q, base] /.
      {{nr___, r_List:{}}, pt_} :> {0~Table~{-pt}, nr, OverBar /@ r}
   }], base /. 10 -> ""]
可以使用以下方法实现基本保留算法:

Scan[
  (#[rd[q1_, b1_], rd[q2_, b2_] | tail___] ^:=
     rd[ #[q1, q2, tail], If[b1 === b2, b1, 10] ]) &,
  {Plus, Times, Power}
]
检查是否可以在多个基数中转换为重复小数。还检查加法、乘法和除法的例程:

Grid[{{"n", "value", "decimal", "rd[n,10]", "rd[n,2]", "rd[n,3]",  "rd[n,7]"}, 
 {"a", a = 14/3, N[a], rd[a, 10], rd[a, 2], rd[a, 3],  rd[a, 7]}, 
 {"b", b = 2/5, N[b], rd[b, 10], rd[b, 2], rd[b, 3], rd[b, 7]}, 
 {"c", c = 1/2, N[c], rd[c, 10], rd[c, 2], rd[c, 3], rd[c, 7]}, 
 {"a + b", a + b, N[a + b], rd[a, 10] + rd[b, 10], 
    rd[a, 2] + rd[b, 2], rd[a, 3] + rd[b, 3], rd[a, 7] + rd[b, 7]}, 
 {"a + b + c", a + b + c, N[a + b + c], 
   rd[a, 10] + rd[b, 10] + rd[c, 10], rd[a, 2] + rd[b, 2] + rd[c, 2], 
   rd[a, 3] + rd[b, 3] + rd[c, 3], 
   rd[a, 7] + rd[b, 7] + rd[c, 7]}, 
 {"a \[Times] b ", a*b, N[a*b], 
    rd[a, 10]*rd[b, 10], rd[a, 2]*rd[b, 2], rd[a, 3]*rd[b, 3], 
    rd[a, 7]*rd[b, 7]}, {"a \[Times] b \[Times] c ", a*b*c, N[a*b*c], 
    rd[a, 10]*rd[b, 10]*rd[c, 10], rd[a, 2]*rd[b, 2]*rd[c, 2], 
    rd[a, 3]*rd[b, 3]*rd[c, 3], rd[a, 7]*rd[b, 7]*rd[c, 7]}, 
 {"a / b", 
    a/b, N[a/b], rd[a, 10]/rd[b, 10], rd[a, 2]/rd[b, 2], 
    rd[a, 3]/rd[b, 3], rd[a, 7]/rd[b, 7]}}, Dividers -> All]


编辑

最新的改进(再次归功于Wizard先生)支持嵌套:

ClearAll[f, x, y]
f := (x/(x + 3 + 2 y) + y)/7 x; f
f // FullForm
x = 14/3; y = 1/3; f
BaseForm[N[f], 10]
x = rd[14/3, 10]; y = rd[1/3, 10]; f
x = rd[14/3, 2]; y = rd[1/3, 2]; f
x = rd[14/3, 5]; y = rd[1/3, 5]; f

简单:
BaseForm[1./12,3]
将以重复小数形式显示基数3中的1/12(1后面的小数点是为了确保近似值)


额外:将基数x转换为基数10更简单
x^^

谢谢您指出这一点。然而,我问的是如何做与原始链接完全相同的事情,显示重复的小数点,然后做一些算术,如加法/减法等。@Qiang做“一些算术”的部分有点模糊。你能详细说明一下吗?例如,在显示了
(1/3)\u 2
的重复小数后,我希望它能处理这种情况
(1/3)\u 2+(5/3)\u 2=10\u 2
@QiangLi你能不能像往常一样做算术,并将结果通过realdights?+1作为小数点,这是我以前在
BaseForm
中从未见过的。还有一些事情要做:你的方法并不能明确地识别重复的部分,但知道这一点是件好事。我会四处看看,看看我能想出什么。@Mr.很高兴得到你的帮助。关于最后一行,你可能是对的。当我翻出旧代码时,最后3行都被隐藏了。让我看看你想到了什么。目前,未执行以10以外的基数计算。@Mr.Wizard Ok。很高兴听到这个消息。我删除了行
rd/:(h:Plus | Times)
的交换性质,这似乎是多余的。现在显示的代码是否通过了一系列测试?@Mr.Wizard所有例程都工作正常。非常感谢你的帮助!顺便说一句,如果我们可以通过一些按键组合直接通过键盘输入重复的小数,那就太好了。这当然假定Mma对这些小数有基本的了解。