require "big" def pi q, r, t, k, n, l = [1, 0, 1, 1, 3, 3].map { |n| BigInt.new(n) } dot_written = false loop do if 4*q + r - t < n*t yield n unless dot_written yield '.' dot_written = true end nr = 10*(r - n*t) n = ((10*(3*q + r)) / t) - 10*n q *= 10 r = nr else nr = (2*q + r) * l nn = (q*(7*k + 2) + r*l) / (t*l) q *= k t *= l l += 2 k += 1 n = nn r = nr end end end pi { |digit_or_dot| print digit_or_dot; STDOUT.flush }