MathLabs

竞赛数学与解题

奥数数论

结合整除、同余与丢番图技巧解决数论谜题的竞赛方法。

直观2整除100!多少次?

100!100!(即 1×2×3×⋯×1001\times 2\times 3\times\cdots\times 100)末尾有多少个0?数出隐藏在一百个数乘积中的每个因子 1010,若硬算看似绝望,但有一个一行的技巧:每个末尾的0都来自一个因子 55 与一个因子 22 配对(而 22 要丰富得多),所以只需数出 55 整除 100!100! 多少次。每个不超过 100100 的 55 的倍数都贡献至少一个因子 55(2020 个),每个 2525 的倍数再多贡献一个(44 个),每个 125125 的倍数还会再多贡献一个(≤100\le 100 以内没有),得到 20+4=2420+4=24 个末尾的0。这个计数技巧——求出一个素数整除阶乘或巨大乘积的精确幂次——正是通往奥数数论的入口:用几行算术取代看似不可能的情形计数,给出精确、机械的规则。

展示素数幂倍数计数几何衰减的抛物线图
模 m=13m = 13 的乘法结构:追踪轨道与 pp 进赋值 νp(an−bn)\nu_p(a^n - b^n) 将奥数整除问题转化为模算术。

中学pp进赋值与勒让德公式

定义: pp进赋值

对素数 pp 与非零整数 nn,**pp进赋值** vp(n)v_p(n) 是使 pk∣np^k \mid n 成立的最大指数 kk,即 n=pvp(n)⋅mn = p^{v_p(n)} \cdot m 且 p∤mp \nmid m。它通过 vp(ab)=vp(a)+vp(b)v_p(ab) = v_p(a)+v_p(b) 扩展到乘积,把乘法变成加法,恰似限定于单个素数的对数。

vp(n!)=∑i=1∞⌊npi⌋v_p(n!) = \sum_{i=1}^{\infty} \left\lfloor \frac{n}{p^i} \right\rfloor

这就是勒让德公式:它对每个幂 pip^i 计数 {1,…,n}\{1,\dots,n\} 中 pip^i 的倍数个数,并对所有 ii 求和,从而对 n!n! 中隐藏的每个因子 pp 在其存活的每一层恰好计数一次。实际上该和是有限的,因为一旦 pi>np^i > n 就有 ⌊n/pi⌋=0\lfloor n/p^i\rfloor = 0。一个有用的改写是 vp(n!)=n−sp(n)p−1v_p(n!) = \frac{n - s_p(n)}{p-1},其中 sp(n)s_p(n) 是 nn 用 pp 进制表示时各位数字之和。

vp(n!)=n−sp(n)p−1v_p(n!) = \frac{n - s_p(n)}{p-1}
选用哪种工具
工具最适用场景
勒让德公式整除 n!n! 或二项系数的素数精确幂次
升幂引理当 p∣a∓bp \mid a\mp b 时的 vp(an±bn)v_p(a^n \pm b^n)
韦达跳跃在二次代换下对称的丢番图方程
模 nn 同余排除解、周期性论证

大学完整证明:勒让德公式与升幂引理

对素数 pp 与正整数 nn,vp(n!)=∑i=1∞⌊npi⌋v_p(n!) = \sum_{i=1}^{\infty} \left\lfloor \frac{n}{p^i} \right\rfloor。

为什么成立?

勒让德公式是计算阶乘与二项系数精确素数幂整除性的标准工具,与库默尔定理结合可精确解释哪些二项系数能被给定素数整除。

证明

**第1步:将 vp(n!)v_p(n!) 写成对各因子的求和。** 由定义 n!=1⋅2⋯nn! = 1\cdot 2\cdots n,故 vp(n!)=∑k=1nvp(k)v_p(n!) = \sum_{k=1}^{n} v_p(k),即从 11 到 nn 每个整数的 pp进赋值之和。

**第2步:将每个 vp(k)v_p(k) 改写为计数。** 对每个 kk,vp(k)=∑i=1∞[pi∣k]v_p(k) = \sum_{i=1}^{\infty} [p^i \mid k](用艾弗森记号,真为 11,假为 00),因为 kk 恰好对 vp(k)v_p(k) 个 ii 值(即 i=1,…,vp(k)i=1,\dots,v_p(k))能被 pip^i 整除。

第3步:交换求和顺序。 代入得 vp(n!)=∑k=1n∑i=1∞[pi∣k]=∑i=1∞∑k=1n[pi∣k]v_p(n!) = \sum_{k=1}^n \sum_{i=1}^{\infty} [p^i \mid k] = \sum_{i=1}^{\infty} \sum_{k=1}^n [p^i \mid k],交换(有限从而合理的)双重求和。

**第4步:直接计数 pip^i 的倍数。** 内层和 ∑k=1n[pi∣k]\sum_{k=1}^n [p^i \mid k] 计数 11 到 nn 中有多少整数是 pip^i 的倍数,恰为 ⌊npi⌋\left\lfloor \frac{n}{p^i} \right\rfloor(这些倍数为 pi,2pi,…,⌊n/pi⌋⋅pip^i, 2p^i, \dots, \lfloor n/p^i\rfloor \cdot p^i)。

第5步:结论。 代回得 vp(n!)=∑i=1∞⌊npi⌋v_p(n!) = \sum_{i=1}^{\infty} \left\lfloor \frac{n}{p^i} \right\rfloor,由于一旦 pi>np^i > n 就有 ⌊n/pi⌋=0\lfloor n/p^i \rfloor = 0,故该和有限,证明完成。

定理: 升幂引理

设 pp 为奇素数,a,ba,b 为满足 p∣a−bp \mid a-b 且 p∤ap \nmid a、p∤bp \nmid b 的整数。则对每个正整数 nn:vp(an−bn)=vp(a−b)+vp(n)v_p(a^n - b^n) = v_p(a-b) + v_p(n)。

为什么成立?

升幂引理把关于高次幂之差整除性的难题变成关于赋值的简单算术,是解决要求整除 an−bna^n-b^n 之类表达式的最大素数幂次,或证明该表达式永不(或总是)被某个素数幂整除的奥数问题的最快方法之一。

证明

**第1步:利用乘性归结到 n=pn=p 的情形。** 写 n=pvp(n)⋅mn = p^{v_p(n)} \cdot m,其中 p∤mp \nmid m。将下面证明的 n=pn=p 情形反复应用于 am,bma^m, b^m(代替 a,ba,b),可得 vp(an−bn)=vp((am)pvp(n)−(bm)pvp(n))=vp(am−bm)+vp(n)v_p(a^n-b^n) = v_p((a^m)^{p^{v_p(n)}} - (b^m)^{p^{v_p(n)}}) = v_p(a^m-b^m) + v_p(n),故只需证明当 p∤mp \nmid m 时 vp(am−bm)=vp(a−b)v_p(a^m - b^m) = v_p(a-b),以及证明基础步骤 vp(ap−bp)=vp(a−b)+1v_p(a^p-b^p) = v_p(a-b)+1。

第2步:用因式分解证明基础步骤。 分解 ap−bp=(a−b)(ap−1+ap−2b+⋯+bp−1)a^p - b^p = (a-b)(a^{p-1}+a^{p-2}b+\cdots+b^{p-1})。需证第二个因子 S=∑j=0p−1ap−1−jbjS = \sum_{j=0}^{p-1} a^{p-1-j}b^j 满足 vp(S)=1v_p(S) = 1。

**第3步:证明 p∣Sp \mid S。** 由 p∣a−bp \mid a-b 得 a≡b(modp)a \equiv b \pmod p,故每一项 ap−1−jbj≡bp−1−jbj=bp−1(modp)a^{p-1-j}b^j \equiv b^{p-1-j}b^j = b^{p-1} \pmod p。将全部 pp 项相加,S≡p⋅bp−1≡0(modp)S \equiv p\cdot b^{p-1} \equiv 0 \pmod p(利用 p∤bp \nmid b),故 p∣Sp \mid S。

