среда, 11 августа 2010 г.

Поиск простых чисел

Откопал из закромов свою программу на Си для поиска простых чисел по алгоритму решета Эратосфена:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
const int MAX_NUMBER =1048576;
const unsigned long masks[32]={0x80000000,0x40000000,0x20000000,0x10000000,
0x08000000,0x04000000,0x02000000,0x01000000,
0x00800000,0x00400000,0x00200000,0x00100000,
0x00080000,0x00040000,0x00020000,0x00010000,
0x00008000,0x00004000,0x00002000,0x00001000,
0x00000800,0x00000400,0x00000200,0x00000100,
0x00000080,0x00000040,0x00000020,0x00000010,
0x00000008,0x00000004,0x00000002,0x00000001};
inline unsigned long getBit(unsigned long *ptr,unsigned long bit)
{
return ptr[bit>>5]&masks[bit&0x1f];
}
inline void setBit(unsigned long *ptr,unsigned long bit)
{
ptr[bit>>5]|=masks[bit&0x1f];
}
inline void resetBit(unsigned long *ptr,unsigned long bit)
{
ptr[bit>>5]&=~masks[bit&0x1f];
}
void main(void)
{
unsigned long maxNum=MAX_NUMBER;
unsigned long *ptr=(unsigned long *)malloc(maxNum/8);
if (ptr==NULL)
{
fprintf(stderr,"Can't get memory for buffer.\n");
return;
}
memset(ptr,0xff,maxNum/8);
for(unsigned long i=2;i<maxNum;i++)
if (getBit(ptr,i)!=0)
{
fprintf(stdout,"%ld\r",i);
fprintf(stderr,"%ld\r",i);
for(unsigned long j=2*i;j<maxNum;j+=i)
resetBit(ptr,j);
}
free(ptr);
}

Судя по отметке времени на файле, программа была написана 28 октября 2002 года. Ищет простые числа от 1 до 1048576. На хранение всего "решета" отводится 128 килобайт памяти. Для поиска чисел до миллиарда потребуется 128 мегабайт.

Комментариев нет:

Отправить комментарий