Much wider support for Catacomb in all its glory.
[catacomb-perl] / pgen.xs
CommitLineData
660b443c 1# -*-fundamental-*-
2#
fcd15e0b 3# $Id$
660b443c 4#
5# Prime generation gubbins
6#
7# (c) 2001 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
660b443c 28MODULE = Catacomb PACKAGE = Catacomb::MP::Prime::Filter
29
30MP_Prime_Filter *
31new(me, x)
32 SV *me
33 mp *x
34 CODE:
35 RETVAL = CREATE(MP_Prime_Filter);
36 RETVAL->rc = pfilt_create(&RETVAL->pf, x);
37 OUTPUT:
38 RETVAL
39
40SV *
41DESTROY(pf)
42 MP_Prime_Filter *pf
43 CODE:
44 pfilt_destroy(&pf->pf);
45 DESTROY(pf);
46 XSRETURN_UNDEF;
47
48int
49status(pf)
50 MP_Prime_Filter *pf
51 CODE:
52 RETVAL = pf->rc;
53 OUTPUT:
54 RETVAL
55
56MP_Prime_Filter *
57muladd(pf, m, a)
58 MP_Prime_Filter *pf
59 U32 m
60 U32 a
61 CODE:
62 if (m > MPW_MAX)
fcd15e0b 63 croak("multiplier too large");
660b443c 64 if (a > MPW_MAX)
fcd15e0b 65 croak("step too large");
660b443c 66 RETVAL = CREATE(MP_Prime_Filter);
67 RETVAL->rc = pfilt_muladd(&RETVAL->pf, &pf->pf, m, a);
68 OUTPUT:
69 RETVAL
70
71int
72step(pf, n)
73 MP_Prime_Filter *pf
74 U32 n
75 CODE:
76 if (n > MPW_MAX)
fcd15e0b 77 croak("step too large");
660b443c 78 RETVAL = pf->rc = pfilt_step(&pf->pf, n);
79 OUTPUT:
80 RETVAL
81
82int
83jump(pf, j)
84 MP_Prime_Filter *pf
85 MP_Prime_Filter *j
86 CODE:
87 RETVAL = pf->rc = pfilt_jump(&pf->pf, &j->pf);
88 OUTPUT:
89 RETVAL
90
91mp *
92m(pf)
93 MP_Prime_Filter *pf
94 CODE:
95 RETVAL = mp_copy(pf->pf.m);
96 OUTPUT:
97 RETVAL
98
99MP_Prime_Gen_FilterStepper *
100stepper(me, step)
101 SV *me
102 unsigned step
103 CODE:
104 RETVAL = CREATE(MP_Prime_Gen_FilterStepper);
105 RETVAL->f.step = step;
106 RETVAL->mg.p = pgen_filter;
107 RETVAL->mg.ctx = &RETVAL->f;
108 OUTPUT:
109 RETVAL
110
111MP_Prime_Gen_JumpStepper *
112jumper(me, j)
113 SV *me
114 mp *j
115 CODE:
116 RETVAL = CREATE(MP_Prime_Gen_JumpStepper);
117 pfilt_create(&RETVAL->pf, j);
118 RETVAL->j.j = &RETVAL->pf;
119 RETVAL->mg.p = pgen_jump;
120 RETVAL->mg.ctx = &RETVAL->j;
121 OUTPUT:
122 RETVAL
123
124MODULE = Catacomb PACKAGE = Catacomb::MP::Prime::Rabin PREFIX = rabin_
125
126MP_Prime_Rabin *
127new(me, x)
128 SV *me
129 mp *x
130 CODE:
660b443c 131 RETVAL = CREATE(MP_Prime_Rabin);
fcd15e0b 132 if (rabin_create(RETVAL, x)) {
133 DESTROY(RETVAL);
134 RETVAL = 0;
135 }
660b443c 136 OUTPUT:
137 RETVAL
138
139SV *
140DESTROY(r)
141 MP_Prime_Rabin *r
142 CODE:
143 rabin_destroy(r);
144 DESTROY(r);
145 XSRETURN_UNDEF;
146
147int
148rabin_test(r, g)
149 MP_Prime_Rabin *r
150 mp *g
151
fcd15e0b 152mp *
153m(r)
154 MP_Prime_Rabin *r
155 CODE:
156 RETVAL = MP_COPY(r->mm.m);
157 OUTPUT:
158 RETVAL
159
660b443c 160int
161rabin_iters(r)
162 MP_Prime_Rabin *r
163 C_ARGS:
164 mp_bits(r->mm.m)
165
166int
fcd15e0b 167ntests(me, bits)
168 SV *me
660b443c 169 int bits
170 CODE:
171 RETVAL = rabin_iters(bits);
172 OUTPUT:
173 RETVAL
174
175MP_Prime_Gen_RabinTester *
176tester(me)
177 SV *me
178 CODE:
179 RETVAL = CREATE(MP_Prime_Gen_RabinTester);
180 RETVAL->mg.p = pgen_test;
181 RETVAL->mg.ctx = &RETVAL->r;
182 OUTPUT:
183 RETVAL
184
185MODULE = Catacomb PACKAGE = Catacomb::MP::Prime::Gen::MagicProc
186
187SV *
188DESTROY(proc)
189 MP_Prime_Gen_MagicProc *proc
190 CODE:
191 DESTROY(proc);
192 XSRETURN_UNDEF;
193
194MODULE = Catacomb PACKAGE = Catacomb::MP::Prime::Gen::FilterStepper
195
196SV *
197DESTROY(s)
198 MP_Prime_Gen_FilterStepper *s
199 CODE:
200 DESTROY(s);
201 XSRETURN_UNDEF;
202
203MODULE = Catacomb PACKAGE = Catacomb::MP::Prime::Gen::JumpStepper
204
205SV *
206DESTROY(s)
207 MP_Prime_Gen_JumpStepper *s
208 CODE:
209 pfilt_destroy(&s->pf);
210 DESTROY(s);
211 XSRETURN_UNDEF;
212
213MODULE = Catacomb PACKAGE = Catacomb::MP::Prime::Gen::RabinTester
214
215SV *
216DESTROY(t)
217 MP_Prime_Gen_RabinTester *t
218 CODE:
219 DESTROY(t);
220 XSRETURN_UNDEF;
221
222MODULE = Catacomb PACKAGE = Catacomb::MP::Prime::Gen::Proc
223
224MP_Prime_Gen_MagicProc *
225ev(me)
226 SV *me
227 CODE:
228 RETVAL = CREATE(MP_Prime_Gen_MagicProc);
229 RETVAL->p = pgen_ev;
230 RETVAL->ctx = 0;
231 OUTPUT:
232 RETVAL
233
234MP_Prime_Gen_MagicProc *
235evspin(me)
236 SV *me
237 CODE:
238 RETVAL = CREATE(MP_Prime_Gen_MagicProc);
239 RETVAL->p = pgen_evspin;
240 RETVAL->ctx = 0;
241 OUTPUT:
242 RETVAL
243
244MP_Prime_Gen_MagicProc *
245subev(me)
246 SV *me
247 CODE:
248 RETVAL = CREATE(MP_Prime_Gen_MagicProc);
249 RETVAL->p = pgen_subev;
250 RETVAL->ctx = 0;
251 OUTPUT:
252 RETVAL
253
fcd15e0b 254int
255PG_BEGIN(me, ev)
256 SV *me
257 MP_Prime_Gen_Event *ev
258 ALIAS:
259 PG_TRY = 0
260 PG_PASS = 1
261 PG_FAIL = 2
262 PG_ABORT = 3
263 PG_DONE = 4
264 CODE:
265 RETVAL = 0;
266 OUTPUT:
267 RETVAL
268
660b443c 269MODULE = Catacomb PACKAGE = Catacomb::MP::Prime
270
271mp *
fcd15e0b 272gen(me, name, m, steps, stepper, tests, tester, events = &PL_sv_undef)
273 SV *me
660b443c 274 char *name
275 mp *m
276 MP_Prime_Gen_NullProc *events
277 unsigned steps
278 MP_Prime_Gen_Proc *stepper
279 unsigned tests
280 MP_Prime_Gen_Proc *tester
281 PREINIT:
282 pgen_proc *ev, *step, *test;
283 void *ectx, *sctx, *tctx;
284 CODE:
285 pgproc_get(events, &ev, &ectx);
286 pgproc_get(stepper, &step, &sctx);
287 pgproc_get(tester, &test, &tctx);
288 RETVAL = pgen(name, MP_NEW, m, ev, ectx,
289 steps, step, sctx, tests, test, tctx);
290 OUTPUT:
291 RETVAL
292
293void
fcd15e0b 294strongprime_setup(me, name, bits, r = &rand_global, n = 0, events = &PL_sv_undef)
295 SV *me
660b443c 296 char *name
297 unsigned bits
298 grand *r
299 unsigned n
300 MP_Prime_Gen_NullProc *events
301 PREINIT:
302 pgen_proc *ev;
303 void *ectx;
304 mp *d;
305 MP_Prime_Gen_JumpStepper *j;
306 PPCODE:
307 pgproc_get(events, &ev, &ectx);
308 j = CREATE(MP_Prime_Gen_JumpStepper);
309 d = strongprime_setup(name, MP_NEW, &j->pf, bits, r, n, ev, ectx);
310 EXTEND(SP, 2);
fcd15e0b 311 if (!d)
660b443c 312 DESTROY(j);
fcd15e0b 313 else {
660b443c 314 j->j.j = &j->pf;
315 j->mg.p = pgen_jump;
316 j->mg.ctx = &j->j;
317 PUSHs(RET_MP(d));
318 PUSHs(RET(j, "Catacomb::MP::Prime::Gen::JumpStepper"));
319 }
320
321void
fcd15e0b 322limlee(me, name, qbits, pbits, r = &rand_global, on = 0, oevents = &PL_sv_undef, ievents = &PL_sv_undef)
323 SV *me
660b443c 324 char *name
325 unsigned qbits
326 unsigned pbits
327 grand *r
328 unsigned on
329 MP_Prime_Gen_NullProc *oevents
330 MP_Prime_Gen_NullProc *ievents
331 PREINIT:
332 pgen_proc *oev, *iev;
333 void *oec, *iec;
334 mp **f;
335 size_t nf, i;
336 mp *x;
337 PPCODE:
338 pgproc_get(oevents, &oev, &oec);
339 pgproc_get(ievents, &iev, &iec);
340 if (GIMME_V == G_SCALAR) {
341 x = limlee(name, MP_NEW, MP_NEW, qbits, pbits, r, on,
342 oev, oec, iev, iec, 0, 0);
fcd15e0b 343 if (!x) return;
660b443c 344 EXTEND(SP, 1);
345 PUSHs(RET_MP(x));
346 } else {
347 x = limlee(name, MP_NEW, MP_NEW, qbits, pbits, r, on,
348 oev, oec, iev, iec, &nf, &f);
fcd15e0b 349 if (!x) return;
660b443c 350 EXTEND(SP, 1 + nf);
351 PUSHs(RET_MP(x));
352 for (i = 0; i < nf; i++)
353 PUSHs(RET_MP(f[i]));
354 xfree(f);
355 }
356
357MODULE = Catacomb PACKAGE = Catacomb::MP::Prime::Gen::Event
358
359char *
360name(ev)
361 MP_Prime_Gen_Event *ev
362 CODE:
363 RETVAL = (char *)ev->name;
364 OUTPUT:
365 RETVAL
366
367mp *
fcd15e0b 368m(ev, x = &PL_sv_undef)
660b443c 369 MP_Prime_Gen_Event *ev
fcd15e0b 370 SV *x
371 PREINIT:
372 mp *y;
660b443c 373 CODE:
374 RETVAL = mp_copy(ev->m);
fcd15e0b 375 if (SvOK(x)) {
376 if ((y = mp_fromsv(x, "x", 0, 1)) == 0)
377 croak("bad integer");
660b443c 378 mp_drop(ev->m);
fcd15e0b 379 ev->m = y;
660b443c 380 }
381 OUTPUT:
382 RETVAL
383
fcd15e0b 384int
385steps(ev)
386 MP_Prime_Gen_Event *ev
387 CODE:
388 RETVAL = ev->steps;
389 OUTPUT:
390 RETVAL
391
392int
393tests(ev)
394 MP_Prime_Gen_Event *ev
395 CODE:
396 RETVAL = ev->tests;
397 OUTPUT:
398 RETVAL
399
660b443c 400SV *
401rand(ev)
402 MP_Prime_Gen_Event *ev
403 CODE:
404 RETVAL = MAKE(ev->r, "Catacomb::Rand::Magic");
405 OUTPUT:
406 RETVAL
407
408#----- That's all, folks ----------------------------------------------------