首先聲明本人水平有限,僅僅作一下記錄,有錯的地方請指正,文章垃圾請包容!! 在網上不當心瀏覽到一篇技術博客,叫作《求質數算法的N種境界(N>10)》,寫得很好,有興趣的讀者本身去搜索。而後就想本身去試試這篇博客裏寫得各類求質數的方法。
不想搭環境,就暫時用了PHP語言,在apache裏運行,簡易測試一下。php
首先明確一下概念 質數(prime number)又稱素數,有無限個。質數定義爲在大於1的天然數中,
除了1和它自己之外再也不有其餘因數的數稱爲質數。
100之內質數表
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47
53 59 61 67 71 73 79 83 89 97
質數的個數是無窮的。算法
相對的就是合數
合數,數學用語,英文名爲Composite number,指天然數中除了能被1和自己整除外,
還能被其餘數(0除外)整除的數(如:4,6,8,9,10)。
與之相對的是質數,而1既不屬於質數也不屬於合數。最小的合數是4。apache
如下是求100之內的質數算法
//1.最基礎的寫法
$a = 1;//序號,標識個數
for($i = 2; $i < 101; $i++) {
$primes = 0;
for($k = 1; $k <= $i; $k++)
if($i%$k === 0) $primes++;
if($primes <= 2){ // 能除以1和自身的整數(不包括0)
echo $a . ".{$i}
";
$a++;
}
}數組
//2.考慮全部數均可以被1整除和
//若是有(除了自身之外的)質因數,那確定會小於等於 $i/2,因此 $i/2
//這裏不能輕易將第一個算法的語句for($k = 1; $k <= $i; $k++)改爲
//for($k = 1; $k <= $i/2; $k++); 緣由本身試試就知道了性能
$a = 1;//序號,標識個數
for($i = 2; $i < 101; $i++) {
$primes = 0;
for($k = 2; $k <= $i/2; $k++)
if($i%$k === 0) $primes++;
if($primes <= 0){ // 能除以1和自身的整數(不包括0)
echo $a . ".{$i}
";
$a++;
}
}測試
//3.進一步想除了2之外,全部可能的質因數都是奇數。
//因此先測試2,而後再測試3到$i/2的全部奇數。
//關鍵特殊考慮數字2
$a = 1;//序號,標識個數
for($i = 2; $i < 101; $i++) {
$primes = 0;
if($i != 2 && $i%2 === 0) $primes++;code
for($k = 3; $k <= $i/2; $k=$k+2)
if($i%$k === 0) $primes++;博客
if($primes <= 0){ // 能除以1和自身的整數(不包括0)
echo $a . ".{$i}
";
$a++;
}
}數學
//4.其實只要從 2 一直嘗試到√x(開平方),就能夠了。
$a = 1;//序號,標識個數
for($i = 2; $i < 101; $i++) {
$primes = 0;
if($i != 2 && $i%2 === 0) $primes++;it
for($k = 3; $k <= sqrt($i); $k=$k+2)
if($i%$k === 0) $primes++;
if($primes <= 0){ // 能除以1和自身的整數(不包括0)
echo $a . ".{$i}
";
$a++;
}
}
//5.其實只要從 2 一直嘗試到√x(開平方)其中的全部質數就能夠
//算法理論中常常提到的:以空間換時間。就是先存以前的結果再拿來用
//如下本人寫得只是用一個數組來實現這個算法,本人技術有限,不知這樣是否準確理解原博
//客做者的意圖,就當隨便看看吧
$arr =array();
$a = 1;//序號,標識個數
for($i = 2; $i < 101; $i++) {
$primes = 0;
if($i != 2 && $i%2 === 0) $primes++;
if(!empty($arr)){
foreach($arr as $key => $value){ if($value <= sqrt($i)){ if($i%$value === 0) $primes++; } }
}
if($primes <= 0){ // 能除以1和自身的整數(不包括0)
array_push($arr,$i);
echo $a . ".{$i}
";
$a++;
}
}
接下來,咱們作一下簡單的性能測試,比較一下各個算法的優劣,僅僅從時間上考慮
如下是測試結果
由於算法1,2,3差別性不是很大,不作比較,比較如下1,4,5的優劣
100之內
算法一
[time:0.00099992752075195]s
算法五
[time:0.0010001659393311]s
結果顯示在100之內差別性不大
1000之內
算法一
[time:0.059004068374634]s
算法四
[time:0.004000186920166]s
算法五
[time:0.035001993179321]s
結果顯示在1000之內,算法四已經凸顯優點了
10000之內
算法一
[time:4.537260055542]s
算法四
[time:0.19901204109192]s
算法五
[time:1.9741129875183]s
結果顯示在10000之內,算法一已經不行了
算法五也不行了
100000之內
算法一
[time:542.75104403496]s
算法四
[time:3.6972119808197]s
算法五
[time:164.25539493561]s
結果顯示在100000之內,除了算法四可行,其餘都不行
總結:開始覺得算法五會更勝一籌,不知道是我寫法垃圾,仍是php數組的底層問題,也可能我不理解空間換時間的本質,因此目前仍是算法4最優了。
本人水平有限,僅僅作一下記錄,有錯的地方請指正,文章垃圾請包容!!