费马小定理
费马小定理:当
p
p
p为质数时,有
a
p
≡
a
(
m
o
d
p
)
a^{p} \equiv a \pmod p
ap≡a(modp),如果再加上
a
a
a与
p
p
p互质这一条件,得
a
p
−
1
≡
1
(
m
o
d
p
)
a^{p - 1} \equiv 1 \pmod p
ap−1≡1(modp),这个定理可用来求逆元,只要将式子转化为
a
p
−
2
≡
a
−
1
(
m
o
d
p
)
a^{p - 2} \equiv a^{-1} \pmod p
ap−2≡a−1(modp),这个定理不能用来准确判定质数,详情请搜索“伪质数”。
定理证明:由二项式定理,得:
(
x
+
y
)
p
=
x
p
+
C
p
1
x
p
−
1
y
+
C
p
2
x
p
−
2
y
2
+
⋅
⋅
⋅
+
y
p
(x+y)^p = x^p + C^1_px^{p - 1}y+C^2_px^{p-2}y^2 + \cdot \cdot \cdot + y^p
(x+y)p=xp+Cp1xp−1y+Cp2xp−2y2+⋅⋅⋅+yp,当
p
p
p为质数时,不难得出
p
∣
C
p
k
,
k
=
1
,
2
,
⋅
⋅
⋅
,
p
−
1
p | C^k_p,k = 1,2,\cdot \cdot \cdot,p - 1
p∣Cpk,k=1,2,⋅⋅⋅,p−1,从而
(
x
+
y
)
p
≡
x
p
+
y
p
(
m
o
d
p
)
(x+y)^p \equiv x^p + y^p \pmod p
(x+y)p≡xp+yp(modp),此时,令
x
=
y
=
1
x=y=1
x=y=1,得
2
p
≡
2
(
m
o
d
p
)
2^p \equiv 2 \pmod p
2p≡2(modp),令
x
=
2
,
y
=
1
x=2,y=1
x=2,y=1,得
3
p
≡
(
2
+
1
)
p
≡
2
p
+
1
p
≡
2
+
1
≡
3
(
m
o
d
p
)
3^p \equiv (2 + 1)^p \equiv 2^p + 1^p \equiv 2 + 1 \equiv3 \pmod p
3p≡(2+1)p≡2p+1p≡2+1≡3(modp),即
3
p
≡
3
(
m
o
d
p
)
3^p \equiv 3 \pmod p
3p≡3(modp),以此类推,对于所有
a
=
0
,
1
,
⋅
⋅
⋅
,
p
−
1
a=0,1,\cdot \cdot \cdot ,p-1
a=0,1,⋅⋅⋅,p−1(太大了就会直接被模),都有
a
p
≡
a
(
m
o
d
p
)
a^{p} \equiv a \pmod p
ap≡a(modp)
威尔逊定理
威尔逊定理:若成立
(
p
−
1
)
!
≡
−
1
(
m
o
d
p
)
(p-1)! \equiv -1 \pmod p
(p−1)!≡−1(modp),当且仅当
p
p
p为质数。
它的逆命题也成立,即满足
(
p
−
1
)
!
≡
−
1
(
m
o
d
p
)
(p-1)! \equiv -1 \pmod p
(p−1)!≡−1(modp)的数一定为质数。
这个定理可用来判定质数,然而,由于阶乘是一种呈爆炸性增长的运算,实际意义不大。
定理证明:
充分性:设
p
p
p为质数,当
p
=
2
p=2
p=2时结论显然成立,当
p
≥
3
p \ge 3
p≥3时,根据逆元的知识,对于
a
=
1
,
2
,
⋯
 
,
p
−
1
a = 1,2,\cdots,p-1
a=1,2,⋯,p−1(都与
p
p
p互质),总有一个数
a
′
a'
a′使得
a
∗
a
′
≡
1
(
m
o
d
p
)
a*a' \equiv 1 \pmod{p}
a∗a′≡1(modp),并且对于一个数
a
a
a,
a
′
a'
a′显然不为0,故
a
′
a'
a′一定在
1
,
2
,
⋯
 
