数论四大定理之威尔逊定理
一.前言
威尔逊定理是数论四大定理之一。虽然他在算法竞赛中十分少见, 且由于爆炸性增长的阶乘,在数论中他也不常用。 但他是素数学中为数不多的充要定理,所以我还是准备开篇文章来写。
二.定义
威尔逊定理如下
如果
p
p
p为素数那么
(
p
−
1
)
!
≡
−
1
(
m
o
d
p
)
(p-1)! \equiv -1(mod \ p)
(p−1)!≡−1(mod p)
三.证明
由于威尔逊定理应用极少所以 平时懒得写证明的我 开始写证明。
因为定理证明比较复杂,所以我们先证明他的逆定理。
1.威尔逊定理逆定理证明
由于直接威尔逊定理左半部分能够出素数比较困难,我们用反证法证明非素数不满足威尔逊定理。由于一个 > = 3 >=3 >=3的合数都能拆分成不包含自身的两个数之积,所以我们分成三类进行讨论: ( a ) p = 1 (a)p=1 (a)p=1, ( b ) p (b)p (b)p能分解成两个不相同的不包含自身的两个因子的乘积, ( c ) p (c)p (c)p是完全平方数且不能分解成两个不相同的不包含自身的两个因子的乘积
a ) a) a). p = 1 p=1 p=1
将 1 1 1带入 ( 1 − 1 ) ! ≡ − 1 ( m o d 1 ) (1-1)! \equiv -1(mod \ 1) (1−1)!≡−1(mod 1)左半部分 0 ! = 1 0!=1 0!=1,后半部分 − 1 m o d 1 = 0 -1 \ mod \ 1=0 −1 mod 1=0,左半部分 ≠ \neq =右半部分,对于 p = 1 p=1 p=1威尔逊定理显然不成立。
b ) b) b). p p p能分解成两个不相同的不包含自身的两个因子的乘积
显然我们可以把
p
p
p表达成
a
∗
b
a*b
a∗b,
1
<
a
<
b
<
p
1<a<b<p
1<a<b<p
(
p
−
1
)
!
=
1
∗
2
∗
3
∗
⋯
∗
(
p
−
1
)
=
1
∗
2
∗
3
⋯
∗
a
∗
⋯
∗
b
∗
⋯
∗
(
p
−
1
)
=
p
∗
(
p
−
1
)
!
a
∗
b
m
o
d
p
=
0
\begin{aligned}(p-1)! &= 1*2*3* \dots *(p-1) \\ &= 1*2*3 \dots *a* \dots *b* \dots *(p-1) \\ &= p * \frac{(p-1)! }{a*b} \ mod \ p=0 \end{aligned}
(p−1)!=1∗2∗3∗⋯∗(p−1)=1∗2∗3⋯∗a∗⋯∗b∗⋯∗(p−1)=p∗a∗b(p−1)! mod p=0
−
1
m
o
d
p
=
−
1
+
p
∵
p
>
1
∴
−
1
+
p
≠
0
-1 \ mod \ p = -1+p \\ \because p>1 \\ \therefore -1+p \neq 0
−1 mod p=−1+p∵p>1∴−1+p=0
所以在
b
)
b)
b)情况下的合数不满足威尔逊定理逆定理
c ) c) c). p p p是完全平方数且不能分解成两个不相同的不包含自身的两个因子的乘积
我们令
k
=
p
k=\sqrt{p}
k=p,则
2
k
=
2
p
2k=2\sqrt{p}
2k=2p,
(
2
p
)
2
=
4
p
(2\sqrt{p})^2=4p
(2p)2=4p,
p
2
−
4
p
=
(
p
−
2
)
2
−
4
p^2-4p=(p-2)^2-4
p2−4p=(p−2)2−4,
∵
>
1
\because >1
∵>1的最小完全平方数为
4
4
4,当
p
=
4
p=4
p=4时正好为
0
0
0,我们单独讨论
(
4
−
1
)
!
m
o
d
4
=
2
(4-1)! \ mod \ 4 = 2
(4−1)! mod 4=2,
−
1
m
o
d
4
=
3
-1 \ mod \ 4=3
−1 mod 4=3,显然对于
4
4
4不成立。当
p
>
4
p>4
p>4时,
p
2
−
4
p
>
0
p^2-4p>0
p2−4p>0,即
2
k
<
p
2k<p
2k<p,即
2
k
<
=
p
−
1
2k<=p-1
2k<=p−1所以我们可进行以下构造
对于任意
p
>
4
p>4
p>4的完全平方数,令
k
=
p
k=\sqrt{p}
k=p,根据上述证明.
2
k
<
=
p
−
1
2k<=p-1
2k<=p−1
(
p
−
1
)
!
=
1
∗
2
∗
3
∗
⋯
∗
(
p
−
1
)
=
1
∗
2
∗
3
⋯
∗
k
∗
⋯
∗
2
k
∗
⋯
∗
(
p
−
1
)
=
2
∗
p
∗
(
p
−
1
)
!
2
k
2
m
o
d
p
=
0
\begin{aligned}(p-1)! &= 1*2*3* \dots *(p-1) \\ &= 1*2*3 \dots *k* \dots *2k* \dots *(p-1) \\ &= 2*p * \frac{(p-1)! }{2k^2} \ mod \ p=0 \end{aligned}
(p−1)!=1∗2∗3∗⋯∗(p−1)=1∗2∗3⋯∗k∗⋯∗2k∗⋯∗(p−1)=2∗p∗2k2(p−1)! mod p=0
−
1
m
o
d
p
=
−
1
+
p
∵
p
>
4
∴
−
1
+
p
≠
0
-1 \ mod \ p = -1+p \\ \because p>4 \\ \therefore -1+p \neq 0
−1 mod p=−1+p∵p>4∴−1+p=0
所以在
c
)
c)
c)情况下的合数不满足威尔逊定理逆定理
因为所有合数都能分成 a ) a) a), b ) b) b), c ) c) c)三类,所以一切合数均不满足威尔逊定理,所以满足$(p-1)! \equiv -1(mod \ p) $ 的数必定是素数,威尔逊定理充分性得证。
还有一种更加简洁的证明方法。
对于威尔逊定理: ( p − 1 ) ! ≡ − 1 ( m o d p ) (p-1)! \equiv -1(mod \ p) (p−1)!≡−1(mod p) 。我们两边两边同时 + 1 +1 +1 得到 ( p − 1 ) ! + 1 ≡ 0 ( m o d p ) (p-1)!+1 \equiv 0(mod \ p) (p−1)!+1≡0(mod p)
即$ p \mid (p-1)!+1$ 。
假设一个非素数 p p p使得 ( p − 1 ) ! ≡ − 1 ( m o d p ) (p-1)! \equiv -1(mod \ p) (p−1)!≡−1(mod p) 。若 p = 1 p=1 p=1上面已经证明过,威尔逊定理不成立。当 p ≠ 1 p \neq 1 p=1则 p p p一定有一个素因数 a a a。
显然 a ∣ ( p − 1 ) ! + 1 a \mid (p-1)!+1 a∣(p−1)!+1 ,又因为 a a a是 p p p的一个素因数,显然 a < p − 1 a<p-1 a<p−1。 ( p − 1 ) ! = 1 ∗ 2 ∗ 3 ⋯ ∗ a ∗ ⋯ ∗ ( p − 1 ) (p-1)!=1*2*3 \dots *a* \dots * (p-1) (p−1)!=1∗2∗3⋯∗a∗⋯∗(p−1),那么有 a ∣ ( p − 1 ) ! a \mid (p-1)! a∣(p−1)!,这与 a ∣ ( p − 1 ) ! + 1 a \mid (p-1)!+1 a∣(p−1)!+1矛盾。
所以假设不成立,原命题成立,即不存在非素数使 ( p − 1 ) ! ≡ − 1 ( m o d p ) (p-1)! \equiv -1(mod \ p) (p−1)!≡−1(mod p) ,所以若 ( p − 1 ) ! ≡ − 1 ( m o d p ) (p-1)! \equiv -1(mod \ p) (p−1)!≡−1(mod p) 则 p p p是素数,威尔逊定理逆定理得证。
2.威尔逊定理证明
必要性的证明需要用到比较复杂的数论知识,以下是参考《初等数论及其应用》后给出的简要证明。
设 p p p是一个素数
a ) . a). a). 当 p = 2 p=2 p=2时
有 ( p − 1 ) ! ≡ − 1 ( m o d 2 ) (p-1)!\equiv -1(mod \ 2) (p−1)!≡−1(mod 2),显然成立
b ) b) b).当 p > 2 p>2 p>2时
通过费马小定理可知 2 → p − 2 2\rightarrow p-2 2→p−2之间必定有 p − 1 2 \frac{p-1}{2} 2p−1个互为逆元的数互相匹配,而剩下的 1 1 1没有匹配,故 ( p − 2 ) ! ≡ 1 ( m o d p ) (p-2)! \equiv 1(mod \ p) (p−2)!≡1(mod p),所以 ( p − 1 ) ! ≡ − 1 ( m o d p ) (p-1)! \equiv -1(mod \ p) (p−1)!≡−1(mod p)。
四.威尔逊定理的应用
1.较小的素数判定
呃,其实如果不预处理阶乘的话,威尔逊定理比试除法效率还低,而且阶乘不用高精绝对会溢出,所以我们根本不会使用威尔逊定理进行素数判定,我们比较倾向使用费马小定理的伪逆定理进行随机判定。以下是 毫无应用价值的威尔逊定理素数判定代码。
#include<iostream>
using namespace std;
bool Wilson(int p){
long long temp = 1;
if(p==1) return false;//特判
for (int i = 1; i <= p-1; ++i) {
temp*=i;
}
return temp%p==p-1;//因为c++负数取模还是负数所以只能写成p-1了
}
int main(){
int num;
scanf("%d",&num);
if(Wilson(num)) printf("%d is prime",num);
else printf("%d is not prime",num);
return 0;
}
2.威尔逊定理逆定理对于 ( n − 1 ) ! m o d n (n-1)! \ mod \ n (n−1)! mod n型表达式的迅速求解
我们想要迅速计算表达式可以应用上述充分性证明 1 1 1中给出的证明过程,当 n n n为素数时,满足威尔逊定理,我们可以得到答案为 − 1 m o d n = n − 1 -1 \ mod \ n=n-1 −1 mod n=n−1,当 n n n为 4 4 4时,我们特判得到 2 2 2,其他情况下通过前文的论证可以得到结果均为 0 0 0。
五.完结
撒花~~