CalcTune
📐
数学 · 算術

剰余計算ツール

整数除算の余り(剰余)と商を計算します。被除数と除数を入力するだけで、数学的な床関数方式とプログラミングの切り捨て方式の両方の結果を確認できます。

計算例を表示中 — 上に値を入力してください
a mod b = a − b × floor(a/b)
17 mod 5 = 2
床関数(数学的)
2
余り
3
検算: 5 × 3 + 2 = 17

剰余演算の完全ガイド:余り、商、方式の違いを理解する

剰余演算(モジュロ演算)は、数学とコンピュータサイエンスの両方で最も広く使われる演算の一つです。その核心は、ある整数を別の整数で割ったときの余りを計算することです。a mod bと書き、「aをbで何回割れるだけ割ったあと、何が残るか?」という問いに答えます。一見シンプルな定義ですが、剰余演算は整数論、暗号理論、アルゴリズム設計と深いつながりがあり、負の数に対する挙動にはプログラマーや数学者が理解すべき微妙な違いがあります。

このガイドでは、剰余演算の定義、床関数方式と切り捨て方式の違い、実用的な応用、異なるプログラミング言語での負の数の扱いについて包括的に解説します。

定義と基本公式

2つの整数a(被除数)とb(除数、bはゼロでない)が与えられたとき、剰余演算 a mod b は余りrを生成します。a = b × q + r の関係が成り立ち、qは商(整数)、標準的な数学的定義では 0 ≤ r < |b| です。商は q = floor(a/b) として計算され、正確な除算結果以下の最大の整数を意味します。

正の数の場合、これは分かりやすいです。例えば 17 mod 5 では、商は floor(17/5) = 3、余りは 17 − 5 × 3 = 2 です。検算すると 5 × 3 + 2 = 17 です。同様に、25 mod 7 = 4 で、floor(25/7) = 3、25 − 7 × 3 = 4 です。

床関数方式と切り捨て方式

負の数に対する剰余演算の挙動は、商の計算方法によって異なります。主に2つの方式があります:床関数方式と切り捨て方式です。

床関数方式(数学やPythonで使用)では、商はfloor関数で計算され、負の無限大方向に丸められます。これにより、余りは常に除数と同じ符号を持ちます。例えば、-7 mod 3 = 2(床関数方式)。floor(-7/3) = -3 で、-7 − 3 × (-3) = -7 + 9 = 2 です。

切り捨て方式(C、Java、JavaScriptの%演算子で使用)では、商はゼロ方向に切り捨てて計算されます。余りは被除数と同じ符号を持ちます。例えば、JavaScriptでは -7 % 3 = -1 です。trunc(-7/3) = -2 で、-7 − 3 × (-2) = -7 + 6 = -1 です。

どちらの方式も有効で、単に余りの定義が異なるだけです。正の被除数と除数の場合、両方式は同じ結果を返します。違いが生じるのは、一方または両方の数が負の場合のみです。

検算の性質

どの方式を使用しても、基本的な関係式 a = b × q + r は常に成り立ちます。これはユークリッドの除法の定理です。任意の整数aとb(bはゼロでない)に対して、a = b × q + r かつ 0 ≤ r < |b| を満たす唯一の整数q(商)とr(余り)が存在します。計算ツールではこの検算を表示して結果の正確性を確認できます。

この性質は算術の確認に役立ち、整数論の多くの証明の基礎となっています。各方式のもとで、商と余りへの分割が常に明確に定義され一意であることを保証しています。

コンピュータサイエンスにおける応用

剰余演算はプログラミングのいたるところに登場します。一般的な応用には、偶奇判定(n % 2)、配列インデックスの巡回(i % length)、循環バッファやリングデータ構造の実装、ハッシュ関数の計算、出力のフォーマット(N個ごとに改行を挿入など)があります。

