Project Euler 129

Problem 129

A(n)は、

(10e - 1) / 9 ≡ 0 (mod n)

となる1以上で最小のeです。
nが2または5で割り切れるとき、この式を満たすeは無いので考慮に入れません。
A(n)は、nが3で割り切れないとき、

10e ≡ 1 (mod n)

となる最小のeです。7の剰余なら、10から10倍していって、

10 → 2 → 6 → 4 → 5 → 1

だから最小のeは6、11の剰余なら、

10 → 1

だから2です。このeをB(n)と書くことにしましょう。B(7) = 6、B(11) = 2です。

nの既約剰余類群で10が原始根になっていればB(n) = φ(n)です。既約剰余類というのは、nと互いに素の剰余の乗法に関する群です。例えばn = 12なら、1, 5, 7, 11がnに互いに素です。そうするとこれが乗法に関して群になります。

  1 5 7 11
1 1 5 7 11
5 5 1 11 7
7 7 11 1 5
11 11 7 5 1

この群の元はオイラーの関数を使ってφ(n)個あります。geで全ての元を生成できるとき、gを原始根と言います。そのとき全ての元をめぐって1周してくるので、gφ(n) ≡ 1となってφ(n)がge ≡ 1を満たす最も小さいeです。

n素数pのとき、原始根は必ず存在します。このときφ(p) = p - 1なので、B(p) = p - 1です。だから、pが小さくてもB(p)が比較的大きくなります。これ以外で大きくなるのはn = p2と書けるときです。φ(n) = p(p - 1)です。これがNを超えると、p > √N + 1/2なので、n > N + √Nです。N = 106なら、nはNを1000以上超えることになります。一方、NとN + √Nの間には素数定理から√N / logN ≒ 72個くらいあります。n素数のとき必ずしも10が原始根になるわけではないですが、原始根は各素数pに対してφ(p - 1)個あるので、10が原始根になる確率はそんなに低くないです。だから、NとN + √Nの間に10が原始根になる素数pがほぼ確実にあると言っていいでしょう。だから、n素数だけを考えればよいです。

さて、素数pの既約剰余類について10が原始根であるか判定しましょう。例えば、p = 1801を考えます。p - 1 = 23 * 32 * 52です。読みにくいのでこれを指数だけ取り出して(3, 2, 2)と書くことにします。フェルマーの小定理から、

10p-1 ≡ 1(mod p)

だから、B(p)はp - 1に約数になります。そして、B(p)は(3, 2, 2)でないなら

(2, 2, 2), (3, 1, 2), (3, 2, 1)

のいずれかの約数になります。よってこの3つの自然数miについて、

10mi ≡ 1(mod p)

がいずれも成り立たなければ、p - 1の真約数のいずれでも成り立たないことになり、10が原始根であることがわかります。逆は明らかですね。さらに

10p-1 ≡ 1(mod p)

を判定に入れると素数判定をしなくても済みます。これを先に行うとある程度弾けるので、速度アップにつながります。

nが3を含む場合は、

(10e - 1) / 9 ≡ 0(mod n)
10e ≡ 1(mod 9n)

となります。n = 3em(mは3で割り切れない自然数)として、B(9n) = lcm(B(3e+2), B(m))となります。よってB(3e+2)を計算すればよいです。

101 ≡ 1(mod 9)
103 ≡ 1(mod 27)

から想像できるように、

B(3e+2) = e

となります。すなわち、103e = 3e+2d + 1(e ≥ 0、dは3で割り切れない自然数)となります。数学的帰納法でこれを証明しましょう。e = 0では上で見たように成り立ちます。e(≥ 0)で成り立つとすると、

103e+1 = (103e)3 = (3e+2d + 1)3 = 33e+6d3 + 32e+5d2 + 3e+3d + 1
= 3e+3d1 + 1(dは3で割り切れない自然数

が成り立ちます。

よって、

B(9n) = B(3e+2m) = lcm(3e, B(m))

です。B(m)が3で割り切れず、かつm - 1のとき、

B(9n) = 3e(m - 1) = n - 3e

となります。これはeが小さければnに非常に近くなります。3で割り切れないときの素数で10が原始根のときとこれ以外のときは無視して計算します。

106のときは一瞬、1017で19秒でした。