符号の方式を理解する
2つの方式は、両方の数が正であれば同じ結果になりますが、負の値が絡むと以下のように異なります。
| a | b | 床関数方式の結果(bの符号) | 切り捨て方式の結果(aの符号) |
|---|---|---|---|
| 13 | 5 | 3 | 3(同じ——両方正) |
| −13 | 5 | 2 | −3 |
| 13 | −5 | −2 | 3 |
| −13 | −5 | −3 | −3(同じ——両方負) |
- 床関数方式(ここでは既定の主要な結果として使用)は純粋数学や数論で最も一般的な方式で、Pythonの組み込み%演算子と一致します。
- 切り捨て方式(副次的な結果として表示)は、JavaScript、C、C++、Javaなど、多くのC系言語の組み込み%演算子と一致し、余りの符号は被除数に従います。
- 0による剰余は定義されず、この計算機では計算されません。除数は0以外の数でなければなりません。
剰余演算とは
剰余演算はa mod b(またはa % b)と書き、aをbで割ったときの余りを返します。例えば13 mod 5 = 3です。13 = 2 × 5 + 3であり、13を5で割ると商2、余り3になるためです。剰余は数論(合同算術・時計算術)、コンピュータ科学(ハッシュ、循環インデックス、チェックサム)、そして曜日や時計の時刻のような日常的な余りやサイクルの考え方にとって基本的な演算です。
負の数が絡むとき、結果の符号をどう定めるかについて、広く使われている数学的な方式が2つあります。1つは床関数方式(floored modulo)で、結果は常に除数bと同じ符号になります。もう1つは切り捨て方式(truncated modulo)で、結果は常に被除数aと同じ符号になります。どちらも数学的に有効な「余り」の定義であり、aとbが両方とも正であれば完全に一致しますが、負の値が絡むときのみ異なります。
この方式の違いは実際に重要です。プログラミング言語によって既定の方式が異なるためです。Pythonの%演算子は床関数方式を使いますが、JavaScript、C、C++、Java、その他多くのC系言語は切り捨て方式(被除数の符号に一致)を使います。この計算機はどちらの結果も明示的に表示するので、必要な方の方式をそのまま読み取れます。
剰余計算機の使い方
- 被除数(a)——割られる数を入力します。
- 除数(b)——割る数を入力します。0による除算(および剰余)は定義されないため、除数を0にすることはできません。
- 床関数方式の結果(符号は常に除数と一致)を確認します。これは数論で最も一般的な数学的方式です。
- 特定のプログラミング言語の組み込み%演算子に合わせたい場合は、切り捨て方式の結果(符号は常に被除数と一致)と比較し、商と完全な除算の式で計算の内訳を確認します。
床関数方式と切り捨て方式の公式
床関数方式では、商をq = ⌊a ÷ b⌋(負の無限大方向に切り下げ)と定義し、次にr = a − b×qとします。これにより、余りrは常に除数bと同じ符号(または0)になることが保証され、b > 0のとき0 ≤ r < |b|を満たします。計算例:13 mod 5:q = ⌊13/5⌋ = 2、r = 13 − 5×2 = 3。
被除数が負の場合の計算例:−13 mod 5(床関数方式):q = ⌊−13/5⌋ = ⌊−2.6⌋ = −3、r = −13 − 5×(−3) = −13 + 15 = 2。結果が正(正の除数に一致)になっている点に注目してください。これは下の切り捨て方式の結果とは異なります。
切り捨て方式では、商を負の無限大方向ではなく0方向に丸めて定義し、余りは同じ方法で計算します。これにより、余りは常に被除数aと同じ符号(または0)になることが保証されます。計算例:−13 mod 5(切り捨て方式、JavaScript/C/Javaの%の結果):商は−2.6を0方向に丸めて−2になるので、r = −13 − 5×(−2) = −13 + 10 = −3——負の値になり、負の被除数に一致します。同じ入力に対する床関数方式の結果+2とは異なります。
よくある間違い
- すべてのプログラミング言語が負の数についてa mod bを同じ方法で計算すると思い込むこと——JavaScript、C、C++、Javaは切り捨て方式を使い、Pythonや多くの数学の教科書は床関数方式を使うため、aが負のときは結果が異なります。
- 床関数方式の結果は常に被除数ではなく除数の符号を共有することを忘れること——これは切り捨て方式(JavaScript式)の結果とは正反対です。
- a mod 0を計算しようとすること——剰余演算は除算と同様、除数が0のときは定義されません。
- 整数以外の入力を使い、整数の合同算術と同じ性質を期待すること——この計算機は実数を受け付けて同じ床関数・切り捨てのロジックを適用しますが、時計算術のような古典的な合同算術の性質の多くは整数に対して特別に定義されたものです。
よくある質問
床関数方式と切り捨て方式の剰余の違いは何ですか?
床関数方式は商を負の無限大方向に丸めるため、余りは常に除数と同じ符号になります。切り捨て方式は商を0方向に丸めるため、余りは常に被除数と同じ符号になります。両者は数が両方とも正のときは一致しますが、どちらかが負のときは異なります。例えば−13 mod 5は、床関数方式では2ですが、切り捨て方式では−3です。
なぜ計算機によって−13 mod 5の答えが違うのですか?
どちらの符号の方式が使われているかによります。床関数方式では2になります(結果は正の除数の符号に一致し、0 ≤ r < 5を満たします)。切り捨て方式では−3になります(結果は負の被除数の符号に一致します)。Pythonの%演算子は2を返します(床関数方式)。JavaScript、C、Javaの%演算子は−3を返します(切り捨て方式)。どちらか一方が「より正しい」わけではなく、どちらも等しく有効な、異なる数学的定義です。
a mod bを手計算するにはどうすればよいですか?
aをbで割って商を求め、選んだ方式に従ってそれを丸め(床関数方式なら切り下げ、切り捨て方式なら0方向)、次にaからbとその丸めた商の積を引きます:余り = a − b × 商。13 mod 5の場合:13 ÷ 5 = 2.6は、どちらの方式でも商2に丸まるため、余り = 13 − 5×2 = 3です。
合同算術・時計算術におけるmodとは何を意味しますか?
合同算術(モジュラー算術)では、数は法(モジュラス)に達すると「一周して戻る」ものとして扱われます。典型的な例は12時間制の時計で、時刻はmod 12(24時間表記ならmod 24)で計算されます。例えば24時間表記の15時は、12時間制の時計では15 mod 12 = 3に対応します。剰余は、この「一周して戻った」余りを求める演算です。
負の除数で剰余を求めることはできますか?
はい。床関数方式では、a mod b(bが負の場合)は、bと同じ符号の余りを生じます——例えば13 mod −5 = −2です。13 = (−3)×(−5) + (−2)であるためです。切り捨て方式では、代わりに余りは被除数の符号に一致し、13 mod −5 = 3となります。商が0方向に丸められて−2になるため、13 − (−5)×(−2) = 13 − 10 = 3となるためです。
参考文献
- Rosen KH. Elementary Number Theory and Its Applications. 6th ed. Pearson, 2010. (Division algorithm and modular arithmetic.)
- Leijen D. Division and Modulus for Computer Scientists. Utrecht University Technical Report UU-CS-2001-20, 2001. (Formal comparison of flooring, truncating and Euclidean division conventions.)
- ECMA International. ECMA-262: ECMAScript Language Specification — the remainder operator (%). ecma-international.org.