12

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]]]

465桁


繰り返される小数の合計における 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の場合の結果

ケース1

予想どおり、最初の加算では整数が得られ、2 番目の加算では小数が得られます。


ケース 2 : Reals と Integers の RepeatDecimals にFormat ラップされていないが、up 値がONの場合の結果

ケース 2

Reals と IntegersのFormatラッパーは、手元の追加には影響しません。


ケース 3 : Reals と Integers の RepeatDecimals をFormat ラップしたが、up 値がOFFの場合の結果

ケース 3

upvalues が OFF の場合、Format加算は行われません。


ケース 4 :実数と整数の繰り返しデシマルにFormat ラップされず、値がOFFの場合の結果

ケース 4

upvalues が OFF で、Format` がReals と Integers の RepeatingDecimalsにラップされていない場合、2 番目の加算は期待どおりに機能します。

実数と整数の場合の Format ラッパーを削除する以上の理由があります。


ケース 3 とケース 4 の結果の違いについて何かコメントはありますか?

4

2 に答える 2

11

を与えるべきではありませんでしたが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

于 2011-03-05T00:36:30.550 に答える
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];

参照用にこの古いバージョンをここに残しておきますが、現在、Question コミュニティ wiki を編集しています。

于 2011-03-05T13:32:57.000 に答える