中国剩余定理

本人用三元组存储数据,求逆元。一共有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;
}

演示样例:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值