如何求素數

先上轉載鏈接: 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 
版權聲明:本文爲博主原創文章,轉載請附上博文鏈接!

結束&

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章