概念
若有 (a−b)|p ( a − b ) | p ,那么就说a和b在模p的意义下同余,即 a≡b(modp) a ≡ b ( m o d p ) 。
性质
- 自反性;对称性;传递性。
- 同加性: a≡b(modp) a ≡ b ( m o d p ) ,则有 a+c≡b+c(modp) a + c ≡ b + c ( m o d p )
- 同乘性: a≡b(modp) a ≡ b ( m o d p ) ,则有 a∗b≡b∗c(modp) a ∗ b ≡ b ∗ c ( m o d p )
- 同幂性: a≡b(modp) a ≡ b ( m o d p ) ,则有 ac≡bc(modp) a c ≡ b c ( m o d p )
- 不满足同除性: a≡b(modp) a ≡ b ( m o d p ) ,却不满足 ac≡bc(modp) a c ≡ b c ( m o d p ) ,但有 ac≡bc(modpc) a c ≡ b c ( m o d p c )
- 推论1: a∗b%p=(a%p)∗(b%p)%p a ∗ b % p = ( a % p ) ∗ ( b % p ) % p
- 推论2:若有
a%p=x,a%q=x,gcd(p,q)=1
a
%
p
=
x
,
a
%
q
=
x
,
g
c
d
(
p
,
q
)
=
1
,则有
a%(p∗q)=x
a
%
(
p
∗
q
)
=
x
证明:令 a=s∗p+x=t∗q+x a = s ∗ p + x = t ∗ q + x ,即 s∗p=t∗q s ∗ p = t ∗ q
又因为 gcd(p,q)=1 g c d ( p , q ) = 1 ,那么 t|p t | p
则有 s=tp∗q=k∗q s = t p ∗ q = k ∗ q ,即有 a=k∗p∗q+x a = k ∗ p ∗ q + x
得证。
相关定理
威尔逊定理
若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
,则此时有解
将原方程转化即得:
而其对应的同余方程为:
稍作联立,并将取模运算符展开:
到了这里,我们发现这个式子的最左边与最右边相等了,a,b两个参数又没有变,那么可得:
模拟上述过程不断递归,直到b=0,就得到了一组解,再向上递归算出原来的x,y,由此得到通解。
代码
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。
最后利用构造法,由原式,可以得到
那么方程的最小正整数解就应该为 x=(2∗70+3∗21+2∗15)%105=23 x = ( 2 ∗ 70 + 3 ∗ 21 + 2 ∗ 15 ) % 105 = 23
且方程的解集为 {23+105k|k∈Z} { 23 + 105 k | k ∈ Z }
代码
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;i<k;i++)
n*=w[i];
for(int i=0;i<k;i++)
{
m=n/w[i];
exgcd(w[i],m,x,y);
a=(a+y*m*b[i])%n;
}
if(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
)
。