素數判斷算法

2021-02-19 小知識酷
方法1:

function isPrime(num){

if(num ==2 || num==3)

return true;

for (var i = 2;i <= n-1;i++) {

if(num % i ==0){

return false;

}

}

return true;

}

方法2:

上述判斷方法,明顯存在效率極低的問題。對於每個數n,其實並不需要從2判斷到n-1

我們知道,一個數若可以進行因數分解,那麼分解時得到的兩個數,一定是一個小於等於sqrt(n)和一個大於等於sqrt(n)

據此,上述代碼中並不需要遍歷到n-1,遍歷到sqrt(n)即可,因為若sqrt(n)左側找不到約數,那麼右側也一定找不到約數
12
1×12=12
2×6=12
3×4=12
4×3=12

能被2整除的數一定不是素數,所以不用被4、6整除,這樣能減少n/2次執行次數

能被3整除的數一定不是素數,所以不用被6、9整除,這樣能繼續減少執行次數

function isPrime(num){

if(num ==2|| num==3 )

return true;

var temp = parseInt(Math.sqrt(num));

for (var i = 2;i <= temp;i++) {

if(num % i ==0){

return false;

}

}

return true;

}

方法3:

function isPrime(num){

if(num ==2 || num==3)

return true;

if(num % 2 == 0 || num % 3 == 0 || num % 5 == 0)

return false;

var temp = parseInt(Math.sqrt(num));

for (var i = 7;i <= temp;i=i+2) {

if(num % i == 0){

return false;

}

}

return true;

}

方法4:

證明:令x≥1,將大於等於5的自然數表示如下:

······ 6x-1,6x,6x+1,6x+2,6x+3,6x+4,6x+5,6(x+1),6(x+1)+1 ······

可以看到,6的倍數兩側之外的數為6x+2,6x+3,6x+4,由於2(3x+1),3(2x+1),2(3x+2),所以它們一定不是素數,再加上6x本身也不是素數

此時判斷質數可以6個為單元快進,即在循環中i++步長加大為6,加快判斷速度

原因是,假如要判定的數為n,則n必定是6x-1或6x+1的形式,對於循環中6i-1,6i,6i+1,6i+2,6i+3,6i+4,其中如果n能被6i,6i+2,6i+4整除,則n至少得是一個偶數,但是6x-1或6x+1的形式明顯是一個奇數,故不成立

另外,如果n能被6i+3整除,則n至少能被3整除,但是6x能被3整除,故6x-1或6x+1(即n)不可能被3整除,故不成立。

綜上,循環中只需要考慮6i-1和6i+1的情況,即循環的步長可以定為6,每次判斷循環變量k和k+2的情況即可,理論上講整體速度應該會是方法(2)的3倍

function isPrime(num){

//兩個較小數

if(num == 2 || num == 3 )

return true ;

//不在6的倍數兩側的一定不是質數

if(num%6 != 1 && num%6 != 5){

return false ;

}

var tmp =Math.sqrt(num);

//在6的倍數兩側的也可能不是質數

for(var i = 5;i <= tmp; i+=6 )

if(num%i == 0 || num%(i+2) == 0)

return false ;

return true;

}

