您的位置:首页 > 其它

中国剩余定理

2015-11-14 14:09 155 查看
本人用三元组存储数据,求逆元。一共有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
的逆元,
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
;
int * m=new int
;
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;
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: