X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~mdw/git/catacomb-python/blobdiff_plain/457b4e971a2795898c83a53ae4c27d6a893690d1..be6df1c38491ef517f2f55f2abc9c9e64ea034b0:/mp.c diff --git a/mp.c b/mp.c index 79c6cf2..9330121 100644 --- a/mp.c +++ b/mp.c @@ -544,13 +544,15 @@ end: return ((PyObject *)zz); } -static long mp_pyhash(PyObject *me) +long mphash(mp *x) { - long h; - PyObject *l = mp_topylong(MP_X(me)); h = PyObject_Hash(l); + PyObject *l = mp_topylong(x); + long h = PyObject_Hash(l); Py_DECREF(l); return (h); } +static long mp_pyhash(PyObject *me) { return (mphash(MP_X(me))); } + static PyObject *mpmeth_jacobi(PyObject *me, PyObject *arg) { mp *y = 0; @@ -682,6 +684,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 +807,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")