我已经想出如何使用OverBar显示重复小数的重复部分。
repeatingDecimal
实际上不能作为重复小数。我想做一个看起来并且行为的变体,就像一个重复的小数。
我怎样才能使工作重复十进制表示(可能使用Interpretation[]
)?
如果我絮絮叨叨,请原谅。这是我的第一个问题,我想清楚自己的想法。
以下将“绘制”重复的小数。
repeatingDecimal[q2_] :=
Module[{a},
a[{{nr__Integer}, pt_}] :=
StringJoin[
Map[ToString,
If[pt > -1, Insert[{nr}, ".", pt + 1],
Join[{"."}, Table["0", {Abs[pt]}], {nr}]]]];
(* repeating only *)
a[{{{r__Integer}}, pt_}] :=
Row[{".", OverBar@StringJoin[Map[ToString, {r}]]}];
(* One or more non-repeating;
more than one repeating digit KEEP IN THIS ORDER!! *)
a[{{nr__, {r__}}, pt_}] :=
Row[{StringJoin[
Map[ToString,
If[pt > -1, Insert[{nr}, ".", pt + 1],
Join[{"."}, Table["0", {Abs[pt]}], {nr}]]]],
OverBar@StringJoin[Map[ToString, {r}]]}];
(* One or more non-repeating; one repeating digit *)
a[{{nr__, r_Integer}, pt_}] :=
Row[{StringJoin[Map[ToString, {nr}]], ".",
OverBar@StringJoin[Map[ToString, r]]}];
a[RealDigits[q2]]]
所以
repeatingDecimal[7/31]
正确显示重复小数(此处显示为图片,以便显示OverBar)。
在引擎盖下看,它实际上只是一个冒名顶替者,一个重复小数的图像......
In[]:= repeatingDecimal[7/31]//FullForm
Out[]:= Row[List[".",OverBar["225806451612903"]]]
当然,它的行为不像数字:
% + 24/31
我希望增加产量:1
Leonid展示了如何在例程中包装Format并提供用于添加和乘以重复小数的up值。很有帮助!我需要一些时间来适应上下值。
以下内容基本上是Mr.Wizard建议的简化版代码。我在每个重复数字上方设置OverBar以允许换行。 (Row上方的单个OverBar看起来更整洁但是在达到正确的屏幕边距时无法中断。)
ClearAll[repeatingDecimal]
repeatingDecimal[n_Integer | n_Real] := n
Format[repeatingDecimal[q_Rational]] := Row @ Flatten[
{IntegerPart@q, ".", RealDigits@FractionalPart@q} /.
{{nr___Integer, r_List: {}}, pt_} :> {Table[0, {-pt}], nr, OverBar /@ r}
]
repeatingDecimal[q_] + x_ ^:= q + x
repeatingDecimal[q_] * x_ ^:= q * x
repeatingDecimal[q_] ^ x_ ^:= q ^ x
下表显示repeatingDecimal
的一些输出:
n1 = 1; n2 = 15; ClearAll[i, k, r];
TableForm[Table[repeatingDecimal[i/j], {i, n1, n2}, {j, n1, n2}],
TableHeadings -> {None, Table[("r")/k, {k, n1, n2}]}]
现在让我们检查重复小数的加法和乘法:
a = repeatingDecimal[7/31];
b = repeatingDecimal[24/31];
Print["a = ", a]
Print["b = ", b]
Print["a + b = ", a, " + ", b, " = ", a + b]
Print["7/31 \[Times] 24/31 = " , (7/31)* (24/31)]
Print["a\[Times]b = ", a*b, " = \n", repeatingDecimal[a*b]]
Print[N[168/961, 465]]
因此,重复小数的加法和乘法可以根据需要工作。 Power
似乎也能正常运作。
请注意,168/961占据小数点右侧的465个位置。之后,它开始重复。除了N[168/961, 465]
之外,结果与OverBar
的结果相匹配,但换行符发生在不同的地方。并且,正如预期的那样,这与以下内容相吻合:
digits = RealDigits[168/961]
Length[digits[[1, 1]]]
让我们考虑以下两个新增内容
repeatingDecimal[7/31] + repeatingDecimal[24/31]
N@repeatingDecimal[7/31] + N@repeatingDecimal[24/31]
表现在四种不同的情况:
案例1 :Format
包裹围绕reals和整数的重复十进制的结果,而值 ON
正如预期的那样,第一次加法产生一个整数,第二次加法产生一个小数。
<小时/> 案例2 :
Format
未包裹围绕重复和整数的重复的结果但结果值 ON
Reals and Integers周围的Format
包装不会影响手头的增加。
<小时/> 案例3 :
Format
包裹围绕reals和整数的重复十进制的结果,但上升值 OFF
如果upvalues为OFF,Format
会阻止添加。
<小时/> 案例4 :当
Format
未包裹围绕重复和整数的重复行数时,结果为 OFF
如果upvalues为OFF并且格式为`未包装在Reals和Integers的repeatingDecimals周围,则第二个加法按预期工作。
为实数和整数的情况删除格式包装器的更多理由。
任何人都对案例3和案例4中的不同结果有任何评论?
答案 0 :(得分:10)
你不应该给出repeatingDecimal
DownVaues
,而应该FormatValues
:
ClearAll[repeatingDecimal];
Format[repeatingDecimal[q2_]] :=
Module[{a},
a[{{nr__Integer}, pt_}] :=
StringJoin[
Map[ToString,
If[pt > -1, Insert[{nr}, ".", pt + 1],
Join[{"."}, Table["0", {Abs[pt]}], {nr}]]]];
(*repeating only*)
a[{{{r__Integer}}, pt_}] :=
Row[{".", OverBar@StringJoin[Map[ToString, {r}]]}];
(*One or more non-repeating;
more than one repeating digit KEEP IN THIS ORDER!!*)
a[{{nr__, {r__}}, pt_}] :=
Row[{StringJoin[
Map[ToString,
If[pt > -1, Insert[{nr}, ".", pt + 1],
Join[{"."}, Table["0", {Abs[pt]}], {nr}]]]],
OverBar@StringJoin[Map[ToString, {r}]]}];
(*One or more non-repeating;one repeating digit*)
a[{{nr__, r_Integer}, pt_}] :=
Row[{StringJoin[Map[ToString, {nr}]], ".",
OverBar@StringJoin[Map[ToString, r]]}];
a[RealDigits[q2]]]
然后,你也可以给它UpValues
,以便与常用功能集成,例如:
repeatingDecimal /: Plus[left___, repeatingDecimal[q_], right___] := left + q + right;
repeatingDecimal /: Times[left___, repeatingDecimal[q_], right___] := left * q * right;
然后,例如,
In[146]:= repeatingDecimal[7/31]+24/31
Out[146]= 1
您可以将此方法扩展到您可能希望使用repeatingDecimal
。
答案 1 :(得分:2)
以下是您更新的代码的可能重构。我认为这次有效(手指交叉)。如果您不需要颜色突出显示,则可以不使用~Style~
和该行的其余部分。
ClearAll[repeatingDecimal];
Format[repeatingDecimal[n_Integer | n_Real]] := n;
Format[repeatingDecimal[q_Rational]] :=
Row[{IntegerPart@q, ".", RealDigits@FractionalPart@q}] /.
{{ nr___Integer, r_List:{} }, pt_} :>
Row@Join[
"0" ~Table~ {-pt},
{nr},
If[r === {}, {}, {OverBar@Row@r}]
] ~Style~ If[r === {}, Blue, If[{nr} === {}, Red, Gray]]
repeatingDecimal /:
(h : Plus | Times)[left___, repeatingDecimal[q_], right___] :=
h[left, q, right];
我会在这里留下这个旧版本以供参考,但我现在正在编辑问题社区维基。