Testing latest pari + WASM + node.js... and it works?! Wow.
License: GPL3
ubuntu2004
Function: bnfinit
Section: number_fields
C-Name: bnfinit0
Prototype: GD0,L,DGp
Help: bnfinit(P,{flag=0},{tech=[]}): compute the necessary data for future
use in ideal and unit group computations, including fundamental units if
they are not too large. flag and tech are both optional. flag can be any of
0: default, 1: include all data in algebraic form (compact units).
See manual for details about tech.
Description:
(gen):bnf:prec Buchall($1, 0, $prec)
(gen, 0):bnf:prec Buchall($1, 0, $prec)
(gen, 1):bnf:prec Buchall($1, nf_FORCE, $prec)
(gen, ?small, ?gen):bnf:prec bnfinit0($1, $2, $3, $prec)
Doc: initializes a
\kbd{bnf} structure. Used in programs such as \kbd{bnfisprincipal},
\kbd{bnfisunit} or \kbd{bnfnarrow}. By default, the results are conditional
on the GRH, see \ref{se:GRHbnf}. The result is a
10-component vector \var{bnf}.
This implements \idx{Buchmann}'s sub-exponential algorithm for computing the
class group, the regulator and a system of \idx{fundamental units} of the
general algebraic number field $K$ defined by the irreducible polynomial $P$
with integer coefficients. The meaning of \fl is as follows:
\item $\fl = 0$ (default). This is the historical behavior, kept for
compatibility reasons and speed. It has severe drawbacks but is likely to be
a little faster than the alternative, twice faster say, so only use it if
speed is paramount, you obtain a useful speed gain for the fields
under consideration, and you are only interested in the field invariants
such as the classgroup structure or its regulator. The computations involve
exact algebraic numbers which are replaced by floating point embeddings for
the sake of speed. If the precision is insufficient, \kbd{gp} may not be able
to compute fundamental units, nor to solve some discrete logarithm problems.
It \emph{may} be possible to increase the precision of the \kbd{bnf}
structure using \kbd{nfnewprec} but this may fail, in particular when
fundamental units are large. In short, the resulting \kbd{bnf}
structure is correct and contains useful information but later
function calls to \kbd{bnfisprincpal} or \kbd{bnrclassfield} may fail.
When $\fl=1$, we keep an exact algebraic version of all floating point data
and this allows to guarantee that functions using the structure will always
succeed, as well as to compute the fundamental units exactly. The units are
computed in compact form, as a product of small $S$-units, possibly with
huge exponents. This flag also allows \kbd{bnfisprincipal} to compute
generators of principal ideals in factored form as well. Be warned that
expanding such products explicitly can take a very long time, but they can
easily be mapped to floating point or $\ell$-adic embeddings of bounded
accuracy, or to $K^*/(K^*)^\ell$, and this is enough for applications. In
short, this flag should be used by default, unless you have a very good
reason for it, for instance building massive tables of class numbers, and
you do not care about units or the effect large units would have on your
computation.
$\var{tech}$ is a technical vector (empty by default, see \ref{se:GRHbnf}).
Careful use of this parameter may speed up your computations,
but it is mostly obsolete and you should leave it alone.
\smallskip
The components of a \var{bnf} are technical.
In fact: \emph{never access a component directly, always use
a proper member function.} However, for the sake of completeness and internal
documentation, their description is as follows. We use the notations
explained in the book by H. Cohen, \emph{A Course in Computational Algebraic
Number Theory}, Graduate Texts in Maths \key{138}, Springer-Verlag, 1993,
Section 6.5, and subsection 6.5.5 in particular.
$\var{bnf}[1]$ contains the matrix $W$, i.e.~the matrix in Hermite normal
form giving relations for the class group on prime ideal generators
$(\goth{p}_i)_{1\le i\le r}$.
$\var{bnf}[2]$ contains the matrix $B$, i.e.~the matrix containing the
expressions of the prime ideal factorbase in terms of the $\goth{p}_i$.
It is an $r\times c$ matrix.
$\var{bnf}[3]$ contains the complex logarithmic embeddings of the system of
fundamental units which has been found. It is an $(r_1+r_2)\times(r_1+r_2-1)$
matrix.
$\var{bnf}[4]$ contains the matrix $M''_C$ of Archimedean components of the
relations of the matrix $(W|B)$.
$\var{bnf}[5]$ contains the prime factor base, i.e.~the list of prime
ideals used in finding the relations.
$\var{bnf}[6]$ contains a dummy $0$.
$\var{bnf}[7]$ or \kbd{\var{bnf}.nf} is equal to the number field data
$\var{nf}$ as would be given by \kbd{nfinit}.
$\var{bnf}[8]$ is a vector containing the classgroup \kbd{\var{bnf}.clgp}
as a finite abelian group, the regulator \kbd{\var{bnf}.reg},
the number of roots of unity and a generator \kbd{\var{bnf}.tu}, the
fundamental units \emph{in expanded form} \kbd{\var{bnf}.fu}. If the
fundamental units were omitted in the \var{bnf}, \kbd{\var{bnf}.fu} returns
the sentinel value $0$. If $\fl = 1$, this vector contain also algebraic
data corresponding to the fundamental units and to the discrete logarithm
problem (see \kbd{bnfisprincipal}). In particular, if $\fl = 1$ we may
\emph{only} know the units in factored form: the first call to
\kbd{\var{bnf}.fu} expands them, which may be very costly, then caches the
result.
$\var{bnf}[9]$ is a vector used in \tet{bnfisprincipal} only
and obtained as follows. Let $D = U W V$ obtained by applying the
\idx{Smith normal form} algorithm to the matrix $W$ (= $\var{bnf}[1]$) and
let $U_r$ be the reduction of $U$ modulo $D$. The first elements of the
factorbase are given (in terms of \kbd{bnf.gen}) by the columns of $U_r$,
with Archimedean component $g_a$; let also $GD_a$ be the Archimedean
components of the generators of the (principal) ideals defined by the
\kbd{bnf.gen[i]\pow bnf.cyc[i]}. Then $\var{bnf}[9]=[U_r, g_a, GD_a]$,
followed by technical exact components which allow to recompute $g_a$ and
$GD_a$ to higher accuracy.
$\var{bnf}[10]$ is by default unused and set equal to 0. This field is used
to store further information about the field as it becomes available, which
is rarely needed, hence would be too expensive to compute during the initial
\kbd{bnfinit} call. For instance, the generators of the principal ideals
\kbd{bnf.gen[i]\pow bnf.cyc[i]} (during a call to \tet{bnrisprincipal}), or
those corresponding to the relations in $W$ and $B$ (when the \kbd{bnf}
internal precision needs to be increased).
Variant:
Also available is \fun{GEN}{Buchall}{GEN P, long flag, long prec},
corresponding to \kbd{tech = NULL}, where
\kbd{flag} is either $0$ (default) or \tet{nf_FORCE} (include all data in
algebraic form). The function
\fun{GEN}{Buchall_param}{GEN P, double c1, double c2, long nrpid, long flag, long prec} gives direct access to the technical parameters.