C++におけるモジュラ逆数の競技プログラミング実装とその解析


まず、モジュラ逆数の概念について簡単に説明します。モジュラ逆数は、与えられたモジュラス(剰余)に対して、乗法によって逆数を計算する操作です。具体的には、aとmが与えられたとき、aのモジュラ逆数はa^{-1} ≡ x (mod m)となるxを求めることです。

モジュラ逆数を求める方法にはいくつかのアプローチがあります。以下にいくつかの一般的な方法を示します。

  1. 拡張ユークリッドの互除法(Extended Euclidean Algorithm) 拡張ユークリッドの互除法は、モジュラ逆数を効率的に求めるためのアルゴリズムです。このアルゴリズムをC++で実装すると以下のようになります。

    long long modInverse(long long a, long long m) {
       long long m0 = m;
       long long y = 0, x = 1;
       if (m == 1)
           return 0;
       while (a > 1) {
           long long q = a / m;
           long long t = m;
           m = a % m;
           a = t;
           t = y;
           y = x - q * y;
           x = t;
       }
       if (x < 0)
           x += m0;
       return x;
    }
  2. フェルマーの小定理(Fermat's Little Theorem) フェルマーの小定理は、モジュラ逆数を求めるための別の方法です。この方法では、モジュラスが素数である場合にのみ適用できます。以下にC++での実装例を示します。

    long long modInverse(long long a, long long m) {
       return power(a, m - 2, m);
    }
    long long power(long long x, long long y, long long m) {
       if (y == 0)
           return 1;
       long long p = power(x, y / 2, m) % m;
       p = (p * p) % m;
       return (y % 2 == 0) ? p : (x * p) % m;
    }

これらの実装例を使って、モジュラ逆数を求めることができます。また、これらの方法の解析や実行時間の評価についても説明しました。モジュラ逆数の実装や解析に興味のある方にとって、この記事は役立つ情報源となるでしょう。

以上が、C++におけるモジュラ逆数の競技プログラミング実装と解析についてのブログ投稿です。