根號法 埃氏法 尤拉篩選。三種方法求素數

2021-08-06 01:41:44 字數 2061 閱讀 2499

先上開根號求素數

乙個數n的最小質因子,必定小於開根號n:

數學表達:a*b=n,若a《開根號n,b必定》開根號n,所以只要求2~開根號n,即可判斷n是不是素數。

反證法如果數n的最小質因子a大於開根號n,那數n的另乙個因子b,(b和a構成一對n的約數),

必定大於a,那麼也大於根號n,

這時候,a*b必定大於n,所以原命題正確

自己的證明:乙個數n,那麼有 0~開跟號n=>左域  ,開根號n~n-1=>右域。   

開根號n就在中間了,開根號n*開根號n=n,這個是最平衡的組合了。

假設n=a*b。a和b!=開根號n,那麼 a和b必定乙個在左域,乙個在右域。

如果a和b都取值於左域,那麼a*b必定  如果a和b都取值於右域,那麼a*b必定》n

所以原命題成立。

**過於簡單,這裡就不貼出來了,只講述原理。

埃氏法求素數

eratosthenes篩選法求解質數

思路:用一句形象的話來形容這個演算法,就是一山難容二虎。例如,2是乙個質數,那麼他可以留在質數表裡面,

那麼,如果2後面的數能夠被2整除的,肯定就不是素數,所以剔除之。(只要前面的有乙個質數【第1虎】,後面為他的倍數的數就肯定不是素數【第2虎】根據素數的定義)

/* note:your choice is c ide */

#include "stdio.h"

/*//優化前的埃氏演算法主要有1個缺點

//1.求素數倍數的時候,是乙個乙個得求,(比如求2的倍數的時候,是直接從2開始,然後乙個乙個往上加,一直求到n),所以它所檢測過數是乙個連續的序列

//void main()

for(n=2;n<=100;n++)} }

}for(n=1;n<=100;n++)

}}*///優化後的埃氏演算法,主要優化2點

//1.求6的倍數,不從2開始乘,(既2*6,因為前面算2的時候,已經算過了),直接從6*6開始

//2.對求過的數進行判斷,如果已經不是素數了,就直接跳過

//對比優化之前的埃氏演算法,檢測素數倍數的時候,是以點的方法去算,優化之前是以乙個連續的序列去算的(比如求2的倍數,優化之前是從2一直加到n-1。優化後的是直接用 2*2 2*3 2*4 ····2*n 《n,)優化後的埃氏演算法,求素數的所檢測過的數是乙個乙個點,那效果肯定比之前的一大串串行好

void main()

for(i=2;i<=100;i++)

} } }

for(i=1;i<=100;i++)}}

先介紹一下尤拉篩選的原理:  

假設prime陣列現在存放著i之前的素數。

i=6 ,prime=2,prime=3,prime=5;

如果,i%prime=0,那麼(i*prime)%prime必定也會定於0;

換成具體數字,6%2=0;(6*3)%2=0

因為,i能整除prime,說明prime是i的因子。那不管i乘以多少,結果必定能夠整除prime;

也就是說,當未來i跳到9的時候,2*9,會再次進行一次篩選,那麼就存在冗餘了。

下面介紹整個演算法的流程

for(i=>2~n)

也就是說,不管i是不是素數。先把i*prime篩選出來。

如果這個數是素數,那麼就直接把i之前的素數跟他相乘,得出來的數標記為素數。

如果這個數是合數,那麼就根據上面介紹的原理對i進行處理。

如果i不是素數,那麼他必定能整除prime【0-top】(既當前的已經篩選出來的素數,也就是i之前的素數。)中的某乙個素數。

/* note:your choice is c ide */

#include "stdio.h"

int p[10000];

int prime[10000];

int n=100;

void main()

for(j=0;j

線性篩法求素數(埃氏篩法 尤拉篩法)

篩法都是初始化把所有數都先設為素數,然後篩除合數。理解起來比較簡單,就是從小到大的列舉每乙個數,標記它的所有倍數都是合數 非素數 放到u i 為false,u中的下標對應的就是這個數的值。bool u maxn int num,su maxn 1.埃氏篩法 void prime 從小到大的篩選素數,...

快速求素數表 埃氏篩法與尤拉篩法

尤拉篩法 素數的定義 素數就是除了1和本身之外沒有其他的約數,所以有約數的都不是素數。因此,埃氏篩法的思想就是 先去掉2的倍數,再去掉3的倍數,再去掉4的倍數,依此類推,直到最大數小於最後乙個標出的素數的平方,那麼剩下的序列中所有的數都是素數。o nloglogn 時間複雜度的證明戳此鏈結 incl...

篩選素數的三種方法 包含尤拉篩

具體方法的介紹可以看下面詳細 有注釋 選出素數方法 include include include include include using namespace std const int maxn 1010 方法1 試除法 bool s prime int a return true 方法2 埃...