求質數 素數 演算法思想

2021-06-07 13:11:19 字數 2817 閱讀 4159

此演算法是網上查詢到的

,覺得不錯

,所以拿來與大家分享

!!

1

】求10000

以內的所有素數。

素數是除了

1和它本身之外再不能被其他數整除的自然數。由於找不到乙個通項公式來表示所有的素數,所以對於數學家來說,

素數一直是乙個未解之謎。像著名的

哥德**猜想、孿生素數猜想,幾百年來不知吸引了世界上多少優秀的數學家。儘管他們苦心鑽研,嘔心瀝血,但至今仍然未見分曉。

自從有了計算機之後,人們借助於計算機的威力,已經找到了

2216091

以內的所有素數。

求素數的方法有很多種,最簡單的方法是根據素數的定義來求。對於乙個自然數

n,用大於1小於

n的各個自然數都去除一下

n,如果都除不盡,則

n為素數,否則

n為合數。

但是,如果用素數定義的方法來編制電腦程式,它的效率一定是非常低的,其中有許多地方都值得改進。

第一,對於乙個自然數

n,只要能被乙個非

1非自身的數整除,它就肯定不是素數,所以不

必再用其他的數去除。

第二,對於

n來說,只需用小於

n的素數去除就可以了。

例如,如果n能被

15整除,實際上就能被3和

5整除,如果

n不能被3和

5整除,那麼

n也決不會被

15整除。

第三,對於

n來說,不必用從2到

n一1的所有素數去除,只需用小於等於

[w1]

√n(根號

n)的所有素數去除就可以了。

這一點可以用反證法來證明:如果n

是合數,則一定存在大於1小於

n的整數d1和

d2,使得

n=d1×d2。如果

d1和d2均大於

√n,則有:n=

d1×d2>√n×√n=n

。而這是不可能的,所以,d1和

d2中必有乙個小於或等於√n。

基於上述分析,設計演算法如下:

(1)用2,

3,5,

7逐個試除

n的方法求出

100以內的所有素數。

(2)用

100以內的所有素數逐個試除的方法求出

10000

以內的素數。

首先,將2,

3,5,

7分別存放在

a[1]

、a[2]

、a[3]

、a[4]

中,以後每求出乙個素數,只要不大於

100,就依次存放在

a陣列中的乙個單元

中。當我們求

100—10000

之間的素數時,可依次用

a[1]

-a[2]

的素數去試除

n,這個範圍內的素數可以不儲存,直接列印。

2】用篩法求素數。

簡單介紹一下厄拉多塞篩法。厄拉多塞是一位古希臘數學家,他在尋找素數時,採用了一種與眾不同的方法:先將2-

n的各數寫在紙上:在2

的上面畫乙個圓圈,然後劃去

2的其他倍數;第乙個既未畫圈又沒有被劃去的數是

3,將它畫圈,再劃去

3的其他倍數;現在既未畫圈又沒有被劃去的第乙個數是5

,將它畫圈,並劃去

5的其他倍數

……依次類推,一直到所有小於或等於

n的各數都畫了圈或划去為止。這時,表中畫了圈的以及未劃去的那些數正好就是小於

n的素數。

這很像一面篩子,把滿足條件的數留下來,把不滿足條件的數篩掉。由於這種方法是厄拉多塞首先發明的,所以,後人就把這種方法稱作厄拉多塞篩法。

在計算機中,篩法可以用給陣列單元置零的方法來實現。具體來說就是:

首先開乙個陣列:

a[i]

,i=1,2

,3,…

,同時,令所有的陣列元素都等於下標

值,即a[i]=i,當i

不是素數時,令

a[i]=0

。當輸出結果時,只要判斷

a[i]

是否等於零即可,如果

a[i]=0

,則令i=i+1

,檢查下乙個

a[i]

。篩法是計算機程式設計中常用的演算法之一。

【3】用

6n±1

法求素數。

任何乙個自然數,總可以表示成為如下的形式之一:6n,

6n+1

,6n+2

,6n+3

,6n+4

,6n+5 (n=0,1

,2,…)

顯然,當

n≥1時,6n,

6n+2

,6n+3

,6n+4

都不是素數,只有形如

6n+1

和6n+5

的自然數有可能是素數。所以,除了2和

3之外,

所有的素數都可以表示成

6n±1

的形式(n

為自然數)。

根據上述分析,我們可以構造另一面篩子,只對形如

6 n±1

的自然數進行篩選,這樣就可以大大減少篩選的次數,從而進一步提高程式的執行效率和速度。

在程式上,我們可以用乙個二重迴圈實現這一點,外迴圈i按

3的倍數遞增,內迴圈j為

0-1的迴圈,則

2(i+j)-1

恰好就是形如

6n±1

的自然數。

求質數 素數 演算法思想

此演算法是網上查詢到的 覺得不錯 所以拿來與大家分享 1 求10000 以內的所有素數。素數是除了 1和它本身之外再不能被其他數整除的自然數。由於找不到乙個通項公式來表示所有的素數,所以對於數學家來說,素數一直是乙個未解之謎。像著名的 哥德 猜想 孿生素數猜想,幾百年來不知吸引了世界上多少優秀的數學...

Python求質數 素數

先寫乙個裝飾器d1.py,為了測試執行時間 from functools import wraps import time deff1 func wraps func deff2 begin time.time func end time.time print cost end begin retu...

求素數(質數)的幾種演算法對比

查詢指定範圍的自然數的所有質數,實現起來並不難,但是哪種演算法效率最高,速度最快才是重點,我列出幾種演算法 1 將待判斷的值與小於它而且不小於2的所有數求餘數 public static listgetprimev1 int max if flag system.out.println 迴圈次數 t...