Lucas定理 推導及證明

2021-08-07 08:50:23 字數 1818 閱讀 3237

當n、m為大數,p為素數時,

lucas定理是用來求 c(n,m) mod p的

值。適用領域範圍

:在數論中求大組合數取模。

表示式:

c(n,m)%p=c(n/p,m/p)*c(n%p,m%p)%p

lucas定理:我們令

n=sp+q , m=tp+r

. (q ,r ≤p)

那麼:(在程式設計時你只要繼續對

呼叫lucas定理即可。

**可以遞迴的去完成這個過程,其中遞迴終點為

t = 0 ;

時間 o(log

p(n)*p))。

要證:c(n,m)%p=c(n/p,m/p)*c(n%p,m%p)%p

即證:c(n,m)=c(n/p,m/p)*c(n%p,m%p)

已知p是素數,n、m、p為整數。

1.由二項式定理得:

2.由費馬小定理得:

(1)式 :(1+x)^p ≡ (1+x)(mod p).

(2)式 :(1+x^p)≡ (1+x)(mod p).     (因為x^p與x取模p同餘,同時加1也同餘 )

則由上式可知:

(1+x)^p ≡  (1+x^p)(mod p)  (記為(3)式)

3.n = n/p*p + n%p.則:

(1+x)^p(mod p) = (1+x)^(n/p*p)*(1+x)^(n%p)(

mod p)

由式3得:             (1+x)^p(

mod p

)= (1+x^p)^(n/p)*(1+x)^(n%p)

(mod p

)將上式由二項式公式可轉化為:(這一排你用手寫看一下吧,這編輯器裡太難敲了……)

∑(n,z=0)c(n,z)* x^z (mod p)=∑(n/p,i=0)c(n/p,i)* x^(p*i)*∑(n%p,j=0)c(n%p,j)* x^j(

mod p)

任意乙個z,必存在乙個i,j滿足:x^z = x^(p*i)*x^j(即滿足:n = n/p*p + n%p),當且僅當:

i=z/p,j=z%p

時成立此時:          

c(n,m)=

c(n/p,m/p)*c(n%p,m%p)  成立

得證!

**求解過程中,不斷將c(n/p,m/p)拆分化簡,實質是一直在計算c(n%p,m%p),即:

c(n,m)%p=c(n/p,m/p)*c(n%p,m%p)%p

等價於c(n,m)%p=c(n/p/p,m/p/p)*c(n/p%p,m/p%p)%p

等價於c(n,m)%p=c(n/p/p/p,m/p/p/p)*c(n/p/p%p,m/p/p%p)%p

等價於…

直到拆分至m=0,遞迴完成。

#includeusing namespace std;

typedef long long ll;

ll fastmod(ll a,ll b,ll p) //費馬小定理

return cnt;

}ll comb(ll a,ll b,ll p) //組合數

{ ll ca=1,cb=1,tmp=1;;

if(aa-b) b=a-b;

for(ll i=0;i>n>>m>>p)

{ll ans=lucas(n,m,p);

cout<

~step by step

lucas定理證明

lucas 定理 證明 a b是非負整數,p是質數。ab寫成p進製 a a n a n 1 a 0 b b n b n 1 b 0 則組合數c a,b 與c a n b n c a n 1 b n 1 c a 0 b 0 mod p 相同 即 lucas n,m,p c n p,m p lucas ...

瞎搞 Lucas定理證明

求證cn m i 0kc nimi modp 其中m ki 0mip i n ki 0nip i p是質數。首先,我們知道,n0 nmodp,m 0 mmodp 那麼原式相當於求證cn m c np mp cnmodp mmod pmodp 這樣就可以歸納一發證明整個定理了。首先我們知道,對於任意的...

Lucas定理以及證明

對著無數篇部落格終於 yy 懂了 lucas 定理,興奮之際趕緊寫下來 如果 p 是質數,那麼 c equiv c times c mod p 首先我們要知道乙個性質 如果 p 為質數,那麼有 c equiv 0 mod p 其中 n ne 0,p 這個很顯然吧,考慮把組合數的式子寫出來 c p n...