此演算法是網上查詢到的
,覺得不錯
,所以拿來與大家分享
!!
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...