Re[4]: Опять простые числа :)
От: flyker Россия  
Дата: 12.04.02 06:25
Оценка: 16 (2)
Здравствуйте muh, Вы писали:

muh>Здравствуйте vladsm, Вы писали:


V>>I) Тест Леманна


V>>II) Очень распространенный тест Рабина-Миллера


muh>+ еще вариант с построением дерева Кэли %)


Кстати кому интересно я тут еще один способ нарыл

#include <stdio.h>

#include <conio.h>

#include <math.h>

unsigned long n; /* нечетное число, проверяемое на простоту */

/* SPP - функция, равная 1, если */

/* n - сильно псевдопростое число по основанию b */

/* и 0, в противном случае */

int SPP(int b) {

register int k,i;

static unsigned long q;

/* p и x - переменные для точного (64 двоичных разряда) */

/* выполнения промежуточных умножений по mod n */

static double long p,x;

/* вычисление k и нечетного q таких, что n-1=q*2^k */

for(q=n-1,k=0;q%2==0;q>>=1,k++);

/* вычисление p=mod(b^q,n); */

for(x=b,p=q%2?x:1,q>>=1;q>0;q>>=1) {

x=fmodl(x*x,n);

if(q%2) p=fmodl(p*x,n);

}

if(p==1||p==n-1) return 1;

/* поиск i, для которого mod(q*2^i.n)=n-1 */

for(i=1;i<k;i++) if((p=fmodl(p*p,n))==n-1) return 1;

return 0;

}

/*--------------------------------------------------------------------------*/

int main(void) {

FILE *out;

static char *name="rez1.txt"; /* имя файла с результатом */

static unsigned long B,E; /* вводимый диапазон поиска */

static unsigned long NB,NE; /* приведенный диапазон поиска */

static unsigned long k; /* количество простых чисел */

static short p[4]={2,3,5,7},i; /* первые четыре простых числа */

clrscr();

printf("Команда 054. Задача 1.\n");

printf("Простые числа в диапазоне от NB до NE\n");

printf("1<=NB<=NE<=4294967295\n");

/* ввод и приведение начала диапазона к нечетному числу */

printf("NB="); scanf("%lu",&B);

if(B<1) {fprintf(stderr,"*** ошибка NB=%lu\n",B); return 1;}

NB=B; if(B%2==0) NB++;

/* ввод и приведение конца диапазона к нечетному числу */

printf("NE="); scanf("%lu",&E);

if(E<B) {fprintf(stderr,"*** ошибка NE=%lu\n",E); return 1;}

NE=E; if(E%2==0) NE--;

out=fopen(name, "wt");

/* проверка принадлежности введенному диапазону */

/* первых четырех простых чисел */

for(k=0,i=0;i<4;i++) if((B<=p[i])&&(p[i]<=E)) {

k++; fprintf(out," %u",p[i]);

}

/* поиск оставшихся простых чисел в приведенном диапазоне */

n=7; if(NB>9) n=NB-2;

while(n<NE) {

n+=2;

if(SPP(2)&&SPP(3)&&SPP(5)&&SPP(7)&&n!=3215031751L) {

k++; fprintf(out," %lu",n);

}

}

fclose(out);

printf("Количество простых чисел = %lu\n",k);

printf("Результат работы программы записаны в файл %s\n",name);

return 0;

}

Взято отсюда http://www.tl.ru/~gimn13/docs/dooi/054/054ZDCH1.html
Все гениальное — просто
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.