X-Git-Url: https://git.distorted.org.uk/~mdw/catacomb-perl/blobdiff_plain/68e68e18c457d31c1c61bc08dd14a56e7e7ac21e..a1a90aaf554eb974e39e34b513747eb666180776:/mp.xs diff --git a/mp.xs b/mp.xs index 56c8756..5d78908 100644 --- a/mp.xs +++ b/mp.xs @@ -1,6 +1,6 @@ # ---?--- # -# $Id: mp.xs,v 1.2 2004/04/08 01:36:21 mdw Exp $ +# $Id$ # # Multiprecision interface # @@ -34,13 +34,18 @@ new(me, sv = 0, radix = 0) 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) @@ -147,7 +152,7 @@ mp * neg(a) mp *a CODE: - mp_copy(a); + MP_COPY(a); RETVAL = mp_split(a); if (RETVAL->v < RETVAL->vl) RETVAL->f ^= MP_NEG; @@ -284,13 +289,24 @@ smallfactor(x) 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); @@ -301,7 +317,7 @@ MP_Barrett * 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); @@ -312,9 +328,9 @@ MP_Prime_Rabin * 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); @@ -328,9 +344,9 @@ new(me, 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); @@ -390,8 +406,8 @@ mpmont_mexpr(mm, ...) 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); @@ -412,8 +428,10 @@ mpmont_mexp(mm, ...) 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); @@ -424,7 +442,7 @@ mp * r(mm) MP_Mont *mm CODE: - RETVAL = mp_copy(mm->r); + RETVAL = MP_COPY(mm->r); OUTPUT: RETVAL @@ -432,7 +450,7 @@ mp * r2(mm) MP_Mont *mm CODE: - RETVAL = mp_copy(mm->r2); + RETVAL = MP_COPY(mm->r2); OUTPUT: RETVAL @@ -440,7 +458,7 @@ mp * m(mm) MP_Mont *mm CODE: - RETVAL = mp_copy(mm->m); + RETVAL = MP_COPY(mm->m); OUTPUT: RETVAL @@ -451,7 +469,7 @@ new(me, x) 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); @@ -485,7 +503,54 @@ mp * 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 @@ -503,7 +568,8 @@ new(me, ...) 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); @@ -530,8 +596,10 @@ solve(mc, ...) 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: