primes.c00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00054
00055 #include <stdio.h>
00056 #include <stdarg.h>
00057 #include <sys/param.h>
00058 #include <string.h>
00059 #include <imath.h>
00060
00061
00062
00063
00064
00065
00066
00067
00068 #if DATA_SIZE > 8192 + 512
00069 # undef DATA_SIZE
00070 # define DATA_SIZE 8192 + 512
00071 #endif
00072
00073
00074 #if DATA_SIZE < 512
00075 # define MAX_PRIMES (DATA_SIZE - 128)
00076 #else
00077 # define MAX_PRIMES (DATA_SIZE - 512)
00078 #endif
00079
00080 #define LAST_PRIME (MAX_PRIMES * 8L)
00081
00082
00083 unsigned char prime_list[MAX_PRIMES];
00084
00085
00086 static inline int
00087 is_prime (unsigned long n)
00088 {
00089 unsigned short bit = (unsigned short) (n) & 0x07;
00090
00091 return prime_list[n >> 3] & (1 << bit);
00092 }
00093
00094
00095 static inline void
00096 set_prime (unsigned long n)
00097 {
00098 unsigned short bit = (unsigned short) (n) & 0x07;
00099
00100 prime_list[n >> 3] |= (1 << bit);
00101 }
00102
00103
00104
00105 static int
00106 check_for_prime (unsigned long n)
00107 {
00108 unsigned long i;
00109 unsigned char *p;
00110 unsigned long last_value;
00111 unsigned char small_n;
00112
00113 small_n = (n & 0xffff0000) == 0;
00114 i = 0;
00115
00116
00117 last_value = lsqrt (n);
00118
00119
00120
00121 p = prime_list;
00122 do
00123 {
00124 unsigned char val;
00125
00126 val = *p++;
00127 if (val)
00128 {
00129 unsigned short j;
00130 unsigned long q;
00131
00132 q = i;
00133 for (j = 1; val && j <= 0x80; j <<= 1, q++)
00134 {
00135 if (val & j)
00136 {
00137 val &= ~j;
00138
00139
00140 if (small_n)
00141 {
00142 unsigned short r;
00143
00144
00145 r = (unsigned short) (n) % (unsigned short) (q);
00146 if (r == 0)
00147 return 0;
00148 }
00149 else
00150 {
00151 unsigned long r;
00152
00153 r = n % q;
00154
00155
00156 if (r == 0)
00157 return 0;
00158 }
00159 }
00160 }
00161 }
00162 i += 8;
00163 }
00164 while (i < last_value);
00165 return 1;
00166 }
00167
00168 #if 0
00169
00170
00171 static void
00172 print_primes (void)
00173 {
00174 long i;
00175
00176 for (i = 0; i < LAST_PRIME; i++)
00177 if (is_prime (i))
00178 printf ("%ld\n", i);
00179 }
00180 #endif
00181
00182
00183
00184 int verbose = 0;
00185
00186 int
00187 main ()
00188 {
00189 long i;
00190 short cnt = 0;
00191
00192 printf ("Computing prime numbers below %ld\n",
00193 (long) LAST_PRIME);
00194 memset (prime_list, 0, sizeof (prime_list));
00195 for (i = 2; i < LAST_PRIME; i++)
00196 {
00197 if (check_for_prime (i))
00198 {
00199 set_prime (i);
00200 cnt ++;
00201 if (verbose)
00202 printf ("%ld\n", i);
00203 }
00204 }
00205 printf ("Found %ld prime numbers below %ld\n",
00206 (long) cnt, (long) LAST_PRIME);
00207
00208 return 0;
00209 }
|