關於乘法逆元

\[\text{乘法逆元}\]算法

學習博客學習

定義:

這是來自大佬博客的:
對於縮系中的元素,每一個數\(a\)均有惟一的與之對應的乘法逆元\(x\),使得\(ax \equiv 1 (mod \ n)\),一個數有逆元的充分必要條件是\(gcd(a,n)=1\),此時逆元惟一存在ui

求逆元的幾種方法
1.擴展歐幾里得算法

\(a\)的逆元是\(x\)\(x\)知足\(ax\equiv1\),由於除法的實質是減法因此,方程也能夠寫爲\(ax-my=1\),求得一組解以後判斷\(gcd(x,y)\)是不是一,若是不是則說明不是,由於咱們用\(exgcd\)求得就是一組最小解了。若是是,則需調整\(x\)到相應範圍\((0到m-1)\)
Code:spa

int exgcd(int a, int b, int & x, int & y) {
    if(!b) {x = 1, y = 0; return;}
    int d = exgcd(b, a % b, y, x);
    y -= a / b * x;
    return d;
}
int inv(int a, int n) {
    int x, y;
    int d = exgcd(a, n, x, y);
    return d == 1 ? (x + n) % n : -1;
}
費馬小定理:

是歐拉定理的一種特殊狀況
\(a^{p-1}\equiv1(mod \ p)\)
\(a^{p-2}\equiv a^{-1}(mod \ p)\)
除以一個數等於乘上這個數的逆元
除以一個數等於乘他的倒數,而此時的指數爲\(-1\)正好就是他的倒數,也就是他的逆元
須要檢驗求出的冪值\(x\)\(a\)相乘是否爲\(1\)
Code:.net

int power(int x, int y) {
    int sum = 1;
    while(y) {
        if(y & 1) sum = (sum * x) % md;
        x = (x * x) % md;
        y >>= 1;
    }
    return sum;
}
補充一下:

有一個定西叫作求逆元通常公式
\(x=a/b \ mod \ m = x \ mod \ (m *b)/b\)code

簡單證實:

\(\frac{a}{b} mod \ k = d\)
\(\frac{a}{b}= kx+d\)
\(a=kbx+bd\)
\(a \ mod \ kb=bd\)
\(\frac{a \ mod \ kb}{b}=d\)blog

由於這個式子裏有\(k*b\)須要注意一下他倆很大的時候get

仍是費馬小比較的好寫qwq博客

謝謝收看,住身體健康!it

相關文章
相關標籤/搜索