先上轉載鏈接: chaoojie的博客
1.素數,曾稱爲質數。素數的定義爲:
利用反證法可以證明,素數的個數是無窮的。歐幾里得證明素數是無限的。反證法利用排中法的思想。
1.1素數有哪些性質?
可以看到,其中較爲重要的性質有(2),(5),(6),(7),(8)。其中第八個性質可能會有快速解題的妙用。
2.如何求素數?
2.1首先介紹什麼是合數。合數與質數是相對的概念。
合數的定義是:合數就是指自然數中除了能被1和本身整除外,還能被其他數(0除外)整除的數。合數也具有某些特殊的性質。
其中比較重要的個人認爲應該是這一條:每一個合數都可以以唯一的形式被寫成質數的乘積。即分解質因數。因爲藉助這一條性質,可以將需要比較的範圍縮小到2~math.sqrt(n)。
2.2 如何求素數
思路:
1、任何一個合數(都指正整數,下同),都是幾個質數的乘積。例如:18 = 2 * 3 * 3
2、如果一個數N不能整除M,則N也不能整除M*i,i=1, 2, 3....。即,N%M != 0,則 N%(M*i) != 0。例如,N不能整除2,那麼N也不能整除6。因爲,如果N能整除6,即,N%6 = 0,也就是 N%(2*3) = 0,也就是N能整除2,與前面矛盾。
3、如果N不是質數,那麼N有滿足1<d<=sqrt(N)(N的平方根)的一個質數因子 d 存在。因爲如果N不是質數,根據條例1,N肯定可以分解爲一堆質數的和,即肯定存在一個質數因子。如果找不到,那就說明N是質數,只能被1和自己本身整除。
方法:
A、依照判斷素數的概念,我們可以從2~N-1,依次去除,看餘數是否爲0,複雜度爲O(N)
B、改進一下,先判斷 N%2 是否爲0,如果不爲0,即 N%(2*i) != 0(前面的條例2),所以只要再判斷 3~N-1 之間的奇數即可,複雜度減半!爲O(N/2)
同理,可以再判斷 N%3 是否爲0,如果不爲0,則可以去掉後面的 3*i
C、其實,並不需要一直整除到N-1,而只要整除到 sqrt(N) 即可。如果 a < sqrt(N), b<sqrt(N),那麼 a * b < sqrt(N)*sqrt(N) = N。如果b = N/a,那麼b肯定是>=sqrt(N)。所以,只要判斷小於等於sqrt(N)的數即可,再判斷大於sqrt(N)的數就是在浪費時間了。
D、結合前面的 B 和 C,我們就可以先判斷 N%2 是否爲0,然後再判斷 3~sqrt(N) 之間的奇數即可,複雜度爲O(sqrt(N)/2)
E、根據條例3,如果N是質數,則N只能被1和N整除,如果N不是質數,那一定存在1<d<=sqrt(N)的一個質數因子。那麼我們就可以取 2~sqrt(N) 之間的所有質數d,依次判斷N%d 是否爲0。如果判斷均不等於0,就說明不存在這樣的一個質數,也就是說N只能被1和本身整除,即N是質數。
關於各方法時間複雜度的分析和更快捷的方法點這裏:
代碼:代碼來源:判斷素數代碼
/快速判斷一個數是不是質數:(總共2步)
//1、判斷能否被2整除
//2、遍歷 3~Math.sqrt(value)這個範圍
public static boolean IsPrime(int val){
boolean flag = true;
if((val & 1) == 0){
flag = false;
return flag;
}
for(int i=3; i<= Math.sqrt(val); i+=2){
if(val%i == 0){
flag = false;
break;
}
}
return flag;
}
---------------------
作者:下午茶609
來源:CSDN
原文:https://blog.csdn.net/u013565099/article/details/70327791
版權聲明:本文爲博主原創文章,轉載請附上博文鏈接!
結束&