Compute HAKMEM constant.
[frac.git] / mobius_test.c
blob41f46bca9b861f72adb166ec5ababa432aec714c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <gmp.h>
4 #include "cf.h"
5 #include "test.h"
7 static void *sqrt2(cf_t cf) {
8 cf_put_int(cf, 1);
9 while(cf_wait(cf)) {
10 cf_put_int(cf, 2);
12 return NULL;
15 // Converges extremely slowly.
16 static void *slow_pi(cf_t cf) {
17 mpz_t num, denom, t;
18 mpz_init(num);
19 mpz_init(denom);
20 mpz_init(t);
22 mpz_set_ui(denom, 3);
23 cf_put(cf, denom);
25 mpz_set_ui(num, 1);
26 cf_put(cf, num);
27 mpz_set_ui(t, 8);
29 mpz_set_ui(denom, 6);
30 while(cf_wait(cf)) {
31 cf_put(cf, denom);
32 mpz_add(num, num, t);
33 cf_put(cf, num);
34 mpz_add_ui(t, t, 8);
37 mpz_clear(num);
38 mpz_clear(denom);
39 mpz_clear(t);
40 return NULL;
43 int main() {
44 cf_t x, conv;
45 x = cf_new_const(sqrt2);
46 conv = cf_new_cf_convergent(x);
48 mpz_t p, q;
49 mpz_init(p);
50 mpz_init(q);
52 cf_get(p, conv);
53 EXPECT(!mpz_cmp_ui(p, 1));
54 cf_get(q, conv);
55 EXPECT(!mpz_cmp_ui(q, 1));
57 cf_get(p, conv);
58 EXPECT(!mpz_cmp_ui(p, 3));
59 cf_get(q, conv);
60 EXPECT(!mpz_cmp_ui(q, 2));
62 cf_get(p, conv);
63 EXPECT(!mpz_cmp_ui(p, 7));
64 cf_get(q, conv);
65 EXPECT(!mpz_cmp_ui(q, 5));
67 cf_get(p, conv);
68 EXPECT(!mpz_cmp_ui(p, 17));
69 cf_get(q, conv);
70 EXPECT(!mpz_cmp_ui(q, 12));
72 mpz_clear(p);
73 mpz_clear(q);
74 cf_free(conv);
75 cf_free(x);
77 mpz_t z[4];
78 for (int i = 0; i < 4; i++) mpz_init(z[i]);
79 // Identity Mobius transformation.
80 mpz_set_si(z[0], 1);
81 mpz_set_si(z[3], 1);
82 mpz_t digit;
83 mpz_init(digit);
85 x = cf_new_const(slow_pi);
86 conv = cf_new_nonregular_mobius_to_decimal(x, z);
87 cf_get(digit, conv);
88 EXPECT(!mpz_cmp_ui(digit, 3));
89 cf_get(digit, conv);
90 EXPECT(!mpz_cmp_ui(digit, 1));
91 cf_get(digit, conv);
92 EXPECT(!mpz_cmp_ui(digit, 4));
93 cf_get(digit, conv);
94 EXPECT(!mpz_cmp_ui(digit, 1));
95 cf_get(digit, conv);
96 EXPECT(!mpz_cmp_ui(digit, 5));
97 cf_get(digit, conv);
98 EXPECT(!mpz_cmp_ui(digit, 9));
99 cf_get(digit, conv);
100 EXPECT(!mpz_cmp_ui(digit, 2));
102 mpz_clear(digit);
103 cf_free(x);
104 cf_free(conv);
106 x = cf_new_const(sqrt2);
107 cf_t mob;
108 mob = cf_new_mobius_to_cf(x, z);
109 CF_EXPECT_DEC(mob, "1.4142135623730");
110 cf_free(mob);
111 cf_free(x);
112 x = cf_new_const(sqrt2);
113 // (x - 2)/(-3x + 4)
114 // Works out to be 1 + sqrt(2).
115 mpz_set_si(z[0], 1);
116 mpz_set_si(z[1], -2);
117 mpz_set_si(z[2], -3);
118 mpz_set_si(z[3], 4);
119 mob = cf_new_mobius_to_cf(x, z);
120 CF_EXPECT_DEC(mob, "2.4142135623730");
121 cf_free(x);
122 cf_free(mob);
123 for (int i = 0; i < 4; i++) mpz_clear(z[i]);
125 return 0;