4
大学数学基礎解説
文献あり

循環小数の循環節の長さ

1578
0

本文

問題提起

筆者が中学生か高校生のころ、有理数の小数表現、とくに循環節に何らかの規則性があるのではと調べてみたものの、よくわからず断念しました。
あれから時を経て、次のプログラミングの問題を目にしました。

これはまさに当時の疑問を解決してくれるものでした。
本稿ではこの問題の解法について解説します。

循環小数

Nを正の整数とする。
1Nを循環小数で表したときの循環節の長さを求めよ。

O(1)の陽関数として解が求められる問題ではないのですが、プログラミングを活用することで、ある程度は高速に求められるということです。

実験

小さいNに対して実験してみましょう。
割り切れる場合の循環節の長さは、1=0.9˙と考えることにより、ここでは1とします。

N1/N循環節の長さ備考
111割り切れる
20.51割り切れる
30.3˙1
40.251割り切れる
50.21割り切れる
60.16˙1N=3と同じ
70.1˙42857˙6
80.1251割り切れる
90.1˙1
100.11割り切れる
110.0˙9˙2
120.083˙1N=3と同じ
130.0˙76923˙6
140.07˙14285˙6N=7と同じ
150.06˙1N=3と同じ
160.06251割り切れる
170.0˙588235294117647˙16
180.05˙1N=9と同じ
190.0˙52631578947368421˙18
200.051割り切れる
210.0˙47619˙6

この表を観察すると、次のことが予想できます。

  • 2 および 5 では必ず割り切れるため、これらの素因数をはじめに取り除いて考えても循環節には影響しない
  • Nが素数のときにN1となるようにも見えるが、反例がある (N=3,11,13)
  • 循環する部分が一つ見つかったとすれば、循環節の長さはその約数

上で計算した1NNを掛けて戻すと、確かに0.9˙となっています。
例えば、N=7のとき142857×7=999999であり、
10k1Nで割り切れるような最小のkを求めることになります。
これは、
  10k1(modN)
を満たす最小のkと言い換えられます。

準備

本問を解くのに必要な定理を準備します。
有名な定理については、証明は省略します。

位数

anが互いに素であるとき、
ak1(modn)を満たす最小のk>0を、amodn における位数 (order) と呼ぶ。

anが互いに素であり、mamodn における位数とするとき、
  k>0, ak1(modn)  mk

k=qm+r  (0r<m)とすると、aqm+rar1となるから、r=0

Euler の totient 関数

nは正の整数とする。
n個の整数1,2,,nのうち、nと互いに素なものの個数を Euler の totient 関数 と呼び、φ(n)で表す。

nの素因数の種類 (重複なし) が p1,p2,,pm と表せたとすると、
  φ(n)=n1impi1pi

Euler の定理

anが互いに素であるとき、
  aφ(n)1(modn)

今回はNが素数とは限らないため、 Fermat の小定理 を拡張した Euler の定理 を使います。

anが互いに素であり、mamodn における位数とするとき、
  mφ(n)

定理 1 と定理 3 による。

解 (アルゴリズム)

N2または5の倍数のとき、循環節の長さに影響しないため、N2または5で割っておく。
ここでN=1となる場合、解は1とする。

以下、10Nは互いに素であるとする。
1Nに循環する部分があるとすると、それはある長さk>09999Nで割ったものである。
すなわち、
  10k10(modN)
  10k1(modN)
求める循環節の長さは、上の式を満たす最小のk>0である。

10Nは互いに素であるから、求める循環節の長さは10modN における位数となり、
定理 4 より、これはφ(N)の約数のいずれかである。
したがって、φ(N)の約数dを小さい順に列挙し、10d1を満たしていればそれが解となる。
10φ(N)1であるため、解は必ず存在する。

なお、1011(mod1)を満たすため、この議論はN=1でも成り立つ。

時間計算量は、φ(N)の計算およびその約数の列挙の部分がともにボトルネックとなり、O(N)となります。

補記

解法としては上記で十分ですが、Euler の定理におけるφ(n)をさらに精緻化した Carmichael の定理 があり、
anが互いに素であるとき、「すべてのaに対してak1(modn)を満たすk>0」の最小値として、Carmichael 関数λ(n)が求められます。
ただし、特定のa=10に対して最小になるとは限らないため、解はλ(n)の約数のいずれかであるという点は変わりません。
したがって、次の結果が得られます。

10nが互いに素であるとき、
1nを循環小数で表したときの循環節の長さは10k1(modn)を満たす最小のk>0であり、
それはλ(n)の約数のいずれかである。

また、本稿に現れた循環小数の性質は、全ての桁の数字が1である レピュニット (レプユニット; repunit) とも関連があります。

nを正の整数とする。
ある長さk>0のレピュニットRkが存在してnRkを満たすならば、
3nR3kが成り立つ。

nRkであるとする。
  R3k=Rk102k+Rk10k+Rk=Rk(102k+10k+1)
ここで、102k+10k+1=100001000013の倍数だから、3nR3kが成り立つ。

10nが互いに素であるとき、
ある長さk>0のレピュニットRkが存在して、nRkを満たす。

上の解についての議論から、
  10k10(modn)
を満たすk>0が存在する。
すなわち、このkに対してn9Rkを満たす。

(i) 3nが互いに素であるとき、nRkを満たす (n=1を含む)。
(ii) 3nが互いに素でないとき、補題 6 および (i) により、再帰的に題意が成り立つ。

参考文献

投稿日:2021827
OptHub AI Competition

この記事を高評価した人

高評価したユーザはいません

この記事に送られたバッジ

バッジはありません。
バッチを贈って投稿者を応援しよう

バッチを贈ると投稿者に現金やAmazonのギフトカードが還元されます。

投稿者

Researcher and Developer for Algorithms, using C# (.NET). 数検1級金賞 (2002).

コメント

他の人のコメント

コメントはありません。
読み込み中...
読み込み中
  1. 本文
  2. 問題提起
  3. 実験
  4. 準備
  5. 解 (アルゴリズム)
  6. 補記
  7. 参考文献