請選擇模式並輸入整數。「求餘數」也支援負數,還會顯示數學上的餘數(大於或等於 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 繞一圈的時鐘」是同樣的道理,例如今天是星期一,100 天後是 100 mod 7 = 2,所以是「星期一往後 2 天=星期三」。
不論是記事本上的月曆還是月曆 App,都是用這個餘數的計算來對應日期和星期。
商品條碼(台灣以 471 開頭的 EAN-13 條碼)和書籍 ISBN 的最後 1 碼,是由前面的數字用餘數計算產生的檢查用數字(檢查碼)。例如 EAN-13 條碼,是把各位數字交替乘以 1 倍、3 倍後相加,再由總和除以 10 的餘數決定最後一碼。
只要打錯 1 碼,餘數就對不上,所以收銀機和網購系統能當場抓出輸入錯誤。信用卡號碼和身分證字號最後一碼的檢查碼,也是同樣的想法。
用來安全傳送信用卡號碼等資料的公鑰加密代表——RSA 加密,計算時用的正是「巨大數的次方除以某數的餘數」。次方的餘數可以很快算出來,但要從結果反推回原來的數卻非常困難,這種單向的性質就是安全性的根據。
這個頁面「求次方的餘數」模式顯示計算過程所用的反覆平方法,正是加密軟體每天在內部執行的計算。
程式設計中,常用 i % 2 判定偶數或奇數,或用 i % n 做出「每 n 個繞一圈的順序」(例如回合制遊戲中決定下一位玩家、投影片播到最後再回到第一張等),% 運算子是日常使用的工具。
摻雜負數時,% 的結果依語言而不同,所以「數學上的餘數和 C、Java 系 % 的差異」,是除錯時很有用的知識。
63 枝鉛筆平均分給 12 個人,每人 5 枝,還剩 3 枝(63 = 12 × 5 + 3)。庫存裝箱(每箱 n 個,能裝幾箱、剩幾個)、活動分組等,「平分後看剩下多少」的場合,用的都是這個計算。
除法的基本式 a = n × q + r,就是把這些生活中的場景寫成一個式子。
公式與圖示
符號與用語解說
符號
| \(\equiv\) | 同餘 | 表示同餘的符號。把等號(=)的線變成 3 條的形狀,表示比「完全相等」寬鬆的「在餘數的世界裡相等」。 |
| \(\bmod\)(mod) | 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 次方 | 把 \(a\) 自乘 \(k\) 次(次方)。右上角的小數字 \(k\) 是表示「相乘次數」的指數。 |
| % | 百分比符號(當作取餘數運算子時讀作 mod) | 許多程式語言中用來求餘數的取餘數運算子。和百分率的百分比符號相同,但意思不同。C、Java、JavaScript 對負數的結果,可能和數學上的餘數不同(請參考第 1 個公式的「思考重點」)。 |
用語
| 餘數 | 除法中除不盡而剩下的數。數學上約定取大於或等於 \(0\)、小於除數的值。 |
| 商 | 相當於除法中「可以減幾次」的整數,也就是除法基本式 \(a = n \times q + r\) 的 \(q\)。 |
| 模 | 決定「用除以多少的餘數來思考」的數 \(n\),相當於時鐘繞一圈的刻度數。「以 12 為模」的意思是「用除以 12 的餘數來思考」。 |
| 同餘 | 2 個整數除以模 \(n\) 的餘數相等。這是整數性質的用語,和圖形的全等(形狀和大小都相同)不同。 |
| 同餘式 | \(a \equiv b \pmod{n}\) 形式的式子。可以像等式一樣相加、相減、相乘來變形,用式子的變形來進行餘數的計算。是數論的基本工具,也常出現在數學競賽中。 |
| 倍數 | 把某個整數乘以整數所得的數。「差是模的倍數」就是同餘的定義。 |
| 向下取整除法 | 把商往較小的整數取的除法(floor division)。除數是正數時,即使被除數是負數,餘數也會大於或等於 0。Python 的 // 運算子和 Excel 的 INT 函數都是這種方式。 |
| 取餘數運算子 | 程式設計中求餘數的 %。C、Java、JavaScript 是把商往 0 的方向捨去的方式(餘數的正負號和被除數相同),Python、Ruby 是向下取整除法的方式(餘數的正負號和除數相同,模是正數時大於或等於 0)。 |
| 反覆平方法 | 一再平方並取餘數,再把指數分解成 2 的次方之和來相乘,用很少的乘法次數求出大次方餘數的方法。也叫快速冪,用在 RSA 加密等的實作中。 |
| 同餘類 | 把整數依「除以 \(n\) 的餘數」分組的想法。在 mod \(n\) 的世界裡,所有整數都分成餘數 \(0\)~\(n-1\) 這 \(n\) 類。偶數和奇數,就是依除以 2 的餘數分成的同餘類。 |
| 週期性 | 次方的餘數會重複同樣排列的性質。餘數只有 \(n\) 種,所以一定會在某處回到相同的餘數。在個位數字的問題(mod 10)中找出週期,是考試的常見題型。 |
| 互質 | 2 個整數的最大公因數是 1。出現在同餘式兩邊可以同除以某數的條件中。 |
建議先了解的基礎知識
為了能「真正理解意義」地使用這個頁面的計算,這裡整理了建議事先了解的基礎知識。
遇到卡關的地方,回到這張表的內容複習是最快的捷徑。
| 有餘數的除法(國小三~四年級,8~10 歲) |
|
| 倍數與因數(國小五年級,10~11 歲) |
|
| 正負數(國中七年級,12~13 歲) |
|
| 次方與指數(國中七年級~高一,12~16 歲) |
|
| 整數的除法原理(高中,15~18 歲) |
|
用 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 次方的餘數(把上一列平方後取餘數) | =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 方式的餘數時,請用第 1 個表格最後一列、把商往 0 方向捨去的 TRUNC。
第 1 個表格是 −7 除以 3 的例子,餘數是 2、商是 −3。
第 2 個表格是 38 ≡ 14 (mod 12) 的判定,差 24 的餘數是 0,所以顯示 TRUE(同餘)。
第 3 個表格是用反覆平方法求 7 的 100 次方除以 13 的餘數,答案是 9。「^」是次方的符號。Excel 的數值只能精確處理約 15 位數,所以模 n 超過 7 位數時,平方後的值會失去精確度。這時請使用這個頁面的計算機或 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 次方的餘數(把上一列平方後取餘數) | =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 的特色
不需專業知識,操作直覺又簡單
無須登錄任何個人資料
按下「下載」後自動刪除檔案
無須標註來源出處
亦無須事先取得商用授權