威尔逊定理

一、定理概述

威尔逊定理(Wilson’s Theorem)是一个关于质数的性质,通常是指以下这个定理:

若p为质数,则(p-1)! ≡ -1 (mod p)

即p是质数时,(p-1)的阶乘模p等于-1。

由此可以得到一个直接判断质数的方法,若一个数n能够满足(n-1)! ≡ -1 (mod n),则n是质数。

二、证明过程

威尔逊定理的证明过程比较简单,这里简单介绍一下:

设p为一个大于2的质数,则p-1是一个偶数,可以将(p-1)!写成两个部分的积:

(p-1)! = 1*2*3*...*(p/2)*(p/2+1)*...*(p-1)

其中(p/2+1)~(p-1)组成的这部分可以表示为:

(p/2+1)*(p/2+2)*...*(p-1)
= (-1)*(-2)*...*(-p/2)
= (-1)^(p/2)*[(p/2)!]^2

将上式带入主式,得到:

(p-1)! = [(p-1)/2]!^2 * (-1)^(p/2) * (mod p)

当且仅当(p-1)/2为偶数时,(-1)^(p/2)等于1。因此:

(p-1)! ≡ [(p-1)/2]!^2 (mod p)

又因为p是质数,所以剩下的部分[(p-1)/2]!^2肯定不是0,而是模p意义下的一个非零平方数。因此,当(p-1)!模p等于-1时,[(p-1)/2]!^2模p等于1,从而[(p-1)/2]! ≡ 1或(p-1) (mod p)。

若[(p-1)/2]! ≡ (p-1) (mod p),则(p-1)/2 + 1 ~ p-1这部分中肯定有一个数可以与[(p-1)/2]!相乘等于-1,即形如n(p-n) ≡ -1 (mod p)。显然这个n就是(p-1)/2。

由此可以得到,当(p-1)!模p等于-1时,p必然是质数。

三、应用与代码示例

威尔逊定理不仅可以用于判断质数,还可以用于计算排列组合等问题。以下是一个使用威尔逊定理计算组合数的代码示例:

int P = 998244353;

//快速幂模板
long long qpow(long long a, long long b) {
    long long res = 1 % P;
    while(b) {
        if(b & 1) res = res * a % P;
        a = a * a % P;
        b >>= 1;
    }
    return res;
}

//阶乘模板
long long fac(long long x) {
    long long res = 1;
    for(int i = 2; i  n) return 0;
    long long res = fac(n) * inv(fac(m)) % P * inv(fac(n-m)) % P;
    if(n >= P) res = res * qpow(P, n/P) % P;
    return res * fac(n%P) % P * inv(fac(m) * fac(n-m)%P) % P;
}

这个代码中,我们先定义模数为998244353(一个大质数),然后使用快速幂模板、阶乘模板和逆元模板计算阶乘和逆元。最后计算组合数时,如果n比较大,我们还需要对模数做一些特殊处理,将计算结果乘上一个指数。

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/241364.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-12-12 12:31
下一篇 2024-12-12 12:31

相关推荐

  • Python余弦定理求第三边长

    本文将从以下几个方面对Python余弦定理求第三边长进行详细阐述: 一、余弦定理简介 余弦定理是解决三角形问题的基本工具之一,它可以用于求解三角形的边长和角度。其公式如下: c² …

    编程 2025-04-29
  • Lucas定理的应用与实现

    一、定义与介绍 Lucas定理是组合数学中一个十分重要的定理,它可以用来求解组合数取模运算的值,特别地,它可以帮助我们在取模意义下计算组合数的值。这个定理的发现人是法国数学家Edo…

    编程 2025-04-12
  • Dilworth定理

    一、Dilworth定理简介 Dilworth定理是一种集合上的基本定理,它描述了一个偏序集合可以被分解为最少的不可分割链的数量。这个定理在离散数学、组合数学、计算机科学等多个领域…

    编程 2024-12-30
  • stokes定理的阐述

    一、stokes定理证明 stokes定理,也称为斯托克斯定理,是矢量分析中的基本定理之一。该定理是从对小曲面上向量场旋度积分的斯托克斯公式推导而来,该公式是从环路定理得出的。历史…

    编程 2024-12-28
  • 因数个数定理的应用

    一、引言 因数个数定理是数论中的一个重要定理,在许多方面都有广泛的应用。本文将从多个方面对这个定理做详细的阐述,包括定理的基本概念、证明方法、推广应用等。 二、因数个数定理的基本概…

    编程 2024-12-24
  • 斯托克斯定理

    一、斯托克斯定理公式 ∬∂ScurlF·dS = ∫SCF·dl 斯托克斯定理是一个十分重要的定理,它是矢量微积分中的基本定理之一。该定理可以将某一个曲面内的某种物理量的积分值转化…

    编程 2024-12-22
  • c语言中心极限定理,用c语言求极限

    本文目录一览: 1、c语言,随机产生正态分布,中心值为2,sigma为0.4 2、大爷大妈都能看懂的中心极限定理证明 3、出道题消遣一下 4、概率论与数理统计 第五章 大数定律及中…

    编程 2024-12-22
  • 除余定理c语言,带余除法c语言编程

    本文目录一览: 1、C语言怎么求余数 2、C语言取余的原理是怎么回事?比如31%21=10 这个值是什么得到的? 3、C语言取余的原理是怎么回事? 比如 int X,Y X-X/Y…

    编程 2024-12-13
  • 卢卡斯定理的详细阐述

    一、卢卡斯定理基础概念 卢卡斯定理是一种经典的数论定理,用于将一个大数的模取余转化为多个小数的模取余,进而简化问题的求解。 设n、m是两个正整数,且p是一个质数,则该定理表述为: …

    编程 2024-12-12
  • Polya定理——从多个角度阐述多项式置换群的应用

    一、多项式置换群简介 在讨论Polya定理之前,我们先来了解一下多项式置换群的基本概念。多项式置换群是由一组多项式组成的置换群,称为Burnside环或不变环多项式环。这些多项式描…

    编程 2024-12-05

发表回复

登录后才能评论