Реализации алгоритмов/Решето Эратосфена: различия между версиями

Содержимое удалено Содержимое добавлено
м →‎Haskell: дополнение, уточнение, обновление данных
Добавлены ссылки на Решето Аткина и Сундарама; поправлено форматирование
Строка 1:
{{wikipedia|Решето Эратосфена}}
Решето'''Решето́ Эратосфе́на''' — алгоритм нахождения всех простых чисел, доне некоторогопревышающих целогонекоторое числанатуральное число ''n''.
 
=Реализации=
Множество примеров реализации приведено в проекте rosettacode.org<ref>[http://rosettacode.org/wiki/Sieve_of_Eratosthenes Реализация метода на различных языках программирования]</ref>. В данном разделе приводится несколько примеров на популярных языках программирования:
 
==[[w:C (язык программирования)|C]]/[[w:C++|C++]]==
== С / С++ ==
<source lang="cpp">
int n;
vector<bool> prime (n + 1, true);
prime[0] = prime[1] = false;
for (int i = 2; i * i <= n; ++i) // valid for n < 46340^2 = 2147395600
if (prime[i])
for (int j = i * i; j <= n; j += i)
prime[j] = false;
</source>
 
== [[w:Java |Java]]==
<source lang="java">
import java.util.Arrays;
 
 
int n;
boolean[] primes = new boolean[n + 1];
 
public void fillSieve() {
Arrays.fill(primes, true);
primes[0] = primes[1] = false;
for (int i = 2; i < primes.length;i ++i) {
if (primes[i]) {
for (int j = 2; i * j < primes.length;j ++j) {
primes[i * j] = false;
}
}
Строка 33 ⟶ 37 :
</source>
 
== Python 2.x Haskell==
===Базисный вариант===
Функция возвращает список простых и список составных чисел вплоть до заданного ''n'':
<source lang="python">
def eratosthenes(n):
primes = []
multiples = []
for i in xrange(2, n+1):
if i not in multiples:
primes.append(i)
multiples.extend(xrange(i*i, n+1, i))
return (primes, multiples)
</source>
 
== Python 3.x ==
Функция возвращает список ("''решето''"), в котором все составные числа заменены нулями:
<source lang="python">
def eratosthenes(n): # n - число, до которого хотим найти простые числа
sieve = list(range(n + 1))
sieve[1] = 0 # без этой строки итоговый список будет содержать единицу
for i in sieve:
if i > 1:
for j in range(i + i, len(sieve), i):
sieve[j] = 0
return sieve
</source>
 
== Python 3.x ==
<source lang="python">
n = int(input()) # число, до которого хотим найти простые числа
numbers = list(range(2, n+1))
for number in numbers:
for candidate in range(2*number,n,number):
numbers[candidate] = 0
print(*list(filter(lambda x: x!=0, numbers))) # выводим простые числа
</source>
 
== Python 3.x (списковое включение) ==
Полностью на генераторах списков
<source lang="python">
n = int(input())
s = [x for x in range(1,n) if x not in [i for sub in [list(range(2*j,n,j)) for j in range(2,n//2)] for i in sub]]
print(*s)
</source>
 
== Haskell ==
Базисный вариант:
<source lang="haskell">
primesTo n = eratos [2..n] where
Строка 91 ⟶ 51 :
</source>
 
===Вариация по типу Эйлера:===
<source lang="haskell">
primesToEU n = eulers [2..n] where
Строка 100 ⟶ 60 :
</source>
 
===Медленный вариант, с использованием функционала filter:===
<source lang="haskell">
primesOf n = helper [2..n] where
Строка 108 ⟶ 68 :
 
filt a lst = filter (\x -> (mod x a) /= 0) lst
</source>
 
</source>
===Неограниченное решето===
 
С немедленным отсеиванием (медленно):
<source lang="haskell">
Строка 119 ⟶ 78 :
</source>
 
===С отложенным отсеиванием, от квадратов простых чисел (гораздо быстрее):===
<source lang="haskell">
primesEQ = 2 : sieve [3..] 4 primesEQ
Строка 128 ⟶ 87 :
</source>
 
===С комбинированным решетом, от Richard Bird:===
 
<source lang="haskell">
primesB = 2 : minus [3..] (foldr (\p r-> (p*p) : union [p*p+p,p*p+2*p..] r)
Строка 140 ⟶ 98 :
</source>
 
==Python 2.x==
== Примечания ==
Функция возвращает список простых и список составных чисел вплоть до заданного ''n'':
<source lang="python">
def eratosthenes (n):
primes = []
multiples = []
for i in xrange(2, n + 1):
if i not in multiples:
primes.append(i)
multiples.extend(xrange(i * i, n + 1, i))
return (primes, multiples)
</source>
 
==[[w:Python|Python 3.x]]==
===Вариант № 1===
Функция возвращает список ("''решето''"), в котором все составные числа заменены нулями:
<source lang="python">
def eratosthenes(n): # n - число, до которого хотим найти простые числа
sieve = list(range(n + 1))
sieve[1] = 0 # без этой строки итоговый список будет содержать единицу
for i in sieve:
if i > 1:
for j in range(i + i, len(sieve), i):
sieve[j] = 0
return sieve
</source>
 
===Вариант № 1===
<source lang="python">
n = int(input()) # число, до которого хотим найти простые числа
numbers = list(range(2, n + 1))
for number in numbers:
for candidate in range(2 * number, n, number):
numbers[candidate] = 0
print(*list(filter(lambda x: x != 0, numbers))) # выводим простые числа
</source>
 
===Вариант № 3 (списковое включение)===
Полностью построено на генераторах списков.
<source lang="python">
n = int(input())
s = [x for x in range(1, n) if x not in [i for sub in [list(range(2 * j, n, j)) for j in range(2, n // 2)] for i in sub]]
print(*s)
</source>
 
=См. также=
[[Реализации алгоритмов/Решето Аткина|Решето Аткина]]
 
[[Реализации алгоритмов/Решето Сундарама|Решето Сундарама]]
 
=Примечания=
{{примечания}}