自從接觸程式設計以來,發現,選找素數這一題目一直是演算法界乙個長盛不衰的題目,而篩選法似乎是這一題目巧妙極致的乙個解法。不過不知足的我們依然不肯罷休,對程式中那幾次重複運算始終耿耿於懷。什麼時候電腦才能像我們一樣不知是機械的重複呢?
呵呵,我們還是先看一下這個問題中的重複運算吧!
2*20=40,5*8=40,那麼,對於40這乙個合數,程式中兩次對他進行了篩選,越大的合數,在其上浪費的運算量越大,在程式中如果能檢測到這一點從而有選擇的跳過的話將節省好多次運算。今天我們就針對這個問題來討論一下。
先看一下2*20=40這個運算吧,2是第乙個參加運算的數,此時,所有的數還都是素數的標誌,因此它必須參加運算,因為乙個合數至少要具備的條件是:必須是兩個以上比他小的素數的乘積。而在進行5*8這次運算時,8已經是合數了(2*4時已經篩選掉了),而且它的結果與前面的造成了重複,最終的原因是不是因為它是合數的原因呢?我們是不是應該加一項判斷,在運算時忽略掉所有被打上合數標誌的呢?
我們再來看一下2,8這兩個數吧,2*2必須進行,4被篩選掉了,然後是2*3,篩選掉6,然後呢,2*4麼,別忘了,4已經被篩選掉了,它將沒有資格參加這次運算,那麼8這個合數就永遠沒有機會篩選掉了(比他小的素數只有2),因此這種方法下降導致n*m^x(x〉=2)被忽略掉。我們再來看一下40這個數,這裡的2、5、8這三個數的關係是,8是在進行2這個週期的運算上被篩選掉的,如果我們把前面週期運算篩選掉的和數忽略是不是就可以沒有妨礙了呢?
縱觀所有的合數,每個合數都可以分解質因數,最後分解為只含有幾個素數的積。假設乙個和數m被分解為a*a*b*b*c*c,a@a=(
1000
,1000
);for($i=
2;$i<=
1000;$i
++)$s=
sqrt
(1000
);for($i=
2;$i<=$s;
$i++)}
for($i=
2;$i<=
1000;$i
++)perl作為一種指令碼語言用來做資料運算實在不是明智之舉,不過最近剛學的perl,算是一種實踐吧!再說這段程式也比較容易讀懂,看了以後應該很容易寫出c語言的程式的!
找素數的一點思考
2016.7.17 本文 均由c 編寫 經典的素數判定演算法是這樣 給定乙個正整數n,用2到sqrt n 之間的所有整數去除n,如果可以整除,則n不是素數,如果不可以整除,則n就是素數。所以求小於n的所有素數程式如下 include include using namespace std defin...
對Reflection的一點改進
之前實現的那個reflection沒有把光照加進去,使得不是很逼真,與真實的景象有出入。只要我們把光源也想象 為乙個物體,在鏡子中也會有映象,也會使virtual object產生光照效果。這裡我採用的是聚光燈,對其的屬性設定如下 glfloat lightamb ambient light glf...
比線性篩垃圾一點的素數篩法
1.n 2的,蠻爛的時間複雜度 本來就想不出正解了還這麼浪費時間 for int i 2 i n i for int j 2 j i n j noprime i j 1 2.小小優化 for int i 2 i n i if noprime i for int j 2 j i n j noprime...