# -*-fundamental-*-
#
-# $Id: pgen.xs,v 1.2 2004/04/08 01:36:21 mdw Exp $
+# $Id$
#
# Prime generation gubbins
#
U32 a
CODE:
if (m > MPW_MAX)
- croak("multiplier too large in Catacomb::MP::Prime::Filter::muladd");
+ croak("multiplier too large");
if (a > MPW_MAX)
- croak("step too large in Catacomb::MP::Prime::Filter::muladd");
+ croak("step too large");
RETVAL = CREATE(MP_Prime_Filter);
RETVAL->rc = pfilt_muladd(&RETVAL->pf, &pf->pf, m, a);
OUTPUT:
U32 n
CODE:
if (n > MPW_MAX)
- croak("step too large in Catacomb::MP::Prime::Filter::step");
+ croak("step too large");
RETVAL = pf->rc = pfilt_step(&pf->pf, n);
OUTPUT:
RETVAL
SV *me
mp *x
CODE:
- if (x->f & MP_NEG)
- croak("Argument to Catacomb::MP::Prime::Rabin must be positive");
- if (x->v == x->vl || !(x->v[0] & 1u))
- croak("Argument to Catacomb::MP::Prime::Rabin must be odd");
RETVAL = CREATE(MP_Prime_Rabin);
- rabin_create(RETVAL, x);
+ if (rabin_create(RETVAL, x)) {
+ DESTROY(RETVAL);
+ RETVAL = 0;
+ }
OUTPUT:
RETVAL
MP_Prime_Rabin *r
mp *g
+mp *
+m(r)
+ MP_Prime_Rabin *r
+ CODE:
+ RETVAL = MP_COPY(r->mm.m);
+ OUTPUT:
+ RETVAL
+
int
rabin_iters(r)
MP_Prime_Rabin *r
mp_bits(r->mm.m)
int
-ntests(bits)
+ntests(me, bits)
+ SV *me
int bits
CODE:
RETVAL = rabin_iters(bits);
OUTPUT:
RETVAL
+int
+PG_BEGIN(me, ev)
+ SV *me
+ MP_Prime_Gen_Event *ev
+ ALIAS:
+ PG_TRY = 0
+ PG_PASS = 1
+ PG_FAIL = 2
+ PG_ABORT = 3
+ PG_DONE = 4
+ CODE:
+ RETVAL = 0;
+ OUTPUT:
+ RETVAL
+
MODULE = Catacomb PACKAGE = Catacomb::MP::Prime
mp *
-gen(name, m, steps, stepper, tests, tester, events = &PL_sv_undef)
+gen(me, name, m, steps, stepper, tests, tester, events = &PL_sv_undef)
+ SV *me
char *name
mp *m
MP_Prime_Gen_NullProc *events
RETVAL
void
-strongprime_setup(name, bits, r = &rand_global, n = 0, events = &PL_sv_undef)
+strongprime_setup(me, name, bits, r = &rand_global, n = 0, events = &PL_sv_undef)
+ SV *me
char *name
unsigned bits
grand *r
j = CREATE(MP_Prime_Gen_JumpStepper);
d = strongprime_setup(name, MP_NEW, &j->pf, bits, r, n, ev, ectx);
EXTEND(SP, 2);
- if (!d) {
+ if (!d)
DESTROY(j);
- PUSHs(&PL_sv_undef);
- PUSHs(&PL_sv_undef);
- } else {
+ else {
j->j.j = &j->pf;
j->mg.p = pgen_jump;
j->mg.ctx = &j->j;
}
void
-limlee(name, qbits, pbits, r = &rand_global, on = 0, oevents = &PL_sv_undef, ievents = &PL_sv_undef)
+limlee(me, name, qbits, pbits, r = &rand_global, on = 0, oevents = &PL_sv_undef, ievents = &PL_sv_undef)
+ SV *me
char *name
unsigned qbits
unsigned pbits
if (GIMME_V == G_SCALAR) {
x = limlee(name, MP_NEW, MP_NEW, qbits, pbits, r, on,
oev, oec, iev, iec, 0, 0);
+ if (!x) return;
EXTEND(SP, 1);
PUSHs(RET_MP(x));
} else {
x = limlee(name, MP_NEW, MP_NEW, qbits, pbits, r, on,
oev, oec, iev, iec, &nf, &f);
+ if (!x) return;
EXTEND(SP, 1 + nf);
PUSHs(RET_MP(x));
for (i = 0; i < nf; i++)
RETVAL
mp *
-mp(ev, m = 0)
+m(ev, x = &PL_sv_undef)
MP_Prime_Gen_Event *ev
- mp *m
+ SV *x
+ PREINIT:
+ mp *y;
CODE:
RETVAL = mp_copy(ev->m);
- if (items > 1) {
+ if (SvOK(x)) {
+ if ((y = mp_fromsv(x, "x", 0, 1)) == 0)
+ croak("bad integer");
mp_drop(ev->m);
- ev->m = mp_copy(m);
+ ev->m = y;
}
OUTPUT:
RETVAL
+int
+steps(ev)
+ MP_Prime_Gen_Event *ev
+ CODE:
+ RETVAL = ev->steps;
+ OUTPUT:
+ RETVAL
+
+int
+tests(ev)
+ MP_Prime_Gen_Event *ev
+ CODE:
+ RETVAL = ev->tests;
+ OUTPUT:
+ RETVAL
+
SV *
rand(ev)
MP_Prime_Gen_Event *ev