逆元存在的
求單個逆元,一般用快速冪或者擴充套件歐幾里得演算法,複雜度為log(p)。
若是遞推求解所有逆元,複雜度為線性。
前幾天在看 lucas 定理的時候發現要求 1,2
,⋯,p
−1modp
1, 2,⋯,p−1modp
的逆元,然後就看到了乙個 θ(n
) θ(n)
的做法發現太神了,雖然想起來是挺簡單的
這個做法實際上是這樣的,首先 1−1
≡1(modp)
1−1≡1(modp)
然後我們設 p=k
⋅i+r
,r1<
i<
p p=k⋅i+r, r
再將這個式子放到
modp
modp
意義下就會得到k⋅
i+r≡
0(modp
) k⋅i+r≡0(modp)
兩邊同時乘上 i−1
⋅r−1
i−1⋅r−1
就會得到k⋅
r−1+
i−1i
−1i−
1≡≡≡
0−k⋅
r−1−
⌊pi⌋
⋅(pmodi)
−1(modp)
(modp)
(modp)
k⋅r−1+i−1≡0(modp)i−1≡−k⋅r−1(modp)i−1≡−⌊pi⌋⋅(pmodi)−1(modp)
於是就可以從前面推出當前的逆元了,**也就一行
c++ 1a
[i]=
-(p/
i)*a
[p%i
];
線性求所有數模p的乘法逆元
假如當前計算的是x在 p意義下的逆元,設 p kx y 則 large kx y equiv 0 mod p 兩邊同時乘上 x y 這裡代表逆元 則方程變為 large k y x equiv 0 mod p 化簡得 large x equiv k y mod p large x equiv big...
數論 線性求所有逆元的方法
前幾天在看 lucas 定理的時候發現要求 1,2 p 1modp 1,2,p 1modp 的逆元,然後就看到了乙個 n n 的做法發現太神了,雖然想起來是挺簡單的 這個做法實際上是這樣的,首先 1 1 1 modp 1 1 1 modp 然後我們設 p k i r r1 i p p k i r,r...
Lucas定理 線性求所有逆元的方法
主要繞過費馬小定理來證明lucas定理,挺有意思.此外設定多進製計算機可以通過移位運算直接加快多進製運算的速度。1.lucas定理 lucas定理解決的問題是組合數取模。數學上來說,就是求 n m modp 這裡n,m 可能很大,比如達到 1015,而p 在109以內。顯然運用常規的階乘方法無法直接...