【数论】同余问题

定义

两个整数a和b,除以一个大于1的自然数m所得余数相同,就称a和b对于模m同余或称a和b在模m下同余,即 a≡b(mod m)


定律

  1. a≡a(mod d)
  2. a≡b(mod d)→b≡a(mod d)
  3. (a≡b(mod d),b≡c(mod d))→a≡c(mod d)

如果a≡x(mod d),b≡m(mod d),则

  1. a+b≡x+m (mod d)
  2. a-b≡x-m (mod d)
  3. a*b≡x*m (mod d)

值得一提的是:不满足a/n≡b/n(mod d) 求解用逆元

费马小定理:

如果b和p互质 则bp≡b(mod p)

可用于:由此可得bp-1≡1(mod p) 结合求逆元方程b*x≡1(mod p) 得到bp-1≡b*x(mod p)

              所以x≡bp-2(mod p)结合快速幂求出x


扩展欧几里德

已知a, b求解一组x,y,使它们满足贝祖等式: ax+by = gcd(a, b) =d

void exgcd(int a,int b,int &d,int &x,int &y)
{
    int t;
    if(b==0)//当b=0时 gcd(a,b)=a
            //因为1*a+0*0=a 所以ax+by=gcd(a,b)有一组解为
            //x=1 y=0 
    {
        d=a;
        x=1;
        y=0; 
    }
    else
    {
        exgcd(b,a%b,d,x,y);
        t=x;//推导得公式 
        x=y;
        y=t-(a/b)*y;
    }
}
View Code

应用:

求解ax+by=c 

设g=gcd(a,b) a1=a/g   b1=b/g   c1=c/g

扫描二维码关注公众号,回复: 3195796 查看本文章

用exgcd求a1*x1+b1*y1=1的整数解

那么a1*g*c1*x1+b1*g*c1*y1=c1*g 即a*c1*x1+b*c1*y1=c

所以x0=c1*x1   y0=c1*y1是一组解

可推得通解为x=x0+b1*t   y=y0-a1*t   t属于Z

PS:当gcd(a,b)不整除c的时候不满足上述过程

猜你喜欢

转载自www.cnblogs.com/BrokenString/p/9649312.html