欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python素數(shù)篩選法淺析

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

原理:

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

  從2開始依次往后面數(shù),如果當前數(shù)字一個素數(shù),那么就將所有其倍數(shù)的數(shù)從表中刪除或者標記,然后最終得到所有的素數(shù)。

有一個優(yōu)化:

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

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

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

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

注意:1既不是素數(shù)也不是合數(shù),這里沒有處理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) 

用素數(shù)篩選法求1千萬以內(nèi)的素數(shù)用了5.767s,

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

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

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

可見解釋語言確實比編譯語言慢很多。

附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; 
} 

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

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

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

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

    Pytest框架之fixture詳解(一)

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

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

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

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

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

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

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

    Python可視化庫之HoloViews的使用教程

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

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

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

    python中pip安裝、升級以及升級固定的包

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

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

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

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

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

最新評論