Как мне сделать «рабочее» повторяющееся десятичное представление рационального числа?

Я понял, как отображать повторяющуюся часть повторяющейся десятичной дроби с помощью OverBar.

RepeatingDecimal на самом деле не работает как повторение десятичной дроби. Я хотел бы сделать его вариант, который выглядит и ведет себя как повторяющееся десятичное число.


Вопрос

Как я могу сделать работающее повторяющееся десятичное представление (возможно, используя Интерпретация [] )?


Справочная информация

Пожалуйста, извините, если я бреду. Это мой первый вопрос, и я хотел прояснить, что я имею в виду.

Следующее будет «рисовать» повторяющееся десятичное число.

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).

Repeating decimal displayed

Если заглянуть под капот, это действительно просто самозванец, изображение повторяющейся десятичной дроби ...

In[]:= repeatingDecimal[7/31]//FullForm
Out[]:= Row[List[".",OverBar["225806451612903"]]]

Конечно, оно не ведет себя как число:

% + 24/31

fraction plus repeating decimal

Я бы хотел, чтобы добавление yield: 1


Edit: очищенная версия RepeatingDecimal

Леонид показал, как обернуть Format вокруг подпрограммы и предоставить повышающие значения для добавления и умножения повторяющихся десятичных знаков. Очень полезно! Мне потребуется некоторое время, чтобы освоиться с повышением и понижением значений.

То, что следует ниже, по сути является упрощенной версией кода, предложенного мистером Волшебником. Я устанавливаю OverBar над каждой повторяющейся цифрой, чтобы разрешить разрыв строки. (Одиночная полоса 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

В таблице ниже показаны некоторые выходные данные из repeatDecimal :

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

enter image description here


Проверка решения: Работа с повторяющимися десятичными знаками

Давайте теперь проверим сложение и умножение повторяющихся десятичных знаков:

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

repeating decimal addition and multiplication

Итак, сложение и умножение повторяющихся десятичных знаков работают должным образом. Power также работает правильно.

Обратите внимание, что 168/961 занимает 465 знаков справа от десятичной точки. После этого он начинает повторяться. Результаты совпадают с результатами N [168/961, 465] , за исключением OverBar , хотя перенос строки происходит в разных местах. И, как и следовало ожидать, это согласуется со следующим: Результаты, когда Format обернул вокруг repeatDecimals для вещественных и целых чисел, но верхние значения - ВЫКЛ.

Case 3

Если повышающие значения выключены, Формат предотвращает добавление.


Случай 4 ]: Результаты, когда Format НЕ обернут вокруг RepeatingDecimals для вещественных и целых чисел, а повышающие значения - ВЫКЛ.

Case 4

Если upvalues ​​выключены, а Format` НЕ обернут вокруг repeatDecimals для вещественных и целых чисел , второе добавление работает, как ожидалось.

Еще одна причина удалить оболочку Format для случая действительных и целых чисел.


У кого-нибудь есть замечания по поводу различных результатов в случаях 3 и 4?

12
задан 33 revs, 2 users 97% 7 December 2012 в 20:14
поделиться