3 // Opaque interface to continued fractions object.
9 typedef struct cf_s
*cf_t
;
11 cf_t
cf_new(void *(*func
)(cf_t
), void *data
);
12 static inline cf_t
cf_new_const(void *(*func
)(cf_t
)) {
13 return cf_new(func
, NULL
);
15 void cf_free(cf_t cf
);
17 void cf_set_sign(cf_t cf
, int sign
);
19 int cf_flip_sign(cf_t cf
);
20 void cf_get(mpz_t z
, cf_t cf
);
21 void cf_put(cf_t cf
, mpz_t z
);
22 void cf_put_int(cf_t cf
, int n
);
26 void *cf_data(cf_t cf
);
28 void cf_signal(cf_t cf
); // For tee.
29 void cf_waitspecial(cf_t cf
);
33 void cf_tee(cf_t
*out_array
, cf_t in
);
37 // Compute convergents of a simple continued fraction x.
38 // Outputs p then q on channel, where p/q is the last convergent computed.
39 cf_t
cf_new_cf_convergent(cf_t x
);
40 // Compute decimal representation of a simple continued fraction x.
41 // Outputs integer part first, then digits one at a time.
42 cf_t
cf_new_cf_to_decimal(cf_t x
);
44 // Compute convergents of (a x + b)/(c x + d)
45 // where x is a regular continued fraction.
46 cf_t
cf_new_mobius_convergent(cf_t x
, mpz_t a
, mpz_t b
, mpz_t c
, mpz_t d
);
47 cf_t
cf_new_mobius_to_decimal(cf_t x
, mpz_t a
, mpz_t b
, mpz_t c
, mpz_t d
);
48 cf_t
cf_new_mobius_to_cf(cf_t x
, mpz_t z
[4]);
50 // Compute convergents of (a x + b)/(c x + d)
51 // where x is a nonregular continued fraction.
52 cf_t
cf_new_nonregular_mobius_convergent(cf_t x
, mpz_t a
, mpz_t b
, mpz_t c
, mpz_t d
);
53 // Input: Mobius transformation and nonregular continued fraction.
54 // Output: Regular continued fraction. Assumes input fraction is well-behaved.
55 cf_t
cf_new_nonregular_to_cf(cf_t x
, mpz_t a
, mpz_t b
, mpz_t c
, mpz_t d
);
56 // Does both of the above at once. Seems slow.
57 cf_t
cf_new_nonregular_mobius_to_decimal(cf_t x
, mpz_t a
[4]);
59 // Well-known continued fraction expansions.
66 cf_t
cf_new_epow(mpz_t pow
);
67 cf_t
cf_new_tanh(mpz_t z
);
69 // This won't work because my code cannot handle negative denominators,
70 // and also assumes the sequence of convergents alternatively overshoot
71 // and undershoots the target. The tan expansion leads to a sequence of
72 // strictly increasing convergents (for positive input).
73 cf_t
cf_new_tan(mpz_t z
);
75 // Gosper's method for computing bihomographic functions of continued fractions.
76 cf_t
cf_new_bihom(cf_t x
, cf_t y
, mpz_t a
[8]);
83 // Use Newton's method to find solutions of:
85 // a0 xy + a1 x + a2 y + a3
86 // y = ------------------------
87 // a4 xy - a0 x + a5 y - a2
88 cf_t
cf_new_newton(cf_t x
, mpz_t a
[6], mpz_t lower
);
89 cf_t
cf_new_sqrt(cf_t x
);