嘘~ 正在从服务器偷取页面 . . .

威尔逊定理(Wilson 定理)


威尔逊定理(Wilson 定理)

内容

对于素数 \(p\)\[ (p-1) ! \equiv-1(\bmod p) \] 对于整数 \(n\) ,令 \((n!)_p\) 表示所有小于等于 \(n\) 但不能被 \(p\) 整除的正整数的乘积,即 \[ (n !)_p=n ! /\left(\lfloor n / p\rfloor ! p^{\lfloor n / p\rfloor}\right) \] 威尔逊定理指出 \((p !)_p=(p-1) ! \equiv-1 \pmod{p}\) 且可被推广至模素数 \(p\) 的幂次。


应用

1. 阶乘 & 素数

这一段我本来想直接搬 oiwiki 的文本的,然而这 oiwiki 怕不是机翻的

在某些情况下需要考虑以素数 \(p\) 为模数的公式,而且是含有分子和分母都含有阶乘的某些分式

考虑用 \(p\) 的幂次的形式表示 \((n!)_p\) ,如下 \[ \begin{aligned} (n !)_p= & 1 \times 2 \times 3 \times \cdots \times(p-2) \times(p-1) \times \underbrace{1}_p \times(p+1) \times(p+2) \times \cdots \times(2 p-1) \times \underbrace{2}_{2 p} \\ & \times(2 p+1) \times \cdots \times\left(p^2-1\right) \times \underbrace{1}_{p^2} \times\left(p^2+1\right) \times \cdots \times n \pmod{p} \\ = & 1 \times 2 \times 3 \times \cdots \times(p-2) \times(p-1) \times \underbrace{1}_p \times 1 \times 2 \times \cdots \times(p-1) \times \underbrace{2}_{2 p} \times 1 \times 2 \\ & \times \cdots \times(p-1) \times \underbrace{1}_{p^2} \times 1 \times 2 \times \cdots \times(n \bmod p) \pmod{p} \end{aligned} \] 吐槽:oiwiki 的 \(\cdot \ldots \cdot\) 是什么逆天写法

可以发现,除了最后一部分,其余部分被划分为了几个长度相同的块 \[ \begin{aligned} (n !)_p & =\underbrace{1 \times 2 \times 3 \times \cdots \times(p-2) \times(p-1) \times 1}_{\text {1st}} \times \underbrace{1 \times 2 \times 3 \times \cdots \times(p-2) \times(p-1) \times 2}_{\text {2nd }} \times \cdots \\ & \times \underbrace{1 \times 2 \times 3 \times \cdots \times(p-2) \times(p-1) \times 1}_{p \text { th }} \times \cdots \times \underbrace{1 \times 2 \times \cdots \times (n \bmod p)}_{\text {tail }} \pmod{p} \end{aligned} \] 块的主要部分的 \((p-1)! \bmod{p}\) 很容易计算,可以直接应用威尔逊定理

而最后一个块则可以在 \(\mathcal{O}(p)\) 的时间内计算出。

