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,
}
static long fe_pyhash(PyObject *me)
-{
- size_t sz = FE_F(me)->noctets;
- uint32 h = 0xe0c127ca + FE_F(me)->ops->ty;
- octet *p = xmalloc(sz);
- mp_storeb(FE_X(me), p, sz);
- h = unihash_hash(&unihash_global, h, p, sz);
- xfree(p);
- return (h % LONG_MAX);
-}
+ { return (mphash(FE_X(me))); }
static int fe_pycoerce(PyObject **x, PyObject **y)
{
#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); \
}
static 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 }
};
Py_TPFLAGS_BASETYPE,
/* @tp_doc@ */
-"Finite field elements, abstract base class.",
+ "Finite field elements, abstract base class.",
0, /* @tp_traverse@ */
0, /* @tp_clear@ */
static 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")
#undef METHNAME
{ 0 }
};
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@ */
Py_TPFLAGS_BASETYPE,
/* @tp_doc@ */
-"PrimeField(P): prime fields.",
+ "PrimeField(P): prime fields.",
0, /* @tp_traverse@ */
0, /* @tp_clear@ */
Py_TPFLAGS_BASETYPE,
/* @tp_doc@ */
-"NicePrimeField(P): prime field using Solinas reduction.",
+ "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 PyObject *bfget_p(PyObject *me, void *hunoz)
+ { return (gf_pywrap(MP_COPY(FIELD_F(me)->m))); }
+
static 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 }
};
Py_TPFLAGS_BASETYPE,
/* @tp_doc@ */
-"Binary fields. Abstract class.",
+ "Binary fields. Abstract class.",
0, /* @tp_traverse@ */
0, /* @tp_clear@ */
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 */
"BinPolyField", /* @tp_name@ */
Py_TPFLAGS_BASETYPE,
/* @tp_doc@ */
-"BinPolyField(P): 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@ */
}
static PyGetSetDef binnormfield_pygetset[] = {
-#define GETSETNAME(op, name) pf##op##_##name
- GET (p, "F.p -> field polynomial")
-#undef GETSETNAME
#define GETSETNAME(op, name) bnf##op##_##name
GET (beta, "F.beta -> conversion factor")
#undef GETSETNAME
Py_TPFLAGS_BASETYPE,
/* @tp_doc@ */
-"BinNormField(P, BETA): binary fields with normal basis representation.",
+ "BinNormField(P, BETA): binary fields with normal basis representation.",
0, /* @tp_traverse@ */
0, /* @tp_clear@ */
static PyMethodDef methods[] = {
#define METHNAME(func) meth_##func
- METH (_Field_parse, "parse(STR) -> F, REST")
+ METH (_Field_parse, "parse(STR) -> F, REST")
#undef METHNAME
{ 0 }
};