12時の次は13時ではなく1時。この「あまり」の概念が、ページネーションからハッシュ分散まで、あらゆる場面で使われている。modは地味だが、最も実用的な数学かもしれない。

剰余演算 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演算)
  • 関連:フェルマーの小定理、中国剰余定理
  • 次のステップ:整数論、暗号理論