python - Sieve of Eratosthenes returning incorrect answers -
i'm beginner trying create function determine whether or not value prime or not.
def isprime(number): marked = [] ## create empty list in xrange(2, number+1): if not in marked: ## begin loop remove multiples of in list j in xrange(i * i, number + 1, i): marked.append(j) if == number: ## i'm assuming if ##the program made here, not in marked. print isprime(7) >>> true print isprime(10) >>> none ## should false...ok tried tinkering here.
so attempt fix edit last conditional to:
if == number: return true else: ## begin new line of code correct false positive return false
this line messes though because shows:
isprime(7) >>> false
edit turns out method entirely bad method go. according comment jean-francois, easier method check primes
def is_prime(n): if n<2: return false # handle special case sn = int(n**0.5)+1 in range(2,sn): if n%i==0: return false return true
intuition:
let's want check if 61 prime.
- we know below 2 can't prime code has n<2 rule out.
- we know square root of 61 7.8, means if 61 non-prime, we've ruled out factor 8 or on 8.
so what's left test between 2 , 7. if between 2 , 7 see if they're factor of 61 , still fail, means know number prime.
i'm answering if not new stuff. answers question, gives 2 ways of working , tested , in python. should ontopic.
first, computing sieve each time unefficient test 1 number. if have lot of numbers test, that's way. working version (python 2 & 3 compatible), adapted me project euler solution
def primes(n): """generate list of prime numbers [2, 3, ... m] m largest prime <= n.""" n += 1 sieve = list(range(n)) sieve[:2] = [0, 0] in range(2, int(n**0.5)+1): if sieve[i]: j in range(i**2, n, i): sieve[j] = 0 # filter out composites, have been replaced 0's return [p p in sieve if p]
testing:
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]
to test specific number, instead
def is_prime(n): if n<2: return false # handle special case sn = int(n**0.5)+1 # +1 because of perfect squares 49 in range(2,sn): if n%i==0: return false return true
Comments
Post a Comment