亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

python素?cái)?shù)篩選法淺析

 更新時(shí)間:2018年03月19日 14:46:27   作者:power721  
這篇文章主要為大家詳細(xì)介紹了python素?cái)?shù)篩選法的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

原理:

  素?cái)?shù),指在一個(gè)大于1的自然數(shù)中,除了1和此整數(shù)自身外,不能被其他自然數(shù)整除的數(shù)。在加密應(yīng)用中起重要的位置,比如廣為人知的RSA算法中,就是基于大整數(shù)的因式分解難題,尋找兩個(gè)超大的素?cái)?shù)然后相乘作為密鑰的。一個(gè)比較常見(jiàn)的求素?cái)?shù)的辦法是埃拉托斯特尼篩法(the Sieve of Eratosthenes) ,說(shuō)簡(jiǎn)單一點(diǎn)就是畫(huà)表格,然后刪表格,如圖所示:

  從2開(kāi)始依次往后面數(shù),如果當(dāng)前數(shù)字一個(gè)素?cái)?shù),那么就將所有其倍數(shù)的數(shù)從表中刪除或者標(biāo)記,然后最終得到所有的素?cái)?shù)。

有一個(gè)優(yōu)化:

標(biāo)記2和3的倍數(shù)的時(shí)候,6被標(biāo)記了兩次。所以從i的平方開(kāi)始標(biāo)記,減少很多時(shí)間。

比如3的倍數(shù)從9開(kāi)始標(biāo)記,而不是6,并且每次加6。

除了2以外,所有素?cái)?shù)都是奇數(shù)。奇數(shù)的平方還是奇數(shù),如果再加上奇數(shù)就變成了偶數(shù)一定不會(huì)是素?cái)?shù),所以加偶數(shù)(2倍素?cái)?shù))。

預(yù)先處理了所有偶數(shù)。

注意:1既不是素?cái)?shù)也不是合數(shù),這里沒(méi)有處理1。

#! prime.py 
import time 
 
def primes(n): 
 P = [] 
 f = [] 
 for i in range(n+1): 
  if i > 2 and i%2 == 0: 
   f.append(1) 
  else: 
   f.append(0) 
 
 i = 3 
 while i*i <= n: 
  if f[i] == 0: 
   j = i*i 
   while j <= n: 
    f[j] = 1 
    j += i+i 
  i += 2 
 
 P.append(2) 
 for i in range(3,n,2): 
  if f[i] == 0: 
   P.append(i) 
 
 return P 
 
def isPrime(n): 
 if n > 2 and n%2 == 0: 
  return 0 
 
 i = 3 
 while i*i <= n: 
  if n%i == 0: 
   return 0 
  i += 2 
 
 return 1 
 
def primeCnt(n): 
 cnt = 0 
 for i in range(2,n): 
  if isPrime(i): 
   cnt += 1 
 return cnt 
 
if __name__ == '__main__': 
 start = time.clock() 
 n = 10000000 
 P = primes(n); 
 print("There are %d primes less than %d"%(len(P),n)) 
 #for i in range(10): 
 # print(P[i]) 
 print("Time: %f"%(time.clock()-start)) 
 #for n in range(2,100000): 
 # if isPrime(n): 
 #  print("%d is prime"%n) 
  #print("%d is "%n + ("prime" if isPrime(n) else "not prime")) 
 
 start = time.clock() 
 n = 1000000 
 print("There are %d primes less than %d"%(primeCnt(n),n)) 
 print("Time: %f"%(time.clock()-start) 

用素?cái)?shù)篩選法求1千萬(wàn)以內(nèi)的素?cái)?shù)用了5.767s,

普通素?cái)?shù)判斷法求1百萬(wàn)以內(nèi)的素?cái)?shù)用了9.642s,

用C++素?cái)?shù)篩選法求1億以內(nèi)的素?cái)?shù)用了0.948s,

用C++普通素?cái)?shù)判斷法求1千萬(wàn)以內(nèi)的素?cái)?shù)用了3.965s,

可見(jiàn)解釋語(yǔ)言確實(shí)比編譯語(yǔ)言慢很多。

附C++程序,用了位壓縮優(yōu)化空間

#include <iostream> 
#include <cstdio> 
#include <algorithm> 
using namespace std; 
#define N 100000001 
 
