中国剩余定理的实现《一》长整型

********************************

鉴于在博客中写公式略显难看,有碍观瞻,博客中的内容我都事先用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));
	}

}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值