模除（ 有時也稱作 modulus），又稱模數、取模、取模運算等，它得出一個數除以另一個數的餘數。給定兩個正數：被除數 a 和除數 n，a operatorname modulo n（通常縮寫為 a bmod n），得到的是使用歐幾里得除法時的餘數。a bmod 1 所得之數被稱為 a 的小數部份。 舉個例子：計算表示式 5bmod 2 得到 1，因為 5div 2 的商為 2 而餘數為 1；而 9bmod 3 得到 0，因為 9div 3 的商為 3 而餘數為 0；做除法不能整除時得到是有理數，平常使用的計算器採用了有限個數位的十進位制表示法，它以小數點分隔整數部份和小數部份，比如 5div 225。 雖然通常情況下模除的被除數 a 和除數 n 都是整數，但許多計算系統允許其他型別的數值運算，比如對浮點數取模。在所有計算系統中當被除數 a 和除數 n 都是正數時，結果的餘數 r 的範圍為 0 le r n；而 a bmod 0 經常是未定義的，在程式語言裡可能會導致除以零錯誤。當被除數 a 或除數 n 為負數時，不同的程式語言對結果有不同的處理。 各種定義 在數學中，取模運算的結果就是歐幾里德除法的餘數。當然也有許多其他的定義方式。計算機和計算器有許多種表示和儲存數字的方法，因此在不同的硬體環境下、不同的程式語言中，取模運算有著不同的定義。 幾乎所有的計算系統中，a 除以 n 得到商 q 和餘數 r 均滿足以下式子： 即使如此，當餘數非 0 時，餘數的符號仍然是有歧義的：餘數非 0 時，它的符號有兩種選擇，一個是正號而另一個是負號。通常情況下，在數論中總是選擇正餘數。但在程式設計中，選擇餘數的符號依賴於程式語言和被除數 a 或除數 n 的符號。在程式語言所定義的整數模除中，ISOIEC 標準 Pascal A term of the form i div j shall be an error if j is zero otherwise the value of i div j shall be such that abs i abs j abs i div j j abs i where the value shall be zero if abs i abs j otherwise the sign of the value shall be positive if i and j have the same sign and negative if i and j have different signs A term of the form i mod j shall be an error if j is zero or negative otherwise the value of i mod j shall be that value of i k j for integral k such that 0 i mod j j NOTE 2 Only for i 0 and j 0 does the relation i div j j i mod j i hold div divide and truncate ie value is not rounded mod modulus let Remainder A A div B B if Remainder 0 then A mod B Remainder B otherwise A mod B Remainder 和 ALGOL 6810233 Operations on integral operands m OP OVER L INT a b L INT IF b L 0 THEN L INT q L 0 r ABS a WHILE r r ABS b L 0 DO q q L 1 OD a L 0 AND b L 0 OR a L 0 AND b L 0 q q FI n OP MOD L INT a b L INT L INT r a a b b r 0 r ABS b r ，在計算出的餘數 r 為負數時，返回正數 r n 作為結果；另一些程式語言如 ISOIEC C90，當被除數 a 或除數 n 是負數時，C90 標準並沒有做具體的規定，而是留給編譯器去定義並實現 C99 reflects almost universal processor behavior as does the Fortran Standard This definition truncates toward zero and the expression ab ab ab ab is always true It also means that the absolute value of the result does not depend on the signs of the operands for example 10 3 3 10 3 1 10 3 3 10 3 110 3 3 10 3 1 10 3 3 10 3 1 C90 When integers are divided and the division is inexact if both operands are positive the result of the operator is the largest integer less than the algebraic quotient and the result of the operator is positive If either operand is negative whether the result of the operator is the largest integer less than or equal to the algebraic quotient or the smallest integer greater than or equal to the algebraic quotient is implementationdefined as is the sign of the result of the operator If either operand is negative the behavior may differ between C90 and C99 depending on the implementationdefined behavior of the C90 implementation include stdioh int main void int x 1 y 3 if x y 0 xy y x y printf This is a C90 translator behaving differently than C99n Quoting from the C9X Revision Proposal WG14N613 that proposed this change The origin of this practice seems to have been a desire to map Cs division directly to the natural behavior of the target instruction set whatever it may be without requiring extra code overhead that might be necessary to check for special cases and enforce a particular behavior However the argument that Fortran programmers are unpleasantly surprised by this aspect of C and that there would be negligible impact on code efficiency was accepted by WG14 who agreed to require Fortranlike behavior in C99 。在大多數系統中 a bmod 0 是未定義的，雖然有些系統定義它就等於 a。更多詳情參見後續章節表格。 記號 一些計算器有取模按鈕，很多程式語言裡也有類似的函式，通常像 mod a n 這樣。有些語言也支援在表示式內使用 、mod 或 Mod 作為取模或取餘運算子，比如 a n 或 a mod n。 在一些沒有函式的環境中或許可使用等價的：a n int an。這裡的 int 函式事實上等價於截斷函式。 性質及恆等式 一些取模操作，經過分解和展開可以等同於其他數學運算。這在密碼學的證明中十分有用，例如：迪菲 赫爾曼金鑰交換。 恆等式： a bmod n bmod na bmod n 對所有的正數 x 有：nx bmod n0 如果 p 是一個質數，且不為 b 的因數，此時由費馬小定理有：abp1 bmod pa bmod p 逆運算： a bmod na bmod nbmod n0 b1 bmod n 表示模反元素。當且僅當 b 與 n 互質時，等式左側有定義：b1 bmod nb bmod n bmod n 1。 分配律： ab bmod na bmod nb bmod n bmod n ab bmod na bmod nb bmod n bmod n 除法定義：僅當式子右側有定義時，即 b、n 互質時有：frac ab bmod na bmod nb1 bmod nbmod n，其他情況為未定義的。 乘法逆元：ab bmod nb1 bmod nbmod na bmod n 程式語言實現 在各種程式語言中的模除運算 語言 算符 整數 浮點數 定義 ABAP 歐幾里得式 ActionScript 截斷 Ada 下取整 Ada 截斷 ALGOL 68 類似歐幾里得式 AMPL 截斷 APL 下取整 AppleScript 截斷 AutoLISP 截斷 AWK 截斷 bash 截斷 BASIC 實現各異 bc 截斷 CC 截斷 CC C C 截斷 CC C C 修約 C 截斷 C 修約 截斷 Clean 截斷 Clojure 下取整 Clojure 截斷 COBOL 下取整 COBOL 截斷 CoffeeScript 截斷 CoffeeScript 下取整 CoffeeScript operators ColdFusion 截斷 Common Intermediate Language 有符號 截斷 Common Intermediate Language 無符號 Common Lisp 下取整 Common Lisp 截斷 下取整 截斷 D 截斷 Dart 歐幾里得式 Dart 截斷 Eiffel 截斷 Elixir 截斷 Elixir 下取整 Elm 下取整 Elm 截斷 Erlang 截斷 Erlang 截斷 同於 C Euphoria 下取整 Euphoria 截斷 F 截斷 F 修約 Factor 截斷 FileMaker 下取整 Forth 實現定義 Forth 下取整 Forth 截斷 Fortran 截斷 Fortran 下取整 下取整 下取整 截斷 GLSL 未定義 GLSL 下取整 GameMaker Studio GML 截斷 GDScript Godot 截斷 GDScript Godot 截斷 GDScript Godot 歐幾里得式 GDScript Godot 歐幾里得式 Go 截斷 Go 截斷 Go 歐幾里得式 Go 截斷 Groovy 截斷 Haskell 下取整 Haskell 截斷 Haskell GHC 下取整 Haxe 截斷 HLSL 未定義 J 下取整 Java 截斷 Java 下取整 JavaScriptTypeScript 截斷 Julia 下取整 Julia 截斷 Kotlin 截斷 Kotlin 下取整 ksh 截斷 同於 POSIX sh ksh 截斷 LabVIEW 截斷 LibreOffice 下取整 Logo 下取整 Logo 截斷 Lua 5 下取整 Lua 4 截斷 截斷 Mathcad 下取整 Maple 預設 歐幾里得式 Maple 修約 Maple 修約 Mathematica 下取整 MATLAB 下取整 MATLAB 截斷 Maxima 下取整 Maxima 截斷 截斷 Microsoft Excel 下取整 Minitab 下取整 Modula2 下取整 Modula2 截斷 下取整 Netwide Assembler NASM NASMX 無符號 Netwide Assembler NASM NASMX 有符號 實現定義 Nim 截斷 Oberon 類似下取整 ObjectiveC 截斷 同於 C99 Object Pascal Delphi 截斷 OCaml 截斷 OCaml 截斷 Occam 截斷 Pascal ISO7185 和 ISO10206 類似歐幾里得式 Perl 下取整 Perl 截斷 PHP 截斷 PHP 截斷 PIC BASIC Pro 截斷 PLI 下取整 ANSI PLI PowerShell 截斷 Programming Code 未定義 截斷 Prolog ISO 1995ISO 1995 下取整 Prolog ISO 1995ISO 1995 截斷 PureBasic 截斷 PureScript 歐幾里得式 Pure Data 截斷 同於 C Pure Data 下取整 Python 下取整 Python 截斷 Python 修約 Q 截斷 R 下取整 Racket 下取整 Racket 截斷 Raku 下取整 截斷 Reason 截斷 Rexx 截斷 截斷 Ruby 下取整 Ruby 截斷 Rust 截斷 Rust 歐幾里得式 SAS 截斷 Scala 截斷 Scheme 下取整 Scheme 截斷 Scheme R6RS 歐幾里得式 r6rsorg Scheme R6RS 修約 Scheme R6RS 歐幾里得式 Scheme R6RS 修約 Scratch 下取整 下取整 截斷 下取整 截斷 Unix shell 包括 bash、ash 等。 截斷 同於 C Smalltalk 下取整 Smalltalk 截斷 Snap 下取整 下取整 Solidity 下取整 SQL 截斷 SQL 截斷 Standard ML 下取整 Standard ML 截斷 Standard ML 截斷 Stata 歐幾里得式 Swift 截斷 Swift 修約 Swift 截斷 Tcl 下取整 Tcl 截斷 同於 C tcsh 截斷 截斷 下取整 Verilog 2001 截斷 VHDL 下取整 VHDL 截斷 VimL 截斷 Visual Basic 截斷 WebAssembly 無符號 WebAssembly 有符號 截斷 無符號 有符號 截斷 截斷 下取整 Zig 截斷 歐幾里得式 此外，很多計算機系統提供功能，它同時產生商和餘數。例子 x86 架構的指令，C 程式語言的函式，和 Python 的函式。 常見錯誤 當取模的結果與被除數符號相同時，可能會導致意想不到的錯誤。 舉個例子：如果需要判斷一個整數是否為奇數，有人可能會測試這個數除 2 的餘數是否為 1： bool is_odd int n return n 2 1 但在一個取模結果與被除數符號相同的程式語言裡，這樣做是錯的。因為當被除數 是奇數且為負數時， n bmod 2 得到 1，此時函式返回 假。 一種正確的實現是測試取模結果是否為 0，因為餘數為 0 時沒有符號的問題： bool is_odd int n return n 2 0 或者考慮餘數的符號，有兩種情況：餘數可能為 1 或 1。 bool is_odd int n return n 2 1 n 2 1 效能問題 可以透過依次計算帶餘數的除法實現取模操作。特殊情況下，如某些硬體上，存在更快的實現。 例如：2 的 n 次冪的模，可以透過逐位與運算實現： x 2n x 2n 1 例子，假定 為正數： x 2 x 1 x 4 x 3 x 8 x 7 在進行位操作比取模操作效率更高的裝置或軟體環境中，以上形式的取模運算速度更快。 編譯器可以自動識別出對 2 的 n 次冪取模的表示式，自動將其最佳化為 expression constant1。這樣可以在兼顧效率的情況下寫出更整潔的程式碼。這個最佳化在取模結果與被除數符號一致的語言中（包括 C 語言）不能使用，除非被除數是無符號整數。這是因為如果被除數是負數，則結果也是負數，但 expression constant1 總是正數，進行這樣的最佳化就會導致錯誤，無符號整數則沒有這個問題。 用途 取模運算可用於判斷一個數是否能被另一個數整除。對 2 取模即可判斷整數的奇偶性；從 2 到 n1 取模則可判斷一個數是否為質數。 進位制之間的轉換。 用於求取最大公約數的輾轉相除法使用取模運算。 密碼學中的應用：從古老的凱撒密碼到現代常用的 RSA、橢圓曲線密碼，它們的實現過程均使用了取模運算。 參見 模 消歧義 和 模數（Modulo） 這個詞的許多用法，都是 1801 年卡爾弗里德里希高斯引入模算數時產生的。 模冪運算 同餘 腳註 參考文獻 Category 計算機算術 Category 帶有 C 程式碼示例的條目 Category 運算子 程式設計 Category 同餘 Category 數字運算