剰余演算とは
剰余演算(モジュロ演算とも呼ばれます)は、ある数(被除数)を別の数(除数)で割ったときの余りを求める演算です。例えば、「5 mod 2」は、5を2で割った余りである1を返します。
基本的な考え方
2つの整数 a (被除数) と n (除数) が与えられたとき、a を n で割った余り r は、a = q
n + r (0 ≤ r < n) という関係を満たす整数 q (商) とともに一意に定まります。ここで、剰余演算の結果は r となります。
剰余演算の表記
剰余演算は、一般的に`a mod n`、または`a % n`のように表記されます。多くのプログラミング言語では、`%`演算子を使って剰余演算を行います。
剰余演算の仕組み
ユークリッド除法
剰余演算は、数学的にはユークリッド除法の余りに相当します。ユークリッド除法は、整数 a を整数 n で割った際に、商 q と余り r を求める方法です。
コンピュータでは、数値の表現や処理方法が異なるため、剰余演算の定義はプログラミング言語やハードウェアによって異なる場合があります。しかし、基本的には、`a = q n + r` の関係を満たす余り r を算出します。余り r は、常に `0 ≤ r < n` の範囲に収まります。
負の数の剰余
被除数または除数が負の数の場合、剰余の符号は
プログラミング言語によって異なります。
数論では、余りは常に正の数ですが、多くの
プログラミング言語では、被除数の符号に合わせる、または常に正の数を返すなど、様々な規則があります。
剰余演算の注意点
負の剰余の結果
負の数に対する剰余の結果は、
プログラミング言語や処理系によって異なるため、注意が必要です。例えば、`(-5) % 2` の結果が -1 になる場合もあれば、1 になる場合もあります。
0での剰余
`a % 0` は
数学的には未定義であり、多くの
プログラミング言語ではエラーが発生します。しかし、一部のシステムでは、被除数 `a` を返すように定義されていることもあります。
剰余演算の応用
奇数/偶数の判定
ある整数が奇数かどうかを判定する最も簡単な方法は、2で割った余りが1かどうかを調べることです。`n % 2 == 1` なら奇数、`n % 2 == 0` なら偶数です。
範囲内の値の取得
剰余演算は、ある範囲内に値を収めるために使用できます。例えば、サイコロの目を生成する場合、`rand() % 6 + 1` で1から6の範囲の整数をランダムに生成できます。
ハッシュ関数
剰余演算は、ハッシュ関数の計算に利用できます。データをハッシュテーブルに格納する際に、データのキーをテーブルのサイズで割った余りをインデックスとして使用します。
暗号学
剰余演算は、暗号学においても重要な役割を果たします。例えば、ディフィー・ヘルマン鍵交換などの暗号アルゴリズムで利用されています。
剰余演算の効率化
除数が2のべき乗の場合、剰余演算は
ビット演算で効率的に計算できます。例えば、`x % 2^n` は `x & (2^n - 1)` で計算できます。
一部の
コンパイラは、2のべき乗による剰余演算を検出し、自動的に
ビット演算に変換することで、処理速度を向上させることができます。
剰余演算の等価性
恒等式
剰余演算には、以下のような恒等式が成り立ちます。
`(a mod n) mod n = a mod n`
`n^x mod n = 0` (xは正の整数)
`((a mod n) + (b mod n)) mod n = (a + b) mod n`
`((a mod n)
(b mod n)) mod n = (a b) mod n`
逆元
`b` と `n` が互いに素であるとき、`b` のモジュラ逆元 `b^-1` が存在し、`((b^-1 mod n) * (b mod n)) mod n = 1` が成り立ちます。
まとめ
剰余演算は、プログラミングや
数学において非常に重要な演算です。その基本的な仕組みを理解し、様々な応用例を学ぶことで、より効率的で高度なプログラムや計算を開発できるようになります。負の数や
ゼロ除算に注意しながら、剰余演算を使いこなしましょう。