合同式・モジュラー算術
時計盤のように数がぐるぐる回る「割った余り」の世界と、暗号・ハッシュ関数を支える剰余演算
- 1
- モジュラー算術(合同式)とは、整数を法(modulus) で割った余りだけに注目して計算する算術体系であり、余りが一致する数どうしを「合同」とみなして と書く
- 2
- モジュラー算術の世界では数直線がまっすぐ伸びるのではなく、 個の数字が並んだ「時計の文字盤」のように輪になって繰り返す( を超えると 0 に戻る)
- 3
- この「割った余りだけを扱う」性質のおかげで、どれだけ巨大な数を掛けても計算結果が有限の範囲に収まり続けることが保証され、ハッシュ関数の値域制御やRSA暗号の安全性の根幹を支えている
なぜこれを学ぶのか? — 現実社会とテクノロジーでの価値
なぜ生まれたのか?
モジュラー算術(合同式)とは、整数を法(modulus)$m$ で割った余りだけに注目して計算する算術体系であり、余りが一致する数どうしを「合同」とみなして $a \equiv b \pmod{m}$ と書く
身につく武器・思考力
モジュラー算術の世界では数直線がまっすぐ伸びるのではなく、$m$ 個の数字が並んだ「時計の文字盤」のように輪になって繰り返す($m$ を超えると 0 に戻る)
実社会・ITでの活躍現場
- •ハッシュ関数のインデックス計算とRSA暗号の高速べき乗剰余演算
- •ITシステム・アルゴリズム実装における論理設計
- •データ分析やシミュレーションにおける数理モデリング
Layer 1 — 直感・シミュレーター
法(モジュラス) をスライダーで変えると、時計の文字盤の目盛りの数が変化する。数 のスライダーを動かして、 が文字盤上のどの位置()に対応するかをハイライトで確認しよう。さらに2つの数 を選び「足し算」または「掛け算」モードで演算すると、結果が文字盤を何周してどの位置に着地するか(ラップアラウンド)が矢印アニメーションで表示される。
紫 = 現在の数 n の位置、赤 = 演算結果の位置(時計の文字盤 mod m)
演算を試す: a + b (mod m)
9 + 8 = 17 ≡ 5
↑ m を変えると文字盤の目盛りの数が変わる。a, b や演算を変えると、結果が文字盤を何周かして着地する「ラップアラウンド」の様子が矢印で確認できる。
法 (12時間制の時計)で考えるとき、現在の時刻が 9 時で、そこから 8 時間進むと何時になるか。これは合同式でどう表されるか?
Layer 2 — 定義・受験・証明
定義
整数 と正の整数 (法・モジュラス)に対して、 が で割り切れるとき「 と は法 に関して合同である」といい、次のように書く。
これは「 を で割った余り」と「 を で割った余り」が一致することと同値であり、整数全体を余りの値ごとに 個のグループ(剰余類)に分類する関係である。
公式・数理モデル
証明・導出
合同式が加法・乗法と両立すること(合同式の演算規則)の証明: かつ であるとする。定義より、ある整数 が存在して
と書ける。
【加法について】
これは の倍数であるから、 が成り立つ。
【乗法について】 を用いて を展開すると、
したがって は の倍数であり、 が成り立つ。
この2つの性質により、合同式は「先に余りを取ってから足し算・掛け算しても、先に計算してから余りを取っても同じ結果になる」ことが保証される。これがモジュラー算術で巨大な数の計算を余りだけで完結できる理論的根拠である。
押さえておきたいポイント
- 合同式は「同値関係」であり、整数全体を 個の剰余類 に分割する(時計の文字盤のイメージ)
- ( と が互いに素)であるとき、かつそのときに限り の「モジュラー逆数」( を満たす )が存在する
- フェルマーの小定理: が素数で のとき が成り立ち、RSA暗号の理論的基盤となっている
- ハッシュ関数の多くは「巨大な入力を固定サイズのテーブルに割り振る」ためにモジュラー算術(ハッシュ値 mod テーブルサイズ)を利用している
本トピックの内容・数理モデルは、文部科学省学習指導要領(算数・数学・情報)および国際標準カリキュラムに準拠し、エンジニアリング現場の実装事例と照らし合わせてMath World Lab編集部により検証・作成されています。
Layer 3 — 工学応用・現場実装
ハッシュ関数のインデックス計算とRSA暗号の高速べき乗剰余演算
ハッシュテーブルは巨大な入力データを固定長の配列に格納するため、ハッシュ値をテーブルサイズで割った余り(モジュラー演算)を格納位置として使う。また、RSA暗号の暗号化・復号は「非常に大きな数の何百桁ものべき乗を法 で計算する」処理そのものであり、桁あふれを防ぎつつ高速に計算するために繰り返し二乗法(高速べき乗剰余)が使われる。
1// ハッシュテーブルの格納位置を決めるモジュラー演算2function hashIndex(key: string, tableSize: number): number {3 let hash = 0;4 for (let i = 0; i < key.length; i++) {5 hash = (hash * 31 + key.charCodeAt(i)) % tableSize; // 各文字ごとに mod を取り桁あふれを防ぐ6 }7 return hash;8}910// 高速べき乗剰余 (Fast Modular Exponentiation): base^exp mod m を O(log exp) で計算11// RSA暗号の暗号化・復号 c = m^e mod n の核となるアルゴリズム12function modPow(base: bigint, exp: bigint, mod: bigint): bigint {13 let result = 1n;14 base = base % mod;1516 while (exp > 0n) {17 if (exp % 2n === 1n) {18 // 指数が奇数のビットのときだけ結果に掛け込む19 result = (result * base) % mod;20 }21 exp = exp / 2n; // 指数を半分にする(2進数を1桁シフト)22 base = (base * base) % mod; // 底を2乗する(繰り返し二乗法)23 }24 return result;25}2627// 例: ハッシュテーブル(サイズ16)への格納位置28console.log(hashIndex("math-world-lab", 16)); // 0〜15のどこかに収まる2930// 例: RSAでの暗号化計算 c = m^e mod n (実際は数百桁の数を使う)31const encrypted = modPow(42n, 17n, 3233n);32console.log(`暗号文: ${encrypted}`); // 桁があふれず高速に法 n の範囲内で計算できる
次に学ぶならコレ!おすすめトピック
この単元と深い繋がりを持つ、あわせて学ぶと理解が深まるおすすめ単元