a1a90aaf |
1 | # ---?--- |
2 | # |
3 | # $Id$ |
4 | # |
5 | # Multiprecision interface |
6 | # |
7 | # (c) 2000 Straylight/Edgeware |
8 | # |
9 | |
10 | #----- Licensing notice ----------------------------------------------------- |
11 | # |
12 | # This file is part of the Perl interface to Catacomb. |
13 | # |
14 | # Catacomb/Perl is free software; you can redistribute it and/or modify |
15 | # it under the terms of the GNU General Public License as published by |
16 | # the Free Software Foundation; either version 2 of the License, or |
17 | # (at your option) any later version. |
18 | # |
19 | # Catacomb/Perl is distributed in the hope that it will be useful, |
20 | # but WITHOUT ANY WARRANTY; without even the implied warranty of |
21 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
22 | # GNU General Public License for more details. |
23 | # |
24 | # You should have received a copy of the GNU General Public License |
25 | # along with Catacomb/Perl; if not, write to the Free Software Foundation, |
26 | # Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
27 | # |
28 | |
29 | MODULE = Catacomb PACKAGE = Catacomb::GF PREFIX = gf_ |
30 | |
31 | gf * |
32 | new(me, sv = 0, radix = 0) |
33 | SV *me |
34 | SV *sv |
35 | int radix |
36 | CODE: |
37 | RETVAL = sv ? mp_fromsv(sv, "sv", "Catacomb::GF", radix, 1) : MP_ZERO; |
38 | OUTPUT: |
39 | RETVAL |
40 | |
41 | gf * |
42 | copy(x) |
43 | gf *x |
44 | CODE: |
45 | RETVAL = MP_COPY(x); |
46 | OUTPUT: |
47 | RETVAL |
48 | |
49 | gf * |
50 | loadb(me, sv) |
51 | SV *me |
52 | SV *sv |
53 | PREINIT: |
54 | char *p; |
55 | STRLEN len; |
56 | CODE: |
57 | p = SvPV(sv, len); |
58 | RETVAL = mp_loadb(MP_NEW, p, len); |
59 | OUTPUT: |
60 | RETVAL |
61 | |
62 | gf * |
63 | loadl(me, sv) |
64 | SV *me |
65 | SV *sv |
66 | PREINIT: |
67 | char *p; |
68 | STRLEN len; |
69 | CODE: |
70 | p = SvPV(sv, len); |
71 | RETVAL = mp_loadl(MP_NEW, p, len); |
72 | OUTPUT: |
73 | RETVAL |
74 | |
75 | int |
76 | metrics(m) |
77 | gf *m |
78 | INTERFACE_MACRO: |
79 | XSINTERFACE_FUNC |
80 | XSINTERFACE_FUNC_SETMP |
81 | INTERFACE: |
82 | octets bits |
83 | |
84 | SV * |
85 | storeb(m, i = -1) |
86 | gf *m |
87 | int i |
88 | PREINIT: |
89 | size_t sz; |
90 | CODE: |
91 | sz = (i < 0) ? mp_octets(m) : i; |
92 | RETVAL = NEWSV(0, sz ? sz : 1); |
93 | mp_storeb(m, SvPVX(RETVAL), sz); |
94 | SvCUR_set(RETVAL, sz); |
95 | SvPOK_on(RETVAL); |
96 | OUTPUT: |
97 | RETVAL |
98 | |
99 | SV * |
100 | storel(m, i = -1) |
101 | gf *m |
102 | int i |
103 | PREINIT: |
104 | size_t sz; |
105 | CODE: |
106 | sz = (i < 0) ? mp_octets(m) : i; |
107 | RETVAL = NEWSV(0, sz ? sz : 1); |
108 | mp_storel(m, SvPVX(RETVAL), sz); |
109 | SvCUR_set(RETVAL, sz); |
110 | SvPOK_on(RETVAL); |
111 | OUTPUT: |
112 | RETVAL |
113 | |
114 | SV * |
115 | tostring(m, radix = 16) |
116 | gf *m |
117 | int radix |
118 | CODE: |
119 | RETVAL = NEWSV(0, 0); |
120 | mp_writesv(m, RETVAL, radix); |
121 | OUTPUT: |
122 | RETVAL |
123 | |
124 | SV * |
125 | toint(m) |
126 | gf *m |
127 | CODE: |
128 | RETVAL = newSViv(mp_toiv(m)); |
129 | OUTPUT: |
130 | RETVAL |
131 | |
132 | SV * |
133 | DESTROY(m) |
134 | gf *m |
135 | CODE: |
136 | mp_drop(m); |
137 | XSRETURN_UNDEF; |
138 | |
139 | mp * |
140 | gf_sqr(a) |
141 | gf *a |
142 | C_ARGS: |
143 | MP_NEW, a |
144 | INTERFACE_MACRO: |
145 | XSINTERFACE_FUNC |
146 | XSINTERFACE_FUNC_SETGF |
147 | INTERFACE: |
148 | sqr |
149 | |
150 | mp * |
151 | binop(a, b) |
152 | gf *a |
153 | gf *b |
154 | C_ARGS: |
155 | MP_NEW, a, b |
156 | INTERFACE_MACRO: |
157 | XSINTERFACE_FUNC |
158 | XSINTERFACE_FUNC_SETGF |
159 | INTERFACE: |
160 | add sub mul |
161 | |
162 | gf * |
163 | shiftop(a, n) |
164 | mp *a |
165 | int n |
166 | C_ARGS: |
167 | MP_NEW, a, n |
168 | INTERFACE_MACRO: |
169 | XSINTERFACE_FUNC |
170 | XSINTERFACE_FUNC_SETMP |
171 | INTERFACE: |
172 | lsl lsr |
173 | |
174 | int |
175 | gf_eq(a, b) |
176 | gf *a |
177 | gf *b |
178 | CODE: |
179 | RETVAL = mp_eq(a, b); |
180 | OUTPUT: |
181 | RETVAL |
182 | |
183 | int |
184 | gf_irreduciblep(a) |
185 | gf *a |
186 | |
187 | void |
188 | div(a, b) |
189 | mp *a |
190 | mp *b |
191 | PREINIT: |
192 | mp *q = MP_NEW, *r = MP_NEW; |
193 | PPCODE: |
194 | if (MP_EQ(b, MP_ZERO)) |
195 | croak("Divide by zero in Catacomb::GF::div"); |
196 | q = MP_NEW; |
197 | switch (GIMME_V) { |
198 | case G_ARRAY: |
199 | r = MP_NEW; |
200 | mp_div(&q, &r, a, b); |
201 | EXTEND(SP, 2); |
202 | PUSHs(RET_GF(q)); |
203 | PUSHs(RET_GF(r)); |
204 | break; |
205 | case G_VOID: |
206 | break; |
207 | default: |
208 | mp_div(&q, &r, a, b); |
209 | EXTEND(SP, 1); |
210 | PUSHs(RET_GF(q)); |
211 | break; |
212 | } |
213 | |
214 | void |
215 | gcd(a, b) |
216 | gf *a |
217 | gf *b |
218 | PREINIT: |
219 | gf *g = MP_NEW, *x = MP_NEW, *y = MP_NEW; |
220 | PPCODE: |
221 | switch (GIMME_V) { |
222 | case G_ARRAY: |
223 | gf_gcd(&g, &x, &y, a, b); |
224 | EXTEND(SP, 3); |
225 | PUSHs(RET_GF(g)); |
226 | PUSHs(RET_GF(x)); |
227 | PUSHs(RET_GF(y)); |
228 | break; |
229 | case G_VOID: |
230 | break; |
231 | default: |
232 | gf_gcd(&g, 0, 0, a, b); |
233 | EXTEND(SP, 1); |
234 | PUSHs(RET_GF(g)); |
235 | break; |
236 | } |
237 | |
238 | GF_Reduce * |
239 | makereduce(x) |
240 | gf *x |
241 | CODE: |
242 | RETVAL = CREATE(GF_Reduce); |
243 | gfreduce_create(RETVAL, x); |
244 | OUTPUT: |
245 | RETVAL |
246 | |
247 | MODULE = Catacomb PACKAGE = Catacomb::GF::Reduce PREFIX = gfreduce_ |
248 | |
249 | GF_Reduce * |
250 | new(me, x) |
251 | gf *x |
252 | CODE: |
253 | RETVAL = CREATE(GF_Reduce); |
254 | gfreduce_create(RETVAL, x); |
255 | OUTPUT: |
256 | RETVAL |
257 | |
258 | SV * |
259 | DESTROY(r) |
260 | GF_Reduce *r |
261 | CODE: |
262 | gfreduce_destroy(r); |
263 | DESTROY(r); |
264 | XSRETURN_UNDEF; |
265 | |
266 | gf * |
267 | reduce(r, x) |
268 | GF_Reduce *r |
269 | gf *x |
270 | CODE: |
271 | RETVAL = gfreduce_do(r, MP_NEW, x); |
272 | OUTPUT: |
273 | RETVAL |
274 | |
275 | gf * |
276 | sqrt(r, x) |
277 | GF_Reduce *r |
278 | gf *x |
279 | CODE: |
280 | if ((RETVAL = gfreduce_sqrt(r, MP_NEW, x)) == 0) |
281 | XSRETURN_UNDEF; |
282 | OUTPUT: |
283 | RETVAL |
284 | |
285 | int |
286 | gfreduce_trace(r, x) |
287 | GF_Reduce *r |
288 | gf *x |
289 | |
290 | gf * |
291 | gfreduce_halftrace(r, x) |
292 | GF_Reduce *r |
293 | gf *x |
294 | C_ARGS: |
295 | r, MP_NEW, x |
296 | |
297 | gf * |
298 | quadsolve(r, x) |
299 | GF_Reduce *r |
300 | gf *x |
301 | CODE: |
302 | if ((RETVAL = gfreduce_quadsolve(r, MP_NEW, x)) == 0) |
303 | XSRETURN_UNDEF; |
304 | OUTPUT: |
305 | RETVAL |
306 | |
307 | gf * |
308 | m(r) |
309 | GF_Reduce *r |
310 | CODE: |
311 | RETVAL = MP_COPY(r->p); |
312 | OUTPUT: |
313 | RETVAL |
314 | |
315 | gf * |
316 | gfreduce_exp(r, x, y) |
317 | GF_Reduce *r |
318 | gf *x |
319 | gf *y |
320 | C_ARGS: |
321 | r, MP_NEW, x, y |
322 | |
323 | #----- That's all, folks ---------------------------------------------------- |