暗号理論では、剰余算術がRSAやDiffie-Hellmanなどの公開鍵暗号アルゴリズムの基盤です。冪剰余演算(a^b mod nの効率的な計算)はこれらのシステムの中核です。RSAのセキュリティは大きな数の因数分解の困難さに依存していますが、すべての暗号化・復号操作は剰余算術を使って行われます。日本のインターネットバンキングやオンライン決済も、この技術に支えられています。

剰余算術はチェックサムアルゴリズム(ISBN、Luhnアルゴリズムによるクレジットカード認証)、誤り訂正符号、擬似乱数生成器にも使われています。

数学における応用

整数論では、剰余算術が合同関係の基礎を形成します。2つの整数aとbが a ≡ b (mod n) で合同であるとは、nが a − b を割り切ることを意味します。この関係は同値関係であり、整数をn個の剰余類に分割します。

合同式は整除性の規則の証明、一次合同式の系の解法(中国の剰余定理)、整数の構造の研究に使われます。フェルマーの小定理、オイラーの定理、二次相互法則はすべて剰余算術で記述・証明されます。これらの結果は素数の分布やディオファントス方程式の可解性に深い意味を持っています。

プログラミング言語間での負の数の扱い

プログラミング言語によって負の数の剰余の扱いが異なるため、バグの原因になりがちです。JavaScript、C、C++、Javaは%演算子に切り捨て方式を使用し、結果は被除数と同じ符号になります。Pythonは%演算子に床関数方式を使用し、結果は除数と同じ符号になります。Rubyも床関数方式を使います。

切り捨て方式の余りを床関数方式に変換するには、((a % b) + b) % b という公式が使えます。このパターンは、負のオフセットから配列インデックスを計算する場合など、非負の結果が必要なときにJavaScriptやCで頻繁に使われます。

一般的な使用例

時計の算術は剰余算術の自然な例です。時刻は12または24で循環します。10時に5時間を足すと、15 mod 12 = 3時になります。曜日は7を法として循環します。カレンダーの計算、スケジューリングアルゴリズム、時刻管理システムはすべて剰余算術に依存しています。

日常のプログラミングでは、整除性の判定が最も一般的な用途の一つです。n % 3 == 0 なら、nは3で割り切れます。FizzBuzzという古典的なプログラミング演習は、完全に剰余演算に基づいています。剰余はまた、値を範囲内に制約する、ゲームやシミュレーションでラップアラウンドを実装する、並列プロセス間で作業を分散するなどにも使われます。

よくある質問

剰余演算(モジュロ)とは何ですか?

剰余演算(a mod b)は、aをbで割ったときの余りを計算します。例えば、17 mod 5 = 2 です。17 = 5 × 3 + 2 なので、商は3、余りは2です。この演算は数学やコンピュータサイエンスの基本です。

床関数方式と切り捨て方式の違いは?

床関数方式は商を負の無限大方向に丸めるため、余りは除数と同じ符号になります。切り捨て方式は商をゼロ方向に切り捨てるため、余りは被除数と同じ符号になります。正の数では同じ結果ですが、負の数では異なります。例えば、-7 mod 3 = 2(床関数)vs. -1(切り捨て)です。

なぜゼロで割れないのですか?

ゼロ除算は数学的に未定義です。0を掛けてゼロ以外の被除数になる数は存在しないためです。剰余演算は除算に依存しているため、この制約を引き継ぎます。ほとんどのプログラミング言語で a mod 0 はエラーになります。

JavaScriptでは負の数の剰余はどう扱われますか?

JavaScriptの%演算子は切り捨て方式を使用し、結果は被除数と同じ符号になります。例えば、-7 % 3 = -1 です。非負の(床関数方式の)結果を得るには、((a % b) + b) % b というパターンを使います。これで -7 mod 3 = 2 になります。

剰余演算の一般的な用途は?

一般的な用途には、偶奇判定(n % 2)、配列インデックスの巡回、時計の算術(時 mod 12 または 24)、循環バッファの実装、暗号アルゴリズム(RSA)、ハッシュ関数、チェックサム検証(Luhnアルゴリズム)、並列プロセスへの作業分散などがあります。