unsigned f[(N>>5)+5]; 
int p[5761456],m; 
void init() 
{ 
  int i,j; 
  for(i=4;i<N;i+=2) 
    f[i>>5]|=1<<(i&0x1F); 
  p[m++]=2; 
  for(i=3;i*i<N;i+=2) 
    if(!(f[i>>5]&(1<<(i&0x1F)))) 
    { 
      p[m++]=i; 
      for(j=i*i;j<N;j+=i+i) 
        f[j>>5]|=1<<(j&0x1F); 
    } 
  for(;i<N;i+=2) 
    if(!(f[i>>5]&(1<<(i&0x1F)))) 
      p[m++]=i; 
} 
int is_prime(int n) 
{ 
  int i; 
  for(i=0;p[i]*p[i]<=n;i++) 
    if(n%p[i]==0) 
      return 0; 
  return 1; 
} 
int isPrime(int n) 
{ 
  if(n>2 && n%2==0) 
    return 0; 
  int i=3; 
  while(i*i<=n) 
  { 
    if(n%i==0) 
      return 0; 
    i+=2; 
  } 
  return 1; 
} 
int main() 
{ 
  int n=0,i; 
  clock_t st=clock(); 
  init(); 
  /*for(i=2;i<10000000;i++) 
    if(isPrime(i)) 
      n++;*/ 
  printf("%d %dms\n",m,clock()-st); 
  /*while(~scanf("%d",&n),n) 
  { 
    i=lower_bound(p,p+m,n+1)-p; 
    printf("%d\n",i); 
  }*/ 
  return 0; 
} 

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python的Django框架中的數(shù)據(jù)過(guò)濾功能

    Python的Django框架中的數(shù)據(jù)過(guò)濾功能

    這篇文章主要介紹了Python的Django框架中的數(shù)據(jù)過(guò)濾功能,為更新數(shù)據(jù)庫(kù)數(shù)據(jù)時(shí)的數(shù)據(jù)查找提供了方便,需要的朋友可以參考下
    2015-07-07
  • Pytest框架之fixture詳解(一)

    Pytest框架之fixture詳解(一)

    本文詳細(xì)講解了Pytest框架之fixture,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-06-06
  • Python編譯過(guò)程和執(zhí)行原理解析

    Python編譯過(guò)程和執(zhí)行原理解析

    這篇文章主要介紹了Python編譯過(guò)程和執(zhí)行原理解析,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-07-07
  • python實(shí)現(xiàn)畫(huà)五角星和螺旋線的示例

    python實(shí)現(xiàn)畫(huà)五角星和螺旋線的示例

    今天小編就為大家分享一篇python實(shí)現(xiàn)畫(huà)五角星和螺旋線的示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-01-01
  • 如何使用Python 抓取和優(yōu)化所有網(wǎng)站圖像

    如何使用Python 抓取和優(yōu)化所有網(wǎng)站圖像

    我發(fā)布了一個(gè)通過(guò)FTP自動(dòng)優(yōu)化新圖像的教程。這次我們將抓取整個(gè)網(wǎng)站,并在本地優(yōu)化我們遇到的圖像,按URL組織,怎么來(lái)操作呢,下面跟隨小編一起學(xué)習(xí)使用Python 抓取和優(yōu)化所有網(wǎng)站圖像的方法,感興趣的朋友一起看看吧
    2023-02-02
  • Python可視化庫(kù)之HoloViews的使用教程

    Python可視化庫(kù)之HoloViews的使用教程

    本文主要為大家介紹了Python中一個(gè)優(yōu)秀的可視化庫(kù)—HoloViews,不僅能實(shí)現(xiàn)一些常見(jiàn)的統(tǒng)計(jì)圖表繪制,而且其還擁有Matplotlib、Seaborn等庫(kù)所不具備的交互效果,快跟隨小編一起了解一下吧
    2022-02-02
  • python的ping網(wǎng)絡(luò)狀態(tài)監(jiān)測(cè)的實(shí)現(xiàn)(含多IP)

    python的ping網(wǎng)絡(luò)狀態(tài)監(jiān)測(cè)的實(shí)現(xiàn)(含多IP)

    本文主要介紹了python的ping網(wǎng)絡(luò)狀態(tài)監(jiān)測(cè)的實(shí)現(xiàn)(含多IP),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • python中pip安裝、升級(jí)以及升級(jí)固定的包

    python中pip安裝、升級(jí)以及升級(jí)固定的包

    我們知道python有大量的第三方庫(kù),這也是python的優(yōu)勢(shì)之一,pip就是python整的軟件包管理系統(tǒng),類似于Linux平臺(tái)的yum倉(cāng)庫(kù),下面這篇文章主要給大家介紹了關(guān)于python中pip安裝、升級(jí)以及升級(jí)固定包的相關(guān)資料,需要的朋友可以參考下
    2022-02-02
  • 詳解Python如何實(shí)現(xiàn)對(duì)比兩個(gè)Excel數(shù)據(jù)差異

    詳解Python如何實(shí)現(xiàn)對(duì)比兩個(gè)Excel數(shù)據(jù)差異

    這篇文章主要為大家詳細(xì)介紹了Python是如何實(shí)現(xiàn)對(duì)比兩個(gè)Excel數(shù)據(jù)差異的,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的可以參考一下
    2022-12-12
  • Opencv實(shí)現(xiàn)摳圖背景圖替換功能

    Opencv實(shí)現(xiàn)摳圖背景圖替換功能

    這篇文章主要為大家詳細(xì)介紹了Opencv實(shí)現(xiàn)摳圖替換背景圖,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-05-05

最新評(píng)論