Решето Сундарама

Решето Сундарама – алгоритм поиска всех простых чисел в некотором заданном диапазоне. Он был разработан в 1934 году ныне безызвестным студентом из Индии С. П. Сундарамом.

Принцип работы алгоритма Сундарама сводится, как и в его знаменитом предшественнике, к последовательному отсеиванию всех ненужных чисел. Но у него есть одна небольшая особенность: результатом работы алгоритма будет последовательность простых чисел из диапазона от 2 до удвоенного значения граничного числа. Допустим необходимо получить все простые числа до некоторого n, тогда выходными данными будут все простые числа от 2 до 2 n +1.

Решето Сундарама из ряда натуральных чисел, не превышающих n, исключает числа вида 2 ij + i + j. Результат данного выражения, ни при каких значениях входящих в него переменных, не превышает n (2 ij + i + jn). Соблюдая это условие, а также то, что i всегда меньше или равно j, переменные i и j пробегают все натуральные значения из множеств:

i = 1, 2, 3, …,

j = i, i +1, i +2, …,

После исключения всех ненужных чисел необходимо увеличить каждое оставшиеся число в два раза и прибавить единицу (2 i +1). Итоговое множество будет содержать числа: 2, 3, …, 2 n +1.

Код программы на C++:

void Sundaram(bool A[], int n) //Решето Сундарама

{

int i, j;

for (i=1; i<=n; i++) A[i]=true;

i=1;

j=1;

while ((2*i*j+i+j)<=n)

{

while (j<=(n-i)/(2*i+1))

{

A[2*i*j+i+j]=false;

j++;

}

i++;

j=i;

}

for (i=1; i<=n; i++)

if (A[i]) cout<<2*i+1<<" ";

}

void main() //главная функция

{

int n, i, j;

bool A[1000];

cout<<"n > "; cin>>n;

cout<<"Простые числа: 2 ";

Sundaram(A, n);

}

Код программы на Pascal:

type arr=array [1..1000] of boolean;

var

n: integer;

A: arr;

procedure Sundaram(A: arr; n: integer); {Решето Сундарама}

var i, j: integer;

begin

for i:=1 to n do A[i]:=true;

i:=1;

j:=1;

while (2*i*j+i+j)<=n do

begin

while j<=(n-i)/(2*i+1) do

begin

A[2*i*j+i+j]:=false;

j:=j+1;

end;

i:=i+1;

j:=i;

end;

write(2, ' ');

for i:=1 to n do

if A[i] then write(2*i+1, ' ');

end;

begin {основной блок программы}

write('n > ');

read(n);

writeln('Простые числа:');

Sundaram(A, n);

end.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: