【數論學習筆記】同余
阿新 • • 發佈:2019-05-08
oid its study bsp pan cos space pac clas
洛谷P1082題解:https://www.luogu.org/blog/costudy/solution-p1082
知識:
費馬小定理:若 p 是質數,則對於任意整數 a ,有 ap = a (mod p),也就是ap-1=1 (mod p)。
Bézout定理:對於任意整數 a , b ,存在一對整數 x , y ,滿足 ax+by=gcd(a,b) 。
Bézout定理計算x,y的方法:拓展歐幾裏得算法:
代碼如下(兩種辦法,更喜歡2)
inline int exgcd(int a,int b,int &x,int&y){ if(b==0) {x=1,y=0;return a;} int d=exgcd(b,a%b,x,y); int z=x;x=y;y=z-(a/b)*y; return d; } long long x, y; inline void exgcd2(long long a,long long b){ if(b==0){ x=1,y=0; return; } exgcd(b,a%b); long long xx=x; x=y; y=xx-a/b*y; }
證明在開頭題解裏。
乘法逆元:如果 ax≡1 (mod p), 且 gcd(a,p)=1(a與p互質),則稱a關於模p的乘法逆元為x。
求法:費馬小定理,拓展歐幾裏得,線性遞推。
線性遞推代碼如下(1到n關於mod p的乘法逆元)洛谷p3811:
#include<bits/stdc++.h> using namespace std; const int maxn=3*1e6+10; int inv[maxn],n,p; int main() { scanf("%d%d",&n,&p); inv[1]=1; printf("1\n"); for(int i=2;i<=n;i++){ inv[i]=(long long)(p-p/i)*inv[p%i]%p; printf("%d\n",inv[i]); } return 0; }
【數論學習筆記】同余