return (rc);
}
+static PyObject *grmeth_trace(PyObject *me, PyObject *arg)
+{
+ PyObject *rc = 0;
+ mp *xx = 0;
+
+ if (!PyArg_ParseTuple(arg, "O&:trace", convgf, &xx)) goto end;
+ rc = PyInt_FromLong(gfreduce_trace(GFREDUCE_PY(me), xx));
+end:
+ if (xx) MP_DROP(xx);
+ return (rc);
+}
+
+static PyObject *grmeth_halftrace(PyObject *me, PyObject *arg)
+{
+ PyObject *rc = 0;
+ mp *xx = 0;
+
+ if (!PyArg_ParseTuple(arg, "O&:halftrace", convgf, &xx)) goto end;
+ rc = gf_pywrap(gfreduce_halftrace(GFREDUCE_PY(me), MP_NEW, xx));
+end:
+ if (xx) MP_DROP(xx);
+ return (rc);
+}
+
+static PyObject *grmeth_sqrt(PyObject *me, PyObject *arg)
+{
+ PyObject *rc = 0;
+ mp *xx = 0, *yy;
+
+ if (!PyArg_ParseTuple(arg, "O&:sqrt", convgf, &xx)) goto end;
+ if ((yy = gfreduce_sqrt(GFREDUCE_PY(me), MP_NEW, xx)) == 0)
+ VALERR("no modular square root");
+ rc = gf_pywrap(yy);
+end:
+ if (xx) MP_DROP(xx);
+ return (rc);
+}
+
+static PyObject *grmeth_quadsolve(PyObject *me, PyObject *arg)
+{
+ PyObject *rc = 0;
+ mp *xx = 0, *yy;
+
+ if (!PyArg_ParseTuple(arg, "O&:quadsolve", convgf, &xx)) goto end;
+ if ((yy = gfreduce_quadsolve(GFREDUCE_PY(me), MP_NEW, xx)) == 0)
+ VALERR("no solution found");
+ rc = gf_pywrap(yy);
+end:
+ if (xx) MP_DROP(xx);
+ return (rc);
+}
+
static PyObject *grmeth_reduce(PyObject *me, PyObject *arg)
{
PyObject *z = 0;
static PyMethodDef gfreduce_pymethods[] = {
#define METHNAME(name) grmeth_##name
METH (reduce, "R.reduce(X) -> X mod B.m")
+ METH (trace, "R.trace(X) -> Tr(X) = x + x^2 + ... + x^{2^{m - 1}}")
+ METH (halftrace, "R.halftrace(X) -> x + x^{2^2} + ... + x^{2^{m - 1}}")
+ METH (sqrt, "R.sqrt(X) -> Y where Y^2 = X mod R")
+ METH (quadsolve, "R.quadsolve(X) -> Y where Y^2 + Y = X mod R")
METH (exp, "R.exp(X, N) -> X^N mod B.m")
#undef METHNAME
{ 0 }