zoukankan      html  css  js  c++  java
  • 模运算的世界--线性同余方程组

    线性同余方程组

    对于线性同余方程组:

    a1*xb1 (mod c1)

    a2*xb2 (mod c2)

    ……

    an*xbn (mod cn)

    (1)若有c1c2c3、……cn两两互质,则可以用中国剩余定理直接算出可行解(唯一解?)

    (2)若不满足模数两两互质,则:

      设最后的解为X

      我们利用扩展欧几里得可以算出一个可行解x1满足:

    a1*x1b1 (mod c1)

        那么对于第二个方程 a2*xb2 (mod c2)X一定满足X mod lcm(c1,x2)=x1

        所以前两个方程可直接合并成 x mod lcm(c1,c2)=x1;

        这样依次合并下去……

    int gcd(int a,int b)
    {
        if(a%b==0)return b;
        else return gcd(b,a%b);
    }
    int mod_inverse(int a,int m)
    {
    	int x,y,d;
    	ext_gcd(a,m,d,x,y);
    	return (m+x%m)%m;
    }
    //返回一个(b,m)数对
    pair<int,int>linear_congruence(const vector<int>&A,const vector<int>&B,const vector<int>&M)
    {
        int x=0,m=1;
        for(int i=0;i<A.size();i++)
        {
            int a=A[i]*m,b=B[i]-A[i]*x,d=gcd(M[i],a);
            if(b%d!=0)return make_pair(0,-1);//无解
            int t=b/d*mod_inverse(a/d,M[i]/d)%(M[i]/d);
            x=x+m*t;
            m*=M[i]/d;
        }
        return make_pair(x%m,m);
    }
    



  • 相关阅读:
    POJ-1465 Multiple
    POJ-2585 Window Pains
    POJ-1094 Sorting It All Out
    Linux基础学习笔记1
    建议3---理解Python与C语言的不同之处
    堆排序的Python实现
    迭代器和生成器详解
    建议2---编写pythonic代码
    python中Switch/Case实现
    建议1---理解Pythonic的概念
  • 原文地址:https://www.cnblogs.com/bryce1010/p/9387285.html
Copyright © 2011-2022 走看看