From d0d9458708e431e88d60a9073da384a9d4baa3dd Mon Sep 17 00:00:00 2001 Message-Id: From: Mark Wooding Date: Thu, 11 May 2017 10:42:15 +0100 Subject: [PATCH] mp.c: Add binding for `leastcongruent' function. Organization: Straylight/Edgeware From: Mark Wooding --- mp.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/mp.c b/mp.c index 79c6cf2..88ee738 100644 --- a/mp.c +++ b/mp.c @@ -682,6 +682,19 @@ end: return (z); } +static PyObject *mpmeth_leastcongruent(PyObject *me, PyObject *arg) +{ + mp *z, *b, *m; + PyObject *rc = 0; + + if (!PyArg_ParseTuple(arg, "O&O&:leastcongruent", convmp, &b, convmp, &m)) + goto end; + z = mp_leastcongruent(MP_NEW, b, MP_X(me), m); + rc = mp_pywrap(z); +end: + return (rc); +} + #define STOREOP(name, c) \ static PyObject *mpmeth_##name(PyObject *me, \ PyObject *arg, PyObject *kw) \ @@ -792,6 +805,8 @@ static PyMethodDef mp_pymethods[] = { "X.gcdx(Y) -> (gcd(X, Y), U, V) with X U + Y V = gcd(X, Y)") METH (modinv, "X.modinv(Y) -> multiplicative inverse of Y mod X") METH (modsqrt, "X.modsqrt(Y) -> square root of Y mod X, if X prime") + METH (leastcongruent, + "X.leastcongruent(B, M) -> smallest Z >= B with Z == X (mod M)") KWMETH(primep, "X.primep(rng = rand) -> true/false if X is prime") KWMETH(tostring, "X.tostring(radix = 10) -> STR") KWMETH(storel, "X.storel(len = -1) -> little-endian bytes") -- [mdw]