数论四大定理之——威尔逊定理

数论四大定理之——威尔逊定理作为数论四大定理中的一员 威尔逊定理可谓是最简单的一个定理了 虽然它的用处也不想欧拉定理或中国剩余定理那么广泛 但是 我们也必须要了解威尔逊定理 因为没有了它 很多题目都会将你深深的折磨的 那我们现在就开始威尔逊定理的学习吧 威尔逊定理若正整数 ppp 为质数 那么 p 1 p 1 modp p 1 equivp 1 pmodp p 1 p 1 modp 形式的确十分的简单 那么我们该如何证明它呢 首先 由于 ppp 是质数 那么 1 p 11 simp

作为数论四大定理中的一员,威尔逊定理可谓是最简单的一个定理了。虽然它的用处也不想欧拉定理或中国剩余定理那么广泛,但是,我们也必须要了解威尔逊定理,因为没有了它,很多题目都会将你深深的折磨的。那我们现在就开始威尔逊定理的学习吧:

威尔逊定理

若正整数 p p p 为质数,那么:
( p − 1 ) ! ≡ p − 1 ( m o d p ) (p – 1)! \equiv p – 1 \pmod p (p1)!p1(modp)
形式的确十分的简单,那么我们该如何证明它呢?




  • 首先,由于 p p p 是质数,那么 1 ∼ p − 1 1 \sim p – 1 1p1 中的值一定存在模 p p p 意义下的乘法逆元
  • 那么对于任意的 x ( 2 ≤ x ≤ p − 2 ) x (2 \leq x \leq p – 2) x(2xp2) ( p − 1 ) ! (p – 1)! (p1)! 里必定包含了它的逆元,乘起来结果就为 1 1 1
  • 但是稍加计算后发现 1 1 1 的逆元和 p − 1 p – 1 p1 的逆元都是他们本身,它们就没有被消掉,最后的结果也就是它们的乘积 p − 1 p – 1 p1

证明也是十分的简单易懂。那么现在,我们就开始使用威尔逊定理来解决一些题目吧:

题目描述

这是一道模板题,给你一个正整数 n n n
( n − 1 ) !   m o d   n (n – 1)! \bmod n (n1)!modn

输入格式

第一行输入一个正整数 T T T,表示 T T T 组数据
接下来 T T T 行,每行一个正整数 n n n

输出格式

对于每一组输出一行, ( n − 1 ) !   m o d   n (n – 1)! \bmod n (n1)!modn的结果

输入样例

3 3 4 10 

输出样例

2 2 0 

数据范围

对与全部的数据 1 ≤ T ≤ 1 0 4 , 1 ≤ n ≤ 2 × 1 0 9 1 \leq T \leq 10^4, 1 \leq n \leq 2 \times 10^9 1T104,1n2×109

题目解答

很显然,在输入的 n n n 为质数时,套威尔逊定理的即可,结果为 n − 1 n – 1 n1。那如果 n n n 为合数呢?
我们先来看如果 n n n 是完全平方数的情况:

  • 只要保证 2 n ≤ n − 1 2\sqrt{n} \leq n – 1 2n
    n1
    即可,因为 ( n − 1 ) ! = 1 × ⋯ × k × ⋯ × 2 k × ⋯ × ( n − 1 ) (n – 1)! = 1 \times \cdots \times k \times \cdots \times 2k \times \cdots \times (n- 1) (n1)!=1××k××2k××(n1),余数恰好为 0 0 0
  • 唯一不符合这个条件的值是 4 4 4,代入计算 ( 4 − 1 ) !   m o d   4 = 2 (4 – 1)! \bmod 4 = 2 (41)!mod4=2

那如果 n n n 不是完全平方数呢?

  • 由于 n n n 是合数,所以必定存在一对 x , y ( 1 < x , y < n − 1 ) x, y (1 < x, y < n - 1) x,y(1<x,y<n1),使得 x y = n xy = n xy=n
  • ( n − 1 ) ! = 1 × ⋯ × x × ⋯ × y × ⋯ × ( n − 1 ) (n – 1)! = 1 \times \cdots \times x \times \cdots \times y \times \cdots \times (n – 1) (n1)!=1××x××y××(n1),余数同样也是 0 0 0

如果 n = 1 n = 1 n=1,同样直接代入计算,结果也为 0 0 0

AC代码

#include  
     using namespace std; int t, n; bool isprime(int x) // 判断质数 { 
    if (x <= 1) return false; for (int i = 2; i <= x / i; i++) if (x % i == 0) return false; return true; } int main() { 
    scanf("%d", &t); while (t--) { 
    scanf("%d", &n); if (n == 4) puts("2"); else printf("%d", isprime(n) ? n - 1 : 0); } return 0; } 
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/224739.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 上午11:15
下一篇 2026年3月17日 上午11:15


相关推荐

  • linux进入cbq文件夹,Linux流量控制(SFQ/TBFPRIO/CBQ/HTB原理介绍)

    linux进入cbq文件夹,Linux流量控制(SFQ/TBFPRIO/CBQ/HTB原理介绍)Linux 流量控制控发不控收 所以只能对产生瓶颈网卡处的发包速率进行控制 而网络瓶颈分析亦为 Linux 网络流控的第一步 二种流控算法 Linux 流量控制控发不控收 所以只能对产生瓶颈网卡处的发包速率进行控制 而网络瓶颈分析亦为 Linux 网络流控的第一步 二种流控算法上分 无类算法用于树叶级无分支的队列 SFQTBFpFIFO 分类算法用于多分支的队列 PRIOHTBCBQ 调度在分类器的

    2026年3月18日
    2
  • VBS 刷屏代码[通俗易懂]

    VBS 刷屏代码[通俗易懂]刷屏代码VBSScript使用方法:复制需要转发的内容,点击QQ或者微信窗口,,再双击VBS脚本即可自动运行OnErrorResumeNextDimxda,yesetxda=createobject(“wscript.shell”)`循环次数fori=1to200`循环间隔时间wscript.sleep70xda.AppActivatexda.sendKeys”^v”xda.sendKeys”%s”nextwscript.quit…

    2022年6月9日
    261
  • 最近一段时间,OpenClaw 真的有点太火了

    最近一段时间,OpenClaw 真的有点太火了

    2026年3月14日
    2
  • 【AI编程】 serena使用教程

    【AI编程】 serena使用教程

    2026年3月16日
    2
  • 卸载ufw-小白实操记录

    卸载ufw-小白实操记录可以删除或者禁用 ufw 不存在任何问题 它不会影响你的 iptables 配置 UFW 非复杂防火墙 只是为了简化使用 iptables 的一些配置而开发 1 禁用 ufw 要禁用 UFW 可以键入以下内容 sudoufwdisab 卸载 ufw 如果要删除它 可以输入以下命令 sudoapt getremoveufw 清除依赖包 sudoapt getpurgeufw

    2026年3月17日
    2
  • JS向数组添加元素,插入数据

    js中对于数组的操作很常见,下面记录一下js向数组添加元素的方法。letmyArray=[11,22,33];console.log(‘原数组:’,myArray);myArray.push(44,55);console.log(‘用push在数组后面插入元素:’,myArray);myArray.unshift(66,77);co…

    2022年4月5日
    904

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号