この章では 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
前 | この章の目次 | 次 |
---|