这是我能提出的最佳算法.
def get_primes(n):
numbers = set(range(n, 1, -1))
primes = []
while numbers:
p = numbers.pop()
primes.append(p)
numbers.difference_update(set(range(p*2, n+1, p)))
return primes
>>> timeit.Timer(stmt='get_primes.get_primes(1000000)', setup='import get_primes').timeit(1)
1.1499958793645562
Run Code Online (Sandbox Code Playgroud)
可以做得更快吗?
此代码有一个缺陷:由于numbers是无序集,因此无法保证numbers.pop()从集中删除最小数字.然而,它对某些输入数字起作用(至少对我而言):
>>> sum(get_primes(2000000))
142913828922L
#That's the correct sum of all numbers below 2 million
>>> 529 in get_primes(1000)
False
>>> 529 in get_primes(530)
True
Run Code Online (Sandbox Code Playgroud) 这不是作业,我只是好奇.
INFINITE是这里的关键词.
我希望在primes()中使用它作为p.我相信这是Haskell中的内置函数.
所以,答案不能像"Just do a Sieve"那样天真.
首先,您不知道将消耗多少连续素数.好吧,假设你可以一次编制100个.您是否会使用相同的Sieve方法以及素数公式的频率?
我更喜欢非并发方法.
感谢您阅读(和写作;))!
我试图找到一种有效的方法来计算Euler的totient函数.
这段代码有什么问题?它似乎没有工作.
def isPrime(a):
return not ( a < 2 or any(a % i == 0 for i in range(2, int(a ** 0.5) + 1)))
def phi(n):
y = 1
for i in range(2,n+1):
if isPrime(i) is True and n % i == 0 is True:
y = y * (1 - 1/i)
else:
continue
return int(y)
Run Code Online (Sandbox Code Playgroud) 我刚刚学习了learing python,我正在尝试创建一个接受整数的简单函数,并返回从2到该整数的所有素数的列表.
我已经创建了函数,但代码似乎不起作用.我已经找到了解决方案,只针对更有效(和复杂)的方法(比如这个使用list comprehention查找素数)来解决这个问题,但这并不能帮助我找到错误.
def list_of_primes(n):
primes = []
for y in range (2, n):
for z in range(2, y):
if y % x == 0:
continue
else:
primes.append(y)
primes.sort()
return primes
Run Code Online (Sandbox Code Playgroud)
代码有什么问题?