1.循環節の求め方

循環節の表記方法と計算方法

この章では 100以下の素数 (2, 5 を除く) について、
その逆数を循環小数で表した時の循環節、及び循環節の長さを求めてみる。
例えば、

1/7 = 0.[142857], length=6
1/11 = 0.[09], length=2
1/13 = 0.[76923], length=6
...

循環節の開始と終了の数字の上にドットをつける (1つの数字の繰り返しの時は、その数字の上にドットをつける) のが正しい表記方法だが、プログラムで扱う場合、データそのものを修飾する方法は不便なので、 循環節を [ ] でくくる表記とした。lengthは循環節の長さを表す。

例えば、1割る7、の計算手順は以下のようになる。

1/7=0 余り 1
  1 の右に 0 を置き、10/7 を計算する。
10/7=1 余り 3
  3 の右に 0 を置き、30/7 を計算する。
……

このように「余りの右に 0 を付けて 7 で割る」という操作を繰り返す。
余りが 1 になったら、始めの 1/7 に戻ったことになるので、そこで循環したことになる。

プログラム

上記の方法をそのままプログラムにする。
まず、余りの右に 0 を置くという操作は、余りを10倍することにより実現できる。
整数を素数 p で割った時の余りは、

0, 1, 2, ... , p-1

の p 通りだが、この場合割りきれることはないので、余り 0 はありえない。
したがって、余りとして取り得る値は p-1 通り。
よって、最長でも p-1 の長さで必ず循環することになる。

例えば p=7 の場合を求めてみよう。プログラムは以下のとおり。

10   ' cycle
20   A=1:P=7
30   B=A*10\P:A=res:print B;:if A<>1 then 30

このプログラムに対し、循環節の長さをカウントするために、変数lengthを追加する。
最初に length=0 とし、printするたびにカウントアップし、循環したところで length を print する。
これら全体を for 〜 next ループで回し、
100以下の素数 (2, 5 を除く) を分母とする単位分数の循環節と長さを求める。
プログラムは以下のとおり。

 5   ' cycle_p
10   for I=1 to 25:N=prm(I):if or{N=2,N=5} then 100
20     print "n=";N
30     A=1:Length=0
40     B=A*10\N:A=res:print B;:inc Length:if A<>1 then 40
50     print:print Length
60   next I

 実行結果はこちら。


この章の目次

E-mail : kc2h-msm@asahi-net.or.jp
三島 久典