フェルマーの小定理の逆が成り立たない例
フェルマーの小定理は (a, p)=1 なる整数 a と素数 p に対して p−1∣n (n∈N) ならば
an≡1(modp)
が成り立つという定理。この逆の、n∈N に対して an≡1(modp) ならば p−1∣n である、という主張は成り立たない。
260≡1(mod151)
p−1 法とフェルマーの小定理
p−1 法は n∈N の非自明な約数を探索するために次のような計算をする:
gcd(ak−1, n)
ここで a, k∈N である。これがうまくいく理由は、もし p−1∣k ならばフェルマーの小定理により
ak≡1(modp)
が成り立つ。さらにもし p∣n ならば p∣gcd(ak−1, n) となる。よって mod の計算(繰り返し二乗法)と最大公約数の計算(ユークリッドの互除法)で n の約数を取り出すことができる。
この方法が優れている点は、n の素因数によっては計算量が少なくなるため高速であることである。しかし p−1 が小さな素因数たちから成る smooth number でない場合、試し割り法より遅い場合もある。
p−1 法の例
n=49981=151×331 に対して p−1 法を適用する。gcd(2k−1,49981) を k=1, 2, ⋯, とすると、k≤14 では gcd(2k−1,49981)=1 であり k=15 で初めて 非自明な約数を得る:
gcd(215−1,49981)=151
この例では p−1∣k すなわち 151−1∣15 は成り立たない。だがなぜ非自明な約数が見つかったのだろう。
(Z/151Z)× の原始根の一つは 6 である。これは
>>> pow(6, 75, 151)
150
となることからわかる。a=6 で p−1 法を行うと
gcd(6150−1,49981)=151
より p−1∣k となっている。6x≡2(mod151) となる x は次のようにしてわかる:
>>> next((n, pow(6, n, 151)) for n in range(1, 151) if pow(6, n, 151) == 2)
(70, 2)
よって x=70 である。そこで次のような計算をしてみると
>>> gcd(6 ** 1050 - 1, 49981)
151
となり、k=1050 でも非自明な約数を得ることができた:
gcd(61050−1,49981)=151
今日はここまで。