1 /***********************************************************
2 **          Multi-Precision complex type for GMP          **
3 **                      Version 1.1                       **
4 **                                                        **
5 **             Written by Giuseppe Fiorentino             **
6 **                 (fiorent@dm.unipi.it)                  **
7 ***********************************************************/
8 
9 /**
10  * @file
11  * @brief Multiprecision complex type, based on mpf multiprecision
12  * floating point type.
13  */
14 
15 #ifndef __MPC_H__
16 #define __MPC_H__
17 
18 #include <mps/mt.h>
19 #include <stdio.h>
20 #include <gmp.h>
21 
22 #ifdef __cplusplus
23 extern "C" {
24 #endif
25 
26 /***********************************************************
27 **              definition of types                       **
28 ***********************************************************/
29 
30 /*! @cond PRIVATE */
31 typedef struct {
32   mpf_t r, i;
33 } __mpc_struct;
34 /*! @endcond */
35 
36 typedef __mpc_struct mpc_t[1];
37 
38 /***********************************************************
39 **            macros for fields access                    **
40 ***********************************************************/
41 
42 /*
43  * #define mpc_Val(C)             (*(C))
44  */
45 #define mpc_Re(C)               ((C)->r)
46 #define mpc_Im(C)               ((C)->i)
47 #define mpc_Addr(C)             ((__mpc_struct*)C)
48 #define mpc_Move(C1, C2)        (*(C1) = *(C2))
49 
50 /***********************************************************
51 **            mpc_t functions                             **
52 ***********************************************************/
53 
54 /* constructors/destructors */
55 void mpc_init (mpc_t c);
56 void mpc_init2 (mpc_t c, unsigned long int prec);
57 void mpc_clear (mpc_t c);
58 
59 void mpc_set_prec (mpc_t c, unsigned long int prec);
60 unsigned long int mpc_get_prec (const mpc_t c);
61 void mpc_set_prec_raw (mpc_t c, unsigned long int prec);
62 
63 /* initializers */
64 void mpc_set (mpc_t rc, const mpc_t c);
65 void mpc_set_ui (mpc_t c, unsigned long int ir, unsigned long int ii);
66 void mpc_set_si (mpc_t c, signed long int ir, signed long int ii);
67 void mpc_set_d (mpc_t c, double dr, double di);
68 void mpc_set_z (mpc_t c, mpz_t zr, mpz_t zi);
69 void mpc_set_q (mpc_t c, mpq_t qr, mpq_t qi);
70 void mpc_set_f (mpc_t c, mpf_t fr, mpf_t fi);
71 int mpc_set_str (mpc_t c, char *sr, char *si, int base);
72 
73 void mpc_init_set (mpc_t rc, mpc_t c);
74 void mpc_init_set_ui (mpc_t c, unsigned long int ir, unsigned long int ii);
75 void mpc_init_set_si (mpc_t c, signed long int ir, signed long int ii);
76 void mpc_init_set_d (mpc_t c, double dr, double di);
77 void mpc_init_set_f (mpc_t c, mpf_t fr, mpf_t fi);
78 int mpc_init_set_str (mpc_t c, char *sr, char *si, int base);
79 
80 /* unary functions */
81 void mpc_neg (mpc_t rc, mpc_t c);
82 void mpc_smod (mpf_t f, mpc_t c);
83 void mpc_rmod (rdpe_t r, mpc_t c);
84 void mpc_mod (mpf_t f, mpc_t c);
85 void mpc_con (mpc_t rc, mpc_t c);
86 void mpc_inv (mpc_t rc, mpc_t c);
87 void mpc_inv2 (mpc_t rc, mpc_t c);
88 void mpc_sqr (mpc_t rc, mpc_t c);
89 void mpc_rot (mpc_t rc, mpc_t c);
90 void mpc_flip (mpc_t rc, mpc_t c);
91 
92 /* binary functions */
93 void mpc_add (mpc_t rc, mpc_t c1, mpc_t c2);
94 void mpc_add_f (mpc_t rc, mpc_t c, mpf_t f);
95 void mpc_add_ui (mpc_t rc, mpc_t c, unsigned long int r,
96                  unsigned long int i);
97 void mpc_sub (mpc_t rc, mpc_t c1, mpc_t c2);
98 void mpc_sub_f (mpc_t rc, mpc_t c, mpf_t f);
99 void mpc_f_sub (mpc_t rc, mpf_t f, mpc_t c);
100 void mpc_sub_ui (mpc_t rc, mpc_t c, unsigned long int r,
101                  unsigned long int i);
102 void mpc_ui_sub (mpc_t rc, unsigned long int r, unsigned long int i,
103                  mpc_t c);
104 void mpc_mul (mpc_t rc, mpc_t c1, mpc_t c2);
105 void mpc_mul_f (mpc_t rc, mpc_t c, mpf_t f);
106 void mpc_mul_ui (mpc_t rc, mpc_t c, unsigned long int i);
107 void mpc_mul_2exp (mpc_t rc, mpc_t c, unsigned long int i);
108 void mpc_div (mpc_t rc, mpc_t c1, mpc_t c2);
109 void mpc_div_f (mpc_t rc, mpc_t c, mpf_t f);
110 void mpc_f_div (mpc_t rc, mpf_t f, mpc_t c);
111 void mpc_div_ui (mpc_t rc, mpc_t c, unsigned long int i);
112 void mpc_ui_div (mpc_t rc, unsigned long int i, mpc_t c);
113 void mpc_div_2exp (mpc_t rc, mpc_t c, unsigned long int i);
114 void mpc_pow_si (mpc_t rc, mpc_t c, register signed long int i);
115 void mpc_swap (mpc_t c1, mpc_t c2);
116 
117 /* op= style operators */
118 void mpc_smod_eq (mpc_t c);
119 void mpc_mod_eq (mpc_t c);
120 #define mpc_neg_eq(C)           mpc_neg (C, C)
121 #define mpc_con_eq(C)           mpc_con (C, C)
122 #define mpc_inv_eq(C)           mpc_inv (C, C)
123 #define mpc_inv2_eq(C)          mpc_inv2 (C, C)
124 #define mpc_sqr_eq(C)           mpc_sqr (C, C)
125 void mpc_rot_eq (mpc_t c);
126 void mpc_flip_eq (mpc_t c);
127 #define mpc_add_eq(R, C)        mpc_add (R, R, C)
128 #define mpc_add_eq_f(C, F)      mpc_add_f (C, C, F)
129 #define mpc_add_eq_ui(C, R, I)  mpc_add_ui (C, C, R, I)
130 #define mpc_sub_eq(C1, C2)      mpc_sub (C1, C1, C2)
131 #define mpc_sub_eq_f(C, R, F)   mpc_sub_f (C, C, R, F)
132 #define mpc_sub_eq_ui(C, R, I)  mpc_sub_ui (C, C, R, I)
133 #define mpc_ui_sub_eq(C, R, I)  mpc_ui_sub (C, R, I, C)
134 #define mpc_mul_eq(C1, C2)      mpc_mul (C1, C1, C2)
135 #define mpc_mul_eq_ui(C, I)     mpc_mul_ui (C, C, I)
136 #define mpc_mul_eq_f(C, F)      mpc_mul_mpf (C, C, F)
137 #define mpc_mul_eq_2exp(C, I)   mpc_mul_2exp (C, C, I)
138 #define mpc_div_eq(C1, C2)      mpc_div (C1, C1, C2)
139 #define mpc_div2_eq(C1, C2)     mpc_div2 (C1, C1, C2)
140 #define mpc_div_eq_ui(C, I)     mpc_div_ui (C, C, I)
141 #define mpc_ui_div_eq(C, I)     mpc_ui_div (C, I, C)
142 #define mpc_div_eq_f(C, F)      mpc_div_f (C, C, F)
143 #define mpc_div_eq_2exp(C, I)   mpc_div_2exp (C, C, I)
144 #define mpc_pow_eq_si(C, I)     mpc_pow_si (C, C, I)
145 
146 /* relational operators */
147 int mpc_eq (mpc_t c1, mpc_t c2, unsigned long int i);
148 int mpc_eq_zero (mpc_t c);
149 int mpc_eq_one (mpc_t c);
150 
151 /* I/O functions */
152 size_t mpc_out_str_2u (FILE * f, int base, size_t n_digits_r,
153                        size_t n_digits_i, mpc_t c);
154 size_t mpc_out_str_2 (FILE * f, int base, size_t n_digits_r,
155                       size_t n_digits_i, mpc_t c);
156 #define mpc_out_str_u(F, B, D, C)  mpc_out_str_2u (F, B, D, D, C)
157 #define mpc_out_str(F, B, D, C)  mpc_out_str_2 (F, B, D, D, C)
158 #define mpc_outln_str_u(F, B, D, C)  mpc_out_str_2u (F, B, D, D, C); fputc ('\n', F)
159 #define mpc_outln_str(F, B, D, C)  mpc_out_str_2 (F, B, D, D, C); fputc ('\n', F)
160 
161 size_t mpc_inp_str_u (mpc_t c, FILE * f, int base);
162 size_t mpc_inp_str (mpc_t c, FILE * f, int base);
163 
164 /* vector functions */
165 #define mpc_valloc(N)           (mpc_t*)malloc ((N)*sizeof(mpc_t))
166 void mpc_vinit (mpc_t v[], long size);
167 void mpc_vinit2 (mpc_t v[], long size, long prec);
168 void mpc_vclear (mpc_t v[], long size);
169 #define mpc_vfree(C)            free (C)
170 
171 /*
172  * End of extern "C" {
173  *   ...
174  * }
175  */
176 #ifdef __cplusplus
177 }
178 #endif
179 
180 #endif
181 
182 /***********************************************************
183 **                                                        **
184 ***********************************************************/
185