X-Git-Url: https://git.distorted.org.uk/u/mdw/catacomb/blobdiff_plain/898a4e2555438ff8adb08b4d82690d08715e1048..b817bfc642225b8c3c0b6a7e42d1fb949b61a606:/mpcrt.c diff --git a/mpcrt.c b/mpcrt.c index 17bc6ad..c79b00b 100644 --- a/mpcrt.c +++ b/mpcrt.c @@ -1,6 +1,6 @@ /* -*-c-*- * - * $Id: mpcrt.c,v 1.5 2001/04/29 17:39:33 mdw Exp $ + * $Id: mpcrt.c,v 1.6 2004/04/08 01:36:15 mdw Exp $ * * Chinese Remainder Theorem computations (Gauss's algorithm) * @@ -27,26 +27,6 @@ * MA 02111-1307, USA. */ -/*----- Revision history --------------------------------------------------* - * - * $Log: mpcrt.c,v $ - * Revision 1.5 2001/04/29 17:39:33 mdw - * Fix memory leak. - * - * Revision 1.4 2001/04/19 18:25:38 mdw - * Use mpmul for the multiplication. - * - * Revision 1.3 2000/10/08 12:11:22 mdw - * Use @MP_EQ@ instead of @MP_CMP@. - * - * Revision 1.2 1999/12/10 23:22:32 mdw - * Interface changes for suggested destinations. Use Barrett reduction. - * - * Revision 1.1 1999/11/22 20:50:57 mdw - * Add support for solving Chinese Remainder Theorem problems. - * - */ - /*----- Header files ------------------------------------------------------*/ #include "mp.h" @@ -113,7 +93,10 @@ void mpcrt_create(mpcrt *c, mpcrt_mod *v, size_t k, mp *n) */ if (!v[0].ni && !v[1].ni) { - mp_gcd(0, &v[0].ni, &v[1].ni, v[0].n, v[1].n); + mp *g = MP_NEW; + mp_gcd(&g, &v[0].ni, &v[1].ni, v[0].n, v[1].n); + assert(MP_EQ(g, MP_ONE)); + mp_drop(g); v[0].ni = mp_add(v[0].ni, v[0].ni, v[1].n); } else { int i, j; @@ -141,7 +124,7 @@ void mpcrt_create(mpcrt *c, mpcrt_mod *v, size_t k, mp *n) if (!v[i].n) mp_div(&v[i].n, 0, n, v[i].m); if (!v[i].ni) - mp_gcd(0, &v[i].ni, 0, v[i].n, v[i].m); + v[i].ni = mp_modinv(MP_NEW, v[i].n, v[i].m); if (!v[i].nni) v[i].nni = mp_mul(MP_NEW, v[i].n, v[i].ni); }