mp *(*in)(field */*f*/, mp */*d*/, mp */*x*/);
mp *(*out)(field */*f*/, mp */*d*/, mp */*x*/);
mp *(*in)(field */*f*/, mp */*d*/, mp */*x*/);
mp *(*out)(field */*f*/, mp */*d*/, mp */*x*/);
mp *(*add)(field */*f*/, mp */*d*/, mp */*x*/, mp */*y*/);
mp *(*sub)(field */*f*/, mp */*d*/, mp */*x*/, mp */*y*/);
mp *(*mul)(field */*f*/, mp */*d*/, mp */*x*/, mp */*y*/);
mp *(*add)(field */*f*/, mp */*d*/, mp */*x*/, mp */*y*/);
mp *(*sub)(field */*f*/, mp */*d*/, mp */*x*/, mp */*y*/);
mp *(*mul)(field */*f*/, mp */*d*/, mp */*x*/, mp */*y*/);
#define F_IN(f, d, x) (f)->ops->in((f), (d), (x))
#define F_OUT(f, d, x) (f)->ops->out((f), (d), (x))
#define F_IN(f, d, x) (f)->ops->in((f), (d), (x))
#define F_OUT(f, d, x) (f)->ops->out((f), (d), (x))
#define F_ADD(f, d, x, y) (f)->ops->add((f), (d), (x), (y))
#define F_SUB(f, d, x, y) (f)->ops->sub((f), (d), (x), (y))
#define F_MUL(f, d, x, y) (f)->ops->mul((f), (d), (x), (y))
#define F_ADD(f, d, x, y) (f)->ops->add((f), (d), (x), (y))
#define F_SUB(f, d, x, y) (f)->ops->sub((f), (d), (x), (y))
#define F_MUL(f, d, x, y) (f)->ops->mul((f), (d), (x), (y))
#define F_TPL(f, d, x) (f)->ops->tpl((f), (d), (x))
#define F_SQRT(f, d, x) (f)->ops->sqrt((f), (d), (x))
#define F_TPL(f, d, x) (f)->ops->tpl((f), (d), (x))
#define F_SQRT(f, d, x) (f)->ops->sqrt((f), (d), (x))
+/*----- Helpful field operations ------------------------------------------*/
+
+/* --- @field_id@ --- *
+ *
+ * Arguments: @field *f@ = pointer to a field
+ * @mp *d@ = a destination element
+ * @mp *x@ = a source element
+ *
+ * Returns: The result element.
+ *
+ * Use: An identity operation which can be used if your field has no
+ * internal representation.
+ */
+
+extern mp *field_id(field */*f*/, mp */*d*/, mp */*x*/);
+
/*----- Creating fields ---------------------------------------------------*/
/* --- @field_prime@ --- *
/*----- Creating fields ---------------------------------------------------*/
/* --- @field_prime@ --- *