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 的同余方程 ax≡1(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); }