OverBar を使用して、繰り返し小数の繰り返し部分を表示する方法を理解しました。
repeatingDecimal
実際には繰り返し小数として機能しません。繰り返し小数のように見え、動作するバリエーションを作成したいと思います。
質問
どうすれば機能する繰り返し 10 進数表現を作成できますか (おそらく を使用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
編集:replatingDecimalのクリーンアップされたバージョン
Leonid は、Format をルーチンにラップする方法と、繰り返される小数を加算および乗算するためのアップ値を提供する方法を示しました。非常に役立ちます!アップ値とダウン値に慣れるには、しばらく時間がかかります。
以下に続くのは、基本的に、Mr.Wizard によって提案されたコードの合理化されたバージョンです。改行を許可するために、各繰り返し数字の上に OverBar を設定します。(Row の上にある 1 つの 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]]]
繰り返される小数の合計における N[] の動作に対する Format[] ラッパーの影響
Mr.Wizard は、Integers と Reals の場合、 Formatラッパーは不要であると提案しました。
次の2つの追加がどのように行われるかを考えてみましょう
repeatingDecimal[7/31] + repeatingDecimal[24/31]
N@repeatingDecimal[7/31] + N@repeatingDecimal[24/31]
次の 4 つのケースで動作します。
ケース 1 : Reals と Integers の RepeatDecimals をFormat
ラップし、up 値がONの場合の結果
予想どおり、最初の加算では整数が得られ、2 番目の加算では小数が得られます。
ケース 2 : Reals と Integers の RepeatDecimals に
Format
ラップされていないが、up 値がONの場合の結果
Reals と IntegersのFormat
ラッパーは、手元の追加には影響しません。
ケース 3 : Reals と Integers の RepeatDecimals を
Format
ラップしたが、up 値がOFFの場合の結果
upvalues が OFF の場合、Format
加算は行われません。
ケース 4 :実数と整数の繰り返しデシマルに
Format
ラップされず、値がOFFの場合の結果
upvalues が OFF で、Format` がReals と Integers の RepeatingDecimalsにラップされていない場合、2 番目の加算は期待どおりに機能します。
実数と整数の場合の Format ラッパーを削除する以上の理由があります。
ケース 3 とケース 4 の結果の違いについて何かコメントはありますか?