********************************
鉴于在博客中写公式略显难看,有碍观瞻,博客中的内容我都事先用latex写了一个pdf的文档,可以在下链接下载
http://download.csdn.net/detail/xue_haiyang/7640513
下面所写的难免有各种错误,还请留言批评指正(欢迎任意的批评交流)
********************************
上篇博客(http://blog.csdn.net/xue_haiyang/article/details/37822137)
分析了中国剩余定理,这篇文章使用Java 在long类型上实现了中国剩余定理,
并解决了第二个图形所针对的问题。
下篇博客会增加对于BigInteger的支持,并解决(http://blog.csdn.net/xue_haiyang/article/details/29382893)中的RSA例子。
/**
* by Xue Haiyang
* at 2014-7-17
*/
public class CRT {
private static long a, b;
/*
* 计算GCD(x, y)
*/
private static long GCD(long x, long y)
{
if (y==0)
return x;
else
return GCD (y, x%y);
}
/*
* 扩展的Euclid算法计算a, b 使得 ax+by=GCD(x, y)
*
*/
private static void ExtGCD(long x, long y)
{
long temp_a, temp_b;
if (y==0)
{
a=1;
b=0;
} else
{
ExtGCD(y, x%y);
temp_a=a;
temp_b=b;
a=temp_b;
b=temp_a-x/y*temp_b;
}
}
public static long Inv_Mod(long m, long n)
{
if (GCD(m, n)>1)
return 0;
else
{
ExtGCD(m, n);
if (a>0)
return a;
else
return a+n;
}
}
public static long CRT1(long[] m, long[] n) {
int num= m.length;
long[] Ni= new long[num];
long[] ni= new long[num];
long N=1;
long M=0;
for (int i=0; i<num; i++)
N=N*n[i];
for (int i=0; i<num; i++)
Ni[i]=N/n[i];
for (int i=0; i<num; i++)
ni[i]=Inv_Mod(Ni[i], n[i]);
for (int i=0; i<num; i++)
M=(M+ni[i]*Ni[i]*m[i])%N;
return M%N;
}
public static void main(String[] args)
{
long m[]={0,1,2};
long n[]={1,3,5};
System.out.print(CRT1(m, n));
}
}