モードを選んで、整数を入力してください。「余りを求める」では負の数にも対応し、数学の余り(0 以上)とプログラミングの % 演算子の違いも表示します。
目次
このページでできること
- 整数 \(a\) を \(n\) で割った余りを求められます。負の数(例:\(-7\) を \(3\) で割った余り)にも対応し、数学の余り(\(0 \le r < n\))と、C・Java・JavaScript などの % 演算子の結果(負になることがある)を並べて表示します
- 合同式 \(a \equiv b \pmod{n}\) が成り立つかどうかを、「差 \(a - b\) が \(n\) の倍数か」という理由付きで判定できます
- \(7^{100}\) を \(13\) で割った余りのような大きなべき乗の余りを、繰り返し二乗法の途中式付きで厳密に計算できます(電卓では桁あふれする数もそのまま計算できます)
- 余りの様子を時計盤の図(mod \(n\) の円環)で確認でき、「余りは同じ場所をぐるぐる回る」というイメージがつかめます(時計盤の図は法 \(n\) が 2〜24 のときに表示されます)
- 式のやさしい解説・Excel/Googleスプレッドシート/Python用のコピペ数式・計算ドリル(演習問題)もこのページにまとまっています
この計算は何の役に立つ?
時計の「14時=午後2時」は、14 mod 12 = 2 の余りの計算そのものです。曜日も「7 で 1 周する時計盤」と同じ仕組みで、例えば今日が月曜日なら、100 日後の曜日は 100 mod 7 = 2 から「月曜日の 2 つ先=水曜日」とわかります。
手帳のカレンダーもカレンダーアプリも、この余りの計算で日付と曜日を対応させています。
商品バーコード(JANコード)や書籍のISBNの最後の 1 桁は、前の桁から余りの計算で作られる検査用の桁(チェックディジット)です。例えばJANコードでは、桁の数字を 1 倍・3 倍と交互に掛けながら足した合計を 10 で割った余りから、最後の桁を決めます。
1 桁打ち間違えると余りが合わなくなるため、レジや通販システムはその場で入力間違いを見破れます。クレジットカード番号やマイナンバーの検査桁も同じ考え方です。
クレジットカード番号などを安全に送る公開鍵暗号の代表であるRSA暗号は、「巨大な数のべき乗を割った余り」そのものを計算に使っています。べき乗の余りは速く計算できるのに、結果から元の数を逆算するのは非常に難しい、という一方通行の性質が安全性の根拠です。
このページの「べき乗の余り」モードで途中式を表示している繰り返し二乗法は、暗号ソフトが内部で日々実行している計算です。
プログラミングでは、i % 2 で偶数・奇数を判定したり、i % n で「n 個で 1 周する順番」を作ったり(ゲームのターン制で次のプレイヤーを決める、スライドショーを最後まで行ったら最初に戻すなど)、% 演算子が日常的に使われます。
負の数が混ざると言語によって % の結果が違うため、「数学の余りと C・Java 系の % の違い」はバグ調査で役立つ知識です。
63 本の鉛筆を 12 人に同じ数ずつ配ると、1 人 5 本で 3 本余ります(63 = 12 × 5 + 3)。在庫の箱詰め(1 箱 n 個で何箱できて何個余るか)、イベントのグループ分けなど、「等分して余りを見る」場面はすべてこの計算です。
割り算の基本式 a = n × q + r は、こうした身近な場面を 1 本の式にしたものです。
式と図
用語・記号の解説
記号
| \(\equiv\) | ごうどう (〜と合同である) | 合同を表す記号。等号(=)の線を 3 本にした形で、「完全に等しい」よりゆるい「余りの世界では等しい」ことを表します。 |
| \(\bmod\)(mod) | モッド | 法を表す記号。英語 modulus(法)の略で、ラテン語の modulus(ものさし・尺度)に由来するといわれます。「\(a \bmod n\)」は「\(a\) を \(n\) で割った余り」、式の後ろの「\(\pmod{n}\)」は「\(n\) を法として考えます」という宣言です。 |
| \(a,\ b\) | エー・ビー | 余りを調べる整数。合同式では左右に並ぶ 2 つの整数です。「決まった数」を表すときはアルファベットの最初の方の文字を使う慣例があります。 |
| \(n\) | エヌ | 法(何で割った余りで考えるかを決める数)。number(数)の頭文字 \(n\) がよく使われます。このページでは 1 以上の整数です。 |
| \(q\) | キュー | 商。quotient(商)の頭文字です。負の数の割り算では、余りを 0 以上にするため商を小さい方の整数へ切り捨てます(床除算)。 |
| \(r\) | アール | 余り。remainder(余り)の頭文字です。数学の約束では \(0 \le r < n\) の範囲に取ります。 |
| \(m\) | エム | 合同式の定義に出てくる「差が法の何倍か」を表す整数。負の整数や 0 のこともあります。 |
| \(a^{k}\) | エーのケーじょう | \(a\) を \(k\) 回掛け合わせたもの(べき乗)。右上の小さい数 \(k\) が「掛ける回数」を表す指数です。 |
| % | パーセント (剰余演算子としてはモッド) | 多くのプログラミング言語で余りを求める剰余演算子。百分率のパーセントと同じ記号ですが別の意味です。C・Java・JavaScript では負の数に対する結果が数学の余りと異なることがあります(式カード1のポイント参照)。 |
用語
| 余り (剰余) |
あまり(じょうよ) | 割り算で割り切れずに残る数。剰余は余りの少し形式ばった呼び方で、意味は同じです。数学では \(0\) 以上・割る数未満に取るのが約束です。 |
| 商 | しょう | 割り算の「何回引けるか」にあたる整数。割り算の基本式 \(a = n \times q + r\) の \(q\) です。 |
| 法 | ほう | 「何で割った余りで考えるか」を決める数 \(n\) のこと。時計盤でいえば 1 周の目盛の数にあたります。「12 を法として」は「12 で割った余りで考えて」という意味です。 |
| 合同 | ごうどう | 2 つの整数を法 \(n\) で割った余りが等しいこと。図形の合同(形と大きさが同じ)とは別の、整数の性質の用語です。 |
| 合同式 | ごうどうしき | \(a \equiv b \pmod{n}\) の形の式。等式と同じ感覚で足す・引く・掛けるの変形ができ、余りの計算を式変形で進められます。高校では数学A「整数の性質」で学びます。 |
| 倍数 | ばいすう | ある整数を整数倍した数。「差が法の倍数であること」が合同の定義です。 |
| 床除算 | ゆかじょざん | 商を小さい方の整数へ切り捨てる割り算のやり方。割る数が正なら、負の数を割っても余りが 0 以上になります。Python の // 演算子や Excel の INT 関数がこの方式です。 |
| 剰余演算子 | じょうよえんざんし | プログラミングで余りを求める % のこと。C・Java・JavaScript は商を 0 方向へ切り捨てる方式(余りの符号は割られる数と同じ)、Python・Ruby は床除算方式(余りの符号は割る数と同じで、法が正なら 0 以上)です。 |
| 繰り返し二乗法 | くりかえしにじょうほう | 2 乗を繰り返しながら余りを取り、指数を 2 のべき乗の和に分解して掛け合わせることで、大きなべき乗の余りを少ない掛け算で求める方法。二分累乗法・バイナリ法とも呼ばれ、RSA暗号などの実装で使われています。 |
| 余りによる分類 (剰余類) |
あまりによるぶんるい(じょうよるい) | 整数を「\(n\) で割った余り」でグループ分けする考え方。mod \(n\) の世界では、すべての整数が余り \(0\) 〜 \(n-1\) の \(n\) 種類に分類されます。偶数・奇数は 2 で割った余りによる分類です。 |
| 周期性 | しゅうきせい | べき乗の余りが、同じ並びを繰り返す性質。余りは \(n\) 種類しかないので必ずどこかで同じ余りに戻ります。一の位の問題(mod 10)で周期を見つけるのは受験の定番です。 |
| 互いに素 | たがいにそ | 2 つの整数の最大公約数が 1 であること。合同式の両辺を同じ数で割ってよい条件に登場します。 |
前提として理解しておくといいこと
このページの計算を「意味がわかって」使えるようになるために、前提として理解しておくといいことをまとめました。
つまずいたら、この表の内容に戻って復習するのが近道です。
| 余りのある割り算(小学3〜4年) |
|
| 倍数・約数(小学5年) |
|
| 正負の数(中学1年) |
|
| 累乗・指数(中学1年〜高校 数学I) |
|
| 整数の割り算の等式(高校 数学A) |
|
Excelで計算する方法
| 割られる数 a | -7 |
| 法(割る数)n | 3 |
| 数学の余り(0 以上) | =MOD(B1,B2) |
| 商(床除算) | =INT(B1/B2) |
| 検算 n×商+余り | =B2*B4+B3 |
| C・Java方式の余り(0方向切り捨て) | =B1-B2*TRUNC(B1/B2) |
| 整数 a | 38 |
| 整数 b | 14 |
| 法 n | 12 |
| 差 a−b | =B1-B2 |
| 差を n で割った余り | =MOD(B4,B3) |
| 判定(TRUEなら合同) | =MOD(B4,B3)=0 |
| 底 a | 7 |
| 指数 k | 100 |
| 法 n | 13 |
| aの1乗の余り | =MOD(B1,B3) |
| aの2乗の余り(1つ上を2乗して余り) | =MOD(B4^2,$B$3) |
| aの4乗の余り | =MOD(B5^2,$B$3) |
| aの8乗の余り | =MOD(B6^2,$B$3) |
| aの16乗の余り | =MOD(B7^2,$B$3) |
| aの32乗の余り | =MOD(B8^2,$B$3) |
| aの64乗の余り | =MOD(B9^2,$B$3) |
| 100=64+32+4 を組み合わせた余り | =MOD(MOD(B10*B9,$B$3)*B6,$B$3) |
ExcelのMOD関数は、この計算機と同じ「数学の余り」(0 以上)を返します。負の数でも =MOD(-7,3) は 2 です。C・Java方式の余りが知りたいときは、商を0方向へ切り捨てるTRUNCを使った1つ目の表の最終行を使ってください。
1つ目の表は −7 を 3 で割る例で、余りは 2・商は −3 になります。
2つ目の表は 38 ≡ 14 (mod 12) の判定で、差 24 の余りが 0 になり TRUE(合同)と出ます。
3つ目の表は 7 の 100 乗を 13 で割った余りを繰り返し二乗法で求める表で、答えは 9 になります。「^」はべき乗の記号です。Excelの数値は約15桁までしか正確に扱えないため、法 n が 7 桁を超えるときは 2 乗した値が精度切れを起こします。その場合はこのページの計算機か Python を使ってください。
Googleスプレッドシートで計算する方法
| 割られる数 a | -7 |
| 法(割る数)n | 3 |
| 数学の余り(0 以上) | =MOD(B1,B2) |
| 商(床除算) | =INT(B1/B2) |
| 検算 n×商+余り | =B2*B4+B3 |
| C・Java方式の余り(0方向切り捨て) | =B1-B2*TRUNC(B1/B2) |
| 整数 a | 38 |
| 整数 b | 14 |
| 法 n | 12 |
| 差 a−b | =B1-B2 |
| 差を n で割った余り | =MOD(B4,B3) |
| 判定(TRUEなら合同) | =MOD(B4,B3)=0 |
| 底 a | 7 |
| 指数 k | 100 |
| 法 n | 13 |
| aの1乗の余り | =MOD(B1,B3) |
| aの2乗の余り(1つ上を2乗して余り) | =MOD(B4^2,$B$3) |
| aの4乗の余り | =MOD(B5^2,$B$3) |
| aの8乗の余り | =MOD(B6^2,$B$3) |
| aの16乗の余り | =MOD(B7^2,$B$3) |
| aの32乗の余り | =MOD(B8^2,$B$3) |
| aの64乗の余り | =MOD(B9^2,$B$3) |
| 100=64+32+4 を組み合わせた余り | =MOD(MOD(B10*B9,$B$3)*B6,$B$3) |
Pythonで計算する方法
a = -7
n = 3
# Pythonの % は、この計算機と同じ「数学の余り」(法が正なら 0 以上)を返す
print(a % n) # 2
# divmod は床除算の商と余りをまとめて返す(a = n × 商 + 余り)
quotient, remainder = divmod(a, n)
print(quotient, remainder) # -3 2
# 合同判定: 38 ≡ 14 (mod 12) か(差が 12 の倍数かで判定)
print((38 - 14) % 12 == 0) # True
# べき乗の余り: 7 の 100 乗を 13 で割った余り
# pow の3引数版は繰り返し二乗法で計算するため、巨大な指数でも一瞬で終わる
print(pow(7, 100, 13)) # 9
def c_style_mod(x, m):
# C・Java・JavaScript の % と同じ結果(商を 0 方向へ切り捨てる方式)
r = x % m
if r != 0 and x < 0:
r -= m
return r
print(c_style_mod(-7, 3)) # -1
数式記述言語(LaTeX等)での書き方(コピペ可)
a = n × q + r(0 ≦ r < n)
a = nq + r \quad (0 \le r < n)
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block">
<mrow>
<mi>a</mi><mo>=</mo><mi>n</mi><mi>q</mi><mo>+</mo><mi>r</mi>
<mo>,</mo>
<mn>0</mn><mo>≤</mo><mi>r</mi><mo><</mo><mi>n</mi>
</mrow>
</math>
a = n q + r, \ 0 <= r < n
{Quotient[a, n], Mod[a, n]}
q := floor(a/n); r := a mod n;
q = floor(a/n); r = mod(a, n);
a = nq + r (0 ≤ r < n)
a ≡ b (mod n) ⇔ a − b = n × m
a \equiv b \pmod{n} \iff a - b = nm
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block">
<mrow>
<mi>a</mi><mo>≡</mo><mi>b</mi>
<mspace width="0.3em"/>
<mo>(</mo><mi>mod</mi><mspace width="0.3em"/><mi>n</mi><mo>)</mo>
<mo>⇔</mo>
<mi>a</mi><mo>−</mo><mi>b</mi><mo>=</mo><mi>n</mi><mi>m</mi>
</mrow>
</math>
a -= b (mod n) iff a - b = n m
Mod[a - b, n] == 0
(a - b) mod n = 0;
mod(a - b, n) == 0
a ≡ b (mod n)
(a × b) mod n = {(a mod n) × (b mod n)} mod n
(a \times b) \bmod n = \{(a \bmod n)(b \bmod n)\} \bmod n
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block">
<mrow>
<mo>(</mo><mi>a</mi><mo>×</mo><mi>b</mi><mo>)</mo>
<mspace width="0.3em"/><mi>mod</mi><mspace width="0.3em"/><mi>n</mi>
<mo>=</mo>
<mo>{</mo>
<mo>(</mo><mi>a</mi><mspace width="0.3em"/><mi>mod</mi><mspace width="0.3em"/><mi>n</mi><mo>)</mo>
<mo>×</mo>
<mo>(</mo><mi>b</mi><mspace width="0.3em"/><mi>mod</mi><mspace width="0.3em"/><mi>n</mi><mo>)</mo>
<mo>}</mo>
<mspace width="0.3em"/><mi>mod</mi><mspace width="0.3em"/><mi>n</mi>
</mrow>
</math>
(a * b) mod n = ((a mod n) * (b mod n)) mod n
Mod[a b, n] == Mod[Mod[a, n] Mod[b, n], n]
(a * b) mod n = ((a mod n) * (b mod n)) mod n;
mod(a*b, n) == mod(mod(a, n)*mod(b, n), n)
(a×b) mod n = ((a mod n)×(b mod n)) mod n
a ≡ b, c ≡ d (mod n) ⇒ a+c ≡ b+d, a−c ≡ b−d, a×c ≡ b×d (mod n)
a \equiv b,\ c \equiv d \pmod{n} \Rightarrow a + c \equiv b + d,\ a - c \equiv b - d,\ ac \equiv bd \pmod{n}
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block">
<mrow>
<mi>a</mi><mo>+</mo><mi>c</mi><mo>≡</mo><mi>b</mi><mo>+</mo><mi>d</mi>
<mo>,</mo>
<mi>a</mi><mo>−</mo><mi>c</mi><mo>≡</mo><mi>b</mi><mo>−</mo><mi>d</mi>
<mo>,</mo>
<mi>a</mi><mi>c</mi><mo>≡</mo><mi>b</mi><mi>d</mi>
<mspace width="0.3em"/>
<mo>(</mo><mi>mod</mi><mspace width="0.3em"/><mi>n</mi><mo>)</mo>
</mrow>
</math>
a + c -= b + d, \ a - c -= b - d, \ a c -= b d (mod n)
Mod[a + c, n] == Mod[b + d, n] && Mod[a - c, n] == Mod[b - d, n] && Mod[a c, n] == Mod[b d, n]
(a + c) mod n = (b + d) mod n;
mod(a + c, n) == mod(b + d, n)
a + c ≡ b + d (mod n)
ChatGPT に聞いて計算してもらう方法
あなたは数学(整数の性質)の計算アシスタントです。次の計算を、必ずPythonコードを実際に実行して行い、実行結果の数値だけを根拠に回答してください(暗算や推測で答えないでください)。 次の3問を計算してください。 1. −7 を 3 で割った数学の余り(0 以上に取る)と、そのときの商 2. 38 ≡ 14 (mod 12) が成り立つか(差が 12 の倍数かどうかも示す) 3. 7 の 100 乗を 13 で割った余り(pow(7, 100, 13) を使う) Pythonの %・divmod・pow(底, 指数, 法) を使って計算し、計算に使った式と実行結果の数値を示してください。
計算ドリル(演習問題)
このページの式を、自分の手で計算できるようになるための演習問題です。
答えと解説は解答ページにあります。
使い方
-
1数値を入力計算したい数値を入力欄に入力します
-
2計算「計算する」ボタンを押します
-
3結果を確認計算結果がその場に表示されます。計算の考え方や式の解説も同じページで確認できます
DataChefの特徴
専門知識不要、直感的で簡単な操作
個人情報を登録することなく使用できます
「ダウンロード」押下でファイルを自動削除
クレジット表記不要
商用利用許諾の連絡も不要です
