数论逆元
文章目錄
- 1 什么是逆元
- 2 存在逆元的條件是什么
- 3 怎樣求一個數的逆元
- 1.[ 歐幾里得擴展]
- 2. 費馬小定理 (最常用)
- 4 擴展(常用)
- 1. 線性逆元(常用)
- 2 快速階乘逆元(常用)
逆元是數論之中的一個重要概念
參考博客 ACdreamer
參考書籍 《高中數學 選修 4-6》
1 什么是逆元
2 存在逆元的條件是什么
3 怎樣求一個數的逆元
1.[ 歐幾里得擴展]
不懂的點這里
a?b+n?t=1a*b + n *t = 1a?b+n?t=1
2. 費馬小定理 (最常用)
- 如果n 是素數,費馬小定理 a(n?1)=1(modn)a^{(n-1) }= 1 \ (mod \ n)a(n?1)=1?(mod?n),那么a關于n的逆元就 是a(n?2)a^{(n-2)}a(n?2)
- 如果n 不是素數,利用歐拉定理同理
4 擴展(常用)
1. 線性逆元(常用)
如果p是一個奇質數,則可以在o(n)時間內求出所有關于同余系關于p的逆元
證明如下
對p進行帶余除法,求i的逆元
p=i?k+t(0<t<i)p = i * k + t \ ( 0 < t < i)p=i?k+t?(0<t<i)
等式兩邊同時對關于p取模
于是 t=?i?k(modp)t = -i * k ( mod \ p)t=?i?k(mod?p)
等式兩邊同時乘以 inv(i)?inv(t)inv(i) * inv(t)inv(i)?inv(t)
inv(i)=?k?inv(t)(modp)inv(i) = -k * inv(t) ( mod\ p)inv(i)=?k?inv(t)(mod?p)
inv(i)=(p?k?inv(t))(modp)inv(i) = (p - k* inv(t)\ ) (mod\ p)inv(i)=(p?k?inv(t)?)(mod?p)
inv(i)=(p?p/i?inv(p%i))(modp)inv(i) = (p - p \ / \ i * inv(p\ \% \ i ) ) (mod \ p)inv(i)=(p?p?/?i?inv(p?%?i))(mod?p)
這樣就可以用一個數組存儲關于p的所有逆元
2 快速階乘逆元(常用)
const int maxn = 1e5+10; long long fac[maxn],invfac[maxn]; void init(int n){fac[0] = 1;for(int i = 1;i <= n; ++i) fac[i] = fac[i-1]*i%mod;invfac[n] = qpow(fac[n],mod-2);for(int i = n-1;i >= 0; --i) invfac[i] = invfac[i+1]*(i+1)%mod; }總結
- 上一篇: [短彩信]C#短彩信模块开发设计(2)—
- 下一篇: GIS数据里的4D数据