逆元
在離散數學中的概念 自行查找資料吧
百度簡單介紹一句
逆元 一般指逆元素 逆元素是指一個可以取消另一給定元素運算的元素,在數學里,逆元素廣義化了加法中的加法逆元和乘法中的倒數。
先來引入取模(取余,兩者差別不大)概念
(a + b) % p = (a%p + b%p) %p (對)
(a - b) % p = (a%p - b%p) %p (對)
(a * b) % p = (a%p * b%p) %p (對)
(a / b) % p = (a%p / b%p) %p (錯)
為什么除法錯的
證明是對的難,證明錯的只要舉一個反例
(100/50)%20 = 2 ≠ (100%20) / (50%20) %20 = 0
對於一些題目,我們必須在中間過程中進行求余,否則數字太大,電腦存不下,那如果這個算式中出現除法,我們是不是對這個算式就無法計算了呢?
答案當然是 NO (>o<)
這時就需要逆元了
a*x = 1 (mod p) 滿足a乘以x對p取模等於1 此時 稱 x為a對p的逆元
只有a與p互質才有逆元 互質 公約數只有1 最大公約數為1
費馬小定理
a^(p-1) ≡1 (mod p)
變形 a*a^(p-2) ≡1 (mod p)
此時 a^(p-2)就是a對p的逆元
1 LL pow_mod(LL a, LL b, LL p) //用到快速冪的知識,函數返回a的b次方對p取模 2 { 3 LL ret = 1; 4 while(b) 5 { 6 if(b & 1) 7 ret = (ret * a) % p; 8 a = (a * a) % p; 9 b >>= 1; 10 } 11 return ret; 12 } 13 LL Fermat(LL a, LL p) //返回a對p的逆元 14 { 15 return pow_mod(a, p-2, p); 16 }
擴展歐幾里得
ax+by=gcd(a,b)
把b看做p a與b互質 所以 gcd(a,b)=1,即ax+by=1
這個解的x就是a關於b的逆元,y就是b關於a的逆元
證明 兩邊同對b取模
a*x % b + b*y % b = 1 % b
a*x % b = 1 % b
a*x = 1 (mod b)
所以x是a關於b的逆元 反之可證明y
1 void exgcd(LL a, LL b, LL &x, LL &y, LL &d) //歐幾里得函數 2 { 3 if (!b) 4 {d = a, x = 1, y = 0;} 5 else 6 { 7 exgcd(b, a % b, y, x, d); 8 y -= x * (a / b); 9 } 10 } 11 LL inv(LL t, LL p) //返回t對p的逆元 12 { 13 LL d, x, y; 14 exgcd(t, p, x, y, d); 15 return (x % p + p) % p; //x可能為負,也可能過大 16 }
遞推方法
1 LL inv(LL t, LL p) //求t關於p的逆元,注意:t要小於p,最好傳參前先把t%p一下 2 { 3 return t == 1 ? 1 : (p - p / t) * inv(p % t, p) % p; 4 }
推薦博客 值得看 http://www.cnblogs.com/linyujun/p/5194184.html
https://oi.men.ci/mul-inverse/
菜雞一枚 歡迎大佬糾錯