定义
两个整数a和b,除以一个大于1的自然数m所得余数相同,就称a和b对于模m同余或称a和b在模m下同余,即 a≡b(mod m)
定律
- a≡a(mod d)
- a≡b(mod d)→b≡a(mod d)
- (a≡b(mod d),b≡c(mod d))→a≡c(mod d)
如果a≡x(mod d),b≡m(mod d),则
- a+b≡x+m (mod d)
- a-b≡x-m (mod d)
- 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; } }
应用:
求解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的时候不满足上述过程