1. 程式人生 > 其它 >剩餘類 完全剩餘系 縮減剩餘系 尤拉定理 擴充套件尤拉定理

剩餘類 完全剩餘系 縮減剩餘系 尤拉定理 擴充套件尤拉定理

數論

這篇關於數論的隨筆,我將近拖了兩個星期(大笑),完全就是因為懶,最近閒的沒事,就來重蹈覆轍來將這篇隨筆寫完。這是我第一篇關於數論的隨筆,希望大佬們能夠提出寶貴的意見。好了,話不多說,上菜!

同餘類(剩餘類)

說到同餘類這個名詞,相信很多的小夥伴都能夠很明確的知道這個名詞的含義,但是為了更好的回顧這些知識點和掌握知識,所以,我覺得還是有必要解釋一下。
同餘類,即給定一個正整數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;
}
好了,這就是這篇隨筆的全部內容了,歡迎大家指正!