Алгоритм Аткина

  1. def atkins(limit):
  2.     primes = [False] * limit
  3.     sqrt_limit = int( math.sqrt( limit ) )
  4.  
  5.     x_limit = int( math.sqrt( ( limit + 1 ) / 2 ) )
  6.     for x in xrange( 1, x_limit ):
  7.         xx = x*x
  8.  
  9.         for y in xrange( 1, sqrt_limit ):
  10.             yy = y*y
  11.  
  12.             n = 3*xx + yy
  13.             if n <= limit and n%12 == 7:
  14.                 primes[n] = not primes[n]
  15.  
  16.             n += xx
  17.             if n <= limit and n%12 in (1,5):
  18.                 primes[n] = not primes[n]
  19.  
  20.             if x > y:
  21.                 n -= xx + 2*yy
  22.                 if n <= limit and n%12 == 11:
  23.                     primes[n] = not primes[n]
  24.  
  25.     for n in xrange(5,limit):
  26.         if primes[n]:
  27.             for k in range(n*n, limit, n*n):
  28.                 primes[k] = False
  29.  
  30.     return [2,3] + filter(primes.__getitem__, xrange(5, limit))
Алгоритм Аткина - быстрый современный алгоритм нахождения всех простых чисел до заданного целого числа N.

Реклама

Мы в соцсетях

tw tg yt gt