Sieve of Pritchard: Difference between revisions

Content added Content deleted
(→‎C#: Small shortcut, explanation expanded)
(→‎Python: Started by noticing that the max() should be a min(), then noticed there was some other places that could be made more efficient.)
Line 185: Line 185:
while prime * prime <= limit:
while prime * prime <= limit:
if steplength < limit:
if steplength < limit:
nlimit = min(prime * steplength, limit)
for w in list(members):
for w in list(members):
n = w + steplength
n = w + steplength
while n <= max(prime * steplength, limit):
while n <= nlimit:
members.add(n)
members.add(n)
n += steplength
n += steplength
steplength = min(prime * steplength, limit)
steplength = nlimit
for w in sorted(members):
for w in sorted(members):
n = prime * w
n = prime * w
if n in members:
if n > steplength: break # no use trying to remove items that can't even be there
members.remove(n)
members.remove(n) # no checking necessary now
primes.append(prime)
primes.append(prime)
prime = 3 if prime == 2 else min(m for m in members if m > 1)
prime = 3 if prime == 2 else min(m for m in members if m > 1)
if steplength < limit:
if steplength < limit:
for w in list(members):
for w in sorted(members):
n = w + steplength
n = w + steplength
if n > limit: break # no use etc...
while n <= limit:
while n <= limit:
members.add(n)
members.add(n)
n += steplength
n += steplength
return primes + sorted(members)[1:]
steplength = limit
primes += [m for m in members if m != 1]
return sorted(p for p in primes if p <= limit)


print(pritchard(150))
print(pritchard(150))