若有 (a−b)|p ( a − b ) | p ,那么就说a和b在模p的意义下同余,即 a≡b(modp) a ≡ b ( m o d p ) 。
若p为素数,则 (p−1)!≡p−1(modp) ( p − 1 ) ! ≡ p − 1 ( m o d p ) 。逆定理亦成立。
草率的伪证明:若p为素数,那么1到p-1都与p互质,此时这些数所组成的集合A,即为p的缩系。
对于 p=2 p = 2 , A=1 A = 1 , 1≡1(mod2) 1 ≡ 1 ( m o d 2 )
对于其他任意质数,p均为奇数,那么p-1为偶数,集合A有偶数个,可以将A中的1与p-1配对,其他数字两两配对使得 Ai∗Aj≡1(modp) A i ∗ A j ≡ 1 ( m o d p ) 。
若p为素数,a为正整数,a与p互质,则有 ap−1≡1(modp) a p − 1 ≡ 1 ( m o d p ) 。
若a与m互质,则有 aφ(m)≡1(modm) a φ ( m ) ≡ 1 ( m o d m )
欧拉函数φ(m),φ(m)表示不超过m的与m互质的数的个数。
用于求解形似 ax+by=gcd(a,b) a x + b y = g c d ( a , b ) 的方程的一组解。
由辗转相除法,可知gcd(a,b)=gcd(b,a%b)
当b=0时,可以得到 ax=a a x = a ,则此时有解
将原方程转化即得:
int exgcd(int a,int b,int &x,int &y)
{
if(!b)
{
x=1;
y=0;
return a;
}
int t,res=exgcd(b,a%b,x,y);
t=x;
x=y;
y=t-a/b*y;
return res;
}
若a,b是整数,且 gcd(a,b)=d g c d ( a , b ) = d ,那么对于任意的整数x,y,ax+by都一定是d的倍数,特别地,一定存在整数x,y,使 ax+by=d a x + b y = d 成立。
推广:n个整数,a1,a2,a3……an为n个整数,d是它们的最大公约数,那么存在整数x1……xn使得 x1∗a1+x2∗a2+...xn∗an=d x 1 ∗ a 1 + x 2 ∗ a 2 + . . . x n ∗ a n = d 。
若对于形似 ⎧⎩⎨⎪⎪⎪⎪x≡a1(modp1)x≡a2(modp2)……x≡an(modpn) { x ≡ a 1 ( m o d p 1 ) x ≡ a 2 ( m o d p 2 ) … … x ≡ a n ( m o d p n ) 的方程组,模数p1至pn两两互质,那么对于任意整数ai,方程组有解,且可以构造出通解。
求解满足方程的最小正整数解: ⎧⎩⎨⎪⎪x≡2(mod3)x≡3(mod5)x≡2(mod7) { x ≡ 2 ( m o d 3 ) x ≡ 3 ( m o d 5 ) x ≡ 2 ( m o d 7 )
先进行转化求下列同余方程组,模数与上式对应相同。
分别求其最小正整数解,如第一个式子可以转化为 5∗7y≡1(mod3) 5 ∗ 7 y ≡ 1 ( m o d 3 ) ,易得 y=2 y = 2 ,那么x=70。
int exgcd(int a,int b,int &x,int &y)
{
if(!b)
{
x=1;
y=0;
return a;
}
int t,res=exgcd(b,a%b,x,y);
t=x;
x=y;
y=t-a/b*y;
return res;
}
int crt()
{
int x,y,a,m,n;
a=0;
n=1;
for(int i=0;ifor(int i=0;iif(a>0)
return a;
return a+n;
}
对于a和x,如果它们满足 ax≡1(modp) a x ≡ 1 ( m o d p ) ,我们就说x的最小正整数解即为a在模p意义下的逆元,我们令它为 inv(a) i n v ( a ) 。
由费马小定理我们可以知道 inv(a)=ap−2%p i n v ( a ) = a p − 2 % p 即为a在模p意义下的逆元。
当然还有更好的求法,利用扩展欧几里得算法。首先 ax%p=1 a x % p = 1 ,那么就可以得到 ax+(−k)p=1 a x + ( − k ) p = 1 ,又因为p是一个素数,显然可以转化为 ax+(−k)p=gcd(x,p) a x + ( − k ) p = g c d ( x , p ) 。