分步取模原理

2022-04-21 19:41:00 字數 658 閱讀 7813

很多演算法用到了分步取模運算,演算法中用到乙個結論(a * b + c)%m = (( a % m ) * b + c)%m,但都沒有特別清楚地說明為什麼可以這麼算,只是提到用以下兩個公式:

(a + b) % p = (a % p + b % p) % p   ①

(a * b) % p = (a % p * b % p) % p  ②

經過**發現,

設a=k1m+b1,b=k2m+b2(b1,b2

< m,即a ÷ m = k1……b1,a ÷ m = k2……b2),則:

根據②式 (a * b) % m = (a % m * b % m) % m = (b1 * b2) % m

而(b1 * b) % m = (k2b1m + b1b2) % m = (b1 * b2) % m

所以 (a * b) % m = (b1 * b) % m = (a % m * b) % m  ③

那麼 (a * b + c) % m = ((a * b) % m + c % m) % m

=( (a % m * b) % m + c % m) % m    (根據③)

=(a % m * b + c) % m           (根據②反向)

於是 (a * b + c) % m = (a % m * b + c) % m得證

大數乘積取模的具體原理實現

大數乘取餘 由於p同樣很大,導致 a p b p p還是會溢位。舉個例子4 13 p 我們把13轉化為二進位制數即1101 即有4 1101 2 p 即轉化為4 1 2 3 1 2 2 0 2 1 1 2 0 p 那麼問題就轉化為4從1101的低位開始不斷相乘取模 我們只需要每移動一位時將4乘以2即...

取模與取餘

通常情況下取模運算 mod 和求餘 rem 運算被混為一談,因為在大多數的程式語言裡,都用 符號表示取模或者求餘運算。在這裡要提醒大家要十分注意當前環境下 運算子的具體意義,因為在有負數存在的情況下,兩者的結果是不一樣的。對於整型數a,b來說,取模運算或者求餘運算的方法都是 1.求 整數商 c a ...

取餘和取模

對於整型數a,b來說,取模運算或者求餘運算的方法都是 1.求 整數商 c a b 2.計算模或者餘數 r a c b.但是求模運算和求餘運算在第一步不同 求餘運算在取c的值時,向0 方向捨入 int強制轉換 而取模運算在計算c的值時,向負無窮大方向捨入 floor 函式 因此,當a和b符號一致時,求...