# ---?---
#
-# $Id: mp.xs,v 1.2 2004/04/08 01:36:21 mdw Exp $
+# $Id$
#
# Multiprecision interface
#
SV *sv
int radix
CODE:
- RETVAL = sv ? mp_fromsv(sv, "sv", radix, 1) : MP_ZERO;
+ RETVAL = sv ? mp_fromsv(sv, "sv",
+ "Catacomb::MP", radix, 1) : MP_ZERO;
OUTPUT:
RETVAL
mp *
-mp_copy(x)
+copy(x)
mp *x
+ CODE:
+ RETVAL = MP_COPY(x);
+ OUTPUT:
+ RETVAL
mp *
loadb(me, sv)
neg(a)
mp *a
CODE:
- mp_copy(a);
+ MP_COPY(a);
RETVAL = mp_split(a);
if (RETVAL->v < RETVAL->vl)
RETVAL->f ^= MP_NEG;
OUTPUT:
RETVAL
+MP_Reduce *
+makereduce(x)
+ mp *x
+ CODE:
+ if (!MP_POSP(x))
+ croak("Argument to Catacomb::MP::makereduce must be positive");
+ RETVAL = CREATE(MP_Reduce);
+ mpreduce_create(RETVAL, x);
+ OUTPUT:
+ RETVAL
+
MP_Mont *
mont(x)
mp *x
CODE:
- if (x->f & MP_NEG)
+ if (!MP_POSP(x))
croak("Argument to Catacomb::MP::mont must be positive");
- if (x->v == x->vl || !(x->v[0] & 1u))
+ if (!MP_ODDP(x))
croak("Argument to Catacomb::MP::mont must be odd");
RETVAL = CREATE(MP_Mont);
mpmont_create(RETVAL, x);
barrett(x)
mp *x
CODE:
- if (x->f & MP_NEG)
+ if (!MP_POSP(x))
croak("Argument to Catacomb::MP::barrett must be positive");
RETVAL = CREATE(mpbarrett);
mpbarrett_create(RETVAL, x);
rabin(x)
mp *x
CODE:
- if (x->f & MP_NEG)
+ if (!MP_POSP(x))
croak("Argument to Catacomb::MP::rabin must be positive");
- if (x->v == x->vl || !(x->v[0] & 1u))
+ if (!MP_ODDP(x))
croak("Argument to Catacomb::MP::rabin must be odd");
RETVAL = CREATE(MP_Prime_Rabin);
rabin_create(RETVAL, x);
SV *me
mp *x
CODE:
- if (x->f & MP_NEG)
+ if (!MP_POSP(x))
croak("Argument to Catacomb::MP::Mont::new must be positive");
- if (x->v == x->vl || !(x->v[0] & 1u))
+ if (!MP_ODDP(x))
croak("Argument to Catacomb::MP::Mont::new must be odd");
RETVAL = CREATE(MP_Mont);
mpmont_create(RETVAL, x);
n = (items - 1)/2;
v = xmalloc(n * sizeof(mp_expfactor));
for (i = 1, j = 0; i < items; i += 2, j++) {
- v[j].base = mp_fromsv(ST(i), "g_i", 0, 0);
- v[j].exp = mp_fromsv(ST(i + 1), "x_i", 0, 0);
+ v[j].base = mp_fromsv(ST(i), "g_i", "Catacomb::MP", 0, 0);
+ v[j].exp = mp_fromsv(ST(i + 1), "x_i", "Catacomb::MP", 0, 0);
}
RETVAL = mpmont_mexpr(mm, MP_NEW, v, n);
xfree(v);
n = (items - 1)/2;
v = xmalloc(n * sizeof(mp_expfactor));
for (i = 1, j = 0; i < items; i += 2, j++) {
- v[j].base = mp_fromsv(ST(i), "g_%lu", 0, 0, (unsigned long)i);
- v[j].exp = mp_fromsv(ST(i + 1), "x_%lu", 0, 0, (unsigned long)i);
+ v[j].base = mp_fromsv(ST(i), "g_%lu",
+ "Catacomb::MP", 0, 0, (unsigned long)i);
+ v[j].exp = mp_fromsv(ST(i + 1), "x_%lu",
+ "Catacomb::MP", 0, 0, (unsigned long)i);
}
RETVAL = mpmont_mexp(mm, MP_NEW, v, n);
xfree(v);
r(mm)
MP_Mont *mm
CODE:
- RETVAL = mp_copy(mm->r);
+ RETVAL = MP_COPY(mm->r);
OUTPUT:
RETVAL
r2(mm)
MP_Mont *mm
CODE:
- RETVAL = mp_copy(mm->r2);
+ RETVAL = MP_COPY(mm->r2);
OUTPUT:
RETVAL
m(mm)
MP_Mont *mm
CODE:
- RETVAL = mp_copy(mm->m);
+ RETVAL = MP_COPY(mm->m);
OUTPUT:
RETVAL
SV *me
mp *x
CODE:
- if (x->f & MP_NEG)
+ if (!MP_POSP(x))
croak("Argument to Catacomb::MP::Barrett::new must be positive");
RETVAL = CREATE(mpbarrett);
mpbarrett_create(RETVAL, x);
m(mb)
MP_Barrett *mb
CODE:
- RETVAL = mp_copy(mb->m);
+ RETVAL = MP_COPY(mb->m);
+ OUTPUT:
+ RETVAL
+
+MODULE = Catacomb PACKAGE = Catacomb::MP::Reduce PREFIX = mpreduce_
+
+MP_Reduce *
+new(me, x)
+ SV *me
+ mp *x
+ CODE:
+ if (!MP_POSP(x))
+ croak("Argument to Catacomb::MP::Reduce::new must be positive");
+ RETVAL = CREATE(mpreduce);
+ mpreduce_create(RETVAL, x);
+ OUTPUT:
+ RETVAL
+
+SV *
+DESTROY(r)
+ MP_Reduce *r
+ CODE:
+ mpreduce_destroy(r);
+ DESTROY(r);
+ XSRETURN_UNDEF;
+
+mp *
+reduce(r, x)
+ MP_Reduce *r
+ mp *x
+ CODE:
+ RETVAL = mpreduce_do(r, MP_NEW, x);
+ OUTPUT:
+ RETVAL
+
+mp *
+mpreduce_exp(r, x, y)
+ MP_Reduce *r
+ mp *x
+ mp *y
+ C_ARGS:
+ r, MP_NEW, x, y
+
+mp *
+m(r)
+ MP_Reduce *r
+ CODE:
+ RETVAL = MP_COPY(r->p);
OUTPUT:
RETVAL
n = items - 1;
v = xmalloc(n * sizeof(mpcrt_mod));
for (i = 0; i < n; i++) {
- v[i].m = mp_copy(mp_fromsv(ST(i + 1), "n_%lu", 0, 0,
+ v[i].m = mp_copy(mp_fromsv(ST(i + 1), "n_%lu",
+ "Catacomb::MP", 0, 0,
(unsigned long)i));
}
RETVAL = CREATE(MP_CRT);
n = mc->k;
if (items - 1 != n)
croak("Wrong number of residues for this CRT context");
- for (i = 0; i < n; i++)
- v[i] = mp_fromsv(ST(i + 1), "r_%lu", 0, 0, (unsigned long)i);
+ for (i = 0; i < n; i++) {
+ v[i] = mp_fromsv(ST(i + 1), "r_%lu", "Catacomb::MP",
+ 0, 0, (unsigned long)i);
+ }
RETVAL = mpcrt_solve(mc, MP_NEW, v);
xfree(v);
OUTPUT: