�Ȥ����櫓�ǿ���ľ�������

�ϤƤʥ֥å��ޡ��� - mohno�Υ֥å��ޡ���
��Core i7 �� iMac �ǡ�10�����ϰϤ򸡺�����Τ�1�ץ�����300������ע��٤��äƤ��ȡ�������ȥ��ƥͥ��Τդ뤤�ǡ����Ļ�ε����Ǥ�10���ʤ�2ʬ��Core i7 920�ˡ���μ긵�Ǥ�20�á�Core 2 Duo E6850�ˤ��ä�������ɡ�

10�ä��ڤäƤ��ޤä��Τǡ�

���˥��르�ꥺ��Ǥ��뤬���������������äƤߤ���̤���������

  1. �ޤ� p < 256 �ʾ������ǿ��ǥ���ȥ��ƥͥ��Τդ뤤�ˤ���
  2. ����Miller-Rabin�ǿ�Ƚ��ˡ��Ŭ�Ѥ���

����ϡָġ���64bit�������ǿ����ɤ����פ�Ƚ�ꤹ��Τˤ�(�ǿ�ɽ��������Ȥ������)�٥��Ȥ˶ᤤ��ˡ�ʤΤ�������Ǥ�դ��ϰϤ��������ǿ������ƾ夲��פȤ�������ˤϼ¤�Ŭ���Ƥ��ʤ�����Ǥ�դ��ϰϡפ����ƥ��꡼����֤���ΤǤ���С�������ľ�ܥ���ȥ��ƥͥ��Τդ뤤�򤫤������Ĥä����򤢤�������®���Τ���

�ޤ���32bit���ǿ�ɽ�򤢤餫�����äƤ�����

mksieve32.c

/*
 * $Id: mksieve32.c,v 0.1 2010/07/27 15:21:58 dankogai Exp dankogai $
 */
#include <stdlib.h>
#include <stdio.h>
#include <limits.h>

#include <stdint.h>
typedef uint32_t U32;
typedef uint64_t U64;

#include "bitmap.c"

int main(void) {
    bitmap *b = bitmap_new((U64)INT_MAX+1, NULL);
    bitmap_fill(b, 1);
    bitmap_set( b, 0, 0); /* 1 is not prime */
    U64 p, i;
    for (p = 3; p < USHRT_MAX ;){
        printf("sieving %llu\r", p);
        fflush(stdout);
        for ( i = p + p ; i <=  UINT_MAX ; i += p ) {
            if ((i & 1) == 0) continue; /* skip even */
            bitmap_set( b, i>>1, 0 );
        }
        for(p += 2; !bitmap_get(b, p>>1); p += 2); /* seek next prime */
    }
    char filename[]  = "sieve32.bm";
    printf("saving %s\n", filename);
    bitmap_save(b, filename);
    return 0;
}

���켫�Ρ�(�⤦�����������٤�ˤʤ�?)Core i7��iMac����30�äۤɤ���������ʤ����ʤ���bitmap.c���ĥ���ơ�bitmap_fill()��bitmap_save()���ɲä���������餬���򤹤뤫�ϼ����Ǥ����������ʤߤ�bitmap_load()���ʤ��Τϡ�bitmap_new()�ˤ��ε�ǽ�����Ǥ�¸�ߤ��뤫�顣

primes.c

���ȤϤ���32bit�ǿ�ɽ�����Ѥ���и���Ū�ˤ�64bit�������ǿ������ƿ����夲�뤳�Ȥ��Ǥ���櫓�������������٤��������ˤդ뤤�򤫤���ΤǤϤʤ��������ޤ��ϰϻ��ꤷ���ϰϤΤߤˤ����롣��������α�դ���С�mksieve32.c�Ȥ�äƤ뤳�Ȥ��礷���Ѥ��ʤ���

/*
 * $Id: primes.c,v 0.2 2010/07/27 15:35:59 dankogai Exp dankogai $
 */
#include <stdlib.h>
#include <stdio.h>
#include <limits.h>
#include <errno.h>
#include <math.h>

#include <stdint.h>
typedef uint32_t U32;
typedef uint64_t U64;

#include "bitmap.c"

#define SIEVEFILE "sieve32.bm"

int main(int argc, char **argv) {
    bitmap *sieve = bitmap_new(0, SIEVEFILE);
    if (!sieve){
        perror(SIEVEFILE);
        exit(errno);
    }
    U64 start = argc > 1 ? atoll(argv[1]) : 0;
    U64 size  = argc > 2 ? atoll(argv[2]) : 1000*1000*1000;
    bitmap *b = bitmap_new(size >> 1, NULL);
    bitmap_fill(b, 1);
    if (start == 0) bitmap_set(b, 0, 0);
    U64 pmax = (U64)sqrtl(start+size);
#ifdef VERBOSE
    printf("pmax = %llu\n", pmax);
#endif
    U64 p, i;
    for (p = 3; p < pmax;){
#ifdef VERBOSE
        printf("sieving %llu\r", p);
        fflush(stdout);
#endif
        for ( i = p + p - (start % p) ; i <= size ; i += p ) {
            if ((i & 1) == 0) continue; /* skip even */
            bitmap_set( b, i>>1, 0 );
        }
        for(p += 2; !bitmap_get(sieve, p>>1); p += 2); /* seek next prime */
    }

    char filename[256];
    snprintf(filename, 256, "%llu~%llu.bm", start, start+size);
#ifdef VERBOSE
    printf("saving %s\n", filename);
#endif
    bitmap_save(b, filename);
    return 0;
}