**第4步:证明 p2∤Sp^2 \nmid S。** 写 a=b+pta = b + pt(tt 为整数,因 p∣a−bp\mid a-b 而可行)。展开每一项 ap−1−jbj=(b+pt)p−1−jbj≡bp−1−jbj+(p−1−j)pt bp−2−jbj(modp2)a^{p-1-j}b^j = (b+pt)^{p-1-j}b^j \equiv b^{p-1-j}b^j + (p-1-j)pt\, b^{p-2-j}b^j \pmod{p^2}(二项式展开,舍去 p2p^2 及以上的项)。对 j=0,…,p−1j=0,\dots,p-1 求和:首项之和如前为 p bp−1p\,b^{p-1},修正项之和为 pt bp−2∑j=0p−1(p−1−j)=pt bp−2⋅p(p−1)2pt\,b^{p-2}\sum_{j=0}^{p-1}(p-1-j) = pt\,b^{p-2}\cdot\frac{p(p-1)}{2},可被 p2p^2 整除(因 pp 为奇数,p−12\frac{p-1}{2} 为整数,故此修正项为 p2⋅(integer)p^2\cdot(\text{integer}),即 ≡0(modp2)\equiv 0 \pmod{p^2})。于是 S≡p bp−1(modp2)S \equiv p\,b^{p-1} \pmod{p^2},又因 p∤bp \nmid b,p bp−1p\,b^{p-1} 能被 pp 整除但不能被 p2p^2 整除,得 vp(S)=1v_p(S)=1。

第5步:合并。 由第2–4步,vp(ap−bp)=vp(a−b)+vp(S)=vp(a−b)+1v_p(a^p-b^p) = v_p(a-b) + v_p(S) = v_p(a-b)+1。结合第1步的归约(以及当 p∤mp\nmid m 时 vp(am−bm)=vp(a−b)v_p(a^m-b^m)=v_p(a-b) 这一事实,此时 S≡m bm−1≢0(modp)S \equiv m\,b^{m-1} \not\equiv 0 \pmod p,可同法证明),对 vp(n)v_p(n) 归纳即得对所有正整数 nn 有 vp(an−bn)=vp(a−b)+vp(n)v_p(a^n-b^n) = v_p(a-b)+v_p(n)。

进阶实际应用与典型例题

pp进赋值不仅是竞赛中的趣味话题:在密码学中,计算大数的 v2v_2 是快速模幂运算以及分析 RSA 相关构造安全裕度的常规步骤;在计算机科学中,数二进制数末尾0位的个数正是 v2(n)v_2(n),这是位操作技巧、哈希表实现以及 Fenwick 树中使用的经典"最低置位位"技巧 n  &  (−n)n \;\&\; (-n) 所用的基本运算。韦达跳跃背后的技巧——利用隐藏的二次对称性从较大的解生成较小的解——是费马用来证明 x4+y4=z4x^4+y^4=z^4 没有非平凡整数解的无穷递降法的一个特例,这一方法如今是丢番图几何现代证明的核心。

例题: 通过 v2v_2 求末尾零位

某哈希表实现需要求正整数 n=1600n=1600 的二进制表示中末尾零位的个数,这一步用于计算 nn 在按位 trie 中属于哪个桶层级。计算 v2(1600)v_2(1600)。

解答

第1步:反复提取因子 22:1600=2⋅800=22⋅400=23⋅200=24⋅100=25⋅50=26⋅251600 = 2\cdot 800 = 2^2\cdot 400 = 2^3\cdot 200 = 2^4\cdot 100 = 2^5\cdot 50 = 2^6\cdot 25。

第2步:因为 2525 是奇数,无法再提取因子 22,故 1600=26⋅251600 = 2^6\cdot 25,2525 为奇数,得 v2(1600)=6v_2(1600)=6。

第3步:与二进制表示对照:1600=1100100000021600 = 11001000000_2,确实恰有 66 个末尾零位,确认 v2(1600)=6v_2(1600)=6 与直接数位法一致,说明两种方法(分解因子与数末尾位)是同一种运算。

例题: 在IMO 1988第6题上运用韦达跳跃

