[Shootout-list] C++ pidigits

Falk Hueffner falk@debian.org
Tue, 15 Mar 2005 23:40:05 +0100


--=-=-=

Hi,

here's a C++ version of pidigits. It uses libgmp and needs to be
linked with -lgmpxx -lgmp.

-- 
	Falk


--=-=-=
Content-Type: text/x-c++src
Content-Disposition: inline; filename=pidigits.cc

#include <gmpxx.h>
#include <iostream>
#include <cstdlib>

struct State {
    State(mpz_class nq, mpz_class nr, mpz_class ns, mpz_class nt)
	: q(nq), r(nr), s(ns), t(nt) { }
    mpz_class q, r, s, t;
};

static inline mpz_class extract(const State& z, int x) {
    return (z.q * x + z.r) / (z.s * x + z.t);
}

static inline State lfts(mpz_class k) {
    return State(k, 4 * k + 2, 0, 2 * k + 1);
}

static inline State compose(const State& a, const State& b) {
    return State(a.q * b.q,
		 a.q * b.r + a.r * b.t,
		 a.s * b.q + a.t * b.s,
		 a.s * b.r + a.t * b.t);
}

int main(int argc, char *argv[]) {
    State z(1, 0, 0, 1);
    int k = 1, n = 0, m = std::atoi(argv[1]);
    while (n < m) {
	mpz_class y = extract(z, 3);
	while (y != extract(z, 4)) {
	    z = compose(z, lfts(k++));
	    y = extract(z, 3);	    
	}
	z = compose(State(10, -10 * y, 0, 1), z);
	std::cout << y;
	if ((++n % 10) == 0)
	    std::cout << "\t:" << n << std::endl;
    }
}

--=-=-=--