This technical article documents algorithms for generating 32-bit prime numbers, presenting educational content on computational methods including trial division, wheel factorization, and the Sieve of Eratosthenes. The content engages mildly with UDHR Articles 19 (freedom of expression via open publication) and 26 (education through accessible technical documentation), reflecting foundational commitments to information freedom and knowledge sharing without explicitly addressing human rights frameworks. The overall lean is neutral-to-positive regarding human rights, with weak advocacy for educational access and free expression through structural and editorial choices.
there are also very fast primality tests that work statistically. It's called Miller-Rabin, I tested in the browser here[1] and it can do them all in about three minutes on my phone.
> There is a long way to go from here. Kim Walisch's primesieve can generate all 32-bit primes in 0.061s (though this is without writing them to a file)
Oh, come on, just use a bash indirection and be done with it. It takes 1 minute and you had another result for comparison
There is also the segmented Sieve of Eratosthenes. It has a simlar performance but uses much less memory: the number of prime numbers from 2 to sqrt(n). For example, for n = 1000000, the RAM has to store only 168 additional numbers.
You can combine the Sieve and Wheel techniques to reduce the memory requirements dramatically. There's no need to use a bit for numbers that you already know can't be prime. You can find a Python implementation at https://stackoverflow.com/a/62919243/5987
Why include writing the primes to a file instead of, say, standard output? That increases the optimization space drastically and the IO will eclipse all the careful bitwise math
Does having the primes in a file even allow faster is-prime lookup of a number?
I have a little tool called Prime Grid Explorer at https://susam.net/primegrid.html that I wrote for my own amusement. It can display all primes below 3317044064679887385961981 (an 82-bit integer).
So essentially it can test all 81-bit integers and some 82-bit integers for primality. It does so using the Miller-Rabin primality test with prime bases derived from https://oeis.org/A014233 (OEIS A014233). The algorithm is implemented in about 80 lines of plain JavaScript. If you view the source, look for the function isPrimeByMR.
The Miller-Rabin test is inherently probabilistic. It tests whether a number is a probable prime by checking whether certain number theoretic congruence relations hold for a given base a. The test can yield false positives, that is, a composite number may pass the test. But it cannot have false negatives, so a number that fails the test is definitely composite. The more bases for which the test holds, the more likely it is that the tested number is prime. It has been computationally verified that there are no false positives below 3317044064679887385961981 when tested with prime bases 2, 3, 5, ..., 41. So although the algorithm is probabilistic, it functions as a deterministic test for all numbers below this bound when tested with these 13 bases.
This got me through many of the first 100 problems on Project Euler:
n = 1000000 # must be even
sieve = [True] * (n/2)
for i in range(3,int(n**0.5)+1,2):
if sieve[i/2]: sieve[i*i/2::i] = [False] * ((n-i*i-1)/(2*i)+1)
…
# x is prime if x%2 and sieve[x/2]
Edit: I guess I irked someone. :/ Yes this is a memory hog, but to me beautiful because it’s so tiny and simple. I never tried very hard, but I wonder if it could be made a real one-liner.
I'm pretty sure you can get rid of the 0xFFFFFFFF / p and get some more speedup by manually implementing the bitarray ops. You can get another boost by using BSF instruction [1] to quickly scan for the next set bit. And you really only need to store odd numbers; storing the even numbers is just wasteful.
You can get even more speedup by taking into account cache effects. When you cross out all the multiples of 3 you use 512MB of bandwidth. Then when you cross out all multiples of 5 you use 512MB more. Then 512MB again when you cross out all multiples of 7. The fundamental problem is that you have many partially generated cache-sized chunks and you cycle through them in order with each prime. I'm pretty sure it's faster if you instead fully generate each chunk and then never access it again. So e.g. if your cache is 128k you create a 128k chunk and cross out multiples of 3, 5, 7, etc. for that 128k chunk. Then you do the next 128k chunk again crossing out multiples of 3, 5, 7, etc. That way you only use ~512MB of memory bandwidth in total instead of 512MB per prime number. (Actually it's only really that high for small primes, it starts becoming less once your primes get bigger than the number of bits in a cache line.)
Very nice!
One small note: In an Eratosthenes sieve, you can start crossing out numbers from p^2, since i*p for i<p will have already been crossed out in step i at the latest. You can simply replace
Heh.
1.Create fast modulus quad M for dword D for the first 2000? 200000? (xM)D
2.Eliminate 0b,101b
3.Divide using vrcp14ss/vdivss with correction. Use fast square root too using rsqrt14.
No real reason. It's just an arbitrary task I made for myself. I might have to adjust the goal if writing to the file becomes the lion's share of the runtime, but I'll be pretty happy with myself if that's the project's biggest problem.
Content presents technical information and documentation in written form without editorial restrictions; author freely publishes analysis and code implementation details; no external censorship observed.
FW Ratio: 60%
Observable Facts
Page contains freely published technical article documenting algorithm implementations.
Content includes code samples, mathematical proofs, and implementation notes without editorial redaction.
Page provides links to referenced implementations and GitHub repository with no access restrictions.
Inferences
The open publication and accessibility of technical content suggests structural support for freedom of expression.
Absence of editorial filtering or ideological constraints indicates implicit respect for information freedom, though the neutral technical subject matter makes this a mild rather than strong signal.
Content documents technical algorithms and programming techniques with explicit explanatory intent; provides educational commentary including time complexity analysis, implementation strategies, and references to external resources for further learning.
FW Ratio: 60%
Observable Facts
Page presents algorithm documentation structured for learner comprehension with headers, code samples, and explanatory prose.
Content includes references to external implementations and citations to academic literature enabling further study.
Page provides performance comparisons and complexity analysis intended to develop reader understanding of algorithmic principles.
Inferences
The educational framing and accessible presentation suggest commitment to knowledge sharing consistent with Article 26 principles.
Open publication model without gatekeeping supports access to education, though the technical specificity narrows the audience from Article 26's broader 'everyone' mandate.
Site permits open publication of content on personal domain without gating or filtering; content accessible to all visitors without authentication or consent requirements.
Site structure enables free access to educational material without paywalls or credential requirements; content organization uses clear headings, code examples, and mathematical exposition to support understanding.