#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;
}
以下是实验结果截图