一、引入题目
#
考虑一道数学题目:求 10! 除以 11 的余数。
我们要算的是
10!=1⋅2⋅3⋅4⋅5⋅6⋅7⋅8⋅9⋅10除以 11 后剩下多少,也就是求 10!mod11。
这么长的一串乘积,怎样计算更方便?
1. 暴力计算
#
最直接的办法是先算出阶乘:
10!=3628800=11⋅329890+10.所以余数是 10,写成同余式就是
10!≡10≡−1(mod11).也可以边乘边取余,让中间的数保持小一些。
接下来换个角度:能不能调整乘法顺序,让某些部分特别容易计算?
2. 分组计算
#
计算
25⋅17⋅4时,我们通常会先算 25⋅4=100。乘法允许交换顺序,就可以优先组合容易处理的因子。
在模 11 的计算中,什么样的组合最方便?
乘积余 1 就很好。因为乘以 1,其他部分的余数保持不变。
先看 2。在原来的因子中找一个数,乘以 2 后比 11 的倍数多 1:
2⋅6=12=11+1.所以
2⋅6≡1(mod11).这样,2 和 6 就可以一起处理了。继续找:
3⋅4=12≡1(mod11),5⋅9=45≡1(mod11),7⋅8=56≡1(mod11).整个乘积因此可以重排为
10!=1⋅10⋅(2⋅6)(3⋅4)(5⋅9)(7⋅8).取模后,括号里的每一组都变成了 1:
10!≡1⋅10⋅1⋅1⋅1⋅1≡−1(mod11).这次计算里,最值得注意的是:除了 1 和 10,其余因子恰好能两两配对,每对的乘积都余 1。
二、规律引申
#
把 11 换成 7,试着计算 6! 除以 7 的余数。
我们有
6!=1⋅2⋅3⋅4⋅5⋅6.其中
2⋅4=8≡1(mod7),3⋅5=15≡1(mod7).于是
6!=1⋅6⋅(2⋅4)(3⋅5)≡1⋅6≡−1(mod7).同样的现象又出现了:配对后,留下最前面的 1 和最后面的 6,结果仍然是 −1。
7 和 11 都是素数。我们自然会问:
对任意素数 p,是不是都有
(p−1)!≡−1(modp)成立?
要证明之前,需要先理解“逆元”的概念。
刚才找到的 2 和 6 满足
2⋅6≡1(mod11).我们把这种关系叫作:2 和 6 模 11 互为乘法逆元。
一般地,如果
ab≡1(modm),就称 b 是 a 模 m 的乘法逆元;同时,a 也是 b 的逆元。
所以,“逆元配对”就是把相乘余 1 的两个因子放在一起。
三、分析思路
#
Wilson定理的思想可以拆分成多个子问题:
- 每个因子是不是都能找到对应的搭档(逆元)?
- 这个搭档是唯一的吗,会不会有一对多的情况?会不会出现指向自己的情况?
- 所有的因子都能被用完吗,会不会有多余因子无法成对?
接下来我们逐个分析。
1. 寻找搭档
#
设 p 是素数,取一个因子
a∈{1,2,…,p−1}.由于 a 比 p 小,且不为 0,所以
gcd(a,p)=1.根据贝祖等式,存在整数 u,v,使
au+pv=1.对 p 取模,就得到
au≡1(modp).这已经找到了 a 的逆元。再把 u 换成它模 p 的余数 b,仍然有
ab≡1(modp).这个余数不可能是 0,因此 b 就在 1,2,…,p−1 中。
也就是说,每个因子都能找到搭档,而且搭档就在原来的乘积里面。
2. 搭档唯一
#
假如 a 同时与 b,c 配对,那么
ab≡1(modp),ac≡1(modp).于是
a(b−c)≡0(modp).由于 p 是素数,且 p∤a,只能有 p∣(b−c),即
b≡c(modp).而 b,c 都在 1,…,p−1 中,所以 b=c。
因此,每个因子在这组数中只有一个搭档。
而且,ab≡1 同时意味着 ba≡1。所以 a 的搭档是 b,b 的搭档就一定是 a:
a⟷b.不会出现“a 找 b,b 又找另一个数”的情况。
现在我们解决了不会出现一对多的证明问题,那么会不会在一对一里面出现指向自己的情况呢?
模 11 的计算中,最后留下了 1 和 10。看看它们的平方:
12≡1(mod11),102≡1(mod11).它们的逆元正好都是自己。
可是阶乘中,每个因子只出现一次。我们不能再拿一个 10 与原来的 10 相乘,所以它需要单独留下。
换成一般的素数 p,哪些数会有这种情况?只要解
a2≡1(modp).因式分解:
p∣(a−1)(a+1).因为 p 是素数,必有
a≡1(modp)或a≡−1(modp).因此,对奇素数 p,恰好只有 1 和 p−1 的逆元是自己。这也解释了为什么前面两道例题最后留下的,总是这两个位置上的数。
3. 完美分组
#
每个数都有唯一搭档,怎么保证把它们放在一起时,不会漏掉谁,也不会重复用到谁?
我们可以实际执行一个“取走配对”的过程。
对奇素数 p,先留下 1,p−1,然后:
- 从剩余数中任取一个 a。
- 找到它的逆元 b。
- 把 a,b 一起取走。
- 对尚未取走的数重复上述操作。
这里的 b 与 a 不同,因为自身为逆元的两个数已经留下了。它也不会是 1 或 p−1,因为这两个数各自的唯一搭档就是自己。
最关键的问题是:找到 b 时,它会不会已经被前面的配对取走了?
假如 b 之前已经被取走,那么它当时是和谁一起走的?
它唯一的搭档就是 a。所以,a 当时也应该一起被取走。
但我们刚刚还能从剩余数中选到 a,这就矛盾了。
因此,只要 a 还在,它的搭档 b 就一定也还在。 每次都能取走两个尚未使用的数。原来的数又是有限的,最后就会全部配完,每个数恰好使用一次。
于是整个乘积只剩下
1⋅(p−1)≡−1(modp).四、标准证明
#
接下来我们给出Wilson定理的标准形式和证明。
Wilson 定理:对整数 n>1,
n 是素数⟺(n−1)!≡−1(modn).1. 必要性:若 p 是素数,则 (p−1)!≡−1(modp)
#
当 p=2 时,
1!=1≡−1(mod2),结论成立。下面设 p 是奇素数。
对每个 a∈{1,2,…,p−1},因为 gcd(a,p)=1,存在唯一的逆元代表 a−1∈{1,2,…,p−1},使
aa−1≡1(modp).(贝祖定理推论,详见贝祖定理)
逆元等于自身的条件为
a2≡1(modp),也就是
p∣(a−1)(a+1).由于 p 是素数,必有
a≡1(modp)或a≡−1(modp).因此,在 1,…,p−1 中,只有 1 和 p−1 的逆元等于自身。
其余元素都能分成互不重叠的二元组
{a,a−1},每组的乘积模 p 都等于 1。所以
(p−1)!≡1⋅(p−1)⋅1⋯1≡−1(modp).必要性得证。
2. 充分性:若 (n−1)!≡−1(modn),则 n 是素数
#
用反证法。假设 n 是合数,则存在整数 d 满足
1<d<n,d∣n.因为 d 是乘积 1⋅2⋯(n−1) 中的一项,所以
d∣(n−1)!.另一方面,由已知同余式,
n∣((n−1)!+1).结合 d∣n,得到
d∣((n−1)!+1).将这两个整除关系相减,便得
d∣1,与 d>1 矛盾。因此 n 必为素数,充分性得证。
五、总结
#
回到最开始的问题:为什么要用逆元配对的思想来分析?
因为我们面对的是一个长乘积,想让计算简单,就可以尝试寻找乘积为 1 的因子对。
试了几个数之后,发现这样的组合恰好能覆盖大部分因子,然后猜测这种规律能不能推广到任意素数?
在证明部分,必要性主要用了贝祖定理的推论,来验证分组乘算模 p 为1;充分性则采用反证法思路,从合数定义出发推出矛盾。
对于 Wilson 定理本身,核心主线可以记为一句话:
逆元两两配对,乘积都化为 1,最后留下头尾的 1 和 −1。