miracl库c语言实现中国剩余定理

#include"miracl.h"
#include"mirdef.h"
#include<stdio.h>

#define NUM 3 //从文本读入方程组个数,数据以分行存储

FILE *fp;

int flag = 0; 

int main()
{
	int i, j;
	big a[NUM], m[NUM], x[NUM], mm1[NUM], mm2[NUM];        
	big t0, t1, M, m1, X, y, W;                             //这里mm1[] 为 Mj
	miracl *mip = mirsys(500, 10);                          //mm2[] 为 M^-1 j
	mip->IOBASE = 10;                                       //M 为 m[] 的连乘
	for(i = 0; i < NUM; i++)                               
	{
		a[i] = mirvar(0);
		m[i] = mirvar(0);
		x[i] = mirvar(0);
		mm1[i] = mirvar(0);
		mm2[i] = mirvar(0);
	}
	t0 = mirvar(0);
	t1 = mirvar(1);
	M = mirvar(1);
	m1 = mirvar(0); 
	X = mirvar(0);
	y = mirvar(1);
	W = mirvar(0);

	fp = fopen("C:\\Users\\asus\\Desktop\\02.txt", "r");
	while( 1 )
	{
		
		if(flag<NUM)
		{
			cinstr(a[flag], tmp);
			cotnum(a[flag], stdout);
			flag++;
		}
		else
		{
			cinstr(m[flag-NUM], tmp);
			cotnum(m[flag-NUM], stdout);
			flag++;
		}
                if(flag == 2*NUM) break;
	}
	printf("\n");
	fclose(fp);
	
	for(i=0; i<NUM; i++) //判断mi是否两两互素
	{
		for(j=i+1; j<NUM; j++)
		{
			egcd(m[i], m[j], t0);
			if(compare(t0, t1)) continue;
			else 
			{
				printf("不能直接应用中国剩余定理\n");
				exit(0);
			}
		}
	}

	for(i=0; i<NUM; i++)
	{
		multiply(m[i], M, M); //计算M=m1 x m2 x ... x mn
	}

	copy(M, W);
	for(i=0; i<2; i++)
	{
		divide(M, m[i], mm1[i]); //计算mm1 = Mj ???运算一次后M的值就清0了!!!释放空间了???
		xgcd(mm1[i], m[i], mm2[i], m1, t1 ); //计算mm2 = M1~j
		copy(W, M);
	}

	for(i=0; i<NUM; i++) //计算xj
	{
		multiply(mm1[i], mm2[i], t0);
		multiply(t0, a[i], x[i]);
	}
	
	for(i=0; i<NUM; i++) //计算xj和
	{
		add(x[i], X, X);
	}

	
	powmod(X, y, M, X);//X mod M

	cotnum(X, stdout);
	mirexit();
	
	return 0;
	
}

以下是实验结果截图

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值