【数论】乘法逆元

百度百科

Definition

  在等式乘法中,有,同样在同余问题中,有ax≡1(mod p),其中p∈{素数},则称x为a在mod p域下的逆。

   对于单个式子逆元的求法,显然可以通过解同余方程

ax≡1(mod p)    ①

求得,注意p必须为素数,否则a在mod p域下无意义。即:可以使用解①式求得a在mod p域下的逆,但是不能使用其他求逆元的方法求解①式,因为①式不保证p属于{素数}。

Examples

  lg P1082 同余方程

Description

  求关于 xx 的同余方程 ax1(modb) 的最小正整数解。

Input

  一行,包含两个正整数 a,b ,用一个空格隔开。

Output

  一个正整数 x0 ,即最小正整数解。输入数据保证一定有解。

Sample Input

3 10

Sample Output

7

   注意:本题可以在b为素数时求解a的逆,但是在b不为素数时的解不是a的逆元。仅仅是方程ax≡1(Mod b)的解。

Solution

      由ax≡1(Mod b)                ①

      移项可得,ax-1≡0(Mod b)            ②

      根据同余的定义即得,求解②式即为求解不定方程ax-1=by,即求解ax-by=1的x的最小整数解。

      求解后,注意若(a,b)<0,x取相反数,并不断+b成为正数

Code

#include<cstdio> 

long long int a,b,ans;

inline void exgcd(long long int &x,long long int &y,long long int a,long long int b) {
    if(!b) {
        x=1;y=0;ans=a;
        return;
    }
    long long int x1,y1;
    exgcd(x1,y1,b,a%b);
    x=y1;
    y=x1-(a/b)*y1;
    return;
}

int main() {
    scanf("%lld%lld",&a,&b);
    b*=-1;
    long long int x,y;
    exgcd(x,y,a,b);
    b*=-1;
    if(ans<0)    x=-x;
    while(x<=0)    x+=b;
    printf("%lld\n",x);
}

猜你喜欢

转载自www.cnblogs.com/yifusuyi/p/9134697.html