Eratosthenes筛选返回错误答案

时间:2016-07-25 18:58:40

标签: python if-statement boolean primes sieve-of-eratosthenes

我是一个初学者,试图创建一个函数来确定一个值是否为素数。

def isPrime(number):
    marked = [] ## create empty list
    for i in xrange(2, number+1):
        if i not in marked: ## begin loop to remove multiples of i in list
            for j in xrange(i * i, number + 1, i):
                marked.append(j)
            if i == number: ## I'm assuming that if 
            ##the program made it here, i is not in marked.

print isPrime(7)
>>> True
print isPrime(10)
>>> None ## This should be False...ok so I tried to tinkering here.

所以我尝试解决这个问题就是将最后一个条件编辑为:

if i == number:
    return True
else: ## Begin new line of code to correct for false positive
    return False

这条额外的线条会弄乱一切,因为它现在显示:

isPrime(7)
>>> False

编辑结果这个方法完全不好走。因此,根据Jean-Francois的评论,这是一种更容易检查素数的方法

def is_prime(n):
    if n<2:
       return False  # handle special case
    sn = int(n**0.5)+1
    for i in range(2,sn):
        if n%i==0:
            return False
    return True

直觉:

让我们说要检查61是否是素数。

  • 我们知道2以下的任何东西都不是素数,所以这段代码的n <2 把它排除在外。
  • 我们知道61的平方根约为7.8, 这也意味着如果61是非素数,我们就排除了 因子是8或任何超过8。

所以剩下要测试的是2到7之间的所有内容。如果2到7之间的所有内容都是61并且它们仍然失败,那就意味着我们知道这个数字是素数。

1 个答案:

答案 0 :(得分:1)

即使这不是新东西,我也在回答这个问题。它回答了这个问题,给出了两种工作方式,并在python中进行了测试。应该是ontopic。

首先,每次计算筛子都非常不能测试一个数字。 如果你有很多要测试的数字,那就是这样。 一个工作版本(python 2&amp; 3兼容),由我从一些Project Euler解决方案

改编而来
=VLOOKUP(D597,'Sheet1'!$AA$3:$AC$5000,3,FALSE)

测试:

def primes(n):
    """Generate a list of the prime numbers [2, 3, ... m] where
    m is the largest prime <= n."""
    n += 1
    sieve = list(range(n))
    sieve[:2] = [0, 0]
    for i in range(2, int(n**0.5)+1):
        if sieve[i]:
            for j in range(i**2, n, i):
                sieve[j] = 0
    # Filter out the composites, which have been replaced by 0's
    return [p for p in sieve if p]

要测试特定数字,请改为执行此操作

print(primes(100))
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]