Home
Blog
Products
Profile
Study
Collatz
© 2024 Oizumi Yuta

p - 1 法とフェルマーの小定理

2025-1-7

フェルマーの小定理の逆が成り立たない例

フェルマーの小定理は (a, p)=1(a,\ p) = 1(a, p)=1 なる整数 aaa と素数 ppp に対して p−1∣n (n∈N)p - 1\mid n\ (n \in \mathbb{N})p−1∣n (n∈N) ならば

an≡1(modp)a^n \equiv 1 \pmod{p}an≡1(modp)

が成り立つという定理。この逆の、n∈Nn\in \mathbb{N}n∈N に対して an≡1(modp)a^{n} \equiv 1 \pmod{p}an≡1(modp) ならば p−1∣np - 1\mid np−1∣n である、という主張は成り立たない。

  • 例
260≡1(mod151)2^{60} \equiv 1 \pmod{151}260≡1(mod151)

p−1p - 1p−1 法とフェルマーの小定理

p−1p - 1p−1 法は n∈Nn\in \mathbb{N}n∈N の非自明な約数を探索するために次のような計算をする:

gcd⁡(ak−1, n)\gcd(a^k - 1,\ n)gcd(ak−1, n)

ここで a, k∈Na,\ k\in \mathbb{N}a, k∈N である。これがうまくいく理由は、もし p−1∣kp - 1\mid kp−1∣k ならばフェルマーの小定理により

ak≡1(modp)a^k\equiv 1 \pmod{p}ak≡1(modp)

が成り立つ。さらにもし p∣np\mid np∣n ならば p∣gcd⁡(ak−1, n)p\mid \gcd(a^k - 1,\ n)p∣gcd(ak−1, n) となる。よって mod\textrm{mod}mod の計算(繰り返し二乗法)と最大公約数の計算(ユークリッドの互除法)で nnn の約数を取り出すことができる。

この方法が優れている点は、nnn の素因数によっては計算量が少なくなるため高速であることである。しかし p−1p - 1p−1 が小さな素因数たちから成る smooth number でない場合、試し割り法より遅い場合もある。

p−1p - 1p−1 法の例

n=49981=151×331n = 49981 = 151 \times 331n=49981=151×331 に対して p−1p - 1p−1 法を適用する。gcd⁡(2k−1,49981)\gcd(2^k - 1, 49981)gcd(2k−1,49981) を k=1, 2, ⋯ , k = 1,\ 2,\ \cdots,\ k=1, 2, ⋯,  とすると、k≤14k\le 14k≤14 では gcd⁡(2k−1,49981)=1\gcd(2^k - 1, 49981) = 1gcd(2k−1,49981)=1 であり k=15k = 15k=15 で初めて 非自明な約数を得る:

gcd⁡(215−1,49981)=151\gcd(2^{15} - 1, 49981) = 151gcd(215−1,49981)=151

この例では p−1∣kp - 1\mid kp−1∣k すなわち 151−1∣15 151 - 1\mid 15151−1∣15 は成り立たない。だがなぜ非自明な約数が見つかったのだろう。

(Z/151Z)×(\mathbb{Z}/151\mathbb{Z})^\times(Z/151Z)× の原始根の一つは 666 である。これは

>>> pow(6, 75, 151)
150

となることからわかる。a=6a = 6a=6 で p−1p - 1p−1 法を行うと

gcd⁡(6150−1,49981)=151\gcd(6^{150} - 1, 49981) = 151gcd(6150−1,49981)=151

より p−1∣kp - 1\mid kp−1∣k となっている。6x≡2(mod151)6^x \equiv 2 \pmod{151}6x≡2(mod151) となる xxx は次のようにしてわかる:

>>> next((n, pow(6, n, 151)) for n in range(1, 151) if pow(6, n, 151) == 2)
(70, 2)

よって x=70x = 70x=70 である。そこで次のような計算をしてみると

>>> gcd(6 ** 1050 - 1, 49981)
151

となり、k=1050k = 1050k=1050 でも非自明な約数を得ることができた:

gcd⁡(61050−1,49981)=151\gcd(6^{1050} - 1, 49981) = 151gcd(61050−1,49981)=151

今日はここまで。