100除以7的餘數是2,意思就是說把100個東西七個七個分成一組的話最後還剩2個。餘數有乙個嚴格的定義:假如被除數是a,除數是b(假設它們均為正整數),那麼我們總能夠找到乙個小於b的自然數r和乙個整數m,使得a=bm+r。這個r就是a除以b的餘數,m被稱作商。我們經常用mod來表示取餘,a除以b餘r就寫成a mod b = r。
如果兩個數a和b之差能被m整除,那麼我們就說a和b對模數m同餘(關於m同餘)。比如,100-60除以8正好除盡,我們就說100和60對於模數8同餘。它的另一層含義就是說,100和60除以8的餘數相同。a和b對m同餘,我們記作a≡b(mod m)。比如,剛才的例子可以寫成100≡60(mod 8)。你會發現這種記號到處都在用,比如和數論相關的書中就經常把a mod 3 = 1寫作a≡1(mod 3)。
之所以把同餘當作一種運算,是因為同餘滿足運算的諸多性質。比如,同餘滿足等價關係。具體地說,它滿足自反性(乙個數永遠和自己同餘)、對稱性(a和b同餘,b和a也就同餘)和傳遞性(a和b同餘,b和c同餘可以推出a和c同餘)。這三個性質都是顯然的。
同餘運算裡還有稍微複雜一些的性質。比如,同餘運算和整數加減法一樣滿足「等量加等量,其和不變」。小學我們就知道,等式兩邊可以同時加上乙個相等的數。例如,a=b可以推出a+100=b+100。這樣的性質在同餘運算中也有:對於同乙個模數m,如果a和b同餘,x和y同餘,那麼a+x和b+y也同餘。在我看來,這個結論幾乎是顯然的。當然,我們也可以嚴格證明這個定理。這個定理對減法同樣有效。
性質:如果a≡b(mod m),x≡y(mod m),則a+x≡b+y(mod m)。
證明:條件告訴我們,可以找到p和q使得a-mp = b-mq,也存在r和s使得x-mr = y-ms。於是a-mp + x-mr = b-mq + y-ms,即a+x-m(p+r) = b+y-m(q+s),這就告訴我們a+x和b+y除以m的餘數相同。
容易想到,兩個同余式對應相乘,同余式兩邊仍然相等:
如果a≡b(mod m),x≡y(mod m),則ax≡by(mod m)。
證明:條件告訴我們,a-mp = b-mq,x-mr = y-ms。於是(a-mp)(x-mr) = (b-mq)(y-ms),等式兩邊分別展開後必然是ax-m(…) = by-m(…)的形式,這就說明ax≡by(mod m)。
現在你知道為什麼有的題要叫你「輸出答案mod ***xx的結果」了吧,那是為了避免高精度運算,因為這裡的結論告訴我們在運算過程中邊算邊mod和算完後再mod的結果一樣。假如a是乙個很大的數,令b=a mod m,那麼(a * 100) mod m和(b * 100) mod m的結果是完全一樣的,這相當於是在a≡b (mod m)的兩邊同時乘以100。這些結論其實都很顯然,因為同餘運算只關心餘數(不關心「整的部分」),完全可以每一次運算後都只保留餘數。因此,整個運算過程中參與運算的數都不超過m,避免了高精度的出現。
在證明fermat小定理時,我們用到了這樣乙個定理:
如果ac≡bc(mod m),且c和m互質,則a≡b(mod m)(就是說同余式兩邊可以同時除以乙個和模數互質的數)。
證明:條件告訴我們,ac-mp = bc-mq,移項可得ac-bc = mp-mq,也就是說(a-b)c = m(p-q)。這表明,(a-b)c裡需要含有因子m,但c和m互質,因此只有可能是a-b被m整除,也即a≡b(mod m)。
cpp中關於取模結果的型別
開門見山 cpp中取模運算得到的臨時數 右值 是乙個無符號數,如果直接拿臨時結果跟有符號數進行比較的話,就會發生型別轉換,得到意料之外的結果 起因 在寫乙個lambda表示式的時候,如下 this end 和this start都是int 值為0 max buf是大於0的常量 int rcount ...
取餘與取模的區別,以及在C (C )中的使用
c 和c 中,運算子 為取餘運算子,而並非取模預算符,在一些應用場景中,如果不加以區分,會產生嚴重的bug。取餘運算 complementation 和取模運算 modulo operation 的區別 對於整型數a,b來說,取模運算或取餘運算的方法都是 第一步 求 整數商 c a b 第二步 計算...
Python 關於整除以及負數取餘遇到的問題
最近在編碼的過程中,在整除以及取餘的時候遇到了一些比較迷的問題,這裡碼一下這些問題,以備日後檢視。在python3中,除法有 以及 兩種,這兩個有著明顯的區別,具體區別看 print 12 10 print 12 10 這兩行 的輸出如下 1 1.2這結果的差別顯而易見。當被除數是負數的時候又是令一...