模的逆元
同余方程ax = 1 (mod n ),gcd(a,n)= 1时有解。这时称求出的x为a的对模n的乘法逆元。
对于同余方程ax = 1(mod n ) , gcd(a,n)= 1的求解就是求解方程ax+ ny= 1,x,y为整数。这个可用扩展欧几里德算法求出,原同余方程的唯─解就是用扩展欧几里德算法得出的x
package 数学问题;
import java.util.Scanner;
public class case07_特殊同余方程逆元 {
static long x;
static long y;
public static long ext_gcd(long a,long b){
if(b==0){
x=1;
y=0;
return a;
}
long res=ext_gcd(b,a%b);
//xy已经被下一层递归更新了
long x1=x;//备份
x=y;
y=x1-a/b*y;
return res;
}
//线性方程
public static long linearEquation(long a,long b,long m) throws Exception{
long d=ext_gcd(a,b);
if(m%d!=0) throw new Exception("无解");
long n=m/d;
x*=n;
y*=n;
return d;
}
//逆元
public static void inverseElement(long a,long mo){
try {
linearEquation(a, mo, 1);
x = (x % mo + mo) %mo;
System.out.println(x);
}catch (Exception e){
System.out.println("无解");
}
}
public static void main(String[] args) throws Exception {
case07_特殊同余方程逆元 a=new case07_特殊同余方程逆元();
Scanner sc=new Scanner(System.in);
long n=sc.nextInt();
long mo=sc.nextInt();
try {
a.inverseElement(n,mo);
//System.out.println(a.x);
}catch (Exception e){
System.out.println("无解");
}
}
}