0Pricing
Competitive Programming Academy · レッスン

フェルマーの小定理による逆元

法の下で安全に割り算を行います

「フェルマーの小定理による逆元」は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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 素数を法とする計算
  2. 高速なモジュラーべき乗
  3. フェルマーの小定理による逆元
  4. 前計算した階乗による nCr
← Competitive Programming Academyに戻る