,
p
−
1
1,2,\cdots,p-1
1,2,⋯,p−1内有解,并且是唯一的。同时也不难得出
a
a
a不同时
a
′
a'
a′也不相同。现在找出逆元与原数相同的情况,不难得出
a
2
≡
1
(
m
o
d
p
)
a^2 \equiv 1 \pmod p
a2≡1(modp),从而
a
2
−
1
≡
0
(
m
o
d
p
)
a^2 - 1 \equiv 0 \pmod p
a2−1≡0(modp),所以只有当
a
a
a为1和
p
−
1
p-1
p−1时,
a
′
=
a
a'=a
a′=a,因此,
2
,
3
,
⋯
 
,
p
−
2
2,3,\cdots,p-2
2,3,⋯,p−2,中每两个互逆的元配对,
Π
i
=
2
p
−
2
i
≡
1
(
m
o
d
p
)
\Pi^{p-2}_{i=2}i \equiv 1 \pmod p
Πi=2p−2i≡1(modp),从而
(
p
−
1
)
!
≡
1
∗
1
p
−
3
2
∗
(
p
−
1
)
≡
−
1
(
m
o
d
p
)
(p-1)!\equiv 1 * 1^{p-3 \over 2}*(p-1) \equiv -1 \pmod p
(p−1)!≡1∗12p−3∗(p−1)≡−1(modp),即
(
p
−
1
)
!
≡
−
1
(
m
o
d
p
)
(p-1)! \equiv -1 \pmod p
(p−1)!≡−1(modp),充分性得证。
必要性:若
p
p
p为合数,且
(
p
−
1
)
!
≡
−
1
(
m
o
d
p
)
(p-1)! \equiv -1 \pmod p
(p−1)!≡−1(modp)成立,取
p
p
p的一个素因子
r
r
r,则
1
<
r
<
p
1<r<p
1<r<p,于是
r
∣
(
p
−
1
)
!
r | (p-1)!
r∣(p−1)!。又因为
(
p
−
1
)
!
≡
−
1
(
m
o
d
p
)
(p-1)! \equiv -1 \pmod p
(p−1)!≡−1(modp),得(这个转化时是同余的基本性质,自己手动证明):
(
p
−
1
)
!
≡
−
1
(
m
o
d
r
)
(p-1)! \equiv -1 \pmod r
(p−1)!≡−1(modr),又得出:
0
≡
−
1
(
m
o
d
r
)
0 \equiv -1 \pmod r
0≡−1(modr),前后矛盾,故必要性得证。
欧拉定理
欧拉定理:当
a
a
a与
p
p
p互质时,有
a
ϕ
(
p
)
≡
1
(
m
o
d
p
)
a^{ \phi(p) } \equiv 1 \pmod p
aϕ(p)≡1(modp),
同样可以用来求逆元,只要把式子转化为:
a
ϕ
(
p
)
−
1
≡
a
−
1
(
m
o
d
p
)
a^{ \phi(p) - 1} \equiv a^{-1} \pmod p
aϕ(p)−1≡a−1(modp),
不难看出,费马小定理是欧拉定理的特殊情况。
定理证明:这又要用到完全剩余系的知识,这个我在上一篇博客已经讲到,现在再贴出来复习吧。
完全剩余系。
如果 a a a, b b b关于模 m m m同余,那么 a a a与 b b b同属一类,否则不同属于一类,这样可得 m m m个类,即
M i = { i + k ∗ m ∣ k ∈ Z } , i = 0 , 1 , 2 , ⋯   , m − 1 M_i=\{i + k*m | k \in Z \} , i = 0,1,2,\cdots ,m-1 Mi={i+k∗m∣k∈Z},i=0,1,2,⋯,m−1
它们称为模 m m m的剩余类。
从每个剩余类中各取一个数作为代表,这样得到的 m m m个数称为模 m m m的一个完全剩余系,简称完系。
完全剩余系还有一个性质,就是如果 G C D ( n , m ) = 1 GCD(n,m)=1 GCD(n,m)=1时,那么在 a 1 , a 2 , ⋯   , a m a_1,a_2,\cdots,a_m a1,a2,⋯,am是模 m m m的一个完全剩余系时,那么 n ∗ a 1 + k , n ∗ a 2 + k , ⋯   , n ∗ a m + k n * a_1 + k,n * a_2+k,\cdots ,n * a_m + k n∗a1+k,n∗a2+k,⋯,n∗am+k,模 m m m互不同余,也是一个完全剩余系。
证明:反证法,若 n ∗ a i + k ≡ n ∗ a j + k ( m o d m ) n * a_i + k \equiv n * a_j + k \pmod{m} n∗ai+k≡n∗aj+k(modm),又因为 G C D ( n , m ) = 1 GCD(n,m)=1 GCD(n,m)=1,不难得出 a i ≡ a j ( m o d m ) a_i \equiv a_j \pmod{m} ai≡aj(modm),与定义不成立,矛盾,故这个性质成立。
在模
n
n
n的完全剩余系中有
ϕ
(
n
)
\phi(n)
ϕ(n)个类,这类数与
n
n
n互质。在这类数中各取一个数,就得到
ϕ
(
n
)
\phi(n)
ϕ(n)个数,称这
ϕ
(
n
)
\phi(n)
ϕ(n)个数为模
n
n
n的一个缩系。
如果
a
a
a,
b
b
b与
n
n
n互质,那么
a
∗
b
a*b
a∗b也与
n
n
n互质。
因而设
b
1
,
b
2
,
⋯
 
