X-Git-Url: https://git.distorted.org.uk/~mdw/catacomb-python/blobdiff_plain/5779eaf1c6c738aac2227dcadb9e8c27ca22631e..1c6b925f0cf913ce3100c2ae3bcaed26a3f34bc1:/mp.c diff --git a/mp.c b/mp.c index f5f4320..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) \ @@ -713,7 +726,7 @@ STOREOP(storeb2c, 2c) { \ buf b; \ char *p; \ - int sz; \ + Py_ssize_t sz; \ PyObject *rc = 0; \ mp *x; \ \ @@ -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") @@ -911,7 +926,7 @@ static PyObject *meth__MP_fromstring(PyObject *me, { int r = 0; char *p; - int len; + Py_ssize_t len; PyObject *z = 0; mp *zz; mptext_stringctx sc; @@ -924,7 +939,8 @@ static PyObject *meth__MP_fromstring(PyObject *me, sc.buf = p; sc.lim = p + len; if ((zz = mp_read(MP_NEW, r, &mptext_stringops, &sc)) == 0) VALERR("bad integer"); - z = Py_BuildValue("(Ns#)", mp_pywrap(zz), sc.buf, (int)(sc.lim - sc.buf)); + z = Py_BuildValue("(Ns#)", mp_pywrap(zz), + sc.buf, (Py_ssize_t)(sc.lim - sc.buf)); end: return (z); } @@ -952,7 +968,7 @@ static PyObject *meth__MP_fibonacci(PyObject *me, PyObject *arg) static PyObject *meth__##py##_##name(PyObject *me, PyObject *arg) \ { \ char *p; \ - int len; \ + Py_ssize_t len; \ if (!PyArg_ParseTuple(arg, "Os#:" #name, &me, &p, &len)) return (0); \ return (pre##_pywrap(mp_##name(MP_NEW, p, len))); \ } @@ -2111,7 +2127,7 @@ static PyObject *meth__GF_fromstring(PyObject *me, { int r = 0; char *p; - int len; + Py_ssize_t len; PyObject *z = 0; mp *zz; mptext_stringctx sc; @@ -2127,7 +2143,8 @@ static PyObject *meth__GF_fromstring(PyObject *me, if (zz) MP_DROP(zz); VALERR("bad binary polynomial"); } - z = Py_BuildValue("(Ns#)", gf_pywrap(zz), sc.buf, (int)(sc.lim - sc.buf)); + z = Py_BuildValue("(Ns#)", gf_pywrap(zz), + sc.buf, (Py_ssize_t)(sc.lim - sc.buf)); end: return (z); }