A file containing the first 220=1,048,576 binary digits of π after the radix point can be found at http://weitz.de/files/pi.zip
. The file is meant to be read byte by byte (i.e. octet by octet) and each individual byte should be read from least to most significant bit. Here's some demo code in Python to read the file bit by bit:
def bits (name): with open(name, "rb") as infile: byte = infile.read(1) while byte: num = int.from_bytes(byte, "little") for i in range(8): yield num % 2 num >>= 1 byte = infile.read(1)
The file was created using the Julia program below. It implements a so-called "streaming" spigot algorithm by Jeremy Gibbons. The code can in theory create an unlimited number of digits although it will become slower over time and its memory consumption will increase. (Creating one million binary digits took about two hours on my run-of-the-mill PC.)
using Printf, Dates # for Julia 1.x function spigot(n) V1::BigInt = 1 V2::BigInt = 0 V4::BigInt = 1 num, den, prod = 1, 3, 3 i, j, byte = -1, 0, 0 start = now() open("pi", "w") do out while i <= n if 4V1+V2-V4 < prod*V4 if i >= 0 byte += prod << j j += 1 if j == 8 write(out, byte % UInt8) j, byte = 0, 0 end end i += 1 if i % 1000 == 0 @printf("%9d, %s\n", i, Dates.canonicalize(Dates.CompoundPeriod(now() - start))) end # see remark below V1, V2, prod = 2V1, 2*(V2-prod*V4), div(2*(3V1+V2),V4)-2prod else V1, V2, V4, prod = num*V1, den*(2V1+V2), den*V4, div(7num*V1+2+den*V2,den*V4) num += 1 den += 2 end if num % 50 == 0 g::BigInt = gcd(V1, V2, V4) V1, V2, V4 = div(V1, g), div(V2, g), div(V4, g) end end end end
If you want to emit decimal instead of binary digits, change the four 2's in the line below the comment to 10's. Of course, you'll then have to change the output code as well which currently collects bits until it can write one byte to the file. (That's the if i >= 0
part which is executed for each digit with the digit in the variable prod
.)