Merge branch '1.3.x'
[catacomb-python] / field.c
diff --git a/field.c b/field.c
index b78c166..417c550 100644 (file)
--- a/field.c
+++ b/field.c
@@ -126,16 +126,6 @@ static mp *tofe(field *f, PyObject *o)
   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,
@@ -229,15 +219,7 @@ end:
 }
 
 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)
 {
@@ -282,7 +264,7 @@ 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);                                                       \
   }
@@ -345,8 +327,8 @@ static PyObject *feget__value(PyObject *me, void *hunoz)
 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 }
 };
@@ -533,7 +515,7 @@ static PyGetSetDef field_pygetset[] = {
 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 }
 };
@@ -809,8 +791,11 @@ end:
   return (0);
 }
 
+static PyObject *bfget_p(PyObject *me, void *hunoz)
+  { return (gf_pywrap(MP_COPY(FIELD_F(me)->m))); }
+
 static PyGetSetDef binpolyfield_pygetset[] = {
-#define GETSETNAME(op, name) pf##op##_##name
+#define GETSETNAME(op, name) bf##op##_##name
   GET  (p,             "F.p -> field polynomial")
 #undef GETSETNAME
   { 0 }
@@ -889,7 +874,7 @@ static PyObject *bnfget_beta(PyObject *me, void *hunoz)
 }
 
 static PyGetSetDef binnormfield_pygetset[] = {
-#define GETSETNAME(op, name) pf##op##_##name
+#define GETSETNAME(op, name) bf##op##_##name
   GET  (p,             "F.p -> field polynomial")
 #undef GETSETNAME
 #define GETSETNAME(op, name) bnf##op##_##name