zoukankan      html  css  js  c++  java
  • 同余方程 学习笔记

    裴蜀定理

    上一篇提到过,(ax+by=c)有解,当且仅当(c=m*gcd(a,b)) (m为正整数)

    所以当(gcd(a,b)=1)时,c可以取任意数

    线性同余方程

    推导

    形如 (ax equiv c pmod b) 的东西叫线性同余方程 (Congruence Equation)

    怎么解?

    这不就相当于 ((ax-c)\%b==0),即((ax-c))(b)倍数吗!

    设它为 (-y) 倍,这样不就有 ((ax-c)=-by),就是 (ax+by=c) 了吗!(所以为什么要设为-y倍就是如此——让化简后式子精简)

    然后这不就一个exgcd搞定了吗!做完了!Time: (O(logn))

    例题

    **同余方程,一句话题意:给 (a)(b) 值,求 (a x equiv 1 pmod b) 合法的 (x)

    #include<bits/stdc++.h>
    using namespace std;
    int a,b,xx,yy;
    
    void exgcd(int p,int q,int &x,int &y){
    	if(!q){x=1,y=0;return;}
    	exgcd(q,p%q,x,y);
    	int tmp=x;
    	x=y,y=tmp-(p/q)*y;
    }
    
    int main(){
    	cin>>a>>b;
    	exgcd(a,b,xx,yy);
    	while(xx<=0)xx+=b;
    	cout<<xx%b;
    }
    

    中国剩余定理

    给定(a_i,n_i)(所有n两两互质),求x的可行解。方程组如下:

    (left{egin{array}{l} x equiv a_{1}left(mod n_{1} ight) \ x equiv a_{2}left(mod n_{2} ight) \ vdots \ x equiv a_{k}left(mod n_{k} ight) end{array} ight.)

    怎么求呢?(下面两行是精简版,不理解可以直接跳至第三行)

    一句话 (Large{x=sum_{i=1}^{k}a_i*frac {prod_{j=1}^n n_{_j}}{n_{_i}}*inv[\,frac {prod_{j=1}^n n_{_j}}{n_{_i}}\,]})(啊这)

    其中(inv[x])如果它的分母是(n_i)则表示整个式子模(prod_{i=1}^kn_k)下的逆元

    • 具体来说,首先计算 (n=prod_{i=1}^n n_i)

      然后对于每个式子 (m_i=frac{n}{n_i}),并计算其在 模(n_i)意义 下的逆元 (m_i^{-1})。接下来计算(c_i=m_im_i^{-1})(c_i)不要取模)

      最后 (x=sum_{i=1}^{-1}a_ic_i(mod\,\,n))

    Time: (O(k)),k是式子的数量

    证明:不知道。

  • 相关阅读:
    HTML5 ④
    HTML5 ③
    HTML5 ②
    HTML5 ①
    what’s this?
    第一篇
    2017年3月1号课堂笔记
    2017年2月27号课堂笔记
    2017年2月24号课堂笔记
    2017.02.15课堂笔记
  • 原文地址:https://www.cnblogs.com/BlankAo/p/14018199.html
Copyright © 2011-2022 走看看