Tour of the C Interface

Contents

Tour of the C Interface#

There are two main objects in e-antic: number fields, which are represented by a renf_t, and their elements, represented by a renf_elem_t. Functions that operate on number fields are defined in the header e-antic/renf.h and have the prefix renf_. Functions that operate on elements of number fields are defined in the header e-antic/renf_elem.h and have the prefix renf_elem_.

To work with e-antic, you first need to create a number field. Typically, you will use the function renf_init() to create a number field from its defining rational polynomial as a FLINT fmpq_poly_t and an approximation of one of its real roots as an arb_t.

Once a renf_t has been initialized, its elements can be created with renf_elem_init(). Eventually, use renf_elem_clear() to free the memory taken by these elements, and use renf_clear() to free the memory taken by the number field itself.

Example#

We want to construct a totally real field with minimal polynomial \(x^3 - 3x + 1\), represented by an fmpq_poly_t. We include the appropriate headers and define the polynomial:

#include <e-antic/fmpq_poly_extra.h>

fmpq_poly_t poly;
fmpq_poly_init(poly);
fmpq_poly_set_str_pretty(poly, "a^3 - 3*a + 1", "a");

We fix one of its roots, which is approximately 0.34:

#include <flint/flint.h>
#if __FLINT_RELEASE < 30000
#include <arb.h>
#else
#include <flint/arb.h>
#endif

arb_t emb;
arb_init(emb);
arb_set_str(emb, "0.34 +/- 0.01", 32);

We construct the embedded number field and let \(a\) be its generator:

#include <e-antic/renf.h>
#include <e-antic/renf_elem.h>

renf_t nf;
renf_elem_t a, b;

renf_init(nf, poly, emb, 64);

renf_elem_init(a, nf);
renf_elem_gen(a, nf);

We deallocate the embedding and the defining polynomial, as we will no longer need them:

fmpq_poly_clear(poly);
arb_clear(emb);

We compute \(b = a^2 - 2\) and print its value:

renf_elem_init(b, nf);

renf_elem_mul(b, a, a, nf);
renf_elem_sub_ui(b, b, 2, nf);

renf_elem_print_pretty(b, "a", nf, 32, EANTIC_STR_ALG);
// -> a^2 - 2

Finally, we deallocate the number field and its elements:

renf_elem_clear(a, nf);
renf_elem_clear(b, nf);
renf_clear(nf);

Note#

The same example is also explained in detail in the documentation of the C++ interface.