「威尔逊定理」学习笔记

前言

一个抽象的事情,我在证欧拉定理的时候,偶然发现了一个式子:

(p1)!modp=p1

非常的偶然,实际上是证明欧拉定理的时候有一步搞错了,然后不得不想如何把 (p1)!modp 消去,然后就很意外的发现了这个式子。

当时我不知道他到底是不是成立的,我试了好几个数都是满足的,于是我认为他是成立的,但是显然,我不会证。

于是我去找班里数奥的同学,让他帮我证一下,他说好像从哪儿看过……

于是果然这个式子早就是有人发现且证明过的,就是 威尔逊定理


威尔逊定理

p 是素数,则 (p1)!1(modp)

  • 简单证明

    p 是素数,取集合 A={1,2,3,,p1}

    A 构成模 p 乘法的简化剩余系,同时也是其完全剩余系除去 0 这个元素。

    那么,存在任意 iA ,存在 jA ,使得 (ij)1(modp)

    那么 A 中的元素是否恰好两两配对呢?不一定,需要考虑这种情况: i21(modp)

    解得: i1(modp)ip1(modp)

    其余两两配对,所以满足:

    (p1)!modp1×(p1)1(modp)


  • 详细解剖证明过程

    根据数奥同学的学案,先导入另一个例题:

    p5 是素数,a{2,3,,p2} ,则在数列 a,2a,3a,,(p1)a,pa 中有且只有一个数 b ,满足 b1(modp) ,此外,如 b=ka ,则 kak{2,3,,p2}

    那么这个东西怎么证,又和威尔逊定理又什么关系呢?


    • 证明:
    1. 存在性

      p 为素数,a{2,3,,p2}

      gcd(a,p)=1

      {a,2a,,pa}modp 的完全剩余系

      ∴ 必定存在 k ,使得 ka1(modp) ,即 b=ak


    2. ka

      假设 k=a ,则 a21(modp)

      p|a21p|(a+1)(a1)

      p|(a+1)p|(a1)

      a{2,3,,p2}

      a1{1,2,,p1}

      gcd(a1,p)=1

      而 ∴ p|(a+1)p|(a1)gcd(a1,p)=1 矛盾

      从而通过反证法,证得 ka


    3. k1

      假设 k=1 ,则 a1(modp) ,与 a{2,3,,p2} 矛盾

      从而证得 k1


    4. kp1

      与上面类似的

      假设 k=p1 ,则 (p1)a1(modp)

      a1(modp) ,即 amodp=p1

      a{2,3,,p2} 矛盾

      从而证得 kp1


    5. 唯一性

      akak(modp)

      gcd(a,p)=1

      kk(modp)

      k=k

      k 唯一


    现在把我们上面证明出来的式子带入我们的简单证明过程中

    存在任意 iA ,存在 jA ,使得 (ij)1(modp)

    可以用存在性唯一行证明。

    那么 A 中的元素是否恰好两两配对呢?不一定,需要考虑这种情况: i21(modp) 。解得: i1(modp)ip1(modp) 。其余两两配对

    可以用 k1kp1 证明。

    从而,我们证明了威尔逊定理。

    证毕。


扩展

前言:此部分纯凭个人想象(当然式子是正确的),并非扩展威尔逊定理,若想了解更多真正的扩展,请见 oiwiki

大前提:p 为素数

  • 威尔逊定理:(p1)!modp=p1

  • (p2)!modp=1

    显然的,同时除以 p1


  • (p3)!modp=p12

    此式子需满足前提 p>2 的素数

    • 证明:

      (p2)!(p2)×(p3)!modp(modp)

      {1!modp,2!modp,(p1)!modp} 中,满足其值 1p1

      不妨设 (p3)!modp=pb ,其中 1bp1b 为整数

      原式就变成了 (p2)(pb)modp

      将括号拆开,得 (p2(2+b)p+2b)modp ,得到一个多项式

      其中,每一项中只要是带 p 的,modp 后一定是 0 ,所以原式 =2bmodp

      2b1(modp) ,从而得 2b=kp+1 ,其中 k 为非负整数

      同时 1bp1 ,所以 22b2p2 ,从而得到 k 只能等于 1

      所以 2b=p+1b=p+12

      所以 (p3)!modp=(pb)=p12


  • (pa)(pb)ab(modp)

    在推上一个式子中可以发现,证明过程去上一个证明中刨。

    Cnm=Cnnm 是类似的。


  • 在计算 n!modp 时,如果 n>p ,因为通常情况下,在题目中,常常要把 n!p 的倍数去掉,首先 p 显然是素数。

    那么 n!modp=((p1)!npmodp×(nmodp)!modp)modp

    a=np ,其中 (p1)amodp 的值可以简化

    已知 p11(modp) ,那么 (p1)a(1)a(modp)

    那么 n!modp=((p+(1)np)modp×(nmodp)!modp)modp

    其中 (p+(1)np)modp 加上一个 p 不会改变 modp 的值,同时防止出现负数的情况。

    这样,当 n>p 时,n!modp 的复杂度就可以压死到 O(p1) 以内。


posted @   卡布叻_周深  阅读(59)  评论(3编辑  收藏  举报
相关博文:
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
点击右上角即可分享
微信分享提示