模除- 維基百科,自由的百科全書

文章推薦指數: 80 %
投票人數:10人

模除(又稱模數、取模操作、取模運算等,英語: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粵語 編輯連結



請為這篇文章評分?