File: mpc.h

package info (click to toggle)
mpsolve 3.2.3-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 13,100 kB
  • sloc: ansic: 25,748; sh: 4,925; cpp: 3,155; makefile: 914; python: 407; yacc: 158; lex: 85; xml: 41
file content (184 lines) | stat: -rw-r--r-- 6,816 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
/***********************************************************
**          Multi-Precision complex type for GMP          **
**                      Version 1.1                       **
**                                                        **
**             Written by Giuseppe Fiorentino             **
**                 (fiorent@dm.unipi.it)                  **
***********************************************************/

/**
 * @file
 * @brief Multiprecision complex type, based on mpf multiprecision
 * floating point type.
 */

#ifndef __MPC_H__
#define __MPC_H__

#include <mps/mt.h>
#include <stdio.h>
#include <gmp.h>

#ifdef __cplusplus
extern "C" {
#endif

/***********************************************************
**              definition of types                       **
***********************************************************/

/*! @cond PRIVATE */
typedef struct {
  mpf_t r, i;
} __mpc_struct;
/*! @endcond */

typedef __mpc_struct mpc_t[1];

/***********************************************************
**            macros for fields access                    **
***********************************************************/

/*
 * #define mpc_Val(C)             (*(C))
 */
#define mpc_Re(C)               ((C)->r)
#define mpc_Im(C)               ((C)->i)
#define mpc_Addr(C)             ((__mpc_struct*)C)
#define mpc_Move(C1, C2)        (*(C1) = *(C2))

/***********************************************************
**            mpc_t functions                             **
***********************************************************/

/* constructors/destructors */
void mpc_init (mpc_t c);
void mpc_init2 (mpc_t c, unsigned long int prec);
void mpc_clear (mpc_t c);

void mpc_set_prec (mpc_t c, unsigned long int prec);
unsigned long int mpc_get_prec (const mpc_t c);
void mpc_set_prec_raw (mpc_t c, unsigned long int prec);

/* initializers */
void mpc_set (mpc_t rc, const mpc_t c);
void mpc_set_ui (mpc_t c, unsigned long int ir, unsigned long int ii);
void mpc_set_si (mpc_t c, signed long int ir, signed long int ii);
void mpc_set_d (mpc_t c, double dr, double di);
void mpc_set_z (mpc_t c, mpz_t zr, mpz_t zi);
void mpc_set_q (mpc_t c, mpq_t qr, mpq_t qi);
void mpc_set_f (mpc_t c, mpf_t fr, mpf_t fi);
int mpc_set_str (mpc_t c, char *sr, char *si, int base);

void mpc_init_set (mpc_t rc, mpc_t c);
void mpc_init_set_ui (mpc_t c, unsigned long int ir, unsigned long int ii);
void mpc_init_set_si (mpc_t c, signed long int ir, signed long int ii);
void mpc_init_set_d (mpc_t c, double dr, double di);
void mpc_init_set_f (mpc_t c, mpf_t fr, mpf_t fi);
int mpc_init_set_str (mpc_t c, char *sr, char *si, int base);

/* unary functions */
void mpc_neg (mpc_t rc, mpc_t c);
void mpc_smod (mpf_t f, mpc_t c);
void mpc_rmod (rdpe_t r, mpc_t c);
void mpc_mod (mpf_t f, mpc_t c);
void mpc_con (mpc_t rc, mpc_t c);
void mpc_inv (mpc_t rc, mpc_t c);
void mpc_inv2 (mpc_t rc, mpc_t c);
void mpc_sqr (mpc_t rc, mpc_t c);
void mpc_rot (mpc_t rc, mpc_t c);
void mpc_flip (mpc_t rc, mpc_t c);

/* binary functions */
void mpc_add (mpc_t rc, mpc_t c1, mpc_t c2);
void mpc_add_f (mpc_t rc, mpc_t c, mpf_t f);
void mpc_add_ui (mpc_t rc, mpc_t c, unsigned long int r,
                 unsigned long int i);
void mpc_sub (mpc_t rc, mpc_t c1, mpc_t c2);
void mpc_sub_f (mpc_t rc, mpc_t c, mpf_t f);
void mpc_f_sub (mpc_t rc, mpf_t f, mpc_t c);
void mpc_sub_ui (mpc_t rc, mpc_t c, unsigned long int r,
                 unsigned long int i);
void mpc_ui_sub (mpc_t rc, unsigned long int r, unsigned long int i,
                 mpc_t c);
void mpc_mul (mpc_t rc, mpc_t c1, mpc_t c2);
void mpc_mul_f (mpc_t rc, mpc_t c, mpf_t f);
void mpc_mul_ui (mpc_t rc, mpc_t c, unsigned long int i);
void mpc_mul_2exp (mpc_t rc, mpc_t c, unsigned long int i);
void mpc_div (mpc_t rc, mpc_t c1, mpc_t c2);
void mpc_div_f (mpc_t rc, mpc_t c, mpf_t f);
void mpc_f_div (mpc_t rc, mpf_t f, mpc_t c);
void mpc_div_ui (mpc_t rc, mpc_t c, unsigned long int i);
void mpc_ui_div (mpc_t rc, unsigned long int i, mpc_t c);
void mpc_div_2exp (mpc_t rc, mpc_t c, unsigned long int i);
void mpc_pow_si (mpc_t rc, mpc_t c, signed long int i);
void mpc_swap (mpc_t c1, mpc_t c2);

/* op= style operators */
void mpc_smod_eq (mpc_t c);
void mpc_mod_eq (mpc_t c);
#define mpc_neg_eq(C)           mpc_neg (C, C)
#define mpc_con_eq(C)           mpc_con (C, C)
#define mpc_inv_eq(C)           mpc_inv (C, C)
#define mpc_inv2_eq(C)          mpc_inv2 (C, C)
#define mpc_sqr_eq(C)           mpc_sqr (C, C)
void mpc_rot_eq (mpc_t c);
void mpc_flip_eq (mpc_t c);
#define mpc_add_eq(R, C)        mpc_add (R, R, C)
#define mpc_add_eq_f(C, F)      mpc_add_f (C, C, F)
#define mpc_add_eq_ui(C, R, I)  mpc_add_ui (C, C, R, I)
#define mpc_sub_eq(C1, C2)      mpc_sub (C1, C1, C2)
#define mpc_sub_eq_f(C, R, F)   mpc_sub_f (C, C, R, F)
#define mpc_sub_eq_ui(C, R, I)  mpc_sub_ui (C, C, R, I)
#define mpc_ui_sub_eq(C, R, I)  mpc_ui_sub (C, R, I, C)
#define mpc_mul_eq(C1, C2)      mpc_mul (C1, C1, C2)
#define mpc_mul_eq_ui(C, I)     mpc_mul_ui (C, C, I)
#define mpc_mul_eq_f(C, F)      mpc_mul_mpf (C, C, F)
#define mpc_mul_eq_2exp(C, I)   mpc_mul_2exp (C, C, I)
#define mpc_div_eq(C1, C2)      mpc_div (C1, C1, C2)
#define mpc_div2_eq(C1, C2)     mpc_div2 (C1, C1, C2)
#define mpc_div_eq_ui(C, I)     mpc_div_ui (C, C, I)
#define mpc_ui_div_eq(C, I)     mpc_ui_div (C, I, C)
#define mpc_div_eq_f(C, F)      mpc_div_f (C, C, F)
#define mpc_div_eq_2exp(C, I)   mpc_div_2exp (C, C, I)
#define mpc_pow_eq_si(C, I)     mpc_pow_si (C, C, I)

/* relational operators */
int mpc_eq (mpc_t c1, mpc_t c2, unsigned long int i);
int mpc_eq_zero (mpc_t c);
int mpc_eq_one (mpc_t c);

/* I/O functions */
size_t mpc_out_str_2u (FILE * f, int base, size_t n_digits_r,
                       size_t n_digits_i, mpc_t c);
size_t mpc_out_str_2 (FILE * f, int base, size_t n_digits_r,
                      size_t n_digits_i, mpc_t c);
#define mpc_out_str_u(F, B, D, C)  mpc_out_str_2u (F, B, D, D, C)
#define mpc_out_str(F, B, D, C)  mpc_out_str_2 (F, B, D, D, C)
#define mpc_outln_str_u(F, B, D, C)  mpc_out_str_2u (F, B, D, D, C); fputc ('\n', F)
#define mpc_outln_str(F, B, D, C)  mpc_out_str_2 (F, B, D, D, C); fputc ('\n', F)

size_t mpc_inp_str_u (mpc_t c, FILE * f, int base);
size_t mpc_inp_str (mpc_t c, FILE * f, int base);

/* vector functions */
#define mpc_valloc(N)           (mpc_t*)malloc ((N)*sizeof(mpc_t))
void mpc_vinit (mpc_t v[], long size);
void mpc_vinit2 (mpc_t v[], long size, long prec);
void mpc_vclear (mpc_t v[], long size);
#define mpc_vfree(C)            free (C)

/*
 * End of extern "C" {
 *   ...
 * }
 */
#ifdef __cplusplus
}
#endif

#endif

/***********************************************************
**                                                        **
***********************************************************/