• 应用中国剩余定理解线性同余方程组(不懂)


    对于同余方程组:

          x=a1 (mod m1);   1

          x=a2 (mod m2);    2

          方程组有一个小于m(m1,m2的最小公倍数)的非负整数解的充分必要条件是(a1-a2)%(m1,m2)==0 ,同样利用扩展欧几里德算法。

          两式联立:a1+m1*y=a2+m2*z。

          则:a1-a2=m2*z-m1*y; 这样就可以了解出z和y,则:x=a2+m2*z;  

          现在我们将其推广到一般情形:(设m1,m2,···,mk两两互素) PS:使用中国剩余定理的条件

          x=a1(mod m1);

         x=a2(mod m2);

          ···

          x=ak(mod mk);其在M=m1*m2*···*mk;中有唯一整数解。

          记Mi=M/mi;因为(Mi,mi)=1,故有两整数pi,qi满足Mi*pi+mi*qi=1,如果记ei=Mi*pi;那么:ei=0 (mod mj),j!=i; ei=1(mod mj),j=i;

          很明显,e1*a1+e2*a2+···+ek*ak就是方程的一个解,加减M倍后就可以得到最小非负整数解了。(没看懂)

          如果m1,m2,···,mk不互素,那只能两个两个求解线性同余方程组了。

          x=a1 (mod m1);  

          x=a2 (mod m2);   

          .............

          解完后,a=x; m=m1和m2的最小公倍数。即可。

     PS:应用中国剩余定理解线性同余方程组的条件是m1,m2,···,mk两两互素,适用范围小于普通的方法解线性同于方程组。我没有看懂这个定理,所以我遇到题目的时候

    会选择普通方法来求解,这个定理的结论暂且背下来。

           令Mi=M/mi,因为m1,m2,m3...mr两两互素,因此(Mi,mi)=1;即MiPi==1(mod mi)。(==为同余的意思)

    那么容易验证a1M1p1+a2M2p2+a3M3p3+......+arMrpr就是同余方程组的解。(这里pi需要利用扩展欧几里得求解出来)

    下面给出求此类同余方程组最小非负整数解的算法实现。

    int china(int r)
    {
        M=1;
        for(int i=1; i<=r; i++)
            M*=m[i];
        for(int i=1; i<=r; i++)
        {
            Mi=M/m[i];
            extend(Mi,m[i],d,X,Y);
            ans=(ans+Mi*X*a[i])%M;
        }
        if(ans<0)
            ans+=M;
        return ans;
    }

     POJ 1006:Biorhythms

    题目 :http://poj.org/problem?id=1006

    中国剩余定理的直接应用。

    根据题意可得

    模版:

    #include <iostream>
    #include <stdio.h>
    #include <string.h>
    #include <algorithm>
    #include <math.h>
    using namespace std;
    int X,Y,d,M;
    int m[10],a[10];
    void extend(int A,int B,int &d,int &x1,int &y1)
    {
        if(B==0)
        {
            x1=1;
            y1=0;
            d=A;
            return ;
        }
        extend(B,A%B,d,x1,y1);
        int temp=x1;
        x1=y1;
        y1=temp-(A/B)*y1;
        return ;
    }
    int china(int r)
    {
        int ans=0,Mi;
        M=1;
        for(int i=1; i<=r; i++)
            M*=m[i];
        for(int i=1; i<=r; i++)
        {
            Mi=M/m[i];
            extend(Mi,m[i],d,X,Y);
            ans=(ans+Mi*X*a[i])%M;
        }
        if(ans<0)
            ans+=M;
        return ans;
    }
    int main()
    {
        int t,k = 0;
        while(scanf("%d%d%d%d",&a[1],&a[2],&a[3],&t)!=EOF)
        {
            k++;
            if(a[1]==-1 && a[2]==-1 && a[3]==-1 && t==-1)
            {
                break;
            }
            m[1]=23;
            m[2]=28;
            m[3]=33;
            int ans=china(3);//m的数目
            while(ans<=t)
                ans+=M;
            printf("Case %d: the next triple peak occurs in %d days.
    ",k,ans-t);
        }
        return 0;
    }

     HDU1788:

    刷够了,先在这里存着吧,未完待续。15.1.21

    Chinese remainder theorem again

    我知道部分同学最近在看中国剩余定理,就这个定理本身,还是比较简单的:
    假设m1,m2,…,mk两两互素,则下面同余方程组:
    x≡a1(mod m1)
    x≡a2(mod m2)
    …
    x≡ak(mod mk)
    在0<=<m1m2…mk内有唯一解。
    记Mi=M/mi(1<=i<=k),因为(Mi,mi)=1,故有二个整数pi,qi满足Mipi+miqi=1,如果记ei=Mi/pi,那么会有:
    ei≡0(mod mj),j!=i
    ei≡1(mod mj),j=i
    很显然,e1a1+e2a2+…+ekak就是方程组的一个解,这个解加减M的整数倍后就可以得到最小非负整数解。
    这就是中国剩余定理及其求解过程。
    现在有一个问题是这样的:
    一个正整数N除以M1余(M1 - a),除以M2余(M2-a), 除以M3余(M3-a),总之, 除以MI余(MI-a),其中(a<Mi<100 i=1,2,…I),求满足条件的最小的数。 
  • 相关阅读:
    winform访问https webservice
    rabbitMQ访问失败
    Redis断线测试
    微信消息推送
    线程控制
    Oracle.ManagedDataAccess.dll折腾了我两天
    IPC网络摄像机rtsp视频流web上H5播放方法
    微软补丁下载网站(备忘)
    ABP vnext 种子文件更新
    ABP vnext 使用Swagger账号登录时Chrome浏览器提示【The cookie 'XSRF-TOKEN' has set 'SameSite=None' and must also set 'Secure'.】错误,不能跳转登录
  • 原文地址:https://www.cnblogs.com/zhangmingcheng/p/4238897.html
Copyright © 2020-2023  润新知