5 int main(int argc
, char *argv
[]) {
7 if (argc
> 1) k
= atoi(argv
[1]);
10 mpz_init(r
); mpz_init(s
);
15 for (i
= 1; i
<= k
; i
++ ) {
16 mpz_mul_ui(s
, s
, (2 * i
) * (2 * i
+ 1));
17 mpz_mul_ui(r
, r
, (2 * i
) * (2 * i
+ 1));
24 gmp_printf("%Zd / %Zd\n", r
, s
);
28 // Compute limit = (2k + 1)! / 2
29 mpz_mul_ui(limit
, s
, k
);
30 mpz_mul_ui(limit
, s
, 2 * k
+ 1);
31 gmp_printf("%Zd\n", limit
);
35 mpz_init(p0
); mpz_init(p1
);
36 mpz_init(q0
); mpz_init(q1
);
41 mpz_init(a
); mpz_init(b
);
43 mpz_init(t0
); mpz_init(t1
);
48 mpz_fdiv_qr(t0
, t1
, a
, b
);
50 mpz_addmul(p0
, p1
, t0
);
51 mpz_addmul(q0
, q1
, t0
);
53 if (mpz_cmp(a
, limit
) >= 0) {
54 printf("limit exceeded\n"); break;
58 gmp_printf("%Zd (%Zd) -> %Zd / %Zd\n", t0
, t1
, p1
, q1
);
59 if (!mpz_sgn(t1
)) break;
65 mpz_clear(r
); mpz_clear(s
);
66 mpz_clear(t0
); mpz_clear(t1
);
67 mpz_clear(a
); mpz_clear(b
);