本人用三元组存储数据,求逆元。一共有k个同余式组,Ni为m1 * m2 * … mi .i=1,2,…,k-1.
N_Op 为Ni的逆元。
用递归算法实现定理:
Xi = [X(i-1) + N(i-1) * ( N_Op * ( B(i) - X(i-1) )(mod Mi) ](mod m1*m2*…*mi)
i=2,3,……,k
头文件:head.h
#include<iostream>
using namespace std;
//三元组gcd(a,b) == ax +by == d;
struct gcdstruct
{
int d;
int x;
int y;
};
gcdstruct EXTENDED_EUCLID(int a,int b)
{
gcdstruct aa,bb;
if(b==0)
{
aa.d = a;
aa.x = 1;
aa.y = 0;
return aa;
}
else
{
bb = EXTENDED_EUCLID(b,a%b);
aa.d = bb.d;
aa.x = bb.y;
aa.y = bb.x - bb.y * (a/b);
}
return aa;
}
/*
Description: ax == 1 (mod m),求x
*/
int Inverse(int a,int m) //求逆元
{
gcdstruct aa;
aa = EXTENDED_EUCLID(a,m);
while(aa.x<0) //为了让输出为正数
{
aa.x +=m;
}
return aa.x;
}
int Mod(int a,int b) //求模
{
while(a<0)
{
a +=b;
}
return a%b;
}
int GetNi(int *m,int n) //获得Ni
{
int N=1;
for(int i=0;i<n;i++)
{
N *=m[i];
}
return N;
}
int Result(int * b,int * m,int n ) //获得同余式组的解,n为第i个同余式
{
if(n==1)
{
int x1=Mod( b[n-1] , m[n-1] );
return x1;
}
else
{
int N=GetNi(m,n-1);
int N_Op =Inverse(N,m[n-1]); //N(n-1)的逆元为N(n-1)与m[n]的逆元,
int xi_1=Result(b,m,n-1);
int xi=Mod( xi_1 + N*( Mod( N_Op*(b[n-1] - xi_1),m[n-1]) ), GetNi(m,n) ) ;
return xi;
}
}
中国剩余定理.cpp
#include"head.h"
int main()
{
int n;
cout<<"请输入同余式组的个数n=";
cin>>n;
int * b=new int[n];
int * m=new int[n];
cout<<"请输入同余式组的bi和mi:"<<endl;
for(int i=1;i<=n;i++)
{
cout<<"b"<<i<<"=";
cin>>b[i-1];
cout<<"m"<<i<<"=";
cin>>m[i-1];
}
int x=Result(b,m,n);
cout<<"同余式组的解为:"<<x<<endl;
}