{
PyObject *x;
mp *z;
- char *kwlist[] = { "x", 0 };
+ static const char *const kwlist[] = { "x", 0 };
- if (!PyArg_ParseTupleAndKeywords(arg, kw, "O:fe", kwlist, &x))
+ if (!PyArg_ParseTupleAndKeywords(arg, kw, "O:fe", KWLIST, &x))
return (0);
if (FE_PYCHECK(x) && FE_F(x) == FIELD_F(ty)) RETURN_OBJ(x);
if ((z = getmp(x)) == 0) return (0);
fobj->ty.ht_type.tp_alloc = PyType_GenericAlloc;
fobj->ty.ht_type.tp_free = 0;
fobj->ty.ht_type.tp_new = fe_pynew;
- PyType_Ready(&fobj->ty.ht_type);
+ typeready(&fobj->ty.ht_type);
return ((PyObject *)fobj);
}
{
PyTypeObject *ty;
- if (strcmp(F_NAME(f), "prime") == 0) ty = primefield_pytype;
- else if (strcmp(F_NAME(f), "niceprime") == 0) ty = niceprimefield_pytype;
- else if (strcmp(F_NAME(f), "binpoly") == 0) ty = binpolyfield_pytype;
- else if (strcmp(F_NAME(f), "binnorm") == 0) ty = binnormfield_pytype;
+ if (STRCMP(F_NAME(f), ==, "prime")) ty = primefield_pytype;
+ else if (STRCMP(F_NAME(f), ==, "niceprime")) ty = niceprimefield_pytype;
+ else if (STRCMP(F_NAME(f), ==, "binpoly")) ty = binpolyfield_pytype;
+ else if (STRCMP(F_NAME(f), ==, "binnorm")) ty = binnormfield_pytype;
else abort();
return (field_dopywrap(ty, f));
}
field *field_copy(field *f)
{
- if (strcmp(F_NAME(f), "prime") == 0)
+ if (STRCMP(F_NAME(f), ==, "prime"))
f = field_prime(f->m);
- else if (strcmp(F_NAME(f), "niceprime") == 0)
+ else if (STRCMP(F_NAME(f), ==, "niceprime"))
f = field_niceprime(f->m);
- else if (strcmp(F_NAME(f), "binpoly") == 0)
+ else if (STRCMP(F_NAME(f), ==, "binpoly"))
f = field_binpoly(f->m);
- else if (strcmp(F_NAME(f), "binnorm") == 0) {
+ else if (STRCMP(F_NAME(f), ==, "binnorm")) {
fctx_binnorm *fc = (fctx_binnorm *)f;
f = field_binnorm(f->m, fc->ntop.r[fc->ntop.n - 1]);
} else
return (y);
}
-mp *getfe(field *f, PyObject *o)
-{
- mp *x = 0;
- if ((x = tofe(f, o)) == 0) {
- PyErr_Format(PyExc_TypeError, "can't convert %.100s to fe",
- o->ob_type->tp_name);
- }
- return (x);
-}
-
/*----- Field elements ----------------------------------------------------*/
static int febinop(PyObject *x, PyObject *y,
return (rc);
}
-static long fe_pyhash(PyObject *me)
-{
- long i = mp_tolong(FE_X(me));
- i ^= 0xdcf62d6c; /* random perturbance */
- if (i == -1)
- i = -2;
- return (i);
-}
+static Py_hash_t fe_pyhash(PyObject *me)
+ { return (mphash(FE_X(me))); }
static int fe_pycoerce(PyObject **x, PyObject **y)
{
static PyObject *fe_pyint(PyObject *x)
{
long l;
+ PyObject *rc;
mp *xx = F_OUT(FE_F(x), MP_NEW, FE_X(x));
- if (mp_tolong_checked(xx, &l)) { MP_DROP(xx); return (0); }
+ if (!mp_tolong_checked(xx, &l, 0)) rc = PyInt_FromLong(l);
+ else rc = mp_topylong(xx);
MP_DROP(xx);
- return (PyInt_FromLong(l));
+ return (rc);
}
static PyObject *fe_pylong(PyObject *x)
#define BASEOP(name, radix, pre) \
static PyObject *fe_py##name(PyObject *x) { \
mp *xx = F_OUT(FE_F(x), MP_NEW, FE_X(x)); \
- PyObject *rc = mp_topystring(FE_X(x), radix, 0, pre, 0); \
+ PyObject *rc = mp_topystring(xx, radix, 0, pre, 0); \
MP_DROP(xx); \
return (rc); \
}
}
#define UNOP(name, check) \
- static PyObject *femeth_##name(PyObject *me, PyObject *arg) { \
+ static PyObject *femeth_##name(PyObject *me) { \
field *f = FE_F(me); \
mp *x = FE_X(me); \
- if (!PyArg_ParseTuple(arg, ":" #name)) return (0); \
if (!f->ops->name) TYERR(#name " not supported for this field"); \
check \
x = f->ops->name(f, MP_NEW, x); \
UNOP(hlv, ; )
#undef UNOP
-static PyObject *feget_field(PyObject *me, void *hunoz)
- { RETURN_OBJ(FE_FOBJ(me)); }
-
static PyObject *feget_value(PyObject *me, void *hunoz)
{
mp *x = F_OUT(FE_F(me), MP_NEW, FE_X(me));
return (mp_pywrap(x));
}
-static PyGetSetDef fe_pygetset[] = {
+static const PyMemberDef fe_pymembers[] = {
+#define MEMBERSTRUCT fe_pyobj
+ MEMRNM(field, T_OBJECT, ob_type, READONLY,
+ "X.field -> field containing X")
+#undef MEMBERSTRUCT
+ { 0 }
+};
+
+static const PyGetSetDef fe_pygetset[] = {
#define GETSETNAME(op, name) fe##op##_##name
- GET (field, "X.field -> field containing X")
- GET (value, "X.value -> `natural' integer representation of X")
- GET (_value, "X._value -> internal integer representation of X")
+ GET (value, "X.value -> `natural' MP/GF representation of X")
+ GET (_value, "X._value -> internal MP/GF representation of X")
#undef GETSETNAME
{ 0 }
};
-static PyMethodDef fe_pymethods[] = {
+static const PyMethodDef fe_pymethods[] = {
#define METHNAME(func) femeth_##func
- METH (inv, "X.inv() -> X^{-1}")
- METH (sqr, "X.sqr() -> X^2")
- METH (sqrt, "X.sqrt() -> sqrt(X)")
- METH (quadsolve, "X.quadsolve() -> Y where Y^2 + Y = X (binary only)")
- METH (dbl, "X.dbl() -> 2 * X (prime only)")
- METH (tpl, "X.tpl() -> 3 * X (prime only)")
- METH (qdl, "X.qdl() -> 4 * X (prime only)")
- METH (hlv, "X.hlv() -> X/2 (prime only)")
+ NAMETH(inv, "X.inv() -> X^{-1}")
+ NAMETH(sqr, "X.sqr() -> X^2")
+ NAMETH(sqrt, "X.sqrt() -> sqrt(X)")
+ NAMETH(quadsolve, "X.quadsolve() -> Y where Y^2 + Y = X (binary only)")
+ NAMETH(dbl, "X.dbl() -> 2 * X (prime only)")
+ NAMETH(tpl, "X.tpl() -> 3 * X (prime only)")
+ NAMETH(qdl, "X.qdl() -> 4 * X (prime only)")
+ NAMETH(hlv, "X.hlv() -> X/2 (prime only)")
#undef METHNAME
{ 0 }
};
-static PyNumberMethods fe_pynumber = {
+static const PyNumberMethods fe_pynumber = {
fe_pyadd, /* @nb_add@ */
fe_pysub, /* @nb_subtract@ */
fe_pymul, /* @nb_multiply@ */
0, /* @nb_inplace_true_divide@ */
};
-static PyTypeObject fe_pytype_skel = {
- PyObject_HEAD_INIT(0) 0, /* Header */
- "catacomb.FE", /* @tp_name@ */
+static const PyTypeObject fe_pytype_skel = {
+ PyVarObject_HEAD_INIT(0, 0) /* Header */
+ "FE", /* @tp_name@ */
sizeof(fe_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */
0, /* @tp_setattr@ */
0, /* @tp_compare@ */
0, /* @tp_repr@ */
- &fe_pynumber, /* @tp_as_number@ */
+ PYNUMBER(fe), /* @tp_as_number@ */
0, /* @tp_as_sequence@ */
0, /* @tp_as_mapping@ */
fe_pyhash, /* @tp_hash@ */
Py_TPFLAGS_BASETYPE,
/* @tp_doc@ */
-"Finite field elements, abstract base class.",
+ "Finite field elements, abstract base class.",
0, /* @tp_traverse@ */
0, /* @tp_clear@ */
0, /* @tp_weaklistoffset@ */
0, /* @tp_iter@ */
0, /* @tp_iternext@ */
- fe_pymethods, /* @tp_methods@ */
- 0, /* @tp_members@ */
- fe_pygetset, /* @tp_getset@ */
+ PYMETHODS(fe), /* @tp_methods@ */
+ PYMEMBERS(fe), /* @tp_members@ */
+ PYGETSET(fe), /* @tp_getset@ */
0, /* @tp_base@ */
0, /* @tp_dict@ */
0, /* @tp_descr_get@ */
static PyObject *fmeth_rand(PyObject *me, PyObject *arg, PyObject *kw)
{
- char *kwlist[] = { "rng", 0 };
+ static const char *const kwlist[] = { "rng", 0 };
grand *r = &rand_global;
- if (!PyArg_ParseTupleAndKeywords(arg, kw, "|O&:rand", kwlist,
+ if (!PyArg_ParseTupleAndKeywords(arg, kw, "|O&:rand", KWLIST,
convgrand, &r))
return (0);
return (fe_pywrap(me, F_RAND(FIELD_F(me), MP_NEW, r)));
return (fe_pywrap(me, xx));
}
+static PyObject *fmeth_parse(PyObject *me, PyObject *arg)
+{
+ field *f;
+ char *p;
+ PyObject *rc = 0;
+ qd_parse qd;
+
+ if (!PyArg_ParseTuple(arg, "s:parse", &p)) goto end;
+ qd.p = p; qd.e = 0;
+ if ((f = field_parse(&qd)) == 0) VALERR(qd.e);
+ rc = Py_BuildValue("(Ns)", field_pywrap(f), qd.p);
+end:
+ return (rc);
+}
+
static void field_pydealloc(PyObject *me)
{
F_DESTROY(FIELD_F(me));
{ return (PyInt_FromLong(FIELD_F(me)->noctets)); }
static PyObject *fget_name(PyObject *me, void *hunoz)
- { return (PyString_FromString(F_NAME(FIELD_F(me)))); }
+ { return (TEXT_FROMSTR(F_NAME(FIELD_F(me)))); }
static PyObject *fget_type(PyObject *me, void *hunoz)
{ return (PyInt_FromLong(F_TYPE(FIELD_F(me)))); }
-static PyGetSetDef field_pygetset[] = {
+static const PyGetSetDef field_pygetset[] = {
#define GETSETNAME(op, name) f##op##_##name
GET (zero, "F.zero -> field additive identity")
GET (one, "F.one -> field multiplicative identity")
{ 0 }
};
-static PyMethodDef field_pymethods[] = {
+static const PyMethodDef field_pymethods[] = {
#define METHNAME(name) fmeth_##name
METH (_adopt, "F._adopt(X) -> FE")
- KWMETH(rand, "F.rand(rng = rand) -> FE, uniformly distributed")
+ KWMETH(rand, "F.rand([rng = rand]) -> FE, uniformly distributed")
+ SMTH (parse, "parse(STR) -> F, REST")
#undef METHNAME
{ 0 }
};
-static PyTypeObject field_pytype_skel = {
- PyObject_HEAD_INIT(0) 0, /* Header */
- "catacomb.Field", /* @tp_name@ */
+static const PyTypeObject field_pytype_skel = {
+ PyVarObject_HEAD_INIT(0, 0) /* Header */
+ "Field", /* @tp_name@ */
sizeof(field_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */
Py_TPFLAGS_BASETYPE,
/* @tp_doc@ */
-"An abstract field. This is an abstract type.",
+ "An abstract field. This is an abstract type.",
0, /* @tp_traverse@ */
0, /* @tp_clear@ */
0, /* @tp_weaklistoffset@ */
0, /* @tp_iter@ */
0, /* @tp_iternext@ */
- field_pymethods, /* @tp_methods@ */
+ PYMETHODS(field), /* @tp_methods@ */
0, /* @tp_members@ */
- field_pygetset, /* @tp_getset@ */
+ PYGETSET(field), /* @tp_getset@ */
0, /* @tp_base@ */
0, /* @tp_dict@ */
0, /* @tp_descr_get@ */
{
mp *xx = 0;
field *f;
- char *kwlist[] = { "p", 0 };
+ static const char *const kwlist[] = { "p", 0 };
- if (!PyArg_ParseTupleAndKeywords(arg, kw, "O&:primefield", kwlist,
+ if (!PyArg_ParseTupleAndKeywords(arg, kw, "O&:primefield", KWLIST,
convmp, &xx))
goto end;
if ((f = field_prime(xx)) == 0)
static PyObject *pfget_p(PyObject *me, void *hunoz)
{ return (mp_pywrap(MP_COPY(FIELD_F(me)->m))); }
-static PyGetSetDef primefield_pygetset[] = {
+static const PyGetSetDef primefield_pygetset[] = {
#define GETSETNAME(op, name) pf##op##_##name
GET (p, "F.p -> prime field characteristic")
#undef GETSETNAME
};
-static PyTypeObject primefield_pytype_skel = {
- PyObject_HEAD_INIT(0) 0, /* Header */
- "catacomb.PrimeField", /* @tp_name@ */
+static const PyTypeObject primefield_pytype_skel = {
+ PyVarObject_HEAD_INIT(0, 0) /* Header */
+ "PrimeField", /* @tp_name@ */
sizeof(field_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */
Py_TPFLAGS_BASETYPE,
/* @tp_doc@ */
- "Prime fields.",
+ "PrimeField(P): prime fields.",
0, /* @tp_traverse@ */
0, /* @tp_clear@ */
0, /* @tp_iternext@ */
0, /* @tp_methods@ */
0, /* @tp_members@ */
- primefield_pygetset, /* @tp_getset@ */
+ PYGETSET(primefield), /* @tp_getset@ */
0, /* @tp_base@ */
0, /* @tp_dict@ */
0, /* @tp_descr_get@ */
{
mp *xx = 0;
field *f;
- char *kwlist[] = { "p", 0 };
+ static const char *const kwlist[] = { "p", 0 };
if (!PyArg_ParseTupleAndKeywords(arg, kw, "O&:niceprimefield",
- kwlist, convmp, &xx))
+ KWLIST, convmp, &xx))
goto end;
if ((f = field_niceprime(xx)) == 0)
VALERR("bad prime for niceprimefield");
return (0);
}
-static PyTypeObject niceprimefield_pytype_skel = {
- PyObject_HEAD_INIT(0) 0, /* Header */
- "catacomb.NicePrimeField", /* @tp_name@ */
+static const PyTypeObject niceprimefield_pytype_skel = {
+ PyVarObject_HEAD_INIT(0, 0) /* Header */
+ "NicePrimeField", /* @tp_name@ */
sizeof(field_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */
Py_TPFLAGS_BASETYPE,
/* @tp_doc@ */
- "Nice prime fields.",
+ "NicePrimeField(P): prime field using Solinas reduction.",
0, /* @tp_traverse@ */
0, /* @tp_clear@ */
static PyObject *bfget_m(PyObject *me, void *hunoz)
{ return (PyInt_FromLong(FIELD_F(me)->nbits)); }
-static PyGetSetDef binfield_pygetset[] = {
+static PyObject *bfget_p(PyObject *me, void *hunoz)
+ { return (gf_pywrap(MP_COPY(FIELD_F(me)->m))); }
+
+static const PyGetSetDef binfield_pygetset[] = {
#define GETSETNAME(op, name) bf##op##_##name
GET (m, "F.m -> field polynomial degree")
+ GET (p, "F.p -> field polynomial")
#undef GETSETNAME
{ 0 }
};
-static PyTypeObject binfield_pytype_skel = {
- PyObject_HEAD_INIT(0) 0, /* Header */
- "catacomb.BinField", /* @tp_name@ */
+static const PyTypeObject binfield_pytype_skel = {
+ PyVarObject_HEAD_INIT(0, 0) /* Header */
+ "BinField", /* @tp_name@ */
sizeof(field_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */
0, /* @tp_iternext@ */
0, /* @tp_methods@ */
0, /* @tp_members@ */
- binfield_pygetset, /* @tp_getset@ */
+ PYGETSET(binfield), /* @tp_getset@ */
0, /* @tp_base@ */
0, /* @tp_dict@ */
0, /* @tp_descr_get@ */
{
mp *xx = 0;
field *f;
- char *kwlist[] = { "p", 0 };
+ static const char *const kwlist[] = { "p", 0 };
- if (!PyArg_ParseTupleAndKeywords(arg, kw, "O&:binpolyfield", kwlist,
+ if (!PyArg_ParseTupleAndKeywords(arg, kw, "O&:binpolyfield", KWLIST,
convgf, &xx))
goto end;
if ((f = field_binpoly(xx)) == 0) VALERR("bad poly for binpolyfield");
return (0);
}
-static PyGetSetDef binpolyfield_pygetset[] = {
-#define GETSETNAME(op, name) pf##op##_##name
- GET (p, "F.p -> field polynomial")
-#undef GETSETNAME
- { 0 }
-};
-
-static PyTypeObject binpolyfield_pytype_skel = {
- PyObject_HEAD_INIT(0) 0, /* Header */
- "catacomb.BinPolyField", /* @tp_name@ */
+static const PyTypeObject binpolyfield_pytype_skel = {
+ PyVarObject_HEAD_INIT(0, 0) /* Header */
+ "BinPolyField", /* @tp_name@ */
sizeof(field_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */
Py_TPFLAGS_BASETYPE,
/* @tp_doc@ */
- "Binary fields with polynomial basis representation.",
+ "BinPolyField(P): binary fields with polynomial basis representation.",
0, /* @tp_traverse@ */
0, /* @tp_clear@ */
0, /* @tp_iternext@ */
0, /* @tp_methods@ */
0, /* @tp_members@ */
- binpolyfield_pygetset, /* @tp_getset@ */
+ 0, /* @tp_getset@ */
0, /* @tp_base@ */
0, /* @tp_dict@ */
0, /* @tp_descr_get@ */
{
mp *xx = 0, *yy = 0;
field *f;
- char *kwlist[] = { "p", "beta", 0 };
+ static const char *const kwlist[] = { "p", "beta", 0 };
if (!PyArg_ParseTupleAndKeywords(arg, kw, "O&O&:binnormfield",
- kwlist, convgf, &xx, convgf, &yy))
+ KWLIST, convgf, &xx, convgf, &yy))
goto end;
if ((f = field_binnorm(xx, yy)) == 0) VALERR("bad args for binnormfield");
MP_DROP(xx); MP_DROP(yy);
return (gf_pywrap(MP_COPY(fc->ntop.r[fc->ntop.n - 1])));
}
-static PyGetSetDef binnormfield_pygetset[] = {
-#define GETSETNAME(op, name) pf##op##_##name
- GET (p, "F.p -> field polynomial")
-#undef GETSETNAME
+static const PyGetSetDef binnormfield_pygetset[] = {
#define GETSETNAME(op, name) bnf##op##_##name
GET (beta, "F.beta -> conversion factor")
#undef GETSETNAME
{ 0 }
};
-static PyTypeObject binnormfield_pytype_skel = {
- PyObject_HEAD_INIT(0) 0, /* Header */
- "catacomb.BinNormField", /* @tp_name@ */
+static const PyTypeObject binnormfield_pytype_skel = {
+ PyVarObject_HEAD_INIT(0, 0) /* Header */
+ "BinNormField", /* @tp_name@ */
sizeof(field_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */
Py_TPFLAGS_BASETYPE,
/* @tp_doc@ */
- "Binary fields with normal basis representation.",
+ "BinNormField(P, BETA): binary fields with normal basis representation.",
0, /* @tp_traverse@ */
0, /* @tp_clear@ */
0, /* @tp_iternext@ */
0, /* @tp_methods@ */
0, /* @tp_members@ */
- binnormfield_pygetset, /* @tp_getset@ */
+ PYGETSET(binnormfield), /* @tp_getset@ */
0, /* @tp_base@ */
0, /* @tp_dict@ */
0, /* @tp_descr_get@ */
/*----- Setup -------------------------------------------------------------*/
-static PyObject *meth__Field_parse(PyObject *me, PyObject *arg)
-{
- field *f;
- char *p;
- PyObject *rc = 0;
- qd_parse qd;
-
- if (!PyArg_ParseTuple(arg, "Os:parse", &me, &p))
- goto end;
- qd.p = p;
- qd.e = 0;
- if ((f = field_parse(&qd)) == 0)
- SYNERR(qd.e);
- rc = Py_BuildValue("(Ns)", field_pywrap(f), qd.p);
-end:
- return (rc);
-}
-
-static PyMethodDef methods[] = {
-#define METHNAME(func) meth_##func
- METH (_Field_parse, "parse(STR) -> F, REST")
-#undef METHNAME
+static const struct nameval consts[] = {
+ CONST(FTY_PRIME), CONST(FTY_BINARY),
{ 0 }
};
INITTYPE(binfield, field);
INITTYPE(binpolyfield, binfield);
INITTYPE(binnormfield, binfield);
- addmethods(methods);
}
void field_pyinsert(PyObject *mod)
INSERT("BinField", binfield_pytype);
INSERT("BinPolyField", binpolyfield_pytype);
INSERT("BinNormField", binnormfield_pytype);
+ setconstants(mod, consts);
}
/*----- That's all, folks -------------------------------------------------*/