
\Chapter{Methods for number fields}

An algebraic number field is a finite-dimensional extension of the
rational numbers $\Q$. Such a number field has a primitive element 
and it can be defined by the minimal polynomial of  this primitive
element. Another important way to define an algebraic number field
is by a set of rational matrices which generate a number field.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\Section{Creation of number fields}

We provide functions to create number fields defined by rational 
matrices or by rational polynomials.

\> FieldByMatricesNC( <matrices> )
\> FieldByMatrices( <matrices> )

Creates a field generated by the rational matrices <matrices>. In 
the faster NC version, the function assumes that the input generates 
a field and there are no checks on this performed. 

\> FieldByMatrixBasisNC( <matrices> )
\> FieldByMatrixBasis( <matrices> )

Creates a field with basis <matrices>. The list <matrices> must consist 
of rational matrices which form a basis for a number field. In the faster
NC version, the function assumes that the input is a matrix basis for a
field and no checks are performed.

\> FieldByPolynomialNC( <polynomial> )
\> FieldByPolynomial( <polynomial> )

Creates a field defined by <polynomial>. The polynomial <polynomial>
must be an irreducible rational polynomial. In the faster NC version,
no checks on the input are performed.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\Section{Methods for number fields}

We outline a number of functions for number fields.

\> PrimitiveElement( <F> )
\> DefiningPolynomial( <F> )

Computes a primitive element and a defining polynomial for the given number
field. The defining polynomial is the minimal polynomial of the primitive
element. Since <F> contains various primitive elements, 
`PrimitiveElement' tries to find a primitive element which has a
minimal polynomial with small coefficients. Via the global variable
<PRIM_TEST> the user can decide how many primitive elements will be
compared. The default value is 20.

\> IsPrimitiveElementOfNumberField( <F>, <a> )

Checks if the given element generates the field.

\> DegreeOverPrimeField( <F> )

Returns the degree of <F> over the rationals. 

\> EquationOrderBasis( <F> )
\> MaximalOrderBasis( <F> )
\> IsIntegerOfNumberField( <F>, <k> )

These functions return bases for the equation order or the maximal order
of the number field <F>. Also, they allow to check if a given element is
an integer in the given number field.

\> UnitGroup( <F> )

determines the unit group of <F>.

Recall that the unit group of <F> is a finitely generated abelian
group. The function `IsomorphismPcpGroup' from the {\Polycyclic}
\cite{Polycyclic} package gives an isomorphism to a pcp group which
can be used for various computations with the unit group. 

\> IsUnitOfNumberField( <F>, <k> )

checks whether the element <k> is a unit in <F>. 

\> ExponentsOfUnits( <F>, <elms> )

This function determines the exponent vectors of the elements in <elms>
with respect to the generators of the unit group of <F>. If the unit
group of <F> is not known, then the function computes this unit group also.

\> IsCyclotomicField( <F> )

Check whether <F> is cyclotomic.

\> NormCosetsOfNumberField( <F>, <norm> )

Returns a description for the set of all elements of norm <norm> in <F>. 
These elements can be written as a finite union of cosets of the unit
group of <F>. The function returns coset representatives for these cosets.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\Section{Presentations of multiplicative subgroups}

Suppose that a finite number of
invertible elements
of a number field are given. Then these elements generate a finitely
generated abelian group. However, it is a non-trivial task to provide
a presentation for this abelian group. The most useful representation
for such groups is as pcp group.

\> PcpPresentationOfMultiplicativeSubgroup( <F>, <elms> )
\> IsomorphismPcpGroup( <F>, <elms> )

Determine a pcp presentation for the multiplicative group of
$<F>\backslash\{0\}$ generated by
<elms> and an isomorphism on this presentation. 
Note, that the method `IsomorphismPcpGroup' is defined in the
{\Polycyclic} package \cite{Polycyclic}. We refer to the manual of this
package for further background. 

In the determination of the Pcp-presentation of a multiplicative
subgroup generated by <elms> the relations between the elements in
<elms> play an important role.
Let $elms=\{e_1,\dots,e_l\}$ be a finite subset of a field <F>.
The relation lattice for <elms> is 
$$
rl(elms):=\left\{(h_1,\dots,h_l) \in \Z^l | e_1^{h_1} \cdots
e_l^{h_l} = 1\right\} .
$$

\> RelationLattice( <F>, <elms> )

Determines a generating set 
for the relation lattice of the field elements <elms>.
 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\Section{Methods to compute with subgroups of the unit group}

\> RelationLatticeOfUnits( <F>, <elms> )

Determines a basis for the relation lattice of the units <elms> in 
triangularized form. Note that this method is more efficient than 
the method `RelationLattice'.

\> IntersectionOfUnitSubgroups( <F>, <gen1>, <gen2> )

The lists <gen1> and <gen2> are supposed to generate two subgroups 
$U_1$ and $U_2$ of the unit group of <F>. This function determines 
the intersection of $U_1$ with $U_2$. The result is returned as a 
list of vectors generating the lattice $\{ e \in \Z^n \mid g_1^{e_1} 
\cdots g_n^{e_n} \in U_2 \}$ for <gen1> = $[g_1, \ldots, g_n]$.

For efficiency reasons this function does not check the input and it 
may return wrong results if the input generators do not fulfil the 
requirements.


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\Section{Factorisation of polynomials over a number field}

\> FactorsPolynomialAlgExt( <F>, <pol> )

embeds the rational polynomial <pol> into the polynomial ring over the
number field <F>, which has to be constructed by `FieldByPolynomial'
or `AlgebraicExtension', and returns the factorization of the embedded
polynomial.  By default <a> denotes the primitive element of the field
one can obtain from `PrimitiveElement(<F>)', that is, a root of the
defining polynomial of <F>. 

\> FactorsPolynomialPari( <pol> )

takes a polynomial <pol> defined over an algebraic extension of the
Rationals and factors it using PARI/GP.

\beginexample
gap> x := Indeterminate( Rationals, "x" );;
gap> pol := 2*x^7+2*x^5+8*x^4+8*x^2;
2*x^7+2*x^5+8*x^4+8*x^2
gap> L := FieldByPolynomial( x^3-4 );
<algebraic extension over the Rationals of degree 3>
gap> y := Indeterminate( L, "y" );;
gap> FactorsPolynomialAlgExt( L, pol );
[ !2*y, y, y+(a), y^2+!1, y^2+((-1*a))*y+(a^2) ]
gap> FactorsPolynomialPari( last[5] );
[ y^2+((-1*a))*y+(a^2) ]
gap>
\endexample

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\Section{Examples}

\> ExampleMatField( <l> )

This function returns some examples of fields generated by matrices. 
There are 9 such example fields provided and they can be obtained by
assigning the input <l> to an integer between 1 and 9. Some of the
properties of the examples are summarized in the following table.

\beginexample
                    degree over Q  number of generators  dim. of generators
ExampleMatField(1)              4                     4                   4
ExampleMatField(2)              4                     4                   4
ExampleMatField(3)              4                     4                   4
ExampleMatField(4)              4                    13                   4
ExampleMatField(5)              4                    13                   4
ExampleMatField(6)              4                     7                   4
ExampleMatField(7)              4                    18                   4
ExampleMatField(8)              4                    13                   4
ExampleMatField(9)              4                     7                   4
\endexample







