素數演算法的優化之路

2021-07-03 01:14:25 字數 1332 閱讀 4995

一、素數的定義

質數又稱素數。指在乙個大於1的自然數中,除了1和此整數自身外,不能被其他自然數(不包括0)整除的數。因為合數是由若干個質數相乘而得來的,所以,沒有質數就沒有合數,由此可見質數在數論中有著很重要的地位。

比如:2,3,5,7,9.....都是素數。

二、構造素數演算法

寫演算法之前,先來說說以下這個東西:

對於任意乙個合數n,如果它有兩個質因子x,y,顯然n = x*y, 

所以,由不等式性質可得,x <= sqrt(n), 即 x <= n^(1/2)。

推廣一下,對於任意乙個合數,如果它有k個質因子x1,x2,x3,.... ,xk,顯然n = x1 * x2 * x3 * .... * xk,

所以,由不等式性質可得, x <= n^(1/k),即每個質因子必小於或者等於n開k次方,其中x 屬於集合。

定義乙個全域性變數和乙個全域性陣列,要是陣列是分配在棧上的話,是有容量限制的,所以我們就定義個全域性的。

const unsigned int n = 50000;

bool flag[n+1];

1、演算法一:按照定義,即可快速寫出乙個簡單的構造素數演算法

void primecreatecommon()//按照定義

} //if ( flag )

//} cout << endl;

}

分析:該演算法的時間複雜度為o(n*sqrt(n) ),在n比較大時(比如n = 50000),我的機器跑了個二十來秒,就也叫演算法,呵呵,所以接下來我們來看另一種演算法 ,那就是

古希臘數學家的埃拉託色尼給出的乙個比較省力的演算法------埃拉託色尼篩法。

2、演算法二:篩選法

首先,列出從2開始的數。然後,將2記在素數列表上,再劃去所有2的倍數。根據定義,剩下的最小的數——在這裡是3——必定是素數。將這個數記在素數列表上,再劃去所有它的倍數,這樣又會剩下一些數,取其中最小的,如此反覆操作。最後剩下的都是素數。

void primecreateext()//篩選法優化

} }// for ( int i = 2; i <= n; ++i )

//

// }

// cout << endl;

}

三、兩種演算法的執行時間對比

//測試函式

int main()

//產生50萬以內的素數執行時間對比 

四、空間上的優化

python判斷素數優化 求素數優化演算法

在比賽或者工作時,有時候會經常要求我們程式設計求素數,但是我們自己寫出來的時間複雜度太高,所以我在這裡做個總結。先貼上最終函式,該段 在開啟最大 優化時,可以直接內嵌進呼叫程式中,使得速度更加極致。c語言 對 n 進行素數判斷 inline static int is prime int n int...

關於素數判斷演算法優化方法的討論

今天看見乙個求給定範圍內素數個數的程式設計題目,覺得還是有些小玄機的,特此分享一下。所有有關素數的問題首先都會涉及到乙個問題,就是判斷乙個數是不是素數,判斷乙個數是不是素數方法很簡單,根據素數的定義 素數是只能被1和它自身整除的大於1的自然數 可以很容易寫出程式出來,但是用一些小技巧的話可以將程式更...

求素數的優化

學習自 傳送門 1.乙個乙個找,找因子直到i 2.找因子直到i 2 比如 判斷i是否為素數,則看i是否能整除j 2 i 2 3.找因子直到根號i 比如 判斷i是否為素數,則看i是否能整除j 2 根號i 因為對於16,根號16 4,那麼判斷8是16因子就沒必要了,因為2 8 16,如果已經找到8,那麼...