�����Ȥ��ȡ�10���ʲ��Ǥ����10�ü���ϰ�10���θ���������롣999,999,999,000,000,000~1,000,000,000,000,000,000�����ʤ��10����˵��10���Ǥ���15�äۤɤǤ��ä���10���Ǥ�����ä����󲽤��ʤ��Ȥ�1�����٤ǽ����Ȥ������Ȥˤʤ롣ɬ�פʥǥ��������̤�61M�ΰ����ܤʤΤ�610G�Ȥ��ä��Ȥ�������

10���ޤǤ��ǿ��Υꥹ�Ȥ��äƤߤޤ��󤫡� - ���Ԥδ㡧ITpro
���Ԥ��ǽ�˥ץ�������񤤤��Τϡ��ŵ�Ź��ŹƬ�ˤ��ä�8�ӥåȵ������������Υޥ�����ǤϤȤƤ⤳��ʤȤ����ޤǤ����ʤ��ä����Ǥ������Ĺ�������ơ��ޤ������󥸤��Ƥߤ����Ȼפ���

������ϡ����ޡ����������פˤ����ä��о줷��Shor�Υ��르�ꥺ������������̻ҥ���ԥ塼�����о줷�ơ�RSA�˻Ȥ��Ƥ���褦���礭�ʿ����ǿ�Ƚ����֤ǽ����褦�ˤʤ�������뤫�⤷��ʤ�������������������Ƥ⡢����ȥ��ƥͥ��Τդ뤤�Ϥ��ޤ��ޤʷ��ǻȤ��³������������⤷�����ơ�������˴��⡣

Dan the Prime Counter

bitmap.c

/*
 * $Id: bitmap.c,v 0.2 2010/07/27 15:27:02 dankogai Exp dankogai $
 */
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/mman.h>

typedef struct {
    int    fd;
    size_t size;
    char  *map;
} bitmap;

bitmap *bitmap_free(bitmap *b){
    if (b){
        if (b->map) {
            if (b->fd){
                munmap(b->map, b->size);
                close(b->fd);
            }else{
                free(b->map);
            }
        }
        free(b);
    }
    return (bitmap *)NULL;
}

bitmap *bitmap_new(size_t size, const char *filename){
    bitmap *b = (bitmap *)malloc(sizeof(bitmap));
    struct stat st;
    if (!b) return (bitmap *)NULL;
    if (filename){
        b->fd = open(filename, 
                     size ? O_RDWR|O_CREAT : O_RDONLY, 
                     size ? (mode_t)0644   : (mode_t)0444);
        if (b->fd == -1) {
            perror(filename);
            return bitmap_free(b);
        }
        if (size){
            if (ftruncate(b->fd, size >> 3) == -1){
                perror(filename);
                return bitmap_free(b);
            }
            b->map = (char *)mmap(0, size >> 3, PROT_READ|PROT_WRITE,
                                  MAP_SHARED, b->fd, 0);

        }
        else{
            fstat(b->fd, &st);
            size = st.st_size << 3;
            b->map = (char *)mmap(0, size >> 3, PROT_READ, 
                                  MAP_PRIVATE, b->fd, 0);
        }
        if (b->map == MAP_FAILED) return bitmap_free(b);
    }
    else{
        if (!size) return (bitmap *)NULL;
        b->map = (char *)malloc(size >> 3);
        if (!b->map) return bitmap_free(b);
        b->fd = 0;
    }
    b->size = size;
    return b;
}

int bitmap_save(bitmap *b, const char *filename){
    int ok = 0, fd = open(filename, O_RDWR|O_CREAT|O_TRUNC, (mode_t)0644);
    if (fd != -1){
        if (write(fd, b->map, (b->size >> 3)) != -1) ok = 1;
    }
    if (!ok) perror(filename);
    close(fd);
    return ok;
}

void bitmap_fill(bitmap *b, int val){
    size_t i;
    for (i = 0; i < (b->size >> 3); i++) b->map[i] = val ? 0xff : 0;
}

static const int bits[] = { 1, 2, 4, 8, 16, 32, 64, 128 };

inline int bitmap_set(bitmap *b, size_t where, int val){
    if (val) b->map[where >> 3] |=  bits[where & 7];
    else b->map[where >> 3] &= ~bits[where & 7];
    return val;
}

inline int bitmap_get(bitmap *b, size_t where){
    return !!(b->map[where >> 3] & bits[where & 7]);
}

#ifdef TEST
#include <errno.h>
int main (int argc, char **argv){
    bitmap *b = bitmap_new(4096, (argc > 1 ? argv[1] : NULL));
    if (!b) return errno;
    bitmap_set(b, 0, 1);
    printf("%d\n", bitmap_get(b, 0));
    bitmap_free(b);
    return 0;
}
#endif