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

Popular posts from this blog

jOOQ update returning clause with Oracle -

java - Warning equals/hashCode on @Data annotation lombok with inheritance -

java - BasicPathUsageException: Cannot join to attribute of basic type -