唯一的“难点”在于每个块的最后一位实际上没有被处理(我相信你可能也没注意到\[ 1\times 2 \times \cdots \times (p -1) \times 1\times 1 \times2\times \cdots \] 而这实际上就是 \[ \left(\left\lfloor\frac{n}{p}\right\rfloor !\right)_p \] 于是我们预处理 \(1\)\(p-1\) 的阶乘,即可在单次 \(\mathcal{O}(\log_p n)\) 的时间复杂度内回答 \(n\) 的答案。

总时间复杂度 \(\mathcal{O}(p + q\log_pn)\)

代码:(搬的)

int factmod(int n, int p)
{
    vector<int> f(p); f[0] = 1;
    for(int i = 1; i < p; i++) f[i] = f[i - 1] * i % p;
    int res = 1;
    while (n > 1)
    {
        if ((n / p) % 2) res = p - res;
        res = res * f[n % p] % p;
        n /= p;
    }
    return res;
}

2. Legendre 公式

如果想计算二项式系数模 \(p\) ,那么还需要考虑在 \(n\) 的阶乘的素因子分解中 \(p\) 出现的次数

\(n!\) 中含有的素数 \(p\) 的幂次 \(v_p(n!)\)\[ v_p(n !)=\sum_{i=1}^{\infty}\left\lfloor\frac{n}{p^i}\right\rfloor=\frac{n-S_p(n)}{p-1} \] 其中 \(S_p(n)\)\(p\) 进制下 \(n\) 的各个数位的和。

特别地,阶乘中 \(2\) 的幂次是 \(v_2(n!) = n - S_2(n)\)​ 。

时间复杂度 \(\mathcal{O}(\log n)\)

代码:

int multiplicity_factorial(int n, int p) {
  int count = 0;
  do { n /= p; count += n; } while (n);
  return count;
}

3. Kummer 定理

组合数对一个数取模的结果,往往构成分形结构,例如谢尔宾斯基三角形就可以通过组合数模 \(2\) 得到。

如果仔细分析 \(p\) 是否整除组合数其实和上下标在 \(p\) 进制下减法是否需要借位有关。这就有了 Kummer 定理。

Kummer 定理

\(p\) 在组合数 \(\binom{m}{n}\) 中的幂次,恰好是 \(p\) 进制下 \(m\) 减掉 \(n\) 需要借位的次数,即 \[ v_p\left(\binom{m}{n}\right)=\frac{S_p(n)+S_p(m-n)-S_p(m)}{p-1} \] 特别地,组合数中 \(2\) 的幂次是 \(v_2\left(\binom{m}{n}\right)=S_2(n)+S_2(m-n)-S_2(m)\)


推广

对于素数 \(p\) 和正整数 \(q\)\[ \left(p^{q} !\right)_p \equiv \pm 1\left(\bmod p^q\right) \]

证明:考虑配对一个数与其逆元,也就是考虑关于 \(m\) 的同余方程 \(m^2\equiv 1 \pmod{p^q}\) 的根的乘积

\(p^q = 2\) 时仅有唯一的根;当 \(p=2\)\(q \ge 3\) 时有四根,为 \(\pm 1,~(2^{q-1} \pm 1)\) ;否则有两根 \(\pm1\)​ 。\(\square\)

因此我们对威尔逊定理中的 \(\pm 1\) 有了详细的定义,即 \[ \left(p^{q} !\right)_p \equiv \begin{cases}1, & (p=2) \wedge(q \geq 3) \\ -1, & \text { otherwise }\end{cases} \] 下文两个推论中的 \(\pm 1\) 均特指这样的定义,即当模数 \(p^q\)\(2^3\) 及以上 \(2\) 的幂时取 \(1\) ,其余取 \(-1\)

推论1

对于素数 \(p\) ,正整数 \(q\) ,非负整数 \(n\)\(N_0 = (n \bmod p^q)\) ,有 \[ (n !)_p \equiv( \pm 1)^{\left\lfloor n / p^q\right\rfloor}\left(N_{0} !\right)_p \quad\left(\bmod p^q\right) \]

证明

\(\prod^{\prime}\) 为不能被 \(p\) 整除的数的乘积,则 \[ \begin{aligned} (n !)_p & =\prod_{1 \leq r \leq n}{ }^{\prime} r \\ & =\left(\prod_{i=0}^{\left\lfloor n / p^q\right\rfloor-1} \prod_{1 \leq j \leq p^q}{ }^{\prime}\left(i p^q+j\right)\right)\left({\prod_{1 \leq j \leq N_0}}^{\prime}\left(\left\lfloor n / p^q\right\rfloor p^q+j\right)\right) \\[6pt]& \equiv\left(\left(p^{q} !\right)_p\right)^{\left\lfloor n / p^q\right\rfloor}\left(N_{0} !\right)_p \\[6pt]& \equiv( \pm 1)^{\left\lfloor n / p^q\right\rfloor}\left(N_{0} !\right)_p \pmod{p^q} \end{aligned} \] 第二行是将 \(1 \times 2 \times 3 \times \cdots \times n\) 记为 \(\left(0 \times p^q+1\right) \times\left(0 \times p^q+2\right) \times \cdots \times\left(\left\lfloor n / p^q\right\rfloor p^q+N_0\right)\)\(\square\)

推论2

对于素数 \(p\) ,正整数 \(q\) 和非负整数 \(n\)\[ \frac{n !}{p^{\sum_{j \geq 1}\left\lfloor\frac{n}{p^j}\right\rfloor}} \equiv( \pm 1)^{\sum_{j \geq q}\left\lfloor\frac{n}{p^j}\right\rfloor} \prod_{j \geq 0}\left(N_{j} !\right)_p \pmod{p^q} \] 其中 \(N_j=\left\lfloor n / p^j\right\rfloor \bmod p^q\)​ 。

\(r = n - m\)\(n > m\) ,并记 \(\nu(n !)=\sum_{j \geq 1}\left\lfloor n / p^j\right\rfloor\)\[ \frac{( \pm 1)^{\sum_{j \geq q}\left(\left\lfloor n / p^j\right\rfloor-\left\lfloor m / p^j\right\rfloor-\left\lfloor r / p^j\right\rfloor\right)}}{p^{\nu(n !)-\nu(m !)-\nu(r !)}}\left(\begin{array}{c} n \\ m \end{array}\right) \equiv \frac{n ! / p^{\nu(n !)}}{\left(m ! / p^{\nu(m !)}\right)\left(r ! / p^{\nu(r !)}\right)} \quad\left(\bmod p^q\right) \] 右边的分母括号内的项均在模意义下存在逆元,可直接计算,而 \(\pm 1\) 的与上述相同。

但是这谁记得住啊?!(另:\(\nu\)\nu ,不是 \(v\) 也不是 \(\upsilon\) ,但是这也不重要)


参考文献

[1] https://oiwiki.org/math/number-theory/wilson/


文章作者: q779
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-ND 4.0 许可协议。转载请注明来源 q779 !
评论
  目录