模除- 維基百科,自由的百科全書
文章推薦指數: 80 %
模除(又稱模數、取模操作、取模運算等,英語:modulo 有時也稱作modulus)得到的是一個數除以另一個數的餘數。
給定兩個正整數:被除數 a 和除數 n, a modulo n ...
模除
維基百科,自由的百科全書
跳至導覽
跳至搜尋
商數(q)和 餘數(r)作為被除數(a)的函數時的圖像。
左側是除數為正的情況,右側除數為負。
從上至下分別使用了:向零取整、向下取整和歐幾里德除法。
模除(又稱模數、取模操作、取模運算等,英語:modulo有時也稱作modulus)得到的是一個數除以另一個數的餘數。
給定兩個正整數:被除數a和除數n,amodulon(縮寫為amodn)得到的是使用歐幾里德除法時a/n的餘數。
舉個例子:計算表達式"5mod2"得到1,因為5÷2=2...1(5除以2商2餘1);而"9mod3"得到0,因為9÷3=3...0;注意:如果使用計算器做除法,不能整除時,你不會得到商,而是會得到一個小數,如:5÷2=2.5。
雖然通常情況下a和n都是整數,但許多計算系統允許其他類型的數字操作,如:對浮點數取模。
一個整數對n取模的結果範圍為:0到n−1(amod1恆等於0;amod0則是未定義的,在程式語言里可能會導致除零錯誤)。
有關概念在數論中的應用請參閱模算數。
當a和n均為負數時,通常的定義就不適用了,不同的程式語言對結果有不同的處理。
目次
1定義與餘數的計算
2常見錯誤
3記號
4等價性
5性能問題
6用途
7參見
8腳註
9參考文獻
定義與餘數的計算[編輯]
不同程式語言下整數取模運算的符號
程式語言
操作符
結果與...同符號
AutoLISP
(remdn)[1]
被除數
[註1]
AWK
%
被除數
BASIC
Mod
未定義
C(ISO1999)
%,div
被除數[2]
C++(ISO2011)
%,div
被除數
C#
%
被除數
Clojure
mod
除數
rem
被除數
CoffeeScript
%
被除數
%%
除數[3]
Dart
%
非負
remainder()
被除數
Erlang
rem
被除數
F#
%
被除數
Fortran
mod
被除數
modulo
除數
Go
%
被除數
Haskell
mod
除數
rem
被除數
Kotlin
%
被除數
Java
%
被除數
Math.floorMod
除數
JavaScript
%
被除數
Lua5
%
除數
Mathematica
Mod[a,b]
除數
MATLAB
mod
除數
rem
被除數
Pascal(ISO-7185and-10206)
mod
非負
Perl
%
除數
PHP
%
被除數
Prolog(ISO1995[4])
mod
除數
rem
被除數
Python
%
除數
math.fmod
被除數
Racket
remainder
被除數
R語言
%%
除數
Ruby
%,modulo()
除數
remainder()
被除數
Rust
%
被除數
Scala
%
被除數
SchemeR6RS[5]
mod
非負
mod0
最靠近0的數[5]
SQL(SQL:2012)
%
被除數
Swift
%
被除數
Verilog(2001)
%
被除數
VHDL
mod
除數
rem
被除數
VisualBasic
Mod
被除數
WebAssembly
i32.rem_s,i64.rem_s
被除數
x86彙編(英語:x86assemblylanguage)
IDIV
被除數
不同程式語言下浮點數取模運算的符號
程式語言
操作符
結果與...同符號
C(ISO1999)
fmod
被除數
remainder
最靠近0的數
C++(ISO2011)
std::fmod
被除數
std::remainder
最靠近0的數
C#
%
被除數
CommonLisp
mod
除數
rem
被除數
Dart
%
非負
remainder()
被除數
F#
%
被除數
Fortran
mod
被除數
modulo
除數
Go
math.Mod
被除數
Haskell(GHC)
Data.Fixed.mod'
除數
Java
%
被除數
JavaScript
%
被除數
Perl6
%
除數
PHP
fmod
被除數
Python
%
除數
math.fmod
被除數
Ruby
%,modulo()
除數
remainder()
被除數
SchemeR6RS
flmod
非負
flmod0
最靠近0的數
Swift
truncatingRemainder(dividingBy:)
被除數
在數學中,取模運算的結果就是歐幾里德除法的餘數。
當然也有許多其他的定義方式。
計算機和計算器有許多種表示和儲存數字的方法,因此在不同的硬體環境下、不同的程式語言中,取模運算有著不同的定義。
幾乎所有的計算系統中,a除n得到商q和餘數r均滿足以下式子:
q
∈
Z
a
=
n
q
+
r
|
r
|
<
|
n
|
{\displaystyle{\begin{aligned}q\,&\in\mathbb{Z}\\a\,&=nq+r\\|r|\,&
0
⇒
q
=
[
a
n
]
{\displaystylen>0\Rightarrowq=\left[{\frac{a}{n}}\right]}
n
<
0
⇒
q
=
−
[
−
a
n
]
{\displaystylen<0\Rightarrowq=-\left[-{\frac{a}{n}}\right]}
或者等價的:
q
=
sgn
(
n
)
[
a
|
n
|
]
{\displaystyleq=\operatorname{sgn}(n)\left[{\frac{a}{\left|n\right|}}\right]}
這裡的sgn是符號函數,因此
r
=
a
−
|
n
|
[
a
|
n
|
]
{\displaystyler=a-|n|\left[{\frac{a}{\left|n\right|}}\right]}
CommonLisp也定義了自己的捨入除法和進位除法,商分別定義為q=round(a/n)和q=-[-a/n]。
IEEE754(英語:IEEE754-1985)定義了一個取余函數,商被定義為a/n,依據捨入約定(英語:IEEE754-1985#Roundingfloating-pointnumbers)取整。
因此餘數的符號選定為最接近0。
常見錯誤[編輯]
當取模的結果與被除數符號相同時,可能會導致意想不到的錯誤。
舉個例子:如果需要判斷一個整數是否為奇數,有人可能會測試這個數除2的餘數是否為1:
boolis_odd(intn){
returnn%2==1;
}
但在一個取模結果與被除數符號相同的程式語言里,這樣做是錯的。
因為當被除數n是奇數且為負數時,nmod2得到−1,此時函數返回「假」。
一種正確的實現是測試取模結果是否為0,因為餘數為0時沒有符號的問題:
boolis_odd(intn){
returnn%2!=0;
}
或者考慮餘數的符號,有兩種情況:餘數可能為1或-1。
boolis_odd(intn){
returnn%2==1||n%2==-1;
}
記號[編輯]
一些計算器有取模mod()按鈕,很多程式語言里也有類似的函數,通常像mod(a,n)這樣。
有些語言也支持在表達式內使用"%"、"mod"或"Mod"作為取模或取余操作符。
a %n
或
amodn
或者在一些沒有mod()函數的環境中使用等價的:
(注意'int'事實上等價於截斷函數a/n,進行了向0取整)
a-(n*int(a/n))
等價性[編輯]
一些取模操作,經過分解和展開可以等同於其他數學運算。
這在密碼學的證明中十分有用,例如:迪菲-赫爾曼密鑰交換。
恆等式:
(amodn)modn=amodn
對所有的正數x有:nxmodn=0
如果p是一個質數,且不為b的因數,此時由費馬小定理有:abp−1modp=amodp
逆運算:
[(−amodn)+(amodn)]modn=0.
b−1modn表示模反元素。
若且唯若b與n互質時,等式左側有定義:[(b−1modn)(bmodn)]modn=1。
分配律:
(a+b)modn=[(amodn)+(bmodn)]modn
abmodn=[(amodn)(bmodn)]modn
dmod(abc)=(dmoda)+a[(d\a)modb]+ab[(d\a\b)modc],符號\是歐幾里德除法中的除法操作符,運算結果為商
cmod(a+b)=(cmoda)+[bc\(a+b)]modb-[bc\(a+b)]moda.
除法定義:僅當式子右側有定義時,即b、n互質時有:a/bmodn=[(amodn)(b−1modn)]modn,其他情況為未定義的。
乘法逆元:[(abmodn)(b−1modn)]modn=amodn.
性能問題[編輯]
可以通過依次計算帶餘數的除法實現取模操作。
特殊情況下,如某些硬體上,存在更快的實現。
例如:2的n次冪的模,可以通過逐位與運算實現:
x %2n==x&(2n-1)
例子,假定x為正數:
x %2==x&1
x %4==x&3
x %8==x&7
在進行位操作比取模操作效率更高的設備或軟體環境中,以上形式的取模運算速度更快。
[9]
編譯器可以自動識別出對2的n次冪取模的表達式,自動將其優化為expression&(constant-1)。
這樣可以在兼顧效率的情況下寫出更整潔的代碼。
這個優化在取模結果與被除數符號一致的語言中(包括C語言)不能使用,除非被除數是無符號整數。
這是因為如果被除數是負數,則結果也是負數,但expression&(constant-1)總是正數,進行這樣的優化就會導致錯誤,無符號整數則沒有這個問題。
用途[編輯]
取模運算可用於判斷一個數是否能被另一個數整除。
對2取模即可判斷整數的奇偶性;從2到n-1取模則可判斷一個數是否為質數。
進制之間的轉換。
用於求取最大公約數的輾轉相除法使用取模運算。
密碼學中的應用:從古老的凱撒密碼到現代常用的RSA、橢圓曲線密碼,它們的實現過程均使用了取模運算。
參見[編輯]
模(消歧義)和模(術語)(英語:modulo(jargon))——「模數(Modulo)」這個詞的許多用法,都是1801年卡爾·弗里德里希·高斯引入模算數時產生的。
模冪運算
同餘
腳註[編輯]
^在VisualLISPIDE里測試可知結果與被除數同符號。
(rem133)=>1;(rem-133)=>-1;(rem13-3)=>1;(rem-13-3)=>-1
^從數學上講,正和負只是滿足不等式的無窮多個解中的兩個
參考文獻[編輯]
^AutoCAD2018帮助:rem(AutoLISP).Autodesk,Inc.[2018-07-12](中文).
^ISO/IECJTC.TheISOC99Standard(ISO/IEC9899:TC3CommitteeDraft)(PDF).open-std.org:6.5.5:94.2007-09-07[2018-07-12].(原始內容(pdf)存檔於2018-06-24)(英語).Ifthequotienta/bisrepresentable,theexpression(a/b)*b+a%bshallequala.
^jashkenas.CoffeeScriptLanguageReference-OperatorsandAliases.coffeescript.org.[2018-07-12].(原始內容存檔於2018-07-11)(英語).%worksjustlikeinJavaScript,while %%provides「dividenddependentmodulo」
^J.P.E.Hodgson.Prolog:TheISOdirectives,controlconstructsandbuiltins..1999-04-12[2018-07-12].(原始內容存檔於2017-12-25)(英語).Aconformingprocessorisrequiredtosupportthearithmeticoperationsspecifiedbythefollowingtables.TheyconformtotheISO/IEC10967-1LanguageIndependentArithmeticstandard.
^5.05.1ROBERTBRUCEFINDLER,JACOBMATTHEWS.Revised6ReportontheAlgorithmicLanguageScheme.r6rs.org.2007-09-26[2018-07-12].(原始內容存檔於2018-03-15)(英語).
^Jones,DerekM.TheNewCStandard:AnEconomicandCulturalCommentary(PDF).Addison-Wesley.2003[2018-07-11].ISBN 9780201709179.(原始內容(PDF)存檔於2018-07-11)(英語).
^Knuth,Donald.E.TheArtofComputerProgramming.Addison-Wesley.1972(英語).
^Boute,RaymondT.TheEuclideandefinitionofthefunctionsdivandmod.ACMTransactionsonProgrammingLanguagesandSystems(ACMPress(NewYork,NY,USA)).April1992,14(2):127–144.doi:10.1145/128861.128862(英語).
^Horvath,Adam.Fasterdivisionandmodulooperation-thepoweroftwo.July5,2012.(原始內容存檔於2018-03-05)(英語).
取自「https://zh.wikipedia.org/w/index.php?title=模除&oldid=67874442」
分類:計算機算術同餘二元運算運算符(編程)隱藏分類:CS1英語來源(en)含有英語的條目有藍鏈卻未移除內部連結助手模板的頁面帶有C++代碼示例的條目
導覽選單
個人工具
沒有登入討論貢獻建立帳號登入
命名空間
條目討論
臺灣正體
不转换简体繁體大陆简体香港繁體澳門繁體大马简体新加坡简体臺灣正體
查看
閱讀編輯檢視歷史
更多
搜尋
導航
首頁分類索引特色內容新聞動態近期變更隨機條目資助維基百科
說明
說明維基社群方針與指引互助客棧知識問答字詞轉換IRC即時聊天聯絡我們關於維基百科
工具
連結至此的頁面相關變更上傳檔案特殊頁面靜態連結頁面資訊引用此頁面維基數據項目
列印/匯出
下載為PDF可列印版
其他語言
العربيةCatalàDanskDeutschEnglishEspañolفارسیFrançaisBahasaIndonesiaÍslenskaItaliano日本語ҚазақшаNorskbokmålPolskiPortuguêsRomânăSimpleEnglishSlovenščinaСрпски/srpskiSvenskaTürkçeTiếngViệt粵語
編輯連結
延伸文章資訊
- 1MOD運算_百度百科
mod運算,即求餘運算,是在整數運算中求一個整數x 除以另一個整數y的餘數的運算,且不考慮運算的商。在計算機程序設計中都有MOD運算,其格式為: mod(nExp1,nExp2), ...
- 2裂罅MOD(紫卡)計算機 - 天農人生
裂罅MOD(紫卡)計算機. 近戰 · 步槍 · 霰彈槍 · 手槍 · 組合槍 · 空戰槍械. Note:; 新增"官方交易數據" 與"紫卡網站快速連結". 空戰武器的公式還在調整中,歡迎提供 ...
- 3取模运算计算器
“模”是“Mod”的音译,模运算多应用于程序编写中。 Mod的含义为求余。模运算在数论和程序设计中都有着广泛的应用,从奇偶数的判别到素数的判别,从模幂运算到最大公约数 ...
- 4Day 14:[離散數學]同餘(Mod)是什麼? - iT 邦幫忙
挑戰內容:連續30天紀錄計算機概論、離散數學、演算法、資料結構等課程,還有自己學習程式的心得體悟。 本篇性質:. 適合的人:對密碼學有興趣的人,因為模數運算(mod)是 ...
- 5模計算器
About 模計算器. 模計算器用於對數字執行模運算。 模. 給定兩個數字, 一個(被除數)和n(除數), 一模n(簡稱為MOD n)是從一個由n中的除法的餘數。