6 // e = [2; 1, 2, 1, 1, 4, 1, ...]
7 static void *e_expansion(cf_t cf
) {
9 mpz_init(even
); mpz_init(one
);
10 mpz_set_ui(even
, 2); mpz_set_ui(one
, 1);
17 mpz_add_ui(even
, even
, 2);
27 return cf_new(e_expansion
, NULL
);
30 static void *pi_arctan_sequence(cf_t cf
) {
42 mpz_add_ui(denom
, denom
, 2);
44 mpz_add(num
, num
, denom
);
53 static void *regularized_pi(cf_t cf
) {
55 mpz_init(a
); mpz_init(b
); mpz_init(c
); mpz_init(d
);
56 mpz_set_ui(a
, 0); mpz_set_ui(b
, 4);
57 mpz_set_ui(c
, 1); mpz_set_ui(d
, 0);
58 cf_t nonregpi
= cf_new(pi_arctan_sequence
, NULL
);
59 cf_t conv
= cf_new_nonregular_to_cf(nonregpi
, a
, b
, c
, d
);
69 mpz_clear(a
); mpz_clear(b
); mpz_clear(c
); mpz_clear(d
);
74 return cf_new(regularized_pi
, NULL
);
77 void *exp_expansion(cf_t cf
) {
78 mpz_ptr z
= cf_data(cf
);
81 mpz_init(odd
); mpz_init(two
); mpz_init(minusz
);
89 mpz_add_ui(odd
, odd
, 2);
93 mpz_clear(odd
); mpz_clear(two
); mpz_clear(minusz
);
99 cf_t
cf_new_one_arg(void *(*fun
)(cf_t
), mpz_t z
) {
100 mpz_ptr p
= malloc(sizeof(*p
));
103 return cf_new(fun
, p
);
110 typedef struct funarg_s
*funarg_ptr
;
112 static void *one_arg_nonreg(cf_t cf
) {
113 funarg_ptr p
= cf_data(cf
);
115 mpz_init(a
); mpz_init(b
); mpz_init(c
); mpz_init(d
);
116 mpz_set_ui(a
, 1); mpz_set_ui(b
, 0);
117 mpz_set_ui(c
, 0); mpz_set_ui(d
, 1);
118 mpz_ptr copy
= malloc(sizeof(*copy
));
120 mpz_set(copy
, p
->arg
);
121 cf_t nonreg
= cf_new(p
->fun
, copy
);
122 cf_t conv
= cf_new_nonregular_to_cf(nonreg
, a
, b
, c
, d
);
132 mpz_clear(a
); mpz_clear(b
); mpz_clear(c
); mpz_clear(d
);
139 cf_t
cf_new_one_arg_nonreg(void *(*fun
)(cf_t
), mpz_t z
) {
140 funarg_ptr p
= malloc(sizeof(*p
));
144 return cf_new(one_arg_nonreg
, p
);
147 cf_t
cf_new_epow(mpz_t pow
) {
148 return cf_new_one_arg_nonreg(exp_expansion
, pow
);