�Ȥ����櫓�ǿ���ľ�������
�ϤƤʥ֥å��ޡ��� - mohno�Υ֥å��ޡ�����Core i7 �� iMac �ǡ�10�����ϰϤ򸡺�����Τ�1�ץ�����300������ע��٤��äƤ��ȡ�������ȥ��ƥͥ��Τդ뤤�ǡ����Ļ�ε����Ǥ�10���ʤ�2ʬ��Core i7 920�ˡ���μ긵�Ǥ�20�á�Core 2 Duo E6850�ˤ��ä�������ɡ�
10�ä��ڤäƤ��ޤä��Τǡ�
���˥��르�ꥺ��Ǥ��뤬���������������äƤߤ���̤���������
- �ޤ� p < 256 �ʾ������ǿ��ǥ���ȥ��ƥͥ��Τդ뤤�ˤ���
- ����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
���Υ֥����˥����Ȥ���ˤ�����������ɬ�פǤ���
��������������
���ε����ˤϵ��ĥ桼�����������Ȥ��Ǥ��ޤ���