本文
問題提起
筆者が中学生か高校生のころ、有理数の小数表現、とくに循環節に何らかの規則性があるのではと調べてみたものの、よくわからず断念しました。
あれから時を経て、次のプログラミングの問題を目にしました。
これはまさに当時の疑問を解決してくれるものでした。
本稿ではこの問題の解法について解説します。
循環小数
を正の整数とする。
を循環小数で表したときの循環節の長さを求めよ。
の陽関数として解が求められる問題ではないのですが、プログラミングを活用することで、ある程度は高速に求められるということです。
実験
小さいに対して実験してみましょう。
割り切れる場合の循環節の長さは、と考えることにより、ここではとします。
| | 循環節の長さ | 備考 |
| | | 割り切れる |
| | | 割り切れる |
| | | |
| | | 割り切れる |
| | | 割り切れる |
| | | と同じ |
| | | |
| | | 割り切れる |
| | | |
| | | 割り切れる |
| | | |
| | | と同じ |
| | | |
| | | と同じ |
| | | と同じ |
| | | 割り切れる |
| | | |
| | | と同じ |
| | | |
| | | 割り切れる |
| | | |
この表を観察すると、次のことが予想できます。
- および では必ず割り切れるため、これらの素因数をはじめに取り除いて考えても循環節には影響しない
- が素数のときにとなるようにも見えるが、反例がある ()
- 循環する部分が一つ見つかったとすれば、循環節の長さはその約数
上で計算したにを掛けて戻すと、確かにとなっています。
例えば、のときであり、
がで割り切れるような最小のを求めることになります。
これは、
を満たす最小のと言い換えられます。
準備
本問を解くのに必要な定理を準備します。
有名な定理については、証明は省略します。
位数
とが互いに素であるとき、
を満たす最小のを、の における位数 (order) と呼ぶ。
とが互いに素であり、をの における位数とするとき、
の素因数の種類 (重複なし) が と表せたとすると、
今回はが素数とは限らないため、
Fermat の小定理
を拡張した
Euler の定理
を使います。
とが互いに素であり、をの における位数とするとき、
解 (アルゴリズム)
がまたはの倍数のとき、循環節の長さに影響しないため、をまたはで割っておく。
ここでとなる場合、解はとする。
以下、とは互いに素であるとする。
に循環する部分があるとすると、それはある長さのをで割ったものである。
すなわち、
求める循環節の長さは、上の式を満たす最小のである。
とは互いに素であるから、求める循環節の長さはの における位数となり、
定理 4 より、これはの約数のいずれかである。
したがって、の約数を小さい順に列挙し、を満たしていればそれが解となる。
であるため、解は必ず存在する。
なお、を満たすため、この議論はでも成り立つ。
時間計算量は、の計算およびその約数の列挙の部分がともにボトルネックとなり、となります。
補記
解法としては上記で十分ですが、Euler の定理におけるをさらに精緻化した
Carmichael の定理
があり、
とが互いに素であるとき、「すべてのに対してを満たす」の最小値として、Carmichael 関数が求められます。
ただし、特定のに対して最小になるとは限らないため、解はの約数のいずれかであるという点は変わりません。
したがって、次の結果が得られます。
とが互いに素であるとき、
を循環小数で表したときの循環節の長さはを満たす最小のであり、
それはの約数のいずれかである。
また、本稿に現れた循環小数の性質は、全ての桁の数字がである
レピュニット (レプユニット; repunit)
とも関連があります。
を正の整数とする。
ある長さのレピュニットが存在してを満たすならば、
が成り立つ。
であるとする。
ここで、はの倍数だから、が成り立つ。
とが互いに素であるとき、
ある長さのレピュニットが存在して、を満たす。
上の解についての議論から、
を満たすが存在する。
すなわち、このに対してを満たす。
(i) とが互いに素であるとき、を満たす (を含む)。
(ii) とが互いに素でないとき、補題 6 および (i) により、再帰的に題意が成り立つ。