return ((PyObject *)z);
}
-static mp *tofe(field *f, PyObject *o)
+static mp *implicitfe(field *f, PyObject *o)
{
- mp *x = 0, *y = 0;
-
- if (FE_PYCHECK(o)) {
- if (FE_F(o) != f && !field_samep(FE_F(o), f)) return (0);
- y = MP_COPY(FE_X(o));
- } else if ((x = tomp(o)) != 0) {
- if (MP_ZEROP(x))
- y = MP_COPY(f->zero);
- else if (MP_EQ(x, MP_ONE))
- y = MP_COPY(f->one);
- else
- y = F_IN(f, MP_NEW, x);
- MP_DROP(x);
+ mp *x;
+
+ if (FE_PYCHECK(o) && FE_F(o) == f) return (MP_COPY(FE_X(o)));
+ switch (f->ops->ty) {
+ case FTY_PRIME: x = implicitmp(o); break;
+ case FTY_BINARY: x = implicitgf(o); break;
+ default: assert(!"huh?");
}
- return (y);
+ if (!x) return (0);
+ return (F_IN(f, MP_NEW, x));
}
/*----- Field elements ----------------------------------------------------*/
else if (FE_PYCHECK(y)) *fobj = FE_FOBJ(y);
else return (-1);
*f = FIELD_F(*fobj);
- if ((*xx = tofe(*f, x)) == 0)
+ if ((*xx = implicitfe(*f, x)) == 0)
return (-1);
- if ((*yy = tofe(*f, y)) == 0) {
+ if ((*yy = implicitfe(*f, y)) == 0) {
MP_DROP(*xx);
return (-1);
}
Py_INCREF(*x); Py_INCREF(*y);
return (0);
}
- if ((z = tofe(FE_F(*x), *y)) != 0) {
+ if ((z = implicitfe(FE_F(*x), *y)) != 0) {
Py_INCREF(*x);
*y = fe_pywrap(FE_FOBJ(*x), z);
return (0);
me.assertEqual(C.GF(7) + kk(3), C.GF(4))
me.assertEqual(kk(3) + C.GF(7), C.GF(4))
+ me.assertRaises(TypeError, T.add, k(3), 3.0)
me.assertRaises(TypeError, T.add, k(3), kk(3))
me.assertRaises(TypeError, T.add, kk(3), k(3))
+ me.assertRaises(TypeError, T.add, k(3), C.GF(7))
+ me.assertRaises(TypeError, T.add, C.GF(7), k(3))
+ me.assertRaises(TypeError, T.add, kk(3), 7.0)
+ me.assertRaises(TypeError, T.add, kk(3), C.MP(7))
+ me.assertRaises(TypeError, T.add, C.MP(7), kk(3))
###----- That's all, folks --------------------------------------------------