1 // TODO: Use cf_new_const_nonregular instead of regularized_pi by allowing
2 // arbitrary starting Mobius function.
8 // sqrt(n^2 + 1) = [n; 2n, 2n, ...]
9 static void *sqrt_easy(cf_t cf
) {
10 unsigned int n
= (unsigned int) cf_data(cf
);
20 return cf_new(sqrt_easy
, (void *) 1);
24 return cf_new(sqrt_easy
, (void *) 2);
27 // e = [2; 1, 2, 1, 1, 4, 1, ...]
28 static void *e_expansion(cf_t cf
) {
42 return cf_new_const(e_expansion
);
45 // 4/pi = 1 + 1/(3 + 4/(5 + 9/(7 + 16/(9 + ...))))
46 static void *pi_arctan_sequence(cf_t cf
) {
56 mpz_add_ui(denom
, denom
, 2);
58 mpz_add(num
, num
, denom
);
67 static void *regularized_pi(cf_t cf
) {
69 mpz_init(a
); mpz_init(b
); mpz_init(c
); mpz_init(d
);
70 mpz_set_ui(a
, 0); mpz_set_ui(b
, 4);
71 mpz_set_ui(c
, 1); mpz_set_ui(d
, 0);
72 cf_t nonregpi
= cf_new(pi_arctan_sequence
, NULL
);
73 cf_t conv
= cf_new_nonregular_to_cf(nonregpi
, a
, b
, c
, d
);
83 mpz_clear(a
); mpz_clear(b
); mpz_clear(c
); mpz_clear(d
);
87 // tan 1 = [1; 1, 1, 3, 1, 5, ...]
88 static void *tan1_expansion(cf_t cf
) {
101 return cf_new_const(tan1_expansion
);
104 // exp(z) = 1 + z/(1 - z/(2 + z/(3 - z/(2 + z/(5 - z/(2 + z/ ...))))))
105 void *exp_expansion(cf_t cf
) {
106 mpz_ptr z
= cf_data(cf
);
125 // tanh n = z/(1 + z^2/(3 + z^2/(5 + z^2/...)))
126 static void *gauss_tanh_expansion(cf_t cf
) {
127 mpz_ptr z
= cf_data(cf
);
130 mpz_init(odd
); mpz_init(z2
);
138 mpz_add_ui(odd
, odd
, 2);
141 mpz_clear(odd
); mpz_clear(z2
);
147 // tan n = z/(1 - z^2/(3 - z^2/(5 - z^2/...)))
148 static void *gauss_tan_expansion(cf_t cf
) {
149 mpz_ptr z
= cf_data(cf
);
152 mpz_init(odd
); mpz_init(z2
);
161 mpz_add_ui(odd
, odd
, 2);
164 mpz_clear(odd
); mpz_clear(z2
);
170 cf_t
cf_new_epow(mpz_t pow
) {
171 return cf_new_one_arg_nonregular(exp_expansion
, pow
);
174 cf_t
cf_new_tanh(mpz_t z
) {
175 return cf_new_one_arg_nonregular(gauss_tanh_expansion
, z
);
178 cf_t
cf_new_tan(mpz_t z
) {
179 return cf_new_one_arg_nonregular(gauss_tan_expansion
, z
);
183 return cf_new_const(regularized_pi
);