Lucas定理:线性求所有逆元的方法
Miskcoo's Space,版權所有丨如未注明,均為原創
轉載請注明轉自:http://blog.miskcoo.com/2014/09/linear-find-all-invert
主要繞過費馬小定理來證明lucas定理,挺有意思..此外設置多進制計算機可以通過移位運算直接加快多進制運算的速度。
1.Lucas定理
Lucas定理詳解
Lucas定理解決的問題是組合數取模。數學上來說,就是求 (nm)modp。
這里n,m
可能很大,比如達到 1015 ,而 p 在 109以內。顯然運用常規的階乘方法無法直接求解,所以引入Lucas定理。
Lucas定理
把n
和 m 寫成 p 進制數的樣子(如果長度不一樣把短的補成長的那個的長度):n=(a0a1…ak)p
m=(b0b1…bk)p
那么:
(nm)≡∏ki=0(aibi)modp
證明
如果把Lucas定理從遞歸的角度理解,它其實是這樣的:
設n=ap+b,m=cp+d,(b,d<p,a=?np?,c=?mp?)(nm)≡(ac)?(bd)
這個定理的一個很巧妙的證法是通過二項式定理來說明上面的式子是成立的。
首先,對于任意質數pp,有:
(1+x)p≡1+xpmodp
其證明可以由費馬小定理(xp≡xmodp) |p為素數)
直接得出:(1+x)p≡1+x
xp≡x
所以 (1+x)p≡1+x≡1+xp
(當然同樣也有(a+b)p≡ap+bpmodp
,具體為什么你可以拆開前面的式子,將其除 ap 和 bp 項外的所有項的系數好好研究一下(其實就是楊輝三角的第p層),可以發現把對稱項系數分別合并后都能整除 p)
利用這個性質,我們證明Lucas定理:
(1+x)n=(1+x)?np??p(1+x)b=(1+xp)?np?(1+x)b=∑i=0k(?np?i)xpi∑j=0k(bj)xj
考察等式左右兩邊xmxm的系數,可以發現:
左邊右邊=(nm)=(?np?i)(bj),(pi+j=m,j<p)=(?np??mp?)(bd)
所以上面的式子成立,證明完畢。
如果不算預處理什么的,算法時間復雜度為O(logpn)
。如果能夠支持預處理,那么就加一個 O(p) ,要不就用快速冪,乘上 O(logp) 。2. 線性求所有逆元的方法
的做法發現太神了,雖然想起來是挺簡單的
這個做法實際上是這樣的,首先 1?1≡1(modp)
然后我們設 p=k?i+r,?r<i,?1<i<p
再將這個式子放到modp
意義下就會得到
k?i+r≡0(modp)兩邊同時乘上 i?1?r?1
就會得到
k?r?1+i?1i?1i?1≡≡≡0?k?r?1??pi??(pmodi)?1(modp)(modp)(modp)?于是就可以從前面推出當前的逆元了,代碼也就一行
A[i] = -(p / i) * A[p % i];Related posts:總結
以上是生活随笔為你收集整理的Lucas定理:线性求所有逆元的方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 美颜相机app怎么调试(BeautyCa
- 下一篇: 我的起源雷犀蛋在哪 我的世界Minecr