改进代码以查找素数
Improve code to find prime numbers
我大约 3 天前写了这个 python 代码,我被困在这里,我认为它可以更好,但我不知道如何改进它。你们能帮帮我吗?
# Function
def is_prime(n):
if n == 2 or n == 3:
return True
for d in range(3, int(n**0.5), 2):
if n % d == 0:
return False
return True
寻找相对较小素数的一个很好的确定性方法是使用sieve.
这项技术背后的数学原理如下:要检查一个数是否为质数,只要检查它是否能被其他质数整除就足够了。
import math
def is_prime(n):
# Prepare our Sieve, for readability we make index match the number by adding 0 and 1
primes = [False] * 2 + [True] * (n - 1)
# Remove non-primes
for x in range(2, int(math.sqrt(n) + 1)):
if primes[x]:
primes[2*x::x] = [False] * (n // x - 1)
return primes[n]
# Or use the following to return all primes:
# return {x for x, is_prime in enumerate(primes) if is_prime}
print(is_prime(13)) # True
为了可重用性,您可以将上述代码改编为 return 所有素数的 set
,直到 n
。
试试下面的代码,速度和Olivier Melançon的解决方案是一样的:
from math import sqrt; from itertools import count, islice
def is_prime(n):
return n > 1 and all(n%i for i in islice(count(2), int(sqrt(n)-1)))
print(is_prime(5))
输出:
True
我大约 3 天前写了这个 python 代码,我被困在这里,我认为它可以更好,但我不知道如何改进它。你们能帮帮我吗?
# Function
def is_prime(n):
if n == 2 or n == 3:
return True
for d in range(3, int(n**0.5), 2):
if n % d == 0:
return False
return True
寻找相对较小素数的一个很好的确定性方法是使用sieve.
这项技术背后的数学原理如下:要检查一个数是否为质数,只要检查它是否能被其他质数整除就足够了。
import math
def is_prime(n):
# Prepare our Sieve, for readability we make index match the number by adding 0 and 1
primes = [False] * 2 + [True] * (n - 1)
# Remove non-primes
for x in range(2, int(math.sqrt(n) + 1)):
if primes[x]:
primes[2*x::x] = [False] * (n // x - 1)
return primes[n]
# Or use the following to return all primes:
# return {x for x, is_prime in enumerate(primes) if is_prime}
print(is_prime(13)) # True
为了可重用性,您可以将上述代码改编为 return 所有素数的 set
,直到 n
。
试试下面的代码,速度和Olivier Melançon的解决方案是一样的:
from math import sqrt; from itertools import count, islice
def is_prime(n):
return n > 1 and all(n%i for i in islice(count(2), int(sqrt(n)-1)))
print(is_prime(5))
输出:
True