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


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

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

  第一種方法就是比較普遍的,也是挺基礎的,就是通過費馬小定理來求,但是要求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;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM