質數學習筆記
##定義
質數又稱素數,有無限個。指一個大於1的自然數,除了1和它本身外,不能被其他自然數整除的數,換句話說就是該數除了1和它本身以外不再有其他的因數;大於1又不是質數的正整數稱為合數。
注意:1.1既不是質數也不是合數.2.2是最小的質數也是唯一一個偶數質數
為何質數是無限多的 假設質數有限 分別為$p_1,p_2,p_3......p_n$,這里最大的質數是$p_n$ 有$m=p_1p_2p_3...p_n+1$ 則$m\mod p_1=1,m\mod p_2=1,m\mod p_3=1.......m\mod p_n=1$,顯然m%任一個其中的素數都余1 所以m也是一個質數或者有比$p_n$更大的質因數,這與假設$p_n$是最大的素數矛盾 所以不存在最大的素數 ,所以素數個數無限
##定理
###算數基本定理
任何一個大於1的正整數都能唯一分解為有限個質數的乘積
下面是來自百度百科的表述:
算術基本定理可表述為:任何一個大於1的自然數 \(N\),如果$N$不為質數,那么$N$可以唯一分解成有限個質數的乘積$N=P_1^P_2^P_3^......P_n^$,這里$P_1<P_2<P_3......<P_n$均為質數,其中指數$a_i$是正整數。這樣的分解稱為$N$的標准分解式。
自我覺得並不是很正確,因為即使$N$是個質數,那他也能分解成自己啊,所以任何一個大於1的正整數都能唯一分解為有限個質數的乘積,可寫作:
\(N=p_1^{c_1}p_2^{c_2}……p_m^{c_m}\)
其中$c_$都是正整數,$p_i$都是質數且滿足$p_1<p_2<p_3......<p_n$(你也許會說艹和上面的不是一樣嗎,沒錯就是一樣的,我就想打一遍而已)
###質數分布定理
對於正實數$n$,定義$\pi(n)$為不大於$n$的質數個數,則有:
\(\pi(n)\approx\frac{n}{\ln n}\)
質數分布定理中的$n$越大,這個公式就越准,同時也可以這樣寫:
\(\lim\limits_{x\to\infty}\dfrac{\pi(x)}{x/ln(x)}=1\)
由質數定理可以給出第$n$個質數$p(n)$的漸進估計:\(p(n)≈n\ln n\)
知道就好了qwq
##質數的判定
###試除法
最簡單的是從$2$判斷到$N$直接跑一邊,判斷$N%i$是不是為0,但是這樣是$O(N)$的算法,跑得太慢了,所以我們要想一個效率更高的方法
$N$不必唄$2$$N$之間的每一個整數去除,只需被$2$$\sqrt N$之間的每一個整數去除就可以了。如果$N$不能被$2$$\sqrt N$間任一整數整除,N必定是素數。因為如果$N$能被$2$$N-1$之間任一整數整除,其二個因子必定有一個小於或等於$\sqrt N$,另一個大於或等於$\sqrt N$(也就是說因子是成對出現的).代碼實現如下:
bool isPrime(int n){
if(n==1)return false;//特判N=1的情況
int sq=sqrt(n);
for(int i=2;i<=sq;i++){
if(n%i==0){
return false;
}
}
return true;
}
###尊享版判斷質數
首先看一個關於質數分布的規律:大於等於5的質數一定和6的倍數相鄰。例如5和7,11和13,17和19等等;
證明:令$x≥1$,將大於等於$5$的自然數表示如下:
··· 6x-1,6x,6x+1,6x+2,6x+3,6x+4,6x+5,6(x+1),6(x+1)+1 ···
可以看到,不和6的倍數相鄰的數為$6x+2,6x+3,6x+4$,由於$2(3x+1)$,$3(2x+1),2(3x+2)$,所以它們一定不是素數,再除去$6x$本身,顯然,素數要出現只可能出現在$6x$的相鄰兩側。因此在$5$到$\sqrt$中每$6$個數只判斷$2$個,時間復雜度$O(\sqrt/3)$
int isPrime(int n) {
float n_sqrt;
if(n==2 || n==3) return 1;
if(n%6!=1 && n%6!=5) return 0;
n_sqrt=floor(sqrt((float)n));
for(int i=5; i<=n_sqrt; i+=6) {
if(n%(i)==0 | n%(i+2)==0) return 0;
}
return 1;
}
##質數的篩選
###埃氏篩
埃氏篩法,全稱埃拉托斯特尼篩法~~(什么亂七八糟的)~~,是一種由埃及數學家埃拉托斯特尼所提出的一種簡單檢定素數的算法,其基本思想是:質數的倍數一定不是質數
實現: 先假設所有的數都是質數,然后從小到大枚舉數$i$,若$i$沒有被標記過,則這個數不能被$[2,N-1]$之間的任何數整除,也就是說,該數就是質數。然后我們把找到的質數的倍數標記為合數,依次判斷即可,時間復雜度$O(N\log \log N)$
ps:對1進行特判即可
(具體例子找度娘即可,搜索埃氏篩)
代碼實現如下:
#include<bits/stdc++.h>
using namespace std;
int pri[10000],vis[1000001];
int n,m=0;
void prime(int n) {
memset(vis,0,sizeof(vis));
for(int i=2; i<=n; i++) {
if(vis[i])continue;
pri[++m]=i;
for(int j=1; j<=n/i; j++) {
vis[i*j]=1;
}
}
}
int main(){
scanf("%d",&n);
prime(n);
for(int i=1;i<=m;i++){
cout<<pri[i]<<" ";
}
return 0;
}
###線性篩法(歐拉篩)
在上面的埃氏篩中,我們發現,總有一些數會被標記多次,所以我們要想一個萬全之策,只讓一個數被標記一次,達到線性復雜度,即$O(N)$。
因此我們想到了線性篩,線性篩的基本思路就是使每個數只被篩一次。因為對於兩個數$a$(質數),\(b\)(合數),$a*b$一定為合數。
我們可以通過最小質因數來判斷當前合數是否已經被標記過。我們在生成一個需要標記的合數時,每次只向現有的數上乘上一個質因子,並且讓它是這個合數的最小質因子,這相當於讓合數的質因子從小到大累積,即讓每一個合數只由一種方式產生,這樣一來每個合數只會被它的最小質因子篩一次,達到了$O(N)$的復雜度
代碼實現如下:
int num;
int p[N],vis[N];
void prime(int i) {
for(int i=2; i<=n; i++) {
if(!vis[i])p[++num]=i;
for(int j=1; j<=num; j++) {
if(i*p[j]>n) break;//越界直接break跳出
vis[i*p[j]]=1;//標記為合數
if(i%p[j]==0)break;//一個重要的地方,下面要講
}
}
}
為什么要在$i\mod p[j]==0$時break呢?
以$30$為例:$30=2\times 3\times 5$
假設我們沒有break,此時$i=10$,在用$p[2]$也就是$3$的時候去篩它的倍數,我們能夠將$30$標記為合數$(10\times 3=30)$,而當$i=15$時,我們又用$p[1]$也就是$2$,再次將$30$標記了一次$(15\times2=30)$,那么這樣的話$30$被標記了多次,就不符合我們所說的線性篩法了,因為我們所說的是每個數只會被標記$1$次,所以在$i%p[j]==0$時$break$,就能夠保證每個數都被篩到了一次
那么為何$p[j]$就是$i$的最小質因子呢?
假如$i$有更小的質因子的話,那在篩到$p[j]$之前的時候,就已經被枚舉到了(因為我們是從小到大枚舉質數,當時就要$break$),所以$p[j]$就是$i$的最小質因子
下面我不要臉的把學長課件里的解釋搬上來,肯定能幫助你們進一步理解啦
由於我們的$p$是從小到大枚舉的,可以說$p[j]$是$i$的最小質因子 當$i$能被$p[j]$整除時,$i\times p[j+1],i\times p[j+2]…$這些合數也可以被$p[j]$整除,若我們不停止循環,這些合數會被別的質數篩掉,也就是說我們沒有用最小質質因子去篩的它,這樣一個數會被篩多次,降低了效率。
##質因數分解
前面我們說過算數基本定理,即任何一個大於1的正整數都能唯一分解為有限個質數的乘積,寫作: \(N=p_1^{c_1}p_2^{c_2}……p_m^{c_m}\) (我和諧地又寫了一遍)
這其實就是對於N這個數的質因數分解,並且這種分解是唯一的 ##質數的相關定理 ###唯一分解定理 若整數$a\geq 2$,那么$a$一定可以表示為若干個素數的乘積(唯一的形式) ###威爾遜定理 若$p$是素數,則$(p-1)!\equiv-1(\mod p)$ 威爾遜定理的逆定理也成立,即: 若對一整數$p$,有$(p-1)!\equiv-1(\mod p)$,則$p$一定是素數 威爾遜定理也可寫作:若$p$為質數,則$p$可整除$(p-1)!+1$. 證明: 對於偶質數$2$,命題顯然成立; 對於奇質數,令$a∈A={2,3,4.p-2}$,則$B={a,2a,3a,.,(p-1)a}$中不會有對於除數$p$同余的兩個數;事實上 \(αa,βa∈B,αa≡βa(\mod p)\),則$a|α-β|$能被$p$整除,而$a|α-β|∈B$,$B$中的元素不可能被$p$除盡.於是$B$中被$p$除得的余數形成集合${1,2,3,...,p-1}$. 假設$b$中被$p$除余一的數是$γa$: 一.若$γ=1$,則$γa=a$,它被$p$除余$a$,所以$γ=1$不成立; 二.若$γ=p-1$,則$γa=(p-1)a$,它被$p$除余$a$,所以$γ=p-1$不成立; 三.若$γ=a$,則$γa=a\ast a$,由於$a\ast a≡1(\mod p)$,故應有$a\ast a-1=(a+1)(a-1)≡0(\mod p)$,這只能是$a=1$或$a=p-1$,此與$a∈A$矛盾,故不成立; 有一二三知$γ≠a$且$a∈A$. $a$不同時,$γv$也相異;若$a1≠a2$,\(a1\),\(a2∈A\),且$γa1≡γa2≡1(\mod p)$,因,\(γa1,γa2∈B\),而$B$中的元素關於$\mod p$不同余,可見$a1≠a2$,則$γ1≠γ2$. 即每一個$a$均可找到與其配對的$y$使其$ay≡1(\mod p)$ \(∴ 1×2×3×4.(p-2)≡1(\mod p)\) \(p-1≡-1(\mod p)\) \(∴ (p-1)!≡-1(\mod p)\) 從而$p$可整除$(p-1)!+1$ ###費馬小定理 若$p$為素數,$a$為正整數,且$a$與$p$互質,則$a^\equiv1(\mod p)$.