55 lines
1.0 KiB
Python
55 lines
1.0 KiB
Python
|
|
def sieve(limit):
|
|
'''https://stackoverflow.com/a/3941967
|
|
'''
|
|
a = [True] * limit # Initialize the primality list
|
|
a[0] = a[1] = False
|
|
|
|
for (i, isprime) in enumerate(a):
|
|
if isprime:
|
|
yield i
|
|
for n in range(i*i, limit, i): # Mark factors non-prime
|
|
a[n] = False
|
|
|
|
|
|
def is_prime(n):
|
|
'''Returns True if n is prime.
|
|
https://stackoverflow.com/a/18833845'''
|
|
if n == 1:
|
|
return False
|
|
if n == 2:
|
|
return True
|
|
if n == 3:
|
|
return True
|
|
if n % 2 == 0:
|
|
return False
|
|
if n % 3 == 0:
|
|
return False
|
|
|
|
i = 5
|
|
w = 2
|
|
|
|
while i * i <= n:
|
|
if n % i == 0:
|
|
return False
|
|
i += w
|
|
w = 6 - w
|
|
|
|
return True
|
|
|
|
|
|
def prime_factors(n):
|
|
'''https://stackoverflow.com/a/22808285
|
|
'''
|
|
i = 2
|
|
factors = []
|
|
while i * i <= n:
|
|
if n % i:
|
|
i += 1
|
|
else:
|
|
n //= i
|
|
factors.append(i)
|
|
if n > 1:
|
|
factors.append(n)
|
|
return factors
|