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