1. 程式人生 > >【數論學習筆記】同余

【數論學習筆記】同余

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; }

    

  

【數論學習筆記】同余