1. 程式人生 > >除法求模中求逆元的兩種方法

除法求模中求逆元的兩種方法

除法 模運算 擴展歐幾裏得 tps sdn 求解 blog span emma

  今天下午還是有點閑的,不想刷題,不想補題,突然想起昨天的training 3裏I題涉及到除法取模的問題,就來總結一下

  首先對於模運算來說,是沒有對於除法的取模的(即沒有(a/b)%mod==a%mod/b%mod),但是在很多題目中都涉及到除法取模,所以就必須要了解或者掌握,對於除法取模以(a/b)%mod來說,我們首先需要得到b的逆元,根據逆元的定理 對於正整數技術分享圖片技術分享圖片,如果有技術分享圖片,那麽把這個同余方程中技術分享圖片的最小正整數解叫做技術分享圖片技術分享圖片的逆元。

  然後就是求逆元的兩種方法。

  第一種方法就是比較普遍的,也是挺基礎的,就是通過費馬小定理來求,但是要求mod必須是素數(一般題目中都會是1e9+7)。

  費馬小定理 :假如a是整數,p是質數,則a,p顯然互質(即兩者只有一個公約數1),那麽我們可以得到費馬小定理的一個特例,即當p為質數時候, a^(p-1)≡1(mod p)。

  即可以得到a*a^(p-1)=1(%M);

  也是我們就可以將除法取模轉化為乘法取模 (a/b)%mod==a*b^(mod-2)%mod,但是對於b^(mod-2)來說,也挺難算的,這裏就需要用到快速冪。

  最後貼上代碼片段

  

const long long mod=1e9+7;
long long power_mod(long long a, long long b, long long mod)
{
    long long ans = 1;
    while (b)
    {
        if (b & 1) ans = ans * a % mod;
        a 
= a * a % mod; b >>= 1; } return ans; } a*power_mod(b,mod-2,mod)%mod

  第二種方法就是通過拓展歐幾裏得算法求逆元

  

  擴展歐幾裏得定理:對於不完全為 0 的非負整數 a,b,gcd(a,b)表示 a,b 的最大公約數,必然存在整數對 x,y ,使得 gcd(a,b)=ax+by。

  對於乘法逆元來說 a*x≡1(mod m) 也就等價於 a*x + m*y ==1 即當gcd(a,m)==1時就有拓展歐幾裏得定理,即求解這個方程解出的x就是a的逆元。

  

void
exgcd(int a, int b, int &x, int &y) { if(0 == b){ x = 1, y = 0; return ; } exgcd(b, a%b, x, y); int flag = x; x = y; y = flag - a/b * y; }

除法求模中求逆元的兩種方法