剩餘類 完全剩餘系 縮減剩餘系 尤拉定理 擴充套件尤拉定理
阿新 • • 發佈:2022-12-10
數論
這篇關於數論的隨筆,我將近拖了兩個星期(大笑),完全就是因為懶,最近閒的沒事,就來重蹈覆轍來將這篇隨筆寫完。這是我第一篇關於數論的隨筆,希望大佬們能夠提出寶貴的意見。好了,話不多說,上菜!
同餘類(剩餘類)
說到同餘類這個名詞,相信很多的小夥伴都能夠很明確的知道這個名詞的含義,但是為了更好的回顧這些知識點和掌握知識,所以,我覺得還是有必要解釋一下。
同餘類,即給定一個正整數n,把所有的整數根據模n的結果屬於[0,n-1]劃分成n類,並且每類都可以表示為Cr=nx+r的形式,這一類數所構成的一個集合稱為模n的剩餘類。例如這個
完全剩餘系
完全剩餘系又簡稱為完系,即給定一個正整數n,有n個不同的模n的剩餘類,然後從這n個不同的剩餘類中各自選擇一個出來構成的新的集合,我們將這個新的集合稱為完全剩餘系
例如這個
簡化剩餘系
給定一個正整數n,有φ(n)個不同的模n的餘數r與n互質的剩餘類,然後從這個φ(n)個剩餘類中各自挑選出一個元素所構成的集合,我們稱之為簡化剩餘系。例如
是不是到這裡,看到φ(n)就想起了尤拉函數了呢,是的,到了簡化剩餘系,我們就要開始複製尤拉定理了。
尤拉定理
尤拉定理相對於費馬小定理來講,其對數的約束降低了,也就是費馬小定理中p一定要是質數,且滿足gcd(a,p)=1,但是對於尤拉定理來說,p可以是任意數,只需要滿足gcd(a,p)=1即可,所以從這裡是不是可以看出尤拉定理和費馬小定理到達聯絡了呢,沒錯,當p為質數的時候,φ(p)=p-1這個就是我們的費馬小定理了。所以我們按照證明費馬小定理的那樣的證明方法來證明尤拉定理,即
擴充套件尤拉定理
擴充套件尤拉定理的含金量不用我多說了吧,完全將大冪冪拿捏成小冪冪,然後直接快速冪就好了。
這裡給出一道需要擴充套件尤拉定理的題——洛谷5091
洛谷
下面是AC程式碼:
點選檢視程式碼
/* */ /* 對題目的理解: 擴充套件尤拉定理 */ #include <bits/stdc++.h> using namespace std; typedef long long ll; char s[20000005]; //求解尤拉函式 int get_phi(int n){ int res=n; for(int i=2;i*i<=n;i++){ if(n%i==0){ res=res/i*(i-1); while(n%i==0) n/=i; } } if(n>1) res=res/n*(n-1); return res; } //使用擴充套件尤拉定理進行降冪 int flag=0; int depow(int phi){ int b=0; for(int i=0;s[i];i++){ b=b*10+(s[i]-'0'); if(b>=phi) flag=1,b%=phi; } if(flag) b+=phi; return b; } //快速冪 int m; int quickPow(ll a,int b){ int res=1; while(b){ if(b&1){ res=res*a%m; } a=a*a%m; b>>=1; } return res; } int a,b; int main(){ cin>>a>>m; scanf("%s",s); int phi=get_phi(m); b=depow(phi); cout<<quickPow(a,b)<<endl; system("pause"); return 0; }