python 质数 埃拉托色尼筛法

编程入门 行业动态 更新时间:2024-10-25 04:25:07
本文介绍了python 质数 埃拉托色尼筛法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

谁能告诉我如何在这段代码中实现 Eratosthenes 的筛分以使其更快?如果您能用筛子完成它,我们将不胜感激.在这个特定的代码中,我真的很难做到这一点.

#!/usr/bin/env python导入系统T=10 #测试用例数t=open(sys.argv[1],'r').readlines()导入数学def is_prime(n):如果 n == 2:返回真如果 n%2 == 0 或 n <= 1:返回错误sqr = int(math.sqrt(n)) + 1对于范围(3,sqr,2)中的除数:如果 n%divisor == 0:返回错误返回真#每个测试用例的第一行a=[1,4,7,10,13,16,19,22,25,28]计数=0因为我在一个:b=t[i].split(" ")c=b[1].split("\n")[0]b=b[0]对于 xrange(int(b)) 中的 k:d=t[i+1].split(" ")e=t[i+2].split(" ")对于 d 中的 g:对于 e 中的 j:尝试:总和=整数(g)+整数(j)p=is_prime(sum)如果 p==真:计数+=1打印计数别的:经过除了:尝试:g=g.strip("\n")总和=整数(g)+整数(j)p=is_prime(sum)如果 p==真:计数+=1打印计数别的:经过除了:j=j.strip("\n")总和=整数(g)+整数(j)p=is_prime(sum)如果 p==真:计数+=1打印计数别的:经过打印最终计数"+计数

解决方案

在 Python 中加速筛选的一个老技巧是使用花哨的 ;-) 列表切片表示法,如下所示.这使用 Python 3.Python 2 所需的更改在注释中注明:

定义筛(n):返回所有质数 <= n."np1 = n + 1s = list(range(np1)) # 在 Python 2 中去掉 `list()`s[1] = 0sqrtn = int(round(n**0.5))for i in range(2, sqrtn + 1): # 在 Python 2 中使用 `xrange()`如果 s[i]:# 下一行:在 Python 2 中使用 `xrange()`s[i*i: np1: i] = [0] * len(range(i*i, np1, i))返回过滤器(无,s)

在 Python 2 中,它返回一个列表;在 Python 3 中是一个迭代器.在 Python 3 下:

>>>清单(筛(20))[2, 3, 5, 7, 11, 13, 17, 19]>>>len(list(sieve(1000000)))78498

那些人都眨了眨眼.鉴于此,以下是构建 is_prime 函数的方法:

primes = set(sieve(the_max_integer_you_care_about))def is_prime(n):在素数中返回 n

是 set() 部分使它变得更快.当然,这个函数很简单,你可能想写:

如果 n 是素数:

直接而不是搞乱:

if is_prime(n):

Hi can anyone tell me how to implement Sieve of Eratosthenes within this code to make it fast? Help will be really appreciated if you can complete it with sieve. I am really having trouble doing this in this particular code.

#!/usr/bin/env python import sys T=10 #no of test cases t=open(sys.argv[1],'r').readlines() import math def is_prime(n): if n == 2: return True if n%2 == 0 or n <= 1: return False sqr = int(math.sqrt(n)) + 1 for divisor in range(3, sqr, 2): if n%divisor == 0: return False return True #first line of each test case a=[1,4,7,10,13,16,19,22,25,28] count=0 for i in a: b=t[i].split(" ") c=b[1].split("\n")[0] b=b[0] for k in xrange(int(b)): d=t[i+1].split(" ") e=t[i+2].split(" ") for g in d: for j in e: try: sum=int(g)+int(j) p=is_prime(sum) if p==True: count+=1 print count else: pass except: try: g=g.strip("\n") sum=int(g)+int(j) p=is_prime(sum) if p==True: count+=1 print count else: pass except: j=j.strip("\n") sum=int(g)+int(j) p=is_prime(sum) if p==True: count+=1 print count else: pass print "Final count"+count

解决方案

An old trick for speeding sieves in Python is to use fancy ;-) list slice notation, like below. This uses Python 3. Changes needed for Python 2 are noted in comments:

def sieve(n): "Return all primes <= n." np1 = n + 1 s = list(range(np1)) # leave off `list()` in Python 2 s[1] = 0 sqrtn = int(round(n**0.5)) for i in range(2, sqrtn + 1): # use `xrange()` in Python 2 if s[i]: # next line: use `xrange()` in Python 2 s[i*i: np1: i] = [0] * len(range(i*i, np1, i)) return filter(None, s)

In Python 2 this returns a list; in Python 3 an iterator. Here under Python 3:

>>> list(sieve(20)) [2, 3, 5, 7, 11, 13, 17, 19] >>> len(list(sieve(1000000))) 78498

Those both run in an eyeblink. Given that, here's how to build an is_prime function:

primes = set(sieve(the_max_integer_you_care_about)) def is_prime(n): return n in primes

It's the set() part that makes it fast. Of course the function is so simple you'd probably want to write:

if n in primes:

directly instead of messing with:

if is_prime(n):

更多推荐

python 质数 埃拉托色尼筛法

本文发布于:2023-11-29 23:05:13,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1647900.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:质数   python   埃拉托色尼筛法

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!