1: 0.000000 2: 0.000000 4: 0.250000 8: 0.500000 16: 0.625000 32: 0.656250 64: 0.640625 128: 0.609375 256: 0.578125 512: 0.550781 1024: 0.524414 2048: 0.494629 4096: 0.459473 8192: 0.420654 16384: 0.382507 32768: 0.349976 65536: 0.326782 131072: 0.314400 262144: 0.311932 524288: 0.316700 1048576: 0.325197 2097152: 0.334058 4194304: 0.340790 8388608: 0.344131 16777216: 0.344028 33554432: 0.341329 67108864: 0.337336 134217728: 0.333355 268435456: 0.330365 --- #include #include #include typedef long long int uint64_t; int p(uint64_t p) { // memoization table for primality static int *table = NULL, table_size = 0; int i, acc = 0; for (i = 0; p; i++) { if (p & 1) acc++; p >>= 1; } // 1 is not a prime if (acc == 1) return 0; // memoization table for primality of acc if (table_size < acc) { table = realloc(table, (acc + 1) * sizeof(int)); for (i = table_size; i <= acc; i++) table[i] = 2; table_size = acc; } else { if (table[acc] != 2) return table[acc]; } int sacc = sqrt(acc); for (i = 2; i <= sacc; i++) { if (!(acc % i)) return table[acc] = 0; } return table[acc] = 1; } int prime_counter(void) { uint64_t i = 0, acc = 0, t = 1; while (++i) { if (p(i)) acc++; if (i == t) { printf("%lld: %f\n", i, (double)acc / (double)i); t *= 2; } } }