威尔逊定理(Wilson 定理)
内容
对于素数 $p$ 有
对于整数 $n$ ,令 $(n!)_p$ 表示所有小于等于 $n$ 但不能被 $p$ 整除的正整数的乘积,即
威尔逊定理指出 $(p !)_p=(p-1) ! \equiv-1 \pmod{p}$ 且可被推广至模素数 $p$ 的幂次。
应用
1. 阶乘 & 素数
(这一段我本来想直接搬 oiwiki 的文本的,然而这 oiwiki 怕不是机翻的)
在某些情况下需要考虑以素数 $p$ 为模数的公式,而且是含有分子和分母都含有阶乘的某些分式
考虑用 $p$ 的幂次的形式表示 $(n!)_p$ ,如下
吐槽:oiwiki 的 $\cdot \ldots \cdot$ 是什么逆天写法 。
可以发现,除了最后一部分,其余部分被划分为了几个长度相同的块
块的主要部分的 $(p-1)! \bmod{p}$ 很容易计算,可以直接应用威尔逊定理
而最后一个块则可以在 $\mathcal{O}(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!)$ 为
其中 $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$ 需要借位的次数,即
特别地,组合数中 $2$ 的幂次是 $v_2\left(\binom{m}{n}\right)=S_2(n)+S_2(m-n)-S_2(m)$
推广
对于素数 $p$ 和正整数 $q$ 有
证明:考虑配对一个数与其逆元,也就是考虑关于 $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$ 有了详细的定义,即
下文两个推论中的 $\pm 1$ 均特指这样的定义,即当模数 $p^q$ 取 $2^3$ 及以上 $2$ 的幂时取 $1$ ,其余取 $-1$
推论1
对于素数 $p$ ,正整数 $q$ ,非负整数 $n$ 和 $N_0 = (n \bmod p^q)$ ,有
证明:
令 $\prod^{\prime}$ 为不能被 $p$ 整除的数的乘积,则
第二行是将 $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$ 有
其中 $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$ 有
右边的分母括号内的项均在模意义下存在逆元,可直接计算,而 $\pm 1$ 的与上述相同。
但是这谁记得住啊?!(另:$\nu$ 是\nu
,不是 $v$ 也不是 $\upsilon$ ,但是这也不重要)
参考文献: