夜深人静写算法(三十七)- 威尔逊定理
作者:互联网
文章目录
一、前言
欧拉定理、费马小定理、中国剩余定理 我们都(假设)已经学会了。那么今天的这个定理,是非常重要的。因为只有学会了它,你才能凑齐数论四大定理。
没错,这个定理考试不会考,ACM 基本很少遇到(遇到过三道题),LeetCode 上没有,面试官也不会问,它叫 威尔逊定理。所以建议这篇文章,能不看就不看,基本是在浪费时间。实在想看,我也不会阻拦。
当然,无论有没有读者,我都会继续更新,因为我就是我,我只是单纯的想要凑齐数论 四大定理:欧拉定理、费马小定理、中国剩余定理、威尔逊定理。
二、威尔逊定理
1、定义
- ( 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 不是素数的情况,我们分成以下几种情况来讨论:
- 当 p = 1 p=1 p=1 时,直接带入, ( 1 − 1 ) ! ≡ 0 ( m o d 1 ) (1-1)! \equiv 0(mod \ 1) (1−1)!≡0(mod 1);
- 当 p = 4 p=4 p=4 时,直接带入, ( 4 − 1 ) ! ≡ 2 ( m o d 4 ) (4-1)! \equiv 2(mod \ 4) (4−1)!≡2(mod 4);
- 当 p > 4 p \gt 4 p>4 时:
a)当 p p p 是 完全平方数
- 则 p = k 2 p = k^2 p=k2,由于 p > 4 p > 4 p>4,则 k > 2 k > 2 k>2;
- 然后,我们比较以下 2 k 2k 2k 和 p p p 的大小,即:
- 2 k − p = 2 k − k 2 = 2 k − k 2 − 1 + 1 = − ( k − 1 ) 2 + 1 < 0 \begin{aligned}2k - p &= 2k - k^2 \\ &= 2k - k^2 - 1 + 1 \\ &= -(k-1)^2 + 1 \lt 0\end{aligned} 2k−p=2k−k2=2k−k2−1+1=−(k−1)2+1<0
- 于是有 k < p k \lt p k<p, 2 k < p 2k \lt p 2k<p 成立。
- ( p − 1 ) ! = 1 × 2 × . . . × k × . . . × 2 k × . . . ( p − 1 ) = k × 2 k × n = 2 n k 2 = 2 n p \begin{aligned}(p-1)! &= 1 \times 2 \times ... \times k \times ... \times 2k \times ... (p-1) \\ &= k \times 2k \times n \\ &= 2n k^2 \\ &= 2np \end{aligned} (p−1)!=1×2×...×k×...×2k×...(p−1)=k×2k×n=2nk2=2np
- 所以有:
- ( p − 1 ) ! ≡ 0 ( m o d p ) (p-1)! \equiv 0(mod \ p) (p−1)!≡0(mod p)
b)当 p p p 不是 完全平方数
- 那么, p p p 必然等于两个完全不相等的数 a a a 和 b b b 的乘积,不妨设 a < b a \lt b a<b,则满足:
- 1 < a < b < p 1 \lt a \lt b \lt p 1<a<b<p
- ( p − 1 ) ! = 1 × 2 × . . . × a × . . . × b × . . . ( p − 1 ) = a × b × n = n a b = n p \begin{aligned}(p-1)! &= 1 \times 2 \times ... \times a \times ... \times b \times ... (p-1) \\ &= a \times b \times n \\ &= nab \\ &= np \end{aligned} (p−1)!=1×2×...×a×...×b×...(p−1)=a×b×n=nab=np
- 所以有:
- ( p − 1 ) ! ≡ 0 ( m o d p ) (p-1)! \equiv 0(mod \ p) (p−1)!≡0(mod p)
3、必要性
- 当 p p p 为素数时,考虑二次剩余式:
- x 2 ≡ 1 ( m o d p ) x^2 \equiv 1(mod \ p) x2≡1(mod p)
- 移项得到 x 2 − 1 ≡ 0 ( m o d p ) x^2-1 \equiv 0(mod \ p) x2−1≡0(mod p)
- 分解因式得到:
- ( x − 1 ) ( x + 1 ) ≡ 0 ( m o d p ) (x-1)(x+1) \equiv 0(mod \ p) (x−1)(x+1)≡0(mod p)
- 从而可得:
- x ≡ 1 ( m o d p ) x \equiv 1(mod \ p) x≡1(mod p) 或者 x ≡ p − 1 ( m o d p ) x \equiv p-1(mod \ p) x≡p−1(mod p)
- 那么我们抛开 1 1 1 和 p − 1 p-1 p−1 这两个数不管,对于 a ∈ [ 2 , p − 2 ] a \in [2, p-2] a∈[2,p−2],必然存在一个和它不相等的逆元 a − 1 ∈ [ 2 , p − 2 ] a^{-1} \in [2, p-2] a−1∈[2,p−2],满足:
- a a − 1 ≡ 1 ( m o d p ) aa^{-1} \equiv 1(mod \ p) aa−1≡1(mod p)
- 所以必然有 ( p − 3 ) 2 \frac {(p-3)} {2} 2(p−3) 对数相乘的乘积为 1,即:
- ( p − 2 ) ! ≡ 1 ( m o d p ) (p-2)! \equiv 1(mod \ p) (p−2)!≡1(mod p)
- 等式两边同时乘上 p − 1 p-1 p−1 就等到的威尔逊定理。
- ( p − 1 ) ! ≡ p − 1 ( m o d p ) ≡ − 1 ( m o d p ) (p-1)! \equiv p-1(mod \ p) \equiv -1(mod \ p) (p−1)!≡p−1(mod p)≡−1(mod p)
三、威尔逊定理的应用
1、广义情况
【例题1】给定 n ( 2 ≤ n ≤ 1 0 9 ) n(2 \le n \le 10^9) n(2≤n≤109),求: ( n − 1 ) ! m o d n (n-1)! \ mod \ n (n−1)! mod n
- 这个问题推广到了广义的 ( n − 1 ) ! m o d n (n-1)! \ mod \ n (n−1)! mod n 问题,我们知道:
- 当 n n n 为素数时,这个就是威尔逊定理,答案为 n − 1 n-1 n−1;
- 当 n n n 不为素数时,我们在证明威尔逊定理的充分性时,已经对它进行了一个分类,当 n = 4 n = 4 n=4 时,心算结果为 2;否则,可以根据 完全平方数 和 非完全平方数,得到结果为 0。
2、配合素数判定
【例题2】给定 n ( n ≤ 1 0 6 ) n (n \le 10^6) n(n≤106),求 S n S_n Sn。 [ x ] [x] [x] 代表取下整,其中 S n S_n Sn 定义如下:
- 令 d = 3 k + 7 d = 3k + 7 d=3k+7,则加和的部分我们可以看成是:
- [ ( d − 1 ) ! + 1 d − [ ( d − 1 ) ! d ] ] [ \frac {(d-1)! + 1} {d} - [\frac {(d-1)!} {d}] ] [d(d−1)!+1−[d(d−1)!]]
- 根据威尔逊定理可得,只要 d d d 是素数, ( d − 1 ) ! + 1 d \frac {(d-1)! + 1} {d} d(d−1)!+1 必然是整数,而 [ ( d − 1 ) ! d ] [\frac {(d-1)!} {d}] [d(d−1)!] 必然比 ( d − 1 ) ! + 1 d \frac {(d-1)! + 1} {d} d(d−1)!+1 小 1,所以当 d d d 为素数时,有:
- [ ( d − 1 ) ! + 1 d − [ ( d − 1 ) ! d ] ] = 1 [ \frac {(d-1)! + 1} {d} - [\frac {(d-1)!} {d}] ] = 1 [d(d−1)!+1−[d(d−1)!]]=1
- 当 d d d 不是素数时,满足:
- [ ( d − 1 ) ! + 1 d − [ ( d − 1 ) ! d ] ] = 0 [ \frac {(d-1)! + 1} {d} - [\frac {(d-1)!} {d}] ] = 0 [d(d−1)!+1−[d(d−1)!]]=0
- 所以只要进行素数筛选,筛选出所有 [ 1 , 3000007 ] [1, 3000007] [1,3000007] 中的素数,然后做一次预处理,答案就求出来了。
3、配合逆元的应用
【例题3】给定一个素数 p ( p ≤ 1 0 9 ) p(p \le 10^9) p(p≤109),求找到一个比 p p p 小的最大的素数 q q q, 然后给出以下表达式的值: q ! m o d p q! \ mod \ p q! mod p
- 由威尔逊定理:
- ( p − 1 ) ! ≡ − 1 ( m o d p ) (p-1)! \equiv -1 (mod \ p) (p−1)!≡−1(mod p)
- 可以拆成:
- q ! ( q + 1 ) . . . ( p − 1 ) ≡ − 1 ( m o d p ) q!(q+1)...(p-1) \equiv -1 (mod \ p) q!(q+1)...(p−1)≡−1(mod p)
- 由于 p p p为素数,同余式两边同时乘上 ( q + 1 ) . . . ( p − 1 ) (q+1)...(p-1) (q+1)...(p−1) 的逆元 [ ( q + 1 ) . . . ( p − 1 ) ] − 1 [ (q+1)...(p-1) ]^{-1} [(q+1)...(p−1)]−1。
- 得到:
- q ! ≡ − ( [ ( q + 1 ) . . . ( p − 1 ) ] − 1 ) ( m o d p ) q! \equiv -( [(q+1)...(p-1)]^{-1} ) (mod \ p) q!≡−([(q+1)...(p−1)]−1)(mod p)
- 于是,我们只需要逆序枚举
i
∈
[
2
,
p
−
1
]
i \in [2, p-1]
i∈[2,p−1],枚举过程不断进行素数判定和逆元求解,如果得到
q
q
q 为 素数则打破枚举。枚举过程中将所有逆元相乘再乘上
p
−
1
p-1
p−1就是要求的结果了。
- 关于 威尔逊定理 的内容到这里就结束了。
- 如果还有不懂的问题,可以 想方设法 找到作者的微信进行在线咨询。
- 本文所有示例代码均可在以下 github 上找到:github.com/WhereIsHeroFrom/Code_Templates
四、威尔逊定理相关题集整理
题目链接 | 难度 | 解析 |
---|---|---|
HDU 5391 Zball in Tina Town | ★☆☆☆☆ | 【例题1】威尔逊定理 + 素数判定 |
HDU 2973 YAPTCHA | ★☆☆☆☆ | 【例题2】威尔逊定理 + 素数筛选 |
HDU 6608 Fansblog | ★☆☆☆☆ | 【例题3】威尔逊定理 + 大素数判定 |
标签:...,夜深人静,定理,威尔逊,三十七,times,素数,equiv,mod 来源: https://blog.csdn.net/WhereIsHeroFrom/article/details/118432611