设 a,ba,b 为正整数,且 ab+1ab+1 整除 a2+b2a^2+b^2。证明 a2+b2ab+1\frac{a^2+b^2}{ab+1} 是完全平方数(著名的1988年IMO第6题,被认为是奥数史上最难的题目之一)。

解答

第1步:设 k=a2+b2ab+1k=\frac{a^2+b^2}{ab+1},反证假设 kk 是非完全平方数的正整数。在所有满足 a2+b2ab+1=k\frac{a^2+b^2}{ab+1}=k 的非负整数对 (a,b)(a,b) 中,选取 a+ba+b 最小的一对,并不妨设 a≥b≥0a\ge b\ge 0。

第2步:固定 bb 和 kk,将 a2−kb⋅a+(b2−k)=0a^2 - kb\cdot a + (b^2-k) = 0(整理自 a2+b2=k(ab+1)a^2+b^2=k(ab+1))视为关于 aa 的二次方程。它有根 aa,故由韦达公式另一根为 a′=kb−a=b2−kaa' = kb - a = \frac{b^2-k}{a}。

第3步:证明 a′a' 是整数(由 a′=kb−aa'=kb-a 显然)且 a′≥0a' \ge 0:若 a′<0a'<0,则 a′2−kba′+(b2−k)≥a′2+k+(b2−k)>0a'^2 - kb a' + (b^2-k) \ge a'^2+k+(b^2-k) > 0,与 a′a' 是根矛盾(因为二次式在该处等于 00,而当 a′<0a'<0 时除可能的 −kba′-kba' 外每一项都非负,使整个表达式严格为正——矛盾),故 a′≥0a'\ge 0。

第4步:证明 (a′,b)(a',b) 是更小的解,导出矛盾:因为 a′=b2−kaa'=\frac{b^2-k}{a} 且 b<ab<a(若 a≥ba\ge b 且 a≠ba\ne b 不成立则会迫使 k=2k=2,即完全平方数,与假设矛盾,除非被正性排除的 a=b=0a=b=0;a=ba=b 的情形单独处理,直接给出 k=2k=2 的否定),利用 b<ab<a 得 a′=b2−ka<b2a≤a2a=aa' = \frac{b^2-k}{a} < \frac{b^2}{a} \le \frac{a^2}{a} = a,更直接地:a′a=b2−k<b2≤a2a'a = b^2-k < b^2 \le a^2,故(利用 a>0a>0)a′<aa'<a,即新的一对 (a′,b)(a',b) 满足 a′+b<a+ba'+b < a+b,和严格更小,同时仍满足 a′2+b2a′b+1=k\frac{a'^2+b^2}{a'b+1}=k(该二次关系在把 aa 换成另一根的意义下对称,保持值 kk 不变)——与 a+ba+b 的最小性矛盾。

第5步:结论。第4步的矛盾表明不存在这样的最小反例,故只要 kk 是正整数,它必定是完全平方数,原命题得证。

用勒让德公式,v3(30!)v_3(30!) 等于多少?

由升幂引理,对素数 p=7p=7,当 7∣(12−5)7\mid (12-5) 且 7∤127\nmid 12、7∤57\nmid 5 时,v7(127−57)v_7(12^7-5^7) 等于多少?

在对 a2+b2ab+1=k\frac{a^2+b^2}{ab+1}=k 运用韦达跳跃时,给定解 (a,b)(a,b) 且 a≥ba\ge b,关于 aa 的二次方程的另一根为 a′=kb−aa'=kb-a。为了从 a+ba+b 的最小性导出矛盾,需要证明 a′a' 的什么关键性质?

abc 猜想若被证明,将推广本主题讨论的哪个引理背后的整除直觉?

参考文献

  1. Andrew Granville, Thomas J. Tucker (2002). It's As Easy As abc
  2. Titu Andreescu, Dorin Andrica, Zuming Feng (2007). 104 Number Theory Problems: From the Training of the USA IMO Team
  3. Titu Andreescu, Dorin Andrica, Ion Cucurezeanu (2010). An Introduction to Diophantine Equations: A Problem-Based Approach