1 | /* |
2 | Name: gmp_compat.h |
3 | Purpose: Provide GMP compatiable routines for imath library |
4 | Author: David Peixotto |
5 | |
6 | Copyright (c) 2012 Qualcomm Innovation Center, Inc. All rights reserved. |
7 | |
8 | Permission is hereby granted, free of charge, to any person obtaining a copy |
9 | of this software and associated documentation files (the "Software"), to deal |
10 | in the Software without restriction, including without limitation the rights |
11 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
12 | copies of the Software, and to permit persons to whom the Software is |
13 | furnished to do so, subject to the following conditions: |
14 | |
15 | The above copyright notice and this permission notice shall be included in |
16 | all copies or substantial portions of the Software. |
17 | |
18 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
19 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
20 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
21 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
22 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
23 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
24 | SOFTWARE. |
25 | */ |
26 | |
27 | #ifndef IMATH_GMP_COMPAT_H_ |
28 | #define IMATH_GMP_COMPAT_H_ |
29 | #include "imath.h" |
30 | #include "imrat.h" |
31 | #include <stddef.h> |
32 | |
33 | #define GMPZAPI(fun) impz_ ## fun |
34 | #define GMPQAPI(fun) impq_ ## fun |
35 | |
36 | #ifdef __cplusplus |
37 | extern "C" { |
38 | #endif |
39 | /************************************************************************* |
40 | * |
41 | * Functions with direct translations |
42 | * |
43 | *************************************************************************/ |
44 | /* gmp: mpq_clear */ |
45 | void GMPQAPI(clear)(mp_rat x); |
46 | |
47 | /* gmp: mpq_cmp */ |
48 | int GMPQAPI(cmp)(mp_rat op1, mp_rat op2); |
49 | |
50 | /* gmp: mpq_init */ |
51 | void GMPQAPI(init)(mp_rat x); |
52 | |
53 | /* gmp: mpq_mul */ |
54 | void GMPQAPI(mul)(mp_rat product, mp_rat multiplier, mp_rat multiplicand); |
55 | |
56 | /* gmp: mpq_set */ |
57 | void GMPQAPI(set)(mp_rat rop, mp_rat op); |
58 | |
59 | /* gmp: mpz_abs */ |
60 | void GMPZAPI(abs)(mp_int rop, mp_int op); |
61 | |
62 | /* gmp: mpz_add */ |
63 | void GMPZAPI(add)(mp_int rop, mp_int op1, mp_int op2); |
64 | |
65 | /* gmp: mpz_clear */ |
66 | void GMPZAPI(clear)(mp_int x); |
67 | |
68 | /* gmp: mpz_cmp_si */ |
69 | int GMPZAPI(cmp_si)(mp_int op1, long op2); |
70 | |
71 | /* gmp: mpz_cmpabs */ |
72 | int GMPZAPI(cmpabs)(mp_int op1, mp_int op2); |
73 | |
74 | /* gmp: mpz_cmp */ |
75 | int GMPZAPI(cmp)(mp_int op1, mp_int op2); |
76 | |
77 | /* gmp: mpz_init */ |
78 | void GMPZAPI(init)(mp_int x); |
79 | |
80 | /* gmp: mpz_mul */ |
81 | void GMPZAPI(mul)(mp_int rop, mp_int op1, mp_int op2); |
82 | |
83 | /* gmp: mpz_neg */ |
84 | void GMPZAPI(neg)(mp_int rop, mp_int op); |
85 | |
86 | /* gmp: mpz_set_si */ |
87 | void GMPZAPI(set_si)(mp_int rop, long op); |
88 | |
89 | /* gmp: mpz_set */ |
90 | void GMPZAPI(set)(mp_int rop, mp_int op); |
91 | |
92 | /* gmp: mpz_sub */ |
93 | void GMPZAPI(sub)(mp_int rop, mp_int op1, mp_int op2); |
94 | |
95 | /* gmp: mpz_swap */ |
96 | void GMPZAPI(swap)(mp_int rop1, mp_int rop2); |
97 | |
98 | /* gmp: mpq_sgn */ |
99 | int GMPQAPI(sgn)(mp_rat op); |
100 | |
101 | /* gmp: mpz_sgn */ |
102 | int GMPZAPI(sgn)(mp_int op); |
103 | |
104 | /* gmp: mpq_set_ui */ |
105 | void GMPQAPI(set_ui)(mp_rat rop, unsigned long op1, unsigned long op2); |
106 | |
107 | /* gmp: mpz_set_ui */ |
108 | void GMPZAPI(set_ui)(mp_int rop, unsigned long op); |
109 | |
110 | /* gmp: mpq_den_ref */ |
111 | mp_int GMPQAPI(denref)(mp_rat op); |
112 | |
113 | /* gmp: mpq_num_ref */ |
114 | mp_int GMPQAPI(numref)(mp_rat op); |
115 | |
116 | /* gmp: mpq_canonicalize */ |
117 | void GMPQAPI(canonicalize)(mp_rat op); |
118 | |
119 | /************************************************************************* |
120 | * |
121 | * Functions that can be implemented as a combination of imath functions |
122 | * |
123 | *************************************************************************/ |
124 | /* gmp: mpz_addmul */ |
125 | void GMPZAPI(addmul)(mp_int rop, mp_int op1, mp_int op2); |
126 | |
127 | /* gmp: mpz_divexact */ |
128 | void GMPZAPI(divexact)(mp_int q, mp_int n, mp_int d); |
129 | |
130 | /* gmp: mpz_divisible_p */ |
131 | int GMPZAPI(divisible_p)(mp_int n, mp_int d); |
132 | |
133 | /* gmp: mpz_submul */ |
134 | void GMPZAPI(submul)(mp_int rop, mp_int op1, mp_int op2); |
135 | |
136 | /* gmp: mpz_add_ui */ |
137 | void GMPZAPI(add_ui)(mp_int rop, mp_int op1, unsigned long op2); |
138 | |
139 | /* gmp: mpz_divexact_ui */ |
140 | void GMPZAPI(divexact_ui)(mp_int q, mp_int n, unsigned long d); |
141 | |
142 | /* gmp: mpz_mul_ui */ |
143 | void GMPZAPI(mul_ui)(mp_int rop, mp_int op1, unsigned long op2); |
144 | |
145 | /* gmp: mpz_pow_ui */ |
146 | void GMPZAPI(pow_ui)(mp_int rop, mp_int base, unsigned long exp); |
147 | |
148 | /* gmp: mpz_sub_ui */ |
149 | void GMPZAPI(sub_ui)(mp_int rop, mp_int op1, unsigned long op2); |
150 | |
151 | /* gmp: mpz_fdiv_q_ui */ |
152 | unsigned long GMPZAPI(fdiv_q_ui)(mp_int q, mp_int n, unsigned long d); |
153 | |
154 | /* gmp: mpz_sizeinbase */ |
155 | size_t GMPZAPI(sizeinbase)(mp_int op, int base); |
156 | |
157 | /************************************************************************* |
158 | * |
159 | * Functions with different behavior in corner cases |
160 | * |
161 | *************************************************************************/ |
162 | /* gmp: mpz_gcd */ |
163 | /* gmp: When op1 = 0 and op2 = 0, return 0.*/ |
164 | void GMPZAPI(gcd)(mp_int rop, mp_int op1, mp_int op2); |
165 | |
166 | /* gmp: mpz_get_str */ |
167 | /* gmp: If str is NULL then allocate space using the default allocator. */ |
168 | char* GMPZAPI(get_str)(char *str, int radix, mp_int op); |
169 | |
170 | /* gmp: mpq_get_str */ |
171 | /* gmp: If str is NULL then allocate space using the default allocator. */ |
172 | /* gmp: If value is a whole number do not print denomenator. */ |
173 | /* TODO: Need to handle 0 values better. GMP prints 0/4 instead of 0.*/ |
174 | char* GMPQAPI(get_str)(char *str, int radix, mp_rat op); |
175 | |
176 | /* gmp: mpz_set_str */ |
177 | /* gmp: Allow and ignore spaces in string. */ |
178 | int GMPZAPI(set_str)(mp_int rop, char *str, int base); |
179 | |
180 | /* gmp: mpq_set_str */ |
181 | int GMPQAPI(set_str)(mp_rat rop, char *str, int base); |
182 | |
183 | /* gmp: mpz_get_ui */ |
184 | /* gmp: Return least significant bits if value is too big for a long. */ |
185 | unsigned long GMPZAPI(get_ui)(mp_int op); |
186 | |
187 | /* gmp: mpz_get_si */ |
188 | /* gmp: Return least significant bits if value is too bit for a long. */ |
189 | /* gmp: If value is too big for long, return the least significant |
190 | (8*sizeof(long)-1) bits from the op and set the sign bit according to |
191 | the sign of the op. */ |
192 | long GMPZAPI(get_si)(mp_int op); |
193 | |
194 | /* gmp: mpz_lcm */ |
195 | /* gmp: When op1 = 0 or op2 = 0, return 0.*/ |
196 | /* gmp: The resutl of lcm(a,b) is always positive. */ |
197 | void GMPZAPI(lcm)(mp_int rop, mp_int op1, mp_int op2); |
198 | |
199 | /* gmp: mpz_mul_2exp */ |
200 | /* gmp: allow big values for op2 when op1 == 0 */ |
201 | void GMPZAPI(mul_2exp)(mp_int rop, mp_int op1, unsigned long op2); |
202 | |
203 | /************************************************************************* |
204 | * |
205 | * Functions needing expanded functionality |
206 | * |
207 | *************************************************************************/ |
208 | /* gmp: mpz_cdiv_q */ |
209 | void GMPZAPI(cdiv_q)(mp_int q, mp_int n, mp_int d); |
210 | |
211 | /* gmp: mpz_fdiv_q */ |
212 | void GMPZAPI(fdiv_q)(mp_int q, mp_int n, mp_int d); |
213 | |
214 | /* gmp: mpz_fdiv_r */ |
215 | void GMPZAPI(fdiv_r)(mp_int r, mp_int n, mp_int d); |
216 | |
217 | /* gmp: mpz_tdiv_q */ |
218 | void GMPZAPI(tdiv_q)(mp_int q, mp_int n, mp_int d); |
219 | |
220 | /* gmp: mpz_export */ |
221 | void* GMPZAPI(export)(void *rop, size_t *countp, int order, size_t size, int endian, size_t nails, mp_int op); |
222 | |
223 | /* gmp: mpz_import */ |
224 | void GMPZAPI(import)(mp_int rop, size_t count, int order, size_t size, int endian, size_t nails, const void* op); |
225 | |
226 | #ifdef __cplusplus |
227 | } |
228 | #endif |
229 | #endif /* end IMATH_GMP_COMPAT_H_ */ |
230 | |