import mathdef atkin_sieve(limit): primes = [False] * (limit + 1) square_limit = int(math.sqrt(limit))# Отметитьвсечисла, делящиесянацелона 2, 3 или 5for i in range(1, square_limit + 1): for j in range(1, square_limit + 1): num = 4 * i**2 + j**2 if num <= limit and (num % 12 == 1 or num % 12 == 5): primes[num] = not primes[num] num = 3 * i**2 + j**2 if num <= limit and num % 12 == 7: primes[num] = not primes[num] num = 3 * i**2 - j**2 if i > j and num <= limit and num % 12 == 11: primes[num] = not primes[num]# Удалитькратныеквадратампростыхчиселfor i in range(5, square_limit): if primes[i]: for j in range(i**2, limit + 1, i**2): primes[j] = False# Вернутьсписокпростыхчиселreturn [2, 3] + [i for i in range(5, limit) if primes[i]]# Примериспользованияprint(atkin_sieve(100))
↧
Answer by РомаТютин for Sieve of Eratosthenes - Finding Primes Python
↧