CRT描述
![]()
JAVA代码
/*中国剩余定理,根据公式需要求取大数的逆元*/
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Scanner;
public class CRT {
public static void main(String[] args) {
// TODO Auto-generated method stub
int n;
BigInteger M_All = BigInteger.ONE,res = BigInteger.ZERO;
ArrayList<BigInteger> b = new ArrayList<BigInteger>();
ArrayList<BigInteger> m = new ArrayList<BigInteger>();
ArrayList<BigInteger> M = new ArrayList<BigInteger>();
ArrayList<BigInteger> Mi = new ArrayList<BigInteger>(); // M·Mi = 1 (mod mi)
Scanner scan = new Scanner(System.in);
n = scan.nextInt();
for (int i = 0 ; i < n ; i++){
b.add(scan.nextBigInteger());
m.add(scan.nextBigInteger());
}
for (int i = 0 ; i < n ; i++){
M_All = M_All.multiply(m.get(i));
}
for (int i = 0 ; i < n ; i++){
BigInteger M_tmp = M_All.divide(m.get(i));
M.add(M_tmp);
Mi.add(getMi(M_tmp,m.get(i)));
}
for (int i = 0 ; i < n ; i++){
res = res.add(M.get(i).multiply(Mi.get(i)).multiply(b.get(i)));
}
res = res.mod(M_All);
}
//获取Mi'使得满足MiMi' = 1 (mod m),使用扩展欧几里得算法
public static BigInteger getMi(BigInteger M, BigInteger m){
ArrayList<BigInteger> List_Q = new ArrayList<BigInteger>();
ArrayList<BigInteger> List_S = new ArrayList<BigInteger>();
BigInteger temp, res,m_rec = m;
//通过辗转相除获得List_Q
while (!m.equals(BigInteger.ZERO)){
temp = m;
List_Q.add(M.divide(m));
m = M.remainder(m);
M = temp;
}
//根据递推公式获得List_S
List_S.add(BigInteger.ONE);
List_S.add(BigInteger.ZERO);
for (int i = 2 ; i < 1 + List_Q.size() ; i++){
List_S.add(List_S.get(i - 2).subtract(List_Q.get(i - 2).multiply(List_S.get(i - 1))));
}
res = List_S.get(List_S.size() - 1);
while (res.compareTo(BigInteger.ZERO) < 0){
res = res.add(m_rec);
}
return res.mod(m_rec);
}
}