相關焦點

  • 你不知道的素數判斷方法
    素數判斷?這不是小學學的嗎?您先別著急,不管您是小學,初中還是高中,從事什麼職業,我相信,堅持看完你一定有收穫![C語言必知必會]素數的判斷我們要判斷素數,首先要知道素數的定義。素數:質數又稱素數。一個大於1的自然數,除了1和它自身外,不能被其他自然數整除的數叫做質數;否則稱為合數。知道了素數的定義,那麼我們應該想一下,如何去判斷一個數是否為素數?
  • Python如何判斷一個正整數是否是素數?
    如2、3、5、7、11都是素數,因為找不到除了1和其本身之外的約數;而4、6、8都是合數,因為4可以整除2,6可以整除2和3,8可以整除2和4。而一個數的約數必然是不超過該數的,加上素數必需是只有1和本身是其約數的條件。於是,我們可以通過枚舉小於該數,並且大於1的整數,來判斷該數是否是素數。
  • 素數的判斷
    return true; for (var i = 2;i <= n-1;i++) { if(num % i ==0){ return false; } } return true; }方法2:時間複雜度O(logN)上述判斷方法
  • 素數判別和整數分解存在多項式算法
    在這一部分裡提出了兩個重要的、懸而未決的問題:是否存在判別素數的多項式算法?是否存在分解大整數的多項式算法?已知道「分解整數」這個問題是一個NP完全問題,因此對上面第二個問題的討論是解決計算機科學中的難題:「NP完全問題是否一定是多項式算法可解的?」的一個突破口。因此,素數判別和大數分解對計算機科學來說也是很有價值的。
  • 如何判斷一個數是素數呢?
    素數這個詞,我們經常在數學題中看到,判斷一個數是否是素數,首先,我們先來了解一下素數的概念,素數一般指質數。質數是指在大於1的自然數中,除了1和它本身以外不再有其他因數的自然數。了解概念之後,我們來看一道簡單的例題:判斷101到200之間的素數根據題目,我們通過編程的思想進行分析,判斷素數的方法:用一個數分別去除2到sqrt(這個數),如果能被整除, 則表明此數不是素數,反之是素數。
  • C/C++每日一問--判斷素數
    如何判斷一個數是否是素數?如何判斷一個範圍內的哪些數是素數並具體輸出素數,同時輸出個數?原理:素數(質數),在一般領域,對正整數n,如果用2到根號下n之間的所有整數去除,均無法整除,則n為素數。即:素數大於等於2,不能被它本身和1以外的數整除。
  • 判斷質數的程序框圖和算法
    一、什麼是素數素數指在一個大於1的自然數中,除了1和此整數自身外,沒法被其他自然數整除的數。換句話說,只有兩個正因數(1和自己)的自然數即為素數。比1大但不是素數的數稱為合數。1和0既非素數也非合數。Click() Dim n As Integer, i As Integer n = Val(Text1.Text)For i = 2 To n - 1If n Mod i = 0 Then Text2.Text = n & "不是素數
  • C語言編程求解:1到1000之間所有的素數
    算法思考:判斷一個數是不是素數,只需要判斷它是不能只能被1和自身整除。那怎麼判斷一個數不能被除1和自身之外的其他數整除呢?想法是寫一個循環,循環裡依次除以從2到這個數減1的所有的整數,如果都不能整除,說明這個數是素數;如果出現一個能整除的數,那麼這個數不是素數。(其實,判斷素數還可以優化,循環裡依次除以從2到這個數平方根的所有的整數就可以了。因為假設一個數n,除以2~根號n的整數,都不能整除,那麼除以根號n~n-1的整數也不能整數。
  • 素數是什麼,有哪些和素數有關的數學猜想還未得到解決?
    素數的應用在現實生活中,數的分解是許多網絡加密的基礎,我們要把兩個已知數相乘很容易,但是要把一個大數分解卻很難,利用整數的這一非對稱特性,密碼學家巧妙地設計了加密和解密的數學原理,比如RSA非對稱加密算法,就是基於大數分解。
  • 「每日一練」巧用Python判斷101-200之間有多少個素數
    比如說我想要知道101-200之間有多少個素數,看看python是怎麼輸出的?案例判斷101-200之間有多少個素數,並輸出所有素數。先上代碼~運行效果題目詳述程序分析:判斷素數的方法:用一個數分別去除2到sqrt(這個數),如果能被整除,則表明此數不是素數,反之是素數。
  • 素數有哪些用途,北美洲有一種蟬,利用素數性質來巧妙躲避天敵!
    網絡中廣泛使用的RSA算法,就是基於素數性質的重要應用;在大自然中,素數甚至還關係著一個物種的生存和繁衍。素數表示只能被1和本身整除且大於1的自然數,其餘大於1的自然數叫做合數,「1」既不是素數也不是合數;算術基本定理指出,任何大於1的自然數,都可以唯一分解為有限個素數的乘積。素數就是構成所有數字的基石,要想了解數字的性質,就必須弄清楚素數的奧秘。
  • 方形,圓形,……,和素數
    為什麼會有很多的孿生素數?我們介紹了素數的一些基本統計特性,這裡我們再介紹素數的一些幾何基本特性。這裡介紹一種稍稍複雜的素數及其分布。這種素數叫高斯素數。高斯素數是指在高斯整數域裡不能因子分解的數。高斯整數指實數和虛數部分都是整數的複數,所有這樣的高斯整數組成了一個整數域,其中的素元素即稱為高斯素數。在數學裡,素元素是指滿足類似整數裡的素數或不可約多項式性質的一個數學對象。
  • 使用程小奔機器人找出100以內的素數
    題目:找出100以內的素數(2-99)。質數又稱素數,指在一個大於1的自然數中,除了1和此整數自身外,沒法被其他自然數整除的數。思路:從2開始依次判斷每個數是不是素數,如果是的話就加入到列表裡。難點在於如何判斷一個數是不是素數,根據素數的定義,需要使用重複執行,只要能被1和自身之外的數整除(餘數=0),那麼就不是素數,停止本次循環,然後去判斷下一個自然數是不是素數。
  • 華人數學家再取得素數研究突破 陶哲軒等人證明愛多士關於素數間隔...
    素數可以說是數論中最基礎,也是最重要的概念,指的是一個大於2的正整數,除了1和它本身之外,不是任何數的倍數。就在去年,華人數學家張益唐在孿生素數研究方面取得了突破性進展,而據新浪科技24日報導,包括加州大學洛杉磯分校的天才華裔數學家陶哲軒在內的研究小組目前正取得素數間隔問題的研究突破,這將最終影響加密算法的研究,對信息安全領域有巨大貢獻。
  • 【每日上機】 素數對猜想
    讓我們定義 dn 為:dn = pn+1 – pn,其中 pi 是第i個素數。顯然有 d1=1 且對於n>1有 dn 是偶數。
  • 黎曼猜想仍舊,素數依然孤獨
    高爾斯在《數學》(牛津通識讀本)裡介紹說,素數定理告訴我們在某數附近素數的近似密度。素數是大於1且不能被其他整數——1和自身顯然除外——整除的整數。自從古希臘時期以來,素數就一直困擾著數學家們,因為它們表面上多多少少是隨機分布的,但又並非全然隨機。從沒有人找出一種簡單的規則,能夠告訴我們第 n個素數是多少。
  • C程序設計的常用算法
    算法的描述:是對要解決一個問題或要完成一項任務所採取的方法和步驟的描述,包括需要什麼數據(輸入什麼數據、輸出什麼結果)、採用什麼結構、使用什麼語句以及如何安排這些語句等。通常使用自然語言、結構化流程圖、偽代碼等來描述算法。
  • R語言中repeat循環的使用方法之素數和斐波那契數列前n項
    求向量中第一個大於N的數在R中的執行情況如下圖所示:例子3:求100以內的所有素數。#求出100以內的所有素數n <- 2 #從2開始判斷repeat #循環要判斷的數字{if(n >= 100) #如果超過100,則跳出break;j <- 2 #用2~n的數j去除nrepeat #循環2~n{if(n %% j == 0
  • 一個奇怪的素數序列
    雕塑家安東帕森斯的「傳遞時間」素數通常被描述為數學的「原子」,或者至少是數字。素數恰好有兩個不同的因素:本身和1.(因此1不被認為是素數。)所有大於1的整數都是素數或素數的乘積。一個好奇的人類可以詢問關於素數的第一個問題是有多少,並且最早的證據之一是有無數多個素數是歐幾裡德元素的可愛論證。歐幾裡得的證明以有限的素數列表開始,並描述了一種生成不在列表中的素數的方法。
  • LabVIEW編程實例:如何求解1000以內的所有素數
    編程思路求解1000以內的所有素數,這個問題可以分解為下面兩個問題:如何判斷一個數是否為素數查找1000以內的所有符合條件的素數對於第一個問題,基本的判斷思路比較簡單:對於一個大於1的正整數x,如果用2到根號下x 之間的所有整數去除,均不能整除,則這樣的x可以判斷為是一個素數。