From d2b7e92ced5df6a556220b98488cd3cb84a721b5 Mon Sep 17 00:00:00 2001 From: Mark Wooding Date: Sun, 10 Nov 2019 22:46:35 +0000 Subject: [PATCH 1/1] mp.c: Check that CRT moduli are pairwise coprime. --- mp.c | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/mp.c b/mp.c index fff4aec..bad566d 100644 --- a/mp.c +++ b/mp.c @@ -1718,10 +1718,11 @@ static void mpcrt_pydealloc(PyObject *me) static PyObject *mpcrt_pynew(PyTypeObject *ty, PyObject *arg, PyObject *kw) { mpcrt_mod *v = 0; - int n, i = 0; + int n, i = 0, j; char *kwlist[] = { "mv", 0 }; PyObject *q = 0, *x; - mp *xx = MP_NEW; + mp *xx = MP_NEW, *y = MP_NEW, *g = MP_NEW; + mpmul mm; mpcrt_pyobj *c = 0; if (PyTuple_Size(arg) > 1) @@ -1740,10 +1741,19 @@ static PyObject *mpcrt_pynew(PyTypeObject *ty, PyObject *arg, PyObject *kw) if (MP_CMP(xx, <=, MP_ZERO)) VALERR("moduli must be positive"); v[i].m = xx; v[i].n = 0; v[i].ni = 0; v[i].nni = 0; xx = MP_NEW; } + mpmul_init(&mm); + for (j = 0; j < i; j++) mpmul_add(&mm, v[j].m); + xx = mpmul_done(&mm); + for (j = 0; j < i; j++) { + mp_div(&y, 0, xx, v[j].m); + mp_gcd(&g, 0, 0, y, v[j].m); + if (!MP_EQ(g, MP_ONE)) VALERR("moduli must be pairwise coprime"); + } + c = (mpcrt_pyobj *)ty->tp_alloc(ty, 0); mpcrt_create(&c->c, v, n, 0); Py_DECREF(q); - mp_drop(xx); + mp_drop(xx); mp_drop(y); mp_drop(g); return ((PyObject *)c); end: @@ -1754,7 +1764,7 @@ end: xfree(v); } Py_XDECREF(q); - mp_drop(xx); + mp_drop(xx); mp_drop(y); mp_drop(g); return (0); } -- 2.11.0