,
b
ϕ
(
n
)
b_1,b_2,\cdots,b_{\phi(n)}
b1,b2,⋯,bϕ(n)为一个缩系,且
a
a
a与
n
n
n互质,所以
a
∗
b
1
,
a
∗
b
2
,
⋯
 
,
a
∗
b
ϕ
(
n
)
a*b_1,a*b_2,\cdots,a*b_{\phi(n)}
a∗b1,a∗b2,⋯,a∗bϕ(n)均与
n
n
n互质,并且模
n
n
n互不同余,所以这些数也为模
n
n
n的一个缩系,所涉及到的类相同,不难得出,这两组数之间一定存在着一一对应的关系。
因为两组数同为缩系,我们有
(
a
∗
b
1
)
∗
(
a
∗
b
2
)
∗
⋯
∗
(
a
∗
b
ϕ
(
n
)
)
≡
b
1
∗
b
2
∗
⋯
∗
b
ϕ
(
n
)
(
m
o
d
n
)
(a*b_1)*(a*b_2)*\cdots*(a*b_{\phi(n)}) \equiv b_1*b_2*\cdots*b_{\phi(n)} \pmod n
(a∗b1)∗(a∗b2)∗⋯∗(a∗bϕ(n))≡b1∗b2∗⋯∗bϕ(n)(modn),约去与
n
n
n互质的
b
1
∗
b
2
∗
⋯
∗
b
ϕ
(
n
)
b_1*b_2*\cdots*b_{\phi(n)}
b1∗b2∗⋯∗bϕ(n)得
a
ϕ
(
n
)
≡
1
(
m
o
d
n
)
a^{ \phi(n) } \equiv 1 \pmod n
aϕ(n)≡1(modn),欧拉定理得证。
扩展欧拉定理
扩展欧拉定理:
在模
n
n
n的情况下,
a
b
a^b
ab的解可表示为
a
b
≡
{
a
b
%
ϕ
(
m
)
(
m
o
d
m
)
,
G
C
D
(
b
,
m
)
=
1
;
a
b
(
m
o
d
m
)
,
G
C
D
(
b
,
m
)
不
等
于
1
,
b
<
ϕ
(
m
)
;
a
(
b
%
ϕ
(
m
)
)
+
ϕ
(
m
)
(
m
o
d
m
)
,
G
C
D
(
b
,
m
)
不
等
于
1
,
b
≥
ϕ
(
m
)
a^b \equiv \begin{cases} a^{b \% \phi(m)}&\pmod m,&GCD(b,m) =1 ;\\ a^b&\pmod m, & GCD(b,m) 不等于1,b \lt \phi(m);\\ a^{(b \% \phi(m)) + \phi(m)}&\pmod m,&GCD(b,m) 不等于1,b \ge \phi(m) \end{cases}
ab≡⎩⎪⎨⎪⎧ab%ϕ(m)aba(b%ϕ(m))+ϕ(m)(modm),(modm),(modm),GCD(b,m)=1;GCD(b,m)不等于1,b<ϕ(m);GCD(b,m)不等于1,b≥ϕ(m)
定理证明:我们只要证明第三个式子的正确性即可。
不妨考虑一个质数为
p
p
p,
m
m
m内的质因子
p
p
p的个数为
k
k
k(
k
k
k不可以一直为0),则
m
m
m可表示为
m
=
p
k
∗
s
m=p^k*s
m=pk∗s。
不难看出
G
C
D
(
s
,
p
)
=
1
GCD(s,p)=1
GCD(s,p)=1,根据欧拉定理,不难看出
p
ϕ
(
s
)
≡
1
(
m
o
d
s
)
p^{\phi(s)} \equiv 1 \pmod s
pϕ(s)≡1(mods),并且根据欧拉函数的性质(如下),有
ϕ
(
s
)
∣
ϕ
(
m
)
\phi(s)|\phi(m)
ϕ(s)∣ϕ(m)。
对于一个质数 p p p,有 ϕ ( p a ) = ( p − 1 ) ∗ p a − 1 \phi(p^{a})=(p-1)*p^{a-1} ϕ(pa)=(p−1)∗pa−1
对于任意一个合数若按照下面分解成质数幂乘积表达式 n = p 1 a 1 ∗ p 2 a 2 ∗ ⋯ ∗ p m a m n=p_1^{a_1}*p_2^{a_2}* \cdots * p_m^{a_m} n=p1a1∗p2a2∗⋯∗pmam,则可得出 ϕ ( n ) = n ∗ ( 1 − 1 p 1 ) ∗ ( 1 − 1 p 2 ) ∗ ⋯ ∗ ( 1 − 1 p m ) \phi(n) = n * (1-{ 1 \over p_1 }) * (1-{ 1 \over p_2 }) * \cdots * (1-{ 1 \over p_m }) ϕ(n)=n∗(1−p11)∗(1−p21)∗⋯∗(1−pm1)
所以
p
ϕ
(
m
)
≡
1
(
m
o
d
s
)
p^{\phi(m)} \equiv 1 \pmod s
pϕ(m)≡1(mods)。
根据同余的性质,两边以及模数同时乘以
p
k
p^k
pk,可得
p
k
+
ϕ
(
m
)
≡
p
k
(
m
o
d
m
)
p^{k+\phi(m)} \equiv p^k \pmod{m}
pk+ϕ(m)≡pk(modm)。
两边再乘上
p
b
−
k
p^{b-k}
pb−k(这回不包括模数),其中
b
>
ϕ
(
m
)
b > \phi(m)
b>ϕ(m),得
p
b
+
ϕ
(
m
)
≡
p
b
(
m
o
d
m
)
p^{b+\phi(m)} \equiv p^b \pmod{m}
pb+ϕ(m)≡pb(modm)。
加上一个定理:对于 p k ∣ n p^k|n pk∣n,总有 k ≤ ϕ ( n ) k\le \phi(n) k≤ϕ(n)(可以先研究质数幂,用数学归纳法验证)
因此
k
≤
ϕ
(
m
)
k \le \phi(m)
k≤ϕ(m),上面的式子可表示为
p
b
%
ϕ
(
m
)
+
ϕ
(
m
)
≡
p
b
(
m
o
d
m
)
p^{b \%\phi(m) +\phi(m)} \equiv p^b \pmod{m}
pb%ϕ(m)+ϕ(m)≡pb(modm),假设
q
=
⌊
b
ϕ
(
m
)
⌋
q=\lfloor {b \over \phi(m)} \rfloor
q=⌊ϕ(m)b⌋,这个式子两边乘以
p
q
∗
ϕ
(
m
)
p^{q*\phi(m)}
pq∗ϕ(m),可得
p
b
+
ϕ
(
m
)
≡
p
b
+
q
∗
ϕ
(
m
)
(
m
o
d
m
)
p^{b +\phi(m)} \equiv p^{b+q*\phi(m)} \pmod{m}
pb+ϕ(m)≡pb+q∗ϕ(m)(modm),右边可约去
p
q
∗
ϕ
(
m
)
p^{q*\phi(m)}
pq∗ϕ(m),得出一开始的那个等式
p
b
+
ϕ
(
m
)
≡
p
b
(
m
o
d
m
)
p^{b+\phi(m)} \equiv p^b \pmod{m}
pb+ϕ(m)≡pb(modm),所以
p
b
%
ϕ
(
m
)
+
ϕ
(
m
)
≡
p
b
(
m
o
d
m
)
p^{b \%\phi(m) +\phi(m)} \equiv p^b \pmod{m}
pb%ϕ(m)+ϕ(m)≡pb(modm)成立。
对于一个质数的幂,重复上面的定义,将上面的结果根据同余的一条性质进行乘幂,得:
(
p
k
)
b
≡
(
p
k
)
(
ϕ
(
m
)
+
b
)
≡
(
p
k
)
(
ϕ
(
m
)
+
b
%
ϕ
(
m
)
)
(
m
o
d
m
)
(p^k)^b \equiv (p^{k})^{(\phi(m)+b)} \equiv (p^{k})^{(\phi(m)+b \% \phi(m) )}\pmod m
(pk)b≡(pk)(ϕ(m)+b)≡(pk)(ϕ(m)+b%ϕ(m))(modm)其中
b
≥
ϕ
(
m
)
b \ge \phi(m)
b≥ϕ(m)且
b
∈
Z
b \in Z
b∈Z。
令
a
=
Π
p
i
k
i
a=\Pi p_i^{k_i}
a=Πpiki,因为每一个
p
i
k
i
p_i^{k_i}
piki满足上面的式子,所以这些同余式乘在一起,可得
a
(
b
%
ϕ
(
m
)
)
+
ϕ
(
m
)
≡
a
b
(
m
o
d
m
)
a^{(b \% \phi(m)) + \phi(m)} \equiv a^b \pmod m
a(b%ϕ(m))+ϕ(m)≡ab(modm)所以拓展欧拉定理得证。
【模板】欧拉定理https://www.luogu.org/problem/P5091(其它两个定理的模板以后贴吧 )。
非常裸的模板题。
在快读时取模,无需高精。
#include <iostream>
#include <cstdio>
#include <cstring>
#define ll long long
using namespace std;
ll phi;
inline ll gcd( ll a , ll b ) {
return b == 0 ? a : gcd( b , a % b );
}
inline void read1( ll & res ) {
res = 0;
ll pd = 1;
char a = getchar();
while ( a < '0' || a > '9' ) {
if ( a == '-' ) {
pd = -pd;
}
a = getchar();
}
while ( a >= '0' && a <= '9' ) {
res = ( res << 1 ) + ( res << 3 ) + ( a - '0' );
res %= phi;
a = getchar();
}
res *= pd;
return;
}
inline void read2( ll & res ) {
res = 0;
ll pd = 1;
char a = getchar();
while ( a < '0' || a > '9' ) {
if ( a == '-' ) {
pd = -pd;
}
a = getchar();
}
bool flag = false;
while ( a >= '0' && a <= '9' ) {
res = ( res << 1 ) + ( res << 3 ) + ( a - '0' );
if ( res > phi ) {
flag = true;
res %= phi;
}
a = getchar();
}
if (flag) {
res += phi;
}
res *= pd;
return;
}
inline ll mul( ll a , ll b , ll m ) {
ll res = 1;
while (b) {
if ( b & 1 ) {
res = ( res * a ) % m;
}
a = ( a * a ) % m;
b >>= 1;
}
return res;
}
int main () {
ll a , m , b;
scanf("%lld%lld",&a,&m);
ll tem = m;
phi = m;
for ( int i = 2 ; i <= tem ; ++i ) {
if ( tem % i == 0 ) {
while ( tem % i == 0 ) {
tem /= i;
}
phi = phi - phi / i;
}
}
if ( gcd( a , m ) == 1 ) {
read1(b);
} else {
read2(b);
}
printf("%lld",mul( a , b , m ));
return 0;
}
本文参考资料:《初等数论的知识与问题》(单壿 著)
《数学奥林匹克命题人讲座 初等数论》