フェルマーの小定理による逆元
法の下で安全に割り算を行います
「フェルマーの小定理による逆元」はCoddyKit上の無料Competitive Programming Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはCompetitive Programming Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Competitive Programming Academyコースには全4レッスンが含まれています。
mod の下では割り算が使えない
加算、減算、乗算は modulus の下でもうまく扱えますが、通常の割り算はそうではありません。単純に割ってから余りを取ることはできません。⚠️
割り算を乗算に置き換える
解決策は法逆元です。x で割ることを、x の逆元を掛けることに置き換えます。つまり、a / b mod m は a に b の逆元を掛ける計算になります。
逆元とは何か
x の逆元とは、modulus の下で x と掛けると 1 になる数です。通常の算術における 1/x の役割を果たします。
# x * inv(x) % m == 1素数なら可能になる
x と m が共通因子を持たない場合に限り、逆元が存在します。1e9+7 のような素数を法とする剰余を使えば、0 でないすべての x に逆元が存在することが保証されます。
フェルマーの小定理を知る
フェルマーの小定理によると、素数 p に対して、x が p の倍数でない限り、x の p−1 乗は 1 と合同になります。
# x^(p-1) % p == 1逆元を導出する
x の因子を1つ取り出すと、残りはその逆元でなければなりません。したがって、x の逆元は x の p−2 乗を計算し、p で割った余りになります。
# inv(x) = x^(p-2) % p高速べき乗で計算する
この指数は非常に大きいため、前のレッスンで学んだ高速べき乗法を使います。Python では pow を1回呼び出すだけで、すべて処理できます。
inv = pow(x, MOD - 2, MOD)逆元を使って割る
mod の下で a を b で割るには、a に b の逆元を掛けます。その余りが、真の商を p で割った余りと正確に一致します。
ans = a * pow(b, MOD - 2, MOD) % MODゼロの逆元は求めない
0 に何を掛けても 1 にはならないため、0 の逆元は存在しません。modulus の下で 0 になる値で割らないように確認してください。
1つの逆元にかかる計算量
フェルマー法による逆元は高速べき乗を1回行うため、計算量は O(log p) です。数回の割り算なら安価ですが、何百万回も行うとそのコストが積み重なります。
逆元をまとめて求めるヒント
多数の逆元が必要な場合は、要素ごとに pow を呼び出す代わりに、巧妙な線形パスであらかじめ計算します。次に学ぶ nCr でこれを利用します。
確認問題
素数を法とするとき、法逆元を求めるには何乗すればよいでしょうか。
まとめ
これで、素数を法とする剰余の下で、法逆元を掛けて割り算ができるようになりました。逆元は pow を使って x の p−2 乗として求めます。ただし、0 の逆元は決して求めないでください。✅
よくある質問
「フェルマーの小定理による逆元」レッスンは無料ですか?
はい。「フェルマーの小定理による逆元」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Competitive Programming Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Competitive Programming Academyコースには全4レッスンが含まれています。
「フェルマーの小定理による逆元」で何を学びますか?
法の下で安全に割り算を行います ブラウザで直接実行するハンズオンコードでCompetitive Programming Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Competitive Programming Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのCompetitive Programming Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「フェルマーの小定理による逆元」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このCompetitive Programming Academyレッスンでコードを書いて実行できますか?
はい。すべてのCompetitive Programming Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- 素数を法とする計算
- 高速なモジュラーべき乗
- フェルマーの小定理による逆元
- 前計算した階乗による nCr