/* -*-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)
*
* 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"
*/
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;
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);
}