跳转至

卢卡斯定理

前置知识:阶乘取模

引入

本文讨论大组合数取模的求解。组合数,又称二项式系数,指表达式:

(nk)=n!k!(nk)!.

规模不大时,组合数可以通过 递推公式 求解,时间复杂度为 O(nk);也可以在较大的素数模数 p>n 下,通过计算分子和分母的阶乘在 O(n) 时间内求解。但当问题规模很大(n1018)时,这些方法不再适用。

基于 Lucas 定理及其推广,本文讨论一种可以在模数不太大 (m106) 时求解组合数的方法。更准确地说,只要模数的唯一分解 m=piei 中所有素数幂的和(即 piei)在 106 规模时就可以使用该方法,因为算法的预处理大致相当于这一规模。

Lucas 定理

首先讨论模数为素数 p 的情形。此时,有 Lucas 定理:

Lucas 定理

对于素数 p,有

(nk)(n/pk/p)(nmodpkmodp)(modp).

其中,当 $n