卢卡斯定理

卢卡斯定理(Lucas定理)

链接中视频给出的代码是错误的,因为有可能出现 n    m o d    p < m    m o d    p n\;mod\;p<m\;mod\;p nmodp<mmodp的情况,getC函数可能会越界。尽管这份代码不开O2确实是可以通过的,但是开了O2会无法通过。

卢卡斯定理解决大组合数模质数的问题。

卢卡斯定理指的是:
I n i = 0 ( a i ‾ ( p ) b i ‾ ← ( p ) ) ≡ ∏ i = 0 n ( a i b i ) ( m o d p )        ( p ∈ P ) \underset{i=0}{\overset{n}{\mathbb{I}}}\left({\begin{matrix} \overline{a_i}_{(p)}\\ \underleftarrow{\overline{b_i}}_{(p)} \end{matrix}}\right)\equiv \overset{n}{\underset{i=0}\prod}\left(\begin{matrix} a_i\\ b_i \end{matrix}\right)\pmod p\;\;\;(p\in\mathbb{P}) i=0In(ai(p) bi(p))i=0n(aibi)(modp)(pP)
其中 I \mathbb{I} I表示循环记号, a n a n − 1 . . . ‾ ( p ) \overline{a_na_{n-1}...}_{(p)} anan1...(p)表示将 a n , a n − 1 , . . . a_n,a_{n-1},... an,an1,...依照次序连成一个 p p p进制数。

卢卡斯定理是一个把组合数分解 p p p进制的过程,它表明,分解前后组合数模意义下相等。

卢卡斯定理还有一个常用版本:
( n m ) ≡ ( n / p m / p ) + ( n    m o d    p m    m o d    p ) ( m o d p ) \left(\begin{matrix} n\\ m \end{matrix}\right)\equiv \left(\begin{matrix} n/p\\ m/p \end{matrix}\right)+\left(\begin{matrix} n\;mod\;p\\ m\;mod\;p \end{matrix}\right)\pmod p (nm)(n/pm/p)+(nmodpmmodp)(modp)
其中 / / /表示整除。

证明一下:

(奥秘重重的证明过程)

p ∈ P p\in\mathbb{P} pP

引理1

( x p ) ≡ 0 ( m o d p )        ( 0 < x < p ) (^p_x)\equiv 0\pmod p\;\;\;(0<x<p) (xp)0(modp)(0<x<p)

这是因为,显然有 ( x p ) ≡ p ! x ! ( p − x ) ! ≡ p x ⋅ ( p − 1 ) ! ( x − 1 ) ! ( ( p − 1 ) − ( x − 1 ) ) ! ≡ p ⋅ x − 1 ⋅ ( x − 1 p − 1 ) ≡ 0 ⋅ x − 1 ⋅ ( x − 1 p − 1 ) ≡ 0 (^p_x)\equiv \frac{p!}{x!(p-x)!}\equiv \frac{p}{x}\cdot \frac{(p-1)!}{(x-1)!((p-1)-(x-1))!}\equiv p\cdot x^{-1}\cdot (^{p-1}_{x-1})\equiv 0\cdot x^{-1}\cdot (^{p-1}_{x-1})\equiv 0 (xp)x!(px)!p!xp(x1)!((p1)(x1))!(p1)!px1(x1p1)0x1(x1p1)0

在提出 p p p的过程中,必须提出 x x x,得到一个更小的组合数的原因是,必须要保证提出 p p p之后仍然是整数。

引理2

( 1 + x ) p ≡ 1 + x p ( m o d p ) (1+x)^p\equiv 1+x^p\pmod p (1+x)p1+xp(modp)

结合引理1,做二项式展开易证。

结论

n = k 1 p + r 1 , m = k 2 p + r 2 ( 0 ≤ r 1 , r 2 < p ) n=k_1p+r_1,m=k_2p+r_2(0\leq r_1,r_2<p) n=k1p+r1,m=k2p+r2(0r1,r2<p),则有:
( 1 + x ) n ≡ ∑ m = 0 n ( m n ) x m ≡ ∑ m = 0 k 1 p + r 1 ( k 2 p + r 2 k 1 p + r 1 ) x k 2 p + r (1+x)^n\equiv \overset{n}{\underset{m=0}\sum}(^n_m)x^{m}\equiv\overset{k_1p+r_1}{\underset{m=0}\sum}\left(^{k_1p+r_1}_{k_2p+r_2}\right)x^{k_2p+r} (1+x)nm=0n(mn)xmm=0k1p+r1(k2p+r2k1p+r1)xk2p+r

另有:
( 1 + x ) n ≡ ( 1 + x ) k 1 p ( 1 + x ) r 1 (1+x)^n\equiv (1+x)^{k_1p}(1+x)^{r_1} (1+x)n(1+x)k1p(1+x)r1
≡ ( ( 1 + x ) p ) k 1 ( 1 + x ) r 1 \equiv \left((1+x)^p\right)^{k_1}(1+x)^{r_1} ((1+x)p)k1(1+x)r1

应用引理2:
≡ ( 1 + x p ) k 1 ( 1 + x ) r 1 \equiv (1+x^p)^{k_1}(1+x)^{r_1} (1+xp)k1(1+x)r1
≡ ∑ i = 0 k 1 ( i k 1 ) x i ⋅ p × ∑ j = 0 r 1 ( j r 1 ) x j \equiv \overset{k_1}{\underset{i=0}\sum}\left(^{k_1}_i\right)x^{i\cdot p}\times\overset{r_1}{\underset{j=0}\sum}\left(^{r_1}_{j}\right)x^{j} i=0k1(ik1)xip×j=0r1(jr1)xj

对比系数:
≡ ∑ m = 0 k 1 p + r 1 ( k 2 p + r 2 k 1 p + r 1 ) x k 2 p + r \equiv\overset{k_1p+r_1}{\underset{m=0}\sum}\left(^{k_1p+r_1}_{k_2p+r_2}\right)x^{k_2p+r} m=0k1p+r1(k2p+r2k1p+r1)xk2p+r
≡ ∑ i = 0 k 1 ( i k 1 ) x i ⋅ p × ∑ j = 0 r 1 ( j r 1 ) x j \equiv \overset{k_1}{\underset{i=0}\sum}\left(^{k_1}_i\right)x^{i\cdot p}\times\overset{r_1}{\underset{j=0}\sum}\left(^{r_1}_{j}\right)x^{j} i=0k1(ik1)xip×j=0r1(jr1)xj

可以看出,显然,模 p p p下可以把一个数分解:
( n m ) ≡ ( n / p m / p ) + ( n    m o d    p m    m o d    p ) ( m o d p ) \left(\begin{matrix} n\\ m \end{matrix}\right)\equiv \left(\begin{matrix} n/p\\ m/p \end{matrix}\right)+\left(\begin{matrix} n\;mod\;p\\ m\;mod\;p \end{matrix}\right)\pmod p (nm)(n/pm/p)+(nmodpmmodp)(modp)

QED.

时间复杂度O(logn)

组合数模合数较繁。

后记

于是皆大欢喜。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值