剰余演算 mod 合同式 周期性
剰余演算とは
剰余演算(modular arithmetic)は、ある数を別の数で割ったときの「あまり」を求める演算である。数学では「mod」、プログラミングでは「%」演算子で表されることが多い。
剰余演算
a mod n = r
aをnで割ったときの余りがr(0 ≤ r < n)
例:17 mod 5 = 2(17 = 5 × 3 + 2)
合同式
数学では、同じ余りを持つ数を「合同」という。
合同式(Congruence)
a ≡ b (mod n)
「aとbはnを法として合同」
aとbをnで割った余りが等しいことを意味する。
例:17 ≡ 2 (mod 5)、17 ≡ 7 (mod 5)
性質
剰余演算には便利な性質がある。
| 性質 | 式 | 説明 |
|---|---|---|
| 加法 | (a + b) mod n = ((a mod n) + (b mod n)) mod n | 先に余りを取っても結果は同じ |
| 乗法 | (a × b) mod n = ((a mod n) × (b mod n)) mod n | 掛け算でも同様 |
| 周期性 | a mod n は n 周期で繰り返す | 0, 1, 2, ..., n-1, 0, 1, ... |
時計算術
剰余演算は「時計算術」とも呼ばれる。12時間制の時計では、13時は1時、25時は1時になる。これは mod 12 の演算に他ならない。
この周期的な性質が、プログラミングで非常に役立つ。
実務での応用
WEB開発での応用
ページネーション:総件数 ÷ ページサイズ の余りで最終ページの件数を計算。
配列の循環アクセス:index % array.length で配列を循環的にアクセス。カルーセルUIなど。
ハッシュ分散:hash(key) % bucket_count でデータを分散配置。
ストライプパターン:index % 2 で偶数行/奇数行のスタイル切り替え。
時間計算:秒 → 時分秒 の変換。60秒 = 1分、60分 = 1時間。
AI/MLでの応用
ミニバッチ処理:データセットをバッチサイズで分割する際の端数処理。
周期的特徴量:曜日、月、時刻などの周期的データのエンコーディング。
分散処理:データをワーカー間で均等に分配する際のmod演算。
注意点:負の数のmod
負の数の剰余演算は、言語によって結果が異なる。
| 言語 | -7 % 3 | 方式 |
|---|---|---|
| Python | 2 | 床除算(数学的) |
| JavaScript | -1 | 切り捨て除算 |
| Java/C | -1 | 切り捨て除算 |
負の数を扱う場合は、言語の仕様を確認するか、((a % n) + n) % n のように常に正にする工夫が必要。
深掘りリンク
- Wikipedia: 合同式
- 応用:RSA暗号(大きな数のmod演算)
- 関連:フェルマーの小定理、中国剰余定理
- 次のステップ:整数論、暗号理論