Testing latest pari + WASM + node.js... and it works?! Wow.
License: GPL3
ubuntu2004
% Copyright (c) 2000 The PARI Group1%2% This file is part of the PARI/GP documentation3%4% Permission is granted to copy, distribute and/or modify this document5% under the terms of the GNU General Public License6\newpage7\chapter{Algebraic Number Theory}89\section{General Number Fields}1011\subsec{Number field types}1213None of the following routines thoroughly check their input: they14distinguish between \emph{bona fide} structures as output by PARI routines,15but designing perverse data will easily fool them. To give an example, a16square matrix will be interpreted as an ideal even though the $\Z$-module17generated by its columns may not be an $\Z_K$-module (i.e. the expensive18\kbd{nfisideal} routine will \emph{not} be called).1920\fun{long}{nftyp}{GEN x}. Returns the type of number field structure stored in21\kbd{x}, \tet{typ_NF}, \tet{typ_BNF}, or \tet{typ_BNR}. Other answers22are possible, meaning \kbd{x} is not a number field structure.2324\fun{GEN}{get_nf}{GEN x, long *t}. Extract an \var{nf} structure from25\kbd{x} if possible and return it, otherwise return \kbd{NULL}. Sets26\kbd{t} to the \kbd{nftyp} of \kbd{x} in any case.2728\fun{GEN}{get_bnf}{GEN x, long *t}. Extract a \kbd{bnf} structure from29\kbd{x} if possible and return it, otherwise return \kbd{NULL}. Sets30\kbd{t} to the \kbd{nftyp} of \kbd{x} in any case.3132\fun{GEN}{get_nfpol}{GEN x, GEN *nf} try to extract an \var{nf} structure33from \kbd{x}, and sets \kbd{*nf} to \kbd{NULL} (failure) or to the \var{nf}.34Returns the (monic, integral) polynomial defining the field.3536\fun{GEN}{get_bnfpol}{GEN x, GEN *bnf, GEN *nf} try to extract a \var{bnf}37and an \var{nf} structure from \kbd{x}, and sets \kbd{*bnf}38and \kbd{*nf} to \kbd{NULL} (failure) or to the corresponding structure.39Returns the (monic, integral) polynomial defining the field.4041\fun{GEN}{checknf}{GEN x} if an \var{nf} structure can be extracted from42\kbd{x}, return it; otherwise raise an exception. The more general43\kbd{get\_nf} is often more flexible.4445\fun{GEN}{checkbnf}{GEN x} if an \var{bnf} structure can be extracted from46\kbd{x}, return it; otherwise raise an exception. The more general47\kbd{get\_bnf} is often more flexible.4849\fun{GEN}{checkbnf_i}{GEN bnf} same as \kbd{checkbnf} but return \kbd{NULL}50instead of raising an exception.5152\fun{void}{checkbnr}{GEN bnr} Raise an exception if the argument53is not a \var{bnr} structure.5455\fun{GEN}{checkbnr_i}{GEN bnr} same as \kbd{checkbnr} but returns the56\var{bnr} or \kbd{NULL} instead of raising an exception.5758\fun{GEN}{checknf_i}{GEN nf} same as \kbd{checknf} but return \kbd{NULL}59instead of raising an exception.6061\fun{void}{checkrnf}{GEN rnf} Raise an exception if the argument is not an62\var{rnf} structure.6364\fun{int}{checkrnf_i}{GEN rnf} same as \kbd{checkrnf} but return $0$65on failure and $1$ on success.6667\fun{void}{checkbid}{GEN bid} Raise an exception if the argument is not a68\var{bid} structure.6970\fun{GEN}{checkbid_i}{GEN bid} same as \kbd{checkbid} but return \kbd{NULL}71instead of raising an exception and return \kbd{bid} on success.7273\fun{GEN}{checkznstar_i}{GEN G} return $G$ if it is a \var{znstar};74else return \kbd{NULL} on failure.7576\fun{GEN}{checkgal}{GEN x} if a \var{galoisinit} structure can be extracted77from \kbd{x}, return it; otherwise raise an exception.7879\fun{void}{checksqmat}{GEN x, long N} check whether \kbd{x} is a square matrix80of dimension \kbd{N}. May be used to check for ideals if \kbd{N} is the field81degree.8283\fun{void}{checkprid}{GEN pr} Raise an exception if the argument is not a84prime ideal structure.8586\fun{int}{checkprid_i}{GEN pr} same as \kbd{checkprid} but return $0$87instead of raising an exception and return $1$ on success.8889\fun{int}{is_nf_factor}{GEN F} return $1$ if $F$ is an ideal factorization90and $0$ otherwise.9192\fun{int}{is_nf_extfactor}{GEN F} return $1$ if $F$ is an extended ideal93factorization (allowing $0$ or negative exponents) and $0$ otherwise.9495\fun{GEN}{get_prid}{GEN ideal} return the underlying prime ideal structure96if one can be extracted from \kbd{ideal} (ideal or extended ideal), and97return \kbd{NULL} otherwise.9899\fun{void}{checkabgrp}{GEN v} Raise an exception if the argument100is not an abelian group structure, i.e. a \typ{VEC} with either $2$ or $3$101entries: $[N,\var{cyc}]$ or $[N,\var{cyc}, \var{gen}]$.102103\fun{GEN}{abgrp_get_no}{GEN x}104extract the cardinality $N$ from an abelian group structure.105106\fun{GEN}{abgrp_get_cyc}{GEN x}107extract the elementary divisors \var{cyc} from an abelian group structure.108109\fun{GEN}{abgrp_get_gen}{GEN x}110extract the generators \var{gen} from an abelian group structure.111112\fun{GEN}{cyc_get_expo}{GEN cyc}113return the exponent of the group with structure \kbd{cyc}; $0$ for an infinite114group.115116\fun{void}{checkmodpr}{GEN modpr} Raise an exception if the argument is not a117\kbd{modpr} structure (from \kbd{nfmodprinit}).118119\fun{GEN}{get_modpr}{GEN x} return $x$ if it is a \kbd{modpr} structure120and \kbd{NULL} otherwise.121122\fun{GEN}{checknfelt_mod}{GEN nf, GEN x, const char *s} given an \var{nf}123structure \kbd{nf} and a \typ{POLMOD} \kbd{x}, return the attached124polynomial representative (shallow) if \kbd{x} and \kbd{nf} are compatible.125Raise an exception otherwise. Set $s$ to the name of the caller for a126meaningful error message.127128\fun{void}{check_ZKmodule}{GEN x, const char *s} check whether $x$ looks like129$\Z_K$-module (a pair $[A,I]$, where $A$ is a matrix and $I$ is a list of130ideals; $A$ has as many columns as $I$ has elements. Otherwise131raises an exception. Set $s$ to the name of the caller for a132meaningful error message.133134\fun{long}{idealtyp}{GEN *ideal, GEN *fa} The input is \kbd{ideal}, a pointer135to an ideal (or extended ideal), which is usually modified, \kbd{fa} being136set as a side-effect. Returns the type of the underlying ideal among137\tet{id_PRINCIPAL} (a number field element), \tet{id_PRIME} (a prime ideal)138\tet{id_MAT} (an ideal in matrix form).139140If \kbd{ideal} pointed to an ideal, set \kbd{fa} to \kbd{NULL}, and141possibly simplify \kbd{ideal} (for instance the zero ideal is replaced by142\kbd{gen\_0}). If it pointed to an extended ideal, replace143\kbd{ideal} by the underlying ideal and set \kbd{fa} to the factorization144matrix component.145146\subsec{Extracting info from a \kbd{nf} structure}147148These functions expect a true \var{nf} argument attached to a number field149$K = \Q[x]/(T)$, e.g.~a \var{bnf} will not work. Let $n = [K:\Q]$ be the150field degree.151152\fun{GEN}{nf_get_pol}{GEN nf} returns the polynomial $T$ (monic, in $\Z[x]$).153154\fun{long}{nf_get_varn}{GEN nf} returns the variable number of the number155field defining polynomial.156157\fun{long}{nf_get_r1}{GEN nf} returns the number of real places $r_1$.158159\fun{long}{nf_get_r2}{GEN nf} returns the number of complex places $r_2$.160161\fun{void}{nf_get_sign}{GEN nf, long *r1, long *r2} sets $r_1$ and $r_2$162to the number of real and complex places respectively. Note that163$r_1+2r_2$ is the field degree.164165\fun{long}{nf_get_degree}{GEN nf} returns the number field degree, $n = r_1 +1662r_2$.167168\fun{GEN}{nf_get_disc}{GEN nf} returns the field discriminant.169170\fun{GEN}{nf_get_index}{GEN nf} returns the index of $T$, i.e. the index of171the order generated by the power basis $(1,x,\ldots,x^{n-1})$ in the172maximal order of $K$.173174\fun{GEN}{nf_get_zk}{GEN nf} returns a basis $(w_1,w_2,\ldots,w_n)$ for the175maximal order of $K$. Those are polynomials in $\Q[x]$ of degree $<n$; it is176guaranteed that $w_1 = 1$.177178\fun{GEN}{nf_get_zkden}{GEN nf} returns the denominator of \tet{nf_get_zk},179as a positive \typ{INT}.180181\fun{GEN}{nf_get_zkprimpart}{GEN nf} returns \tet{nf_get_zk} times its182denominator.183184\fun{GEN}{nf_get_invzk}{GEN nf} returns the matrix $(m_{i,j})\in M_n(\Z)$185giving the power basis $(x^i)$ in terms of the $(w_j)$, i.e such that186$x^{j-1} = \sum_{i = 1}^n m_{i,j} w_i$ for all $1\leq j \leq n$; since $w_1 =1871 = x^0$, we have $m_{i,1} = \delta_{i,1}$ for all $i$. The conversion188functions in the \kbd{algtobasis} family essentially amount to a left189multiplication by this matrix.190191\fun{GEN}{nf_get_roots}{GEN nf} returns the $r_1$ real roots of the polynomial192defining the number fields: first the $r_1$ real roots (as \typ{REAL}s), then193the $r_2$ representatives of the pairs of complex conjugates.194195\fun{GEN}{nf_get_allroots}{GEN nf} returns all the complex roots of $T$:196first the $r_1$ real roots (as \typ{REAL}s), then the $r_2$ pairs of complex197conjugates.198199\fun{GEN}{nf_get_M}{GEN nf} returns the $(r_1+r_2)\times n$ matrix $M$200giving the embeddings of $K$: $M[i,j]$ contains $w_j(\alpha_i)$, where201$\alpha_i$ is the $i$-th element of \kbd{nf\_get\_roots(nf)}. In particular,202if $v$ is an $n$-th dimensional \typ{COL} representing the element203$\sum_{i=1}^n v[i] w_i$ of $K$, then \kbd{RgM\_RgC\_mul(M,v)} represents the204embeddings of $v$.205206\fun{GEN}{nf_get_G}{GEN nf} returns a $n\times n$ real matrix $G$ such that207$Gv \cdot Gv = T_2(v)$, where $v$ is an $n$-th dimensional \typ{COL}208representing the element $\sum_{i=1}^n v[i] w_i$ of $K$ and $T_2$ is the209standard Euclidean form on $K\otimes \R$, i.e.~$T_2(v)210= \sum_{\sigma} |\sigma(v)|^2$, where $\sigma$ runs through all $n$ complex211embeddings of $K$.212213\fun{GEN}{nf_get_roundG}{GEN nf} returns a rescaled version of $G$, rounded214to nearest integers, specifically \tet{RM_round_maxrank}$(G)$.215216\fun{GEN}{nf_get_ramified_primes}{GEN nf} returns the vector of ramified217primes.218219\fun{GEN}{nf_get_Tr}{GEN nf} returns the matrix of the Trace quadratic form220on the basis $(w_1,\ldots,w_n)$: its $(i,j)$ entry is $\text{Tr} w_i w_j$.221222\fun{GEN}{nf_get_diff}{GEN nf} returns the primitive part of the inverse of223the above Trace matrix.224225\fun{long}{nf_get_prec}{GEN nf} returns the precision (in words) to which the226\var{nf} was computed.227228\subsec{Extracting info from a \kbd{bnf} structure}229230These functions expect a true \var{bnf} argument, e.g.~a \var{bnr} will not231work.232233\fun{GEN}{bnf_get_nf}{GEN bnf} returns the underlying \var{nf}.234235\fun{GEN}{bnf_get_clgp}{GEN bnf} returns the class group in \var{bnf},236which is a $3$-component vector $[h, \var{cyc}, \var{gen}]$.237238\fun{GEN}{bnf_get_cyc}{GEN bnf} returns the elementary divisors239of the class group (cyclic components) $[d_1,\ldots, d_k]$, where240$d_k \mid \ldots \mid d_1$.241242\fun{GEN}{bnf_get_gen}{GEN bnf} returns the generators $[g_1,\ldots,g_k]$243of the class group. Each $g_i$ has order $d_i$, and the full module of relations244between the $g_i$ is generated by the $d_ig_i = 0$.245246\fun{GEN}{bnf_get_no}{GEN bnf} returns the class number.247248\fun{GEN}{bnf_get_reg}{GEN bnf} returns the regulator.249250\fun{GEN}{bnf_get_logfu}{GEN bnf} returns (complex floating point251approximations to) the logarithms of the complex embeddings of our system of252fundamental units.253254\fun{GEN}{bnf_get_fu}{GEN bnf} returns the fundamental units. Raise255an error if the \var{bnf} does not contain units in algebraic form.256257\fun{GEN}{bnf_get_fu_nocheck}{GEN bnf} as \tet{bnf_get_fu} without258checking whether units are present. Do not use this unless259you initialize the \var{bnf} yourself!260261\fun{GEN}{bnf_get_tuU}{GEN bnf} returns a generator of the torsion part262of $\Z_K^*$.263264\fun{long}{bnf_get_tuN}{GEN bnf} returns the order of the torsion part of265$\Z_K^*$, i.e.~the number of roots of unity in $K$.266267\fun{GEN}{bnf_get_sunits}{GEN bnf} allows access to the algebraic data268stored by \kbd{bnfinit(,1)}. It returns \kbd{NULL} unless the \kbd{bnf}269was initialized by \kbd{bnfinit(,1)}, else a vector $[X,U,E,\kbd{lim}]$ where270271\item $X$ is a vector of rational primes and algebraic integers all of whose272prime divisors have norm less than \kbd{lim},273274\item $U$ is a matrix of exponents whose columns yield the fundamental units275\kbd{bnf.fu}. More precisely,276$$\kbd{bnf.fu}[j] = \prod_i X[i]^{U[i,j]}.$$277278\item $G$ is a matrix of exponents whose columns yield the generators279of principal ideals attached to the HNF of the \kbd{bnf} relation matrix280between the maximal ideals of norm less \kbd{lim} (that generate the class281group under GRH). More precisely, \kbd{bnf[5]} contains the prime factor282base $P$ (its first $r$ elements being independant class group generators),283\kbd{bnf[1]} contains a matrix $W$ in HNF in $M_r(\Z)$ and284\kbd{bnf[2]}, contains a matrix $B$ in $M_{r \times c}(\Z)$. We define285algebraic numbers $e_j$ for $j \leq r+c$ such that286287$$\kbd{\prod_{i \leq r} P_i^{W[i,j]}} = (e_j),\quad j \leq r$$288289$$ P_j \kbd{\prod_{i \leq r} P_i^{B[i,j]}} = (e_j), j > r$$290291\noindent Then $e_j = \prod_i X[i]^{E[i,j]}$.292293\fun{GEN}{bnf_has_fu}{GEN bnf} return fundamental units in expanded form if294\kbd{bnf} contains them. Else return \kbd{NULL}.295296\fun{GEN}{bnf_compactfu}{GEN bnf} return fundamental units as a vector297of algebraic numbers in compact form if \kbd{bnf} contains them. Else return298\kbd{NULL}.299300\fun{GEN}{bnf_compactfu_mat}{GEN bnf} as a pair $(X,U)$, where $X$ is a301vector of $S$-units and $U$ is a matrix with integer entries (without $0$302rows), see \kbd{bnf\_get\_sunits}, if \kbd{bnf} contains them. Else return303\kbd{NULL}.304305\subsec{Extracting info from a \kbd{bnr} structure}306307These functions expect a true \var{bnr} argument.308309\fun{GEN}{bnr_get_bnf}{GEN bnr} returns the underlying \var{bnf}.310311\fun{GEN}{bnr_get_nf}{GEN bnr} returns the underlying \var{nf}.312313\fun{GEN}{bnr_get_clgp}{GEN bnr} returns the ray class group.314315\fun{GEN}{bnr_get_no}{GEN bnr} returns the ray class number.316317\fun{GEN}{bnr_get_cyc}{GEN bnr} returns the elementary divisors318of the ray class group (cyclic components) $[d_1,\ldots, d_k]$, where319$d_k \mid \ldots \mid d_1$.320321\fun{GEN}{bnr_get_gen}{GEN bnr} returns the generators $[g_1,\ldots,g_k]$ of322the ray class group. Each $g_i$ has order $d_i$, and the full module of323relations between the $g_i$ is generated by the $d_ig_i = 0$. Raise324a generic error if the \var{bnr} does not contain the ray class group325generators.326327\fun{GEN}{bnr_get_gen_nocheck}{GEN bnr} as \tet{bnr_get_gen} without328checking whether generators are present. Do not use this unless329you initialize the \var{bnr} yourself!330331\fun{GEN}{bnr_get_bid}{GEN bnr} returns the \var{bid} attached332to the \var{bnr} modulus.333334\fun{GEN}{bnr_get_mod}{GEN bnr} returns the modulus attached335to the \var{bnr}.336337\subsec{Extracting info from an \kbd{rnf} structure}338339These functions expect a true \var{rnf} argument, attached to an extension340$L/K$, $K = \Q[y]/(T)$, $L = K[x]/(P)$.341342\fun{long}{rnf_get_degree}{GEN rnf} returns the \emph{relative} degree343$[L:K]$.344345\fun{long}{rnf_get_absdegree}{GEN rnf} returns the absolute degree346$[L:\Q]$.347348\fun{long}{rnf_get_nfdegree}{GEN rnf} returns the degree of the base349field $[K:\Q]$.350351\fun{GEN}{rnf_get_nf}{GEN rnf} returns the base field $K$, an \var{nf}352structure.353354\fun{GEN}{rnf_get_nfpol}{GEN rnf} returns the polynomial $T$ defining the355base field $K$.356357\fun{long}{rnf_get_nfvarn}{GEN rnf} returns the variable $y$ attached to the358base field $K$.359360\fun{GEN}{rnf_get_nfzk}{GEN rnf} returns the integer basis361of the base field $K$.362363\fun{GEN}{rnf_get_pol}{GEN rnf} returns the relative polynomial defining364$L/K$.365366\fun{long}{rnf_get_varn}{GEN rnf} returns the variable $x$ attached to $L$.367368\fun{GEN}{rnf_get_zk}{GEN nf} returns the relative integer basis generating369$\Z_L$ as a $\Z_K$-module, as a pseudo-matrix $(A,I)$ in HNF.370371\fun{GEN}{rnf_get_disc}{GEN rnf} is the output $[\goth{d}, s]$372of \kbd{rnfdisc}.373374\fun{GEN}{rnf_get_ramified_primes}{GEN rnf} returns the vector of rational375primes below ramified primes in the relative extension, i.e. all prime376numbers appearing in the factorization of377\bprog378idealnorm(rnf_get_nf(rnf), rnf_get_disc(rnf));379@eprog380381\fun{GEN}{rnf_get_idealdisc}{GEN rnf} is the ideal discriminant $\goth{d}$382from \kbd{rnfdisc}.383384\fun{GEN}{rnf_get_index}{GEN rnf} is the index ideal $\goth{f}$385386\fun{GEN}{rnf_get_polabs}{GEN rnf} returns an absolute polynomial defining387$L/\Q$.388389\fun{GEN}{rnf_get_alpha}{GEN rnf} a root $\alpha$ of the polynomial390defining the base field, modulo \kbd{polabs} (cf.~\kbd{rnfequation})391392\fun{GEN}{rnf_get_k}{GEN rnf}393a small integer $k$ such that $\theta = \beta + k\alpha$ is a root of394\kbd{polabs}, where $\beta$ is a root of \kbd{pol}395and $\alpha$ a root of the polynomial defining the base field,396as in \tet{rnf_get_alpha} (cf.~also \kbd{rnfequation}).397398\fun{GEN}{rnf_get_invzk}{GEN rnf} contains $A^{-1}$, where $(A,I)$399is the chosen pseudo-basis for $\Z_L$ over $\Z_K$.400401\fun{GEN}{rnf_get_map}{GEN rnf} returns technical data attached to the map402$K\to L$. Currently, this contains data from \kbd{rnfequation},403as well as the polynomials $T$ and $P$.404405\subsec{Extracting info from a \kbd{bid} structure}406407These functions expect a true \var{bid} argument, attached to a modulus $I408= I_0 I_\infty$ in a number field $K$.409410\fun{GEN}{bid_get_mod}{GEN bid} returns the modulus attached to the \var{bid}.411412\fun{GEN}{bid_get_grp}{GEN bid} returns the Abelian group attached413to $(\Z_K/I)^*$.414415\fun{GEN}{bid_get_ideal}{GEN bid} return the finite part $I_0$416of the \var{bid} modulus (an integer ideal).417418\fun{GEN}{bid_get_arch}{GEN bid} return the Archimedean part $I_\infty$419of the \var{bid} modulus as a vector of real places in vec01 format,420see~\secref{se:signatures}.421422\fun{GEN}{bid_get_archp}{GEN bid} return the Archimedean part $I_\infty$423of the \var{bid} modulus, as a vector of real places in indices format424see~\secref{se:signatures}.425426\fun{GEN}{bid_get_fact}{GEN bid} returns the ideal factorization427$I_0 = \prod_i \goth{p}_i^{e_i}$.428429\fun{GEN}{bid_get_fact2}{GEN bid} as \kbd{bid\_get\_fact} with all factors430$\goth{p}^1$ with $\goth{p}$ of norm $2$ removed from the factorization.431(They play no role in the structure of $(\Z_K/I)^*$, except that the432generators must be made coprime to them.)433434\tet{bid_get_ideal}$(\var{bid})$, via \kbd{idealfactor}.435436\fun{GEN}{bid_get_no}{GEN bid} returns the cardinality of the437group $(\Z_K/I)^*$.438439\fun{GEN}{bid_get_cyc}{GEN bid} returns the elementary divisors440of the group $(\Z_K/I)^*$ (cyclic components) $[d_1,\ldots, d_k]$, where $d_k441\mid \ldots \mid d_1$.442443\fun{GEN}{bid_get_gen}{GEN bid} returns the generators of $(\Z_K/I)^*$444contained in \var{bid}. Raise a generic error if \var{bid} does not contain445generators.446447\fun{GEN}{bid_get_gen_nocheck}{GEN bid} as \tet{bid_get_gen} without448checking whether generators are present. Do not use this unless449you initialize the \var{bid} yourself!450451\fun{GEN}{bid_get_sprk}{GEN bid} return a list of structures attached to the452$(\Z_K/\goth{p}^e)^*$ where $\goth{p}^e$ divides $I_0$ exactly.453454\fun{GEN}{bid_get_sarch}{GEN bid} return the structure attached455to $(\Z_K/I_\infty)^*$, by \kbd{nfarchstar}.456457\fun{GEN}{bid_get_U}{GEN bid} return the matrix with integral coefficients458relating the local generators (from chinese remainders) to the global459SNF generators (\kbd{\var{bid}.gen}).460461\subsec{Extracting info from a \kbd{znstar} structure}462463These functions expect an argument $G$ as returned by \kbd{znstar0(N, 1)},464attached to a positive $N$ and the abelian group $(\Z/N\Z)^*$.465Let $(g_i)$ be the SNF generators, where $g_i$ has order $d_i$;466we call $(g'_i)$ the (canonical) Conrey generators, where $g'_i$ has order467$d'_i$. Both sets of generators have the same cardinality.468469\fun{GEN}{znstar_get_N}{GEN bid} return $N$.470471\fun{GEN}{znstar_get_faN}{GEN G} return the factorization \kbd{factor}$(N)$,472$N = \prod_j p_j^{e_j}$.473474\fun{GEN}{znstar_get_pe}{GEN G} return the vector of primary factors475$(p_j^{e_j})$.476477\fun{GEN}{znstar_get_no}{GEN G} the cardinality $\phi(N)$ of $G$.478479\fun{GEN}{znstar_get_cyc}{GEN G} elementary divisors $(d_i)$ of $(\Z/N\Z)^*$.480481\fun{GEN}{znstar_get_gen}{GEN G} SNF generators divisors $(g_i)$482of $(\Z/N\Z)^*$.483484\fun{GEN}{znstar_get_conreycyc}{GEN G} orders $(d'_i)$ of Conrey generators.485486\fun{GEN}{znstar_get_conreygen}{GEN G} Conrey generators $(g'_i)$.487488\fun{GEN}{znstar_get_U}{GEN G} a square matrix $U$ such that489$(g_i) = U(g'_i)$.490491\fun{GEN}{znstar_get_Ui}{GEN G} a square matrix $U'$ such that492$U'(g_i) = (g'_i)$. In general, $UU'$ will not be the identity.493494\subsec{Inserting info in a number field structure}495496If the required data is not part of the structure, it is computed then497inserted, and the new value is returned.498499These functions expect a \kbd{bnf} argument:500501\fun{GEN}{bnf_build_cycgen}{GEN bnf} the \var{bnf}502contains generators $[g_1,\ldots,g_k]$ of the class group, each with order503$d_i$. Then $g_i^{d_i} = (x_i)$ is a principal ideal. This function returns504the $x_i$ as a factorization matrix (\kbd{famat}) giving the element in505factored form as a product of $S$-units.506507\fun{GEN}{bnf_build_matalpha}{GEN bnf} the class group was508computed using a factorbase $S$ of prime ideals $\goth{p}_i$, $i \leq r$.509They satisfy relations of the form $\prod_j \goth{p}_i^{e_{i,j}} = (\alpha_j)$,510where the $e_{i,j}$ are given by the matrices $\var{bnf}[1]$ ($W$, singling511out a minimal set of generators in $S$) and $\var{bnf}[2]$ ($B$, expressing the512rest of $S$ in terms of the singled out generators). This function returns the513$\alpha_j$ in factored form as a product of $S$-units.514515\fun{GEN}{bnf_build_units}{GEN bnf} returns a minimal set of generators516for the unit group in expanded form. The first element is a torsion unit, the517others have infinite order. This expands units in compact form contained518in a \kbd{bnf} from \kbd{bnfinit}$(,1)$ and may be \emph{very} expensive519if the units are huge.520521\fun{GEN}{bnf_build_cheapfu}{GEN bnf} as \kbd{bnf\_build\_units} but only522expand units in compact form if the computation is inexpensive (a few seconds).523Return \kbd{NULL} otherwise.524525These functions expect a \kbd{rnf} argument:526527\fun{GEN}{rnf_build_nfabs}{GEN rnf, long prec} given a \var{rnf} structure528attached to $L/K$, (compute and) return an \var{nf} structure attached to $L$529at precision \kbd{prec}.530531\fun{void}{rnfcomplete}{GEN rnf} as \tet{rnf_build_nfabs} using the precision532of $K$ for \kbd{prec}.533534\fun{GEN}{rnf_zkabs}{GEN rnf} returns a $\Z$-basis in HNF for $\Z_L$ as a535pair $[T, v]$, where $T$ is \tet{rnf_get_polabs}$(\var{rnf})$ and $v$536a vector of elements lifted from $\Q[X]/(T)$. Note that the function537\tet{rnf_build_nfabs} essentially applies \kbd{nfinit} to the output of this538function.539540\subsec{Increasing accuracy}541542\fun{GEN}{nfnewprec}{GEN x, long prec}. Raise an exception if \kbd{x}543is not a number field structure (\var{nf}, \var{bnf} or \var{bnr}).544Otherwise, sets its accuracy to \kbd{prec} and return the new structure.545This is mostly useful with \kbd{prec} larger than the accuracy to546which \kbd{x} was computed, but it is also possible to decrease the accuracy547of \kbd{x} (truncating relevant components, which may speed up later548computations). This routine may modify the original \kbd{x} (see below).549550This routine is straightforward for \var{nf} structures, but for the551other ones, it requires all principal ideals corresponding to the \var{bnf}552relations in algebraic form (they are originally only available via floating553point approximations). This in turn requires many calls to554\tet{bnfisprincipal0}, which is often slow, and may fail if the initial555accuracy was too low. In this case, the routine will not actually fail but556recomputes a \var{bnf} from scratch!557558Since this process may be very expensive, the corresponding data is cached559(as a \emph{clone}) in the \emph{original} \kbd{x} so that later precision560increases become very fast. In particular, the copy returned by561\kbd{nfnewprec} also contains this additional data.562563\fun{GEN}{bnfnewprec}{GEN x, long prec}. As \kbd{nfnewprec}, but extracts564a \var{bnf} structure form \kbd{x} before increasing its accuracy, and565returns only the latter.566567\fun{GEN}{bnrnewprec}{GEN x, long prec}. As \kbd{nfnewprec}, but extracts a568\var{bnr} structure form \kbd{x} before increasing its accuracy, and569returns only the latter.570571\fun{GEN}{nfnewprec_shallow}{GEN nf, long prec}572573\fun{GEN}{bnfnewprec_shallow}{GEN bnf, long prec}574575\fun{GEN}{bnrnewprec_shallow}{GEN bnr, long prec} Shallow functions576underlying the above, except that the first argument must now have the577corresponding number field type. I.e. one cannot call578\kbd{nfnewprec\_shallow(nf, prec)} if \kbd{nf} is actually a \var{bnf}.579580\subsec{Number field arithmetic}581The number field $K = \Q[X]/(T)$ is represented by an \kbd{nf} (or \kbd{bnf}582or \kbd{bnr} structure). An algebraic number belonging to $K$ is given as583584\item a \typ{INT}, \typ{FRAC} or \typ{POL} (implicitly modulo $T$), or585586\item a \typ{POLMOD} (modulo $T$), or587588\item a \typ{COL}~\kbd{v} of dimension $N = [K:\Q]$, representing589the element in terms of the computed integral basis $(e_i)$, as590\bprog591sum(i = 1, N, v[i] * nf.zk[i])592@eprog593The preferred forms are \typ{INT} and \typ{COL} of \typ{INT}. Routines can594handle denominators but it is much more efficient to remove denominators595first (\tet{Q_remove_denom}) and take them into account at the end.596597\misctitle{Safe routines} The following routines do not assume that their598\kbd{nf} argument is a true \var{nf} (it can be any number field type, e.g.~a599\var{bnf}), and accept number field elements in all the above forms. They600return their result in \typ{COL} form.601602\fun{GEN}{nfadd}{GEN nf, GEN x, GEN y} returns $x+y$.603604\fun{GEN}{nfsub}{GEN nf, GEN x, GEN y} returns $x-y$.605606\fun{GEN}{nfdiv}{GEN nf, GEN x, GEN y} returns $x / y$.607608\fun{GEN}{nfinv}{GEN nf, GEN x} returns $x^{-1}$.609610\fun{GEN}{nfmul}{GEN nf,GEN x,GEN y} returns $xy$.611612\fun{GEN}{nfpow}{GEN nf,GEN x,GEN k} returns $x^k$, $k$ is in $\Z$.613614\fun{GEN}{nfpow_u}{GEN nf,GEN x, ulong k} returns $x^k$, $k\geq 0$.615616\fun{GEN}{nfsqr}{GEN nf,GEN x} returns $x^2$.617618\fun{long}{nfval}{GEN nf, GEN x, GEN pr} returns the valuation of $x$ at the619maximal ideal $\goth{p}$ attached to the \var{prid} \kbd{pr}.620Returns \kbd{LONG\_MAX} if $x$ is $0$.621622\fun{GEN}{nfnorm}{GEN nf,GEN x} absolute norm of $x$.623624\fun{GEN}{nftrace}{GEN nf,GEN x} absolute trace of $x$.625626\fun{GEN}{nfpoleval}{GEN nf, GEN pol, GEN a} evaluate the \typ{POL} \kbd{pol}627(with coefficients in \kbd{nf}) on the algebraic number $a$ (also in $nf$).628629\fun{GEN}{FpX_FpC_nfpoleval}{GEN nf, GEN pol, GEN a, GEN p} evaluate the630\kbd{FpX} \kbd{pol} on the algebraic number $a$ (also in $nf$).631632The following three functions implement trivial functionality akin to633Euclidean division for which we currently have no real use. Of course, even if634the number field is actually Euclidean, these do not in general implement a635true Euclidean division.636637\fun{GEN}{nfdiveuc}{GEN nf, GEN a, GEN b} returns the algebraic integer638closest to $x / y$. Functionally identical to \kbd{ground( nfdiv(nf,x,y) )}.639640\fun{GEN}{nfdivrem}{GEN nf, GEN a, GEN b} returns the vector $[q,r]$, where641\bprog642q = nfdiveuc(nf, a, b);643r = nfsub(nf, a, nfmul(nf,q,b)); \\ or r = nfmod(nf,a,b);644@eprog645646\fun{GEN}{nfmod}{GEN nf, GEN a, GEN b} returns $r$ such that647\bprog648q = nfdiveuc(nf, a, b);649r = nfsub(nf, a, nfmul(nf,q,b));650@eprog651652\fun{GEN}{nf_to_scalar_or_basis}{GEN nf, GEN x} let $x$ be a number field653element. If it is a rational scalar, i.e.~can be represented by a \typ{INT}654or \typ{FRAC}, return the latter. Otherwise returns its basis representation655(\tet{nfalgtobasis}). Shallow function.656657\fun{GEN}{nf_to_scalar_or_alg}{GEN nf, GEN x} let $x$ be a number field658element. If it is a rational scalar, i.e.~can be represented by a \typ{INT}659or \typ{FRAC}, return the latter. Otherwise returns its lifted \typ{POLMOD}660representation (lifted \tet{nfbasistoalg}). Shallow function.661662\fun{GEN}{RgX_to_nfX}{GEN nf, GEN x} let $x$ be a \typ{POL} whose coefficients663are number field elements; apply \kbd{nf\_to\_scalar\_or\_basis} to each664coefficient and return the resulting new polynomial. Shallow function.665666\fun{GEN}{RgM_to_nfM}{GEN nf, GEN x} let $x$ be a \typ{MAT} whose coefficients667are number field elements; apply \kbd{nf\_to\_scalar\_or\_basis} to each668coefficient and return the resulting new matrix. Shallow function.669670\fun{GEN}{RgC_to_nfC}{GEN nf, GEN x} let $x$ be a \typ{COL} or671\typ{VEC} whose coefficients672are number field elements; apply \kbd{nf\_to\_scalar\_or\_basis} to each673coefficient and return the resulting new \typ{COL}. Shallow function.674675\fun{GEN}{nfX_to_monic}{GEN nf, GEN T, GEN *pL} given a nonzero \typ{POL} $T$676with coefficients in \var{nf}, return a monic polynomial $f$ with integral677coefficients such that $f(x) = C T(x/L)$ for some integral $L$ and some $C$678in \var{nf}. The function allows coefficients in basis form; if $L \neq 1$,679it will return them in algebraic form. If \kbd{pL} is not \kbd{NULL},680\kbd{*pL} is set to $L$. Shallow function.681682\misctitle{Unsafe routines} The following routines assume that their \kbd{nf}683argument is a true \var{nf} (e.g.~a \var{bnf} is not allowed) and their684argument are restricted in various ways, see the precise description below.685686\fun{GEN}{nfX_disc}{GEN nf, GEN A} given an \var{nf} structure attached to a687number field $K$ with main variable $Y$ (\kbd{nf\_get\_varn(nf)}), a \typ{POL}688$A \in K[X]$ given as a lift in $\Q[X,Y]$ (implicitly modulo689\kbd{nf\_get\_pol(nf)}, return the discriminant of $A$ as a \typ{POL} in690$\Q[Y]$ (representing an element of $K$).691692\fun{GEN}{nfX_resultant}{GEN nf, GEN A, GEN B} analogous to \kbd{nfX\_disc},693$A, B\in \Q[X,Y]$; return the resultant of $A$ and $B$ with respect to $X$694as a \typ{POL} in $\Q[Y]$ (representing an element of $K$).695696\fun{GEN}{nfinvmodideal}{GEN nf, GEN x, GEN A} given an algebraic integer697$x$ and a nonzero integral ideal $A$ in HNF, returns a $y$ such that698$xy \equiv 1$ modulo $A$.699700\fun{GEN}{nfpowmodideal}{GEN nf, GEN x, GEN n, GEN ideal} given an algebraic701integer $x$, an integer $n$, and a nonzero integral ideal $A$ in HNF,702returns an algebraic integer congruent to $x^n$ modulo $A$.703704\fun{GEN}{nfmuli}{GEN nf, GEN x, GEN y} returns $x\times y$ assuming705that both $x$ and $y$ are either \typ{INT}s or \kbd{ZV}s of the correct706dimension.707708\fun{GEN}{nfsqri}{GEN nf, GEN x} returns $x^2$ assuming that $x$ is a \typ{INT}709or a \kbd{ZV} of the correct dimension.710711\fun{GEN}{nfC_nf_mul}{GEN nf, GEN v, GEN x} given a \typ{VEC} or \typ{COL}712$v$ of elements of $K$ in \typ{INT}, \typ{FRAC} or \typ{COL} form, multiply713it by the element $x$ (arbitrary form). This is faster than multiplying714coordinatewise since pre-computations related to $x$ (computing the715multiplication table) are done only once. The components of the result716are in most cases \typ{COL}s but are allowed to be \typ{INT}s or \typ{FRAC}s.717Shallow function.718719\fun{GEN}{nfC_multable_mul}{GEN v, GEN mx} same as \tet{nfC_nf_mul},720where the argument $x$ is replaced by its multiplication table \kbd{mx}.721722\fun{GEN}{zkC_multable_mul}{GEN v, GEN x} same as \tet{nfC_nf_mul},723where $v$ is a vector of algebraic integers, $x$ is an algebraic724integer, and $x$ is replaced by \kbd{zk\_multable}$(x)$.725726\fun{GEN}{zk_multable}{GEN nf, GEN x} given a \kbd{ZC} $x$ (implicitly727representing an algebraic integer), returns the \kbd{ZM} giving the728multiplication table by $x$. Shallow function (the first column of the result729points to the same data as $x$).730731\fun{GEN}{zk_inv}{GEN nf, GEN x} given a \kbd{ZC} $x$ (implicitly732representing an algebraic integer), returns the \kbd{QC} giving the733inverse $x^{-1}$. Return \kbd{NULL} if $x$ is $0$.734Not memory clean but safe for \kbd{gerepileupto}.735736\fun{GEN}{zkmultable_inv}{GEN mx} as \tet{zk_inv}, where737the argument given is \kbd{zk\_multable}$(x)$.738739\fun{GEN}{zkmultable_capZ}{GEN mx} given a nonzero \var{zkmultable}740\var{mx} attached to $x \in \Z_K$, return the positive generator of741$(x)\cap \Z$.742743\fun{GEN}{zk_scalar_or_multable}{GEN nf, GEN x} given a \typ{INT} or \kbd{ZC}744$x$, returns a \typ{INT} equal to $x$ if the latter is a scalar745(\typ{INT} or \kbd{ZV\_isscalar}$(x)$ is 1) and746\kbd{zk\_multable}$(\var{nf},x)$ otherwise. Shallow function.747748\subsec{Number field arithmetic for linear algebra}749750The following routines implement multiplication in a commutative $R$-algebra,751generated by $(e_1 = 1,\dots, e_n)$, and given by a multiplication table $M$:752elements in the algebra are $n$-dimensional \typ{COL}s, and the matrix753$M$ is such that for all $1\leq i,j\leq n$, its column with index $(i-1)n +754j$, say $(c_k)$, gives $e_i\cdot e_j = \sum c_k e_k$. It is assumed that755$e_1$ is the neutral element for the multiplication (a convenient756optimization, true in practice for all multiplications we needed to implement).757If $x$ has any other type than \typ{COL} where an algebra element is758expected, it is understood as $x e_1$.759760\fun{GEN}{multable}{GEN M, GEN x} given a column vector $x$, representing761the quantity $\sum_{i=1}^N x_i e_i$, returns the multiplication table by $x$.762Shallow function.763764\fun{GEN}{ei_multable}{GEN M, long i} returns the multiplication table765by the $i$-th basis element $e_i$. Shallow function.766767\fun{GEN}{tablemul}{GEN M, GEN x, GEN y} returns $x\cdot y$.768769\fun{GEN}{tablesqr}{GEN M, GEN x} returns $x^2$.770771\fun{GEN}{tablemul_ei}{GEN M, GEN x, long i} returns $x\cdot e_i$.772773\fun{GEN}{tablemul_ei_ej}{GEN M, long i, long j} returns $e_i\cdot e_j$.774775\fun{GEN}{tablemulvec}{GEN M, GEN x, GEN v} given a vector $v$ of elements776in the algebra, returns the $x\cdot v[i]$.777778The following routines implement naive linear algebra using the \emph{black box779field} mechanism:780781\fun{GEN}{nfM_det}{GEN nf, GEN M}782783\fun{GEN}{nfM_inv}{GEN nf, GEN M}784785\fun{GEN}{nfM_mul}{GEN nf, GEN A, GEN B}786787\fun{GEN}{nfM_nfC_mul}{GEN nf, GEN A, GEN B}788789\subsec{Cyclotomic field arithmetic for linear algebra}790791The following routines implement modular algorithms in cyclotomic fields. In792the prototypes, $P$ is the $n$-th cyclotomic polynomial $\Phi_n$ and $M$ is a793\typ{MAT} with \typ{INT} or \kbd{ZX} coefficients, understood modulo $P$.794795\fun{GEN}{ZabM_ker}{GEN M, GEN P, long n} returns an integral (primitive)796basis of the kernel of $M$.797798\fun{GEN}{ZabM_indexrank}{GEN M, GEN P, long n} return a vector with two799\typ{VECSMALL} components givin the rank profile of $M$. Inefficient800(but correct) when $M$ does not have almost full column rank.801802\fun{GEN}{ZabM_inv}{GEN M, GEN P, long n, GEN *pden}803assume that $M$ is invertible; return $N$ and sets the algebraic integer804\kbd{*pden} (an integer or a \kbd{ZX}, implicitly modulo $P$)805such that $M N = \kbd{den} \cdot \Id$.806807\fun{GEN}{ZabM_pseudoinv}{GEN M, GEN P, long n, GEN *pv, GEN *pden} analog808of \kbd{ZM\_pseudoinv}. Not gerepile-safe.809810\fun{GEN}{ZabM_inv_ratlift}{GEN M, GEN P, long n, GEN *pden}811return a primitive matrix $H$ such that $M H$ is $d$ times the identity812and set \kbd{*pden} to $d$. Uses a multimodular algorithm, attempting813rational reconstruction along the way. To be used when you expect that the814denominator of $M^{-1}$ is much smaller than $\det M$ else use \kbd{ZabM\_inv}.815816\subsec{Cyclotomic trace}817818Given two positive integers $m$ and $n$ such that $K_m = \Q(\zeta_m) \subset819K_n = \Q(\zeta_n)$, these functions implement relative trace computation from820$K_n$ to $K_m$. This is in particular useful for character values.821822\fun{GEN}{Qab_trace_init}{long n, long m, GEN Pn, GEN Pm} assume823that \kbd{Pn} is \kbd{polcyclo}$(n)$, \kbd{Pm} is \kbd{polcyclo}$(m)$824(both in the same variable), initialize a structure $T$ used in the following825routines. Shallow function.826827\fun{GEN}{Qab_tracerel}{GEN T, long t, GEN z} assume $T$ was created828by \tet{Qab_trace_init}, $t$ is an integer such that $0 \leq t < [K_n:K_m]$829and $z$ belongs to the cyclotomic field830$\Q(\zeta_n) = \Q[X]/(\kbd{Pn})$. Return the normalized relative trace831$[K_n:K_m]^{-1}\text{Tr}_{K_n/K_m} (\zeta_n^t z)$. Shallow function.832833\fun{GEN}{QabV_tracerel}{GEN T, long t, GEN v} $v$ being a vector of834entries belonging to $K_n$, apply \tet{Qab_tracerel} to all entries.835Shallow function.836837\fun{GEN}{QabM_tracerel}{GEN T, long t, GEN m} $m$ being a matrix838of entries belonging to $K_n$, apply \tet{Qab_tracerel} to all entries.839Shallow function.840841\subsec{Elements in factored form}842843Computational algebraic theory performs extensively linear844algebra on $\Z$-modules with a natural multiplicative structure ($K^*$,845fractional ideals in $K$, $\Z_K^*$, ideal class group), thereby raising846elements to horrendously large powers. A seemingly innocuous elementary linear847algebra operation like $C_i\leftarrow C_i - 10000 C_1$ involves raising848entries in $C_1$ to the $10000$-th power. Understandably, it is often more849efficient to keep elements in factored form rather than expand every such850expression. A \emph{factorization matrix} (or \tev{famat}) is a two column851matrix, the first column containing \emph{elements} (arbitrary objects which852may be repeated in the column), and the second one contains \emph{exponents}853(\typ{INT}s, allowed to be 0). By abuse of notation, the empty matrix854\kbd{cgetg(1, t\_MAT)} is recognized as the trivial factorization (no855element, no exponent).856857Even though we think of a \var{famat} with columns $g$ and $e$858as one meaningful object when fully expanded as $\prod g[i]^{e[i]}$,859\var{famat}s are basically about concatenating information to keep track of860linear algebra: the objects stored in a \var{famat} need not be861operation-compatible, they will not even be compared to each other (with one862exception: \tet{famat_reduce}). Multiplying two \var{famat}s just863concatenates their elements and exponents columns. In a context where a864\var{famat} is expected, an object $x$ which is not of type \typ{MAT} will be865treated as the factorization $x^1$. The following functions all return866\var{famat}s:867868\fun{GEN}{famat_mul}{GEN f, GEN g} $f$, $g$ are \var{famat},869or objects whose type is \emph{not} \typ{MAT} (understood as $f^1$ or $g^1$).870Returns $fg$. The empty factorization is the neutral element for \var{famat}871multiplication.872873\fun{GEN}{famat_mul_shallow}{GEN f, GEN g} shallow version of \tet{famat_mul}.874875\fun{GEN}{famat_pow}{GEN f, GEN n} $n$ is a \typ{INT}. If $f$ is a \typ{MAT},876assume it is a \var{famat} and return $f^n$ (multiplies the exponent column877by $n$). Otherwise, understand it as an element and returns the $1$-line878\var{famat} $f^n$.879880\fun{GEN}{famat_pow_shallow}{GEN f, GEN n} shallow version of \tet{famat_pow}.881882\fun{GEN}{famat_pows_shallow}{GEN f, long n} shallow version of \tet{famat_pow}883where $n$ is a small integer.884885\fun{GEN}{famat_mulpow_shallow}{GEN f, GEN g, GEN e} \kbd{famat}886corresponding to $f \cdot g^e$. Shallow function.887888\fun{GEN}{famat_mulpows_shallow}{GEN f, GEN g, long e} \kbd{famat}889shallow version of \tet{famat_mulpow} where $e$ is a small integer.890891892\fun{GEN}{famat_sqr}{GEN f} returns $f^2$.893894\fun{GEN}{famat_inv}{GEN f} returns $f^{-1}$.895896\fun{GEN}{famat_div}{GEN f, GEN g} return $f/g$.897898\fun{GEN}{famat_inv_shallow}{GEN f} shallow version of \tet{famat_inv}.899900\fun{GEN}{famat_div_shallow}{GEN f, GEN g} return $f/g$; shallow.901902\fun{GEN}{famat_Z_gcd}{GEN M, GEN n} restrict the \var{famat} $M$ to903the prime power dividing $n$.904905\fun{GEN}{to_famat}{GEN x, GEN k} given an element $x$ and an exponent906$k$, returns the \var{famat} $x^k$.907908\fun{GEN}{to_famat_shallow}{GEN x, GEN k} same, as a shallow function.909910\fun{GEN}{famatV_factorback}{GEN v, GEN e} given a vector of \kbd{famat}s911$v$ and a \kbd{ZV} $e$ return the \kbd{famat} $\prod_i v[i]^{e[i]}$. Shallow912function.913914\fun{GEN}{famatV_zv_factorback}{GEN v, GEN e} given a vector of \kbd{famat}s915$v$ and a \kbd{zv} $e$ return the \kbd{famat} $\prod_i v[i]^{e[i]}$. Shallow916function.917918\fun{GEN}{ZM_famat_limit}{GEN f, GEN limit} given a \var{famat} $f$ with919\typ{INT} entries, returns a \var{famat} $g$ with all factors larger than920\kbd{limit} multiplied out as the last entry (with exponent $1$). Shallow921function.922923Note that it is trivial to break up a \var{famat} into its two constituent924columns: \kbd{gel(f,1)} and \kbd{gel(f,2)} are the elements and exponents925respectively. Conversely, \kbd{mkmat2} builds a (shallow) \var{famat} from926two \typ{COL}s of the same length.927928\fun{GEN}{famat_reduce}{GEN f} given a \var{famat} $f$, returns a \var{famat}929$g$ without repeated elements or 0 exponents, such that the expanded forms930of $f$ and $g$ would be equal. Shallow function.931932\fun{GEN}{famat_remove_trivial}{GEN f} given a \var{famat} $f$, returns a933\var{famat} $g$ without 0 exponents. Shallow function.934935\fun{GEN}{famatsmall_reduce}{GEN f} as \kbd{famat\_reduce}, but for exponents936given by a \typ{VECSMALL}.937938\fun{GEN}{famat_to_nf}{GEN nf, GEN f} You normally never want to do this!939This is a simplified form of \tet{nffactorback}, where we do not check the940user input for consistency. The elements must be regular algebraic numbers941(not \var{famat}s) over the given number field.942943Why should you \emph{not} want to use this function ? You should not need to:944most of the functions useful in this context accept \var{famat}s as inputs,945for instance \tet{nfsign}, \tet{nfsign_arch}, \tet{ideallog} and946\tet{bnfisunit}. Otherwise, we can hopefully make good use of a quotient947operation (modulo a fixed conductor, modulo $\ell$-th powers); see the end of948\secref{se:Ideal_reduction}. If nothing else works, this function is949available but is expected to be slow or even overflow the possibilities of950the implementation.951952\fun{GEN}{famat_idealfactor}{GEN nf, GEN x} This is a good alternative for953\kbd{famat\_to\_nf}, returning the factorization of the ideal generated by954$x$. Since the answer is still given in factorized form, there is no risk of955coefficient explosion when the exponents are large. Of course, all components956of $x$ must be factored individually.957958\fun{GEN}{famat_nfvalrem}{GEN nf, GEN x, GEN pr, GEN *py} return the959valuation $v$ at \kbd{pr} of \kbd{famat\_to\_nf}$(x)$, without performing the960expansion of course. Notive that the output is a \kbd{GEN} since it cannot be961assumed to fit into a \kbd{long}. If \kbd{py} is not \kbd{NULL} it contains962the \kbd{famat} obtained by applying \kbd{nfvalrem} to each entry of the963first column and copying the second column, with $0$ exponents removed. The964expanded algebraic number is coprime to \kbd{pr} (in fact, all its components965are coprime do \kbd{pr}) and equal to $x \tau^v$ where $\tau$ is the fixed966anti-uniformizer for \kbd{pr} (\kbd{pr\_get\_tau}).967968\misctitle{Caveat} Receiving a \var{famat} input, \kbd{bnfisunit} assumes that969it is an actual unit, since this is expensive to check, and normally970easy to ensure from the user's side.971972\subsec{Ideal arithmetic}973974\misctitle{Conversion to HNF}975976\fun{GEN}{idealhnf}{GEN nf, GEN x} returns the HNF of the ideal defined by $x$:977$x$ may be an algebraic number (defining a principal ideal), a maximal ideal978(as given by \tet{idealprimedec} or \tet{idealfactor}), or a matrix whose979columns give generators for the ideal. This last format is complicated, but980useful to reduce general modules to the canonical form once in a while:981982\item if strictly less than $N = [K:Q]$ generators are given, $x$ is the983$\Z_K$-module they generate,984985\item if $N$ or more are given, it is assumed that they form a $\Z$-basis986(that the matrix has maximal rank $N$). This acts as \tet{mathnf} since the987$\Z_K$-module structure is (taken for granted hence) not taken into account988in this case.989990Extended ideals are also accepted, their principal part being discarded.991992\fun{GEN}{idealhnf0}{GEN nf, GEN x, GEN y} returns the HNF of the ideal993generated by the two algebraic numbers $x$ and $y$.994995The following low-level functions underlie the above two: they all assume996that \kbd{nf} is a true \var{nf} and perform no type checks:997998\fun{GEN}{idealhnf_principal}{GEN nf, GEN x}999returns the ideal generated by the algebraic number $x$.10001001\fun{GEN}{idealhnf_shallow}{GEN nf, GEN x} is \tet{idealhnf} except that the1002result may not be suitable for \kbd{gerepile}: if $x$ is already in HNF, we1003return $x$, not a copy!10041005\fun{GEN}{idealhnf_two}{GEN nf, GEN v} assuming $a = v[1]$ is a nonzero1006\typ{INT} and $b = v[2]$ is an algebraic integer, possibly given in regular1007representation by a \typ{MAT} (the multiplication table by $b$, see1008\tet{zk_multable}), returns the HNF of $a\Z_K+b\Z_K$.10091010\misctitle{Operations}10111012The basic ideal routines accept all \kbd{nf}s (\var{nf}, \var{bnf},1013\var{bnr}) and ideals in any form, including extended ideals, and return1014ideals in HNF, or an extended ideal when that makes sense:10151016\fun{GEN}{idealadd}{GEN nf, GEN x, GEN y} returns $x+y$.10171018\fun{GEN}{idealdiv}{GEN nf, GEN x, GEN y} returns $x/y$. Returns an extended1019ideal if $x$ or $y$ is an extended ideal.10201021\fun{GEN}{idealmul}{GEN nf, GEN x, GEN y} returns $xy$.1022Returns an extended ideal if $x$ or $y$ is an extended ideal.10231024\fun{GEN}{idealsqr}{GEN nf, GEN x} returns $x^2$.1025Returns an extended ideal if $x$ is an extended ideal.10261027\fun{GEN}{idealinv}{GEN nf, GEN x} returns $x^{-1}$.1028Returns an extended ideal if $x$ is an extended ideal.10291030\fun{GEN}{idealpow}{GEN nf, GEN x, GEN n} returns $x^n$.1031Returns an extended ideal if $x$ is an extended ideal.10321033\fun{GEN}{idealpows}{GEN nf, GEN ideal, long n} returns $x^n$.1034Returns an extended ideal if $x$ is an extended ideal.10351036\fun{GEN}{idealmulred}{GEN nf, GEN x, GEN y} returns an extended ideal equal1037to $xy$.10381039\fun{GEN}{idealpowred}{GEN nf, GEN x, GEN n} returns an extended ideal equal1040to $x^n$.10411042More specialized routines suffer from various restrictions:10431044\fun{GEN}{idealdivexact}{GEN nf, GEN x, GEN y} returns $x/y$, assuming that1045the quotient is an integral ideal. Much faster than \tet{idealdiv} when the1046norm of the quotient is small compared to $Nx$. Strips the principal parts1047if either $x$ or $y$ is an extended ideal.10481049\fun{GEN}{idealdivpowprime}{GEN nf, GEN x, GEN pr, GEN n} returns $x1050\goth{p}^{-n}$, assuming $x$ is an ideal in HNF or a rational number, and1051\kbd{pr} a \var{prid} attached to $\goth{p}$. Not suitable for1052\tet{gerepileupto} since it returns $x$ when $n = 0$.10531054\fun{GEN}{idealmulpowprime}{GEN nf, GEN x, GEN pr, GEN n} returns $x1055\goth{p}^{n}$, assuming $x$ is an ideal in HNF or a rational number, and1056\kbd{pr} a \var{prid} attached to $\goth{p}$. Not suitable for1057\tet{gerepileupto} since it retunrs $x$ when $n = 0$.10581059\fun{GEN}{idealprodprime}{GEN nf, GEN v} given a list $v$ of prime ideals1060in \var{prid} form, return their product. Assume that \var{nf} is a true1061\var{nf} structure.10621063\fun{GEN}{idealprod}{GEN nf, GEN v} given a list $v$ of ideals,1064return their product.10651066\fun{GEN}{idealprodval}{GEN nf, GEN v, GEN pr} given a list $v$ of ideals1067return the valuation of their product at the prime ideal \kbd{pr}.10681069\fun{GEN}{idealHNF_mul}{GEN nf, GEN x, GEN y} returns $xy$, assuming1070than \kbd{nf} is a true \var{nf}, $x$ is an integral ideal in HNF and $y$1071is an integral ideal in HNF or precompiled form (see below).1072For maximal speed, the second ideal $y$ may be given in precompiled form $y =1073[a,b]$, where $a$ is a nonzero \typ{INT} and $b$ is an algebraic integer in1074regular representation (a \typ{MAT} giving the multiplication table by the1075fixed element): very useful when many ideals $x$ are going to be multiplied by1076the same ideal $y$. This essentially reduces each ideal multiplication to1077an $N\times N$ matrix multiplication followed by a $N\times 2N$ modular1078HNF reduction (modulo $xy\cap \Z$).10791080\fun{GEN}{idealHNF_inv}{GEN nf, GEN I} returns $I^{-1}$, assuming that1081\kbd{nf} is a true \var{nf} and $x$ is a fractional ideal in HNF.10821083\fun{GEN}{idealHNF_inv_Z}{GEN nf, GEN I} returns $(I\cap \Z) \cdot I^{-1}$,1084assuming that \kbd{nf} is a true \var{nf} and $x$ is an integral fractional1085ideal in HNF. The result is an integral ideal in HNF.10861087\misctitle{Approximation}10881089\fun{GEN}{idealaddtoone}{GEN nf, GEN A, GEN B} given to coprime integer ideals1090$A$, $B$, returns $[a,b]$ with $a\in A$, $b\in B$, such that $a + b = 1$1091The result is reduced mod $AB$, so $a$, $b$ will be small.10921093\fun{GEN}{idealaddtoone_i}{GEN nf, GEN A, GEN B} as \tet{idealaddtoone} except1094that \kbd{nf} must be a true \var{nf}, and only $a$ is returned.10951096\fun{GEN}{idealaddtoone_raw}{GEN nf, GEN A, GEN B} as \tet{idealaddtoone_i}1097except that the reduction mod $AB$ is only performed modulo the lcm1098of $A \cap \Z$ and $B\cap \Z$, which will increase the size of $a$.10991100\fun{GEN}{zkchineseinit}{GEN nf, GEN A, GEN B, GEN AB} given two coprime1101integral ideals $A$ and $B$ (in any form, preferably HNF) and1102their product \kbd{AB} (in HNF form), initialize a solution to the Chinese1103remainder problem modulo $AB$.11041105\fun{GEN}{zkchinese}{GEN zkc, GEN x, GEN y} given \kbd{zkc} from1106\kbd{zkchineseinit}, and $x$, $y$ two integral elements given as \typ{INT}1107or \kbd{ZC}, return a $z$ modulo $AB$ such that1108$z = x \mod A$ and $z = y \mod B$.11091110\fun{GEN}{zkchinese1}{GEN zkc, GEN x} as \kbd{zkchinese} for $y = 1$; useful1111to lift elements in a nice way from $(\Z_K/A_i)^*$ to $(\Z_K/\prod_i A_i)^*$.11121113\fun{GEN}{hnfmerge_get_1}{GEN A, GEN B} given two square upper HNF integral1114matrices $A$, $B$ of the same dimension $n > 0$, return $a$ in the image of1115$A$ such that $1-a$ is in the image of $B$. (By abuse of notation we denote1116$1$ the column vector $[1,0,\dots,0]$.) If such an $a$ does not exist, return1117\kbd{NULL}. This is the function underlying \tet{idealaddtoone}.11181119\fun{GEN}{idealaddmultoone}{GEN nf, GEN v} given a list of $n$ (globally)1120coprime integer ideals $(v[i])$ returns an $n$-dimensional vector $a$ such that1121$a[i]\in v[i]$ and $\sum a[i] = 1$. If $[K:\Q] = N$, this routine computes1122the HNF reduction (with $Gl_{nN}(\Z)$ base change) of an $N\times nN$ matrix;1123so it is well worth pruning "useless" ideals from the list (as long as the1124ideals remain globally coprime).11251126\fun{GEN}{idealapprfact}{GEN nf, GEN fx} as \tet{idealappr}, except that1127$x$ \emph{must} be given in factored form. (This is unchecked.)11281129\fun{GEN}{idealcoprime}{GEN nf, GEN x, GEN y}. Given 2 integral ideals $x$ and1130$y$, returns an algebraic number $\alpha$ such that1131$\alpha x$ is an integral ideal coprime to $y$.11321133\fun{GEN}{idealcoprimefact}{GEN nf, GEN x, GEN fy} same as1134\tet{idealcoprime}, except that $y$ is given in factored form, as from1135\tet{idealfactor}.11361137\fun{GEN}{idealchinese}{GEN nf, GEN x, GEN y}11381139\fun{GEN}{idealchineseinit}{GEN nf, GEN x}11401141\subsec{Maximal ideals}11421143The PARI structure attached to maximal ideals is a \tev{prid} (for1144\emph{pr}ime \emph{id}eal), usually produced by \tet{idealprimedec}1145and \tet{idealfactor}. In this section, we describe the format; other sections1146will deal with their daily use.11471148A \var{prid} attached to a maximal ideal $\goth{p}$ stores the following1149data: the underlying rational prime $p$, the ramification degree $e\geq 1$,1150the residue field degree $f\geq 1$, a $p$-uniformizer $\pi$ with valuation1151$1$ at $\goth{p}$ and valuation $0$ at all other primes dividing $p$ and1152a rescaled ``anti-uniformizer'' $\tau$ used to compute valuations. This1153$\tau$ is an algebraic integer such that $\tau/p$ has valuation $-1$ at1154$\goth{p}$ and is integral at all other primes; in particular,1155the valuation of $x\in\Z_K$ is positive if and only if the algebraic integer1156$x\tau$ is divisible by $p$ (easy to check for elements in \typ{COL} form).11571158\fun{GEN}{pr_get_p}{GEN pr} returns $p$. Shallow function.11591160\fun{GEN}{pr_get_gen}{GEN pr} returns $\pi$. Shallow function.11611162\fun{long}{pr_get_e}{GEN pr} returns $e$.11631164\fun{long}{pr_get_f}{GEN pr} returns $f$.11651166\fun{GEN}{pr_get_tau}{GEN pr} returns1167$\tet{zk_scalar_or_multable}(\var{nf}, \tau)$, which is the \typ{INT}~$1$1168iff $p$ is inert, and a \kbd{ZM} otherwise. Shallow function.11691170\fun{int}{pr_is_inert}{GEN pr} returns $1$ if $p$ is inert, $0$ otherwise.11711172\fun{GEN}{pr_norm}{GEN pr} returns the norm $p^f$ of the maximal ideal.11731174\fun{ulong}{upr_norm}{GEN pr} returns the norm $p^f$ of the maximal ideal, as1175an \kbd{ulong}. Assume that the result does not overflow.11761177\fun{GEN}{pr_hnf}{GEN pr} return the HNF of $\goth{p}$.11781179\fun{GEN}{pr_inv}{GEN pr} return the fractional ideal $\goth{p}^{-1}$, in HNF.11801181\fun{GEN}{pr_inv_p}{GEN pr} return the integral ideal $p \goth{p}^{-1}$, in HNF.11821183\fun{GEN}{idealprimedec}{GEN nf, GEN p} list of maximal ideals dividing the1184prime $p$.11851186\fun{GEN}{idealprimedec_limit_f}{GEN nf, GEN p, long f} as \tet{idealprimedec},1187limiting the list to primes of residual degree $\leq f$ if $f$ is nonzero.11881189\fun{GEN}{idealprimedec_limit_norm}{GEN nf, GEN p, GEN B} as1190\tet{idealprimedec}, limiting the list to primes of norm $\leq B$, which1191must be a positive \typ{INT}.11921193\fun{GEN}{idealprimedec_galois}{GEN nf, GEN p} return a single prime ideal1194above $p$.11951196\fun{GEN}{idealprimedec_degrees}{GEN nf, GEN p} return a (sorted)1197\typ{VECSMALL} containing the residue degrees $f(\goth{p} / p)$.11981199\fun{GEN}{idealprimedec_kummer}{GEN nf, GEN Ti, long ei, GEN p} let \var{nf}1200(true \var{nf}) correspond to $K = \Q[X]/(T)$ ($T$ monic \kbd{ZX}).1201Let $T \equiv \prod_i T_i^{e_i} \pmod{p}$ be the factorization of $T$ and let1202$(f,g,h)$ be as in Dedekind criterion for prime $p$: $f \equiv \prod T_i$,1203$g \equiv \prod T_i^{e_i-1}$, $h = (T - fg) / p$, and let $D$ be the gcd1204of $(f,g,h)$ in $\F_p[X]$. Let \kbd{Ti} (\kbd{FpX}) be one irreducible factor1205$T_i$ not dividing $D$, with \kbd{ei} $= e_i$. This function returns the1206prime ideal attached to $T_i$ by Kummer / Dedekind criterion, namely1207$p \Z_K + T_i(\bar{X}) \Z_K$, which has ramification index $e_i$ over $p$.1208Shallow function.12091210\fun{GEN}{idealfactor}{GEN nf, GEN x} factors the fractional (hence nonzero)1211ideal $x$ into prime ideal powers; return the factorization matrix.12121213\fun{GEN}{idealfactor_limit}{GEN nf, GEN x, ulong lim} as \kbd{idealfactor},1214including only prime ideals above rational primes $< \kbd{lim}$.12151216\fun{GEN}{idealfactor_partial}{GEN nf, GEN x, GEN L} return partial1217factorization of fractional ideal $x$ as limited by argument $L$:12181219\item $L = \kbd{NULL}$: as \kbd{idealfactor};12201221\item $L$ a \typ{INT}: as \kbd{idealfactor\_limit};12221223\item $L$ a vector of prime ideals of \var{nf} and/or rational primes1224(standing for ``all prime ideal divisors of given rational prime'') limit1225factorization to trial division by elements of $L$; do not include the1226cofactor.12271228\fun{GEN}{idealHNF_Z_factor}{GEN x, GEN *pvN, GEN *pvZ} given an integral1229(nonzero) ideal $x$ in HNF, compute both the factorization of $Nx$ and1230of $x\cap\Z$. This returns the vector of prime divisors of both1231and sets \kbd{*pvN} and \kbd{*pvZ} to the corresponding \typ{VECSMALL} vector1232of exponents for the factorization for the Norm and intersection with $\Z$1233respetively.12341235\fun{GEN}{idealHNF_Z_factor_i}{GEN x, GEN fa, GEN *pvN, GEN *pvZ} internal1236variant of \tet{idealHNF_Z_factor} where \kbd{fa} is either a partial1237factorization of $x\cap \Z$ ($= x[1,1]$) or \kbd{NULL}. Returns the prime1238divisors of $x$ above the rational primes in \kbd{fa} and attached \kbd{vN}1239and \kbd{vZ}. If \kbd{fa} is \kbd{NULL}, use the full factorization, i.e.1240identical to \tet{idealHNF_Z_factor}.12411242\fun{GEN}{nf_pV_to_prV}{GEN}{nf, GEN P} given a vector of rational primes1243$P$, return the vector of all prime ideals above the $P[i]$.12441245\fun{GEN}{nf_deg1_prime}{GEN nf} let \kbd{nf} be a true \var{nf}. This1246function returns a degree $1$ (unramified) prime ideal not dividing1247\kbd{nf.index}. In fact it returns an ideal above the smallest prime1248$p \geq [K:\Q]$ satisfying those conditions.12491250\fun{GEN}{prV_lcm_capZ}{GEN L} given a vector $L$ of \var{prid}1251(maximal ideals) return the squarefree positive integer generating their1252lcm intersected with $\Z$. Not \kbd{gerepile}-safe.12531254\fun{GEN}{pr_uniformizer}{GEN pr, GEN F} given a \var{prid} attached to1255$\goth{p} / p$ and $F$ in $\Z$ divisible exactly by $p$, return an1256$F$-uniformizer for \kbd{pr}, i.e. a $t$ in $\Z_K$ such that $v_{\goth{p}}(t)1257= 1$ and $(t, F/\goth{p}) = 1$. Not \kbd{gerepile}-safe.12581259\subsec{Decomposition group}12601261\fun{GEN}{idealramfrobenius}{GEN nf, GEN gal, GEN pr, GEN ram}1262Let $K$ be the number field defined by $nf$ and assume $K/\Q$ be a1263Galois extension with Galois group given \kbd{gal=galoisinit(nf)},1264and that $pr$ is the prime ideal $\goth{P}$ in prid format, and that1265$\goth{P}$ is ramified, and \kbd{ram} is its list of ramification groups as1266output by \kbd{idealramgroups}.1267This function returns a permutation of \kbd{gal.group} which defines an1268automorphism $\sigma$ in the decomposition group of $\goth{P}$1269such that if $p$ is the unique prime number1270in $\goth{P}$, then $\sigma(x)\equiv x^p\mod\P$ for all $x\in\Z_K$.12711272\fun{GEN}{idealramfrobenius_aut}{GEN nf, GEN gal, GEN pr, GEN ram, GEN aut}1273as \kbd{idealramfrobenius(nf, gal, pr, ram}.12741275\fun{GEN}{idealramgroups_aut}{GEN nf, GEN gal, GEN pr, GEN aut}1276as \kbd{idealramgroups(nf, gal, pr}.12771278\fun{GEN}{idealfrobenius_aut}{GEN nf, GEN gal, GEN pr, GEN aut}1279faster version of \kbd{idealfrobenius(nf, gal, pr} where1280\kbd{aut} must be equal to \kbd{nfgaloispermtobasis(nf, gal)}.12811282\subsec{Reducing modulo maximal ideals}12831284\fun{GEN}{nfmodprinit}{GEN nf, GEN pr} returns an abstract \kbd{modpr}1285structure, attached to reduction modulo the maximal ideal \kbd{pr}, in1286\kbd{idealprimedec} format. From this data we can quickly project any1287\kbd{pr}-integral number field element to the residue field.12881289\fun{GEN}{modpr_get_pr}{GEN x} return the \kbd{pr} component from a \kbd{modpr}1290structure.12911292\fun{GEN}{modpr_get_p}{GEN x} return the $p$ component from a \kbd{modpr}1293structure (underlying rational prime).12941295\fun{GEN}{modpr_get_T}{GEN x} return the \kbd{T} component from a \kbd{modpr}1296structure: either \kbd{NULL} (prime of degree $1$) or an irreducible1297\kbd{FpX} defining the residue field over $\F_p$.12981299In library mode, it is often easier to use directly13001301\fun{GEN}{nf_to_Fq_init}{GEN nf, GEN *ppr, GEN *pT, GEN *pp} concrete1302version of \kbd{nfmodprinit}: \kbd{nf} and \kbd{*ppr} are the inputs, the1303return value is a \kbd{modpr} and \kbd{*ppr}, \kbd{*pT} and \kbd{*pp} are set1304as side effects.13051306The input \kbd{*ppr} is either a maximal ideal or already a \kbd{modpr} (in1307which case it is replaced by the underlying maximal ideal). The residue field1308is realized as $\F_p[X]/(T)$ for some monic $T\in\F_p[X]$, and we set1309\kbd{*pT} to $T$ and \kbd{*pp} to $p$. Set $T = \kbd{NULL}$ if the prime has1310degree $1$ and the residue field is $\F_p$.13111312In short, this receives (or initializes) a \kbd{modpr} structure, and1313extracts from it $T$, $p$ and $\goth{p}$.13141315\fun{GEN}{nf_to_Fq}{GEN nf, GEN x, GEN modpr} returns an \kbd{Fq} congruent1316to $x$ modulo the maximal ideal attached to \kbd{modpr}. The output is1317canonical: all elements in a given residue class are represented by the same1318\kbd{Fq}.13191320\fun{GEN}{Fq_to_nf}{GEN x, GEN modpr} returns an \kbd{nf} element lifting1321the residue field element $x$, either a \typ{INT} or an algebraic integer1322in \kbd{algtobasis} format.13231324\fun{GEN}{modpr_genFq}{GEN modpr} Returns an \kbd{nf} element whose image by1325\tet{nf_to_Fq} is $X \pmod T$, if $\deg T>1$, else $1$.13261327\fun{GEN}{zkmodprinit}{GEN nf, GEN pr} as \tet{nfmodprinit}, but we assume we1328will only reduce algebraic integers, hence do not initialize data allowing to1329remove denominators. More precisely, we can in fact still handle an $x$ whose1330rational denominator is not $0$ in the residue field (i.e. if the valuation1331of $x$ is nonnegative at all primes dividing $p$).13321333\fun{GEN}{zk_to_Fq_init}{GEN nf, GEN *pr, GEN *T, GEN *p} as1334\kbd{nf\_to\_Fq\_init}, able to reduce only $p$-integral elements.13351336\fun{GEN}{zk_to_Fq}{GEN x, GEN modpr} as \kbd{nf\_to\_Fq}, for1337a $p$-integral $x$.13381339\fun{GEN}{nfM_to_FqM}{GEN M, GEN nf,GEN modpr} reduces a matrix1340of \kbd{nf} elements to the residue field; returns an \kbd{FqM}.13411342\fun{GEN}{FqM_to_nfM}{GEN M, GEN modpr} lifts an \kbd{FqM} to a matrix of1343\kbd{nf} elements.13441345\fun{GEN}{nfV_to_FqV}{GEN A, GEN nf,GEN modpr} reduces a vector1346of \kbd{nf} elements to the residue field; returns an \kbd{FqV}1347with the same type as \kbd{A} (\typ{VEC} or \typ{COL}).13481349\fun{GEN}{FqV_to_nfV}{GEN A, GEN modpr} lifts an \kbd{FqV} to a vector of1350\kbd{nf} elements (same type as \kbd{A}).13511352\fun{GEN}{nfX_to_FqX}{GEN Q, GEN nf,GEN modpr} reduces a polynomial1353with \kbd{nf} coefficients to the residue field; returns an \kbd{FqX}.13541355\fun{GEN}{FqX_to_nfX}{GEN Q, GEN modpr} lifts an \kbd{FqX} to a polynomial1356with coefficients in \kbd{nf}.13571358The following functions are technical and avoid computing a true1359\kbd{nfmodpr}:13601361\fun{GEN}{pr_basis_perm}{GEN nf, GEN pr} given a true \var{nf} structure1362and a prime ideal \kbd{pr} above $p$, return as a \typ{VECSMALL} the1363$f(\goth{p}/p)$ indices $i$ such that the \kbd{nf.zk}$[i]$ mod \goth{p}1364form an $\F_p$-basis of the residue field.13651366\fun{GEN}{QXQV_to_FpM}{GEN v, GEN T, GEN p} let $p$ be a positive integer,1367$v$ be a vector of $n$ polynomials with rational coefficients whose denominators1368are coprime to $p$, and $T$ be a \kbd{ZX} (preferably monic) of1369degree $d$ whose leading coefficient is coprime to $p$. Return the1370$d \times n$ \kbd{FpM} whose columns are the $v[i]$ mod $T,p$ in the1371canonical basis $1, X, \dots, X^{d-1}$, see \kbd{RgX\_to\_RgC}.1372This is for instance useful when $v$ contains a $\Z$-basis of the maximal1373order of a number field $\Q[X]/(P)$, $p$ is a prime not dividing the index of1374$P$ and $T$ is an irreducible factor of $P$ mod $p$, attached to a maximal1375ideal $\goth{p}$: left-multiplication by the matrix maps number field1376elements (in basis form) to the residue field of $\goth{p}$.13771378\subsec{Valuations}13791380\fun{long}{nfval}{GEN nf, GEN x, GEN P} return $v_P(x)$13811382\misctitle{Unsafe functions} assume that $P$, $Q$ are \kbd{prid}.13831384\fun{long}{ZC_nfval}{GEN x, GEN P} returns $v_P(x)$,1385assuming $x$ is a \kbd{ZC}, representing a nonzero algebraic integer.13861387\fun{long}{ZC_nfvalrem}{GEN x, GEN P, GEN *newx} returns $v = v_P(x)$,1388assuming $x$ is a \kbd{ZC}, representing a nonzero algebraic integer, and sets1389\kbd{*newx} to $x\tau^v$ which is an algebraic integer coprime to $p$.13901391\fun{int}{ZC_prdvd}{GEN x, GEN P} returns $1$ is $P$ divides $x$ and1392$0$ otherwise. Assumes that $x$ is a \kbd{ZC}, representing an algebraic1393integer. Faster than computing $v_P(x)$.13941395\fun{int}{pr_equal}{GEN P, GEN Q} returns 1 is $P$ and $Q$ represent1396the same maximal ideal: they must lie above the same $p$ and share the same1397$e,f$ invariants, but the $p$-uniformizer and $\tau$ element may differ.1398Returns $0$ otherwise.13991400\subsec{Signatures}\label{se:signatures}14011402``Signs'' of the real embeddings of number field element are represented in1403additive notation, using the standard identification $(\Z/2\Z, +) \to1404(\{-1,1\},\times)$, $s\mapsto (-1)^s$.14051406With respect to a fixed \kbd{nf} structure, a selection of real places (a1407divisor at infinity) is normally given as a \typ{VECSMALL} of indices of the1408roots \kbd{nf.roots} of the defining polynomial for the number field. For1409compatibility reasons, in particular under GP, the (obsolete) \kbd{vec01}1410form is also accepted: a \typ{VEC} with \kbd{gen\_0} or \kbd{gen\_1} entries.14111412The following internal functions go back and forth between the two1413representations for the Archimedean part of divisors (GP: $0/1$ vectors,1414library: list of indices):14151416\fun{GEN}{vec01_to_indices}{GEN v} given a \typ{VEC} $v$ with \typ{INT} entries1417return as a \typ{VECSMALL} the list of indices $i$ such that $v[i] \neq 0$.1418(Typically used with $0,1$-vectors but not necessarily so.) If $v$ is already1419a \typ{VECSMALL}, return it: not suitable for \kbd{gerepile} in this case.14201421\fun{GEN}{vecsmall01_to_indices}{GEN v} as1422\bprog1423vec01_to_indices(zv_to_ZV(v));1424@eprog14251426\fun{GEN}{indices_to_vec01}{GEN p, long n} return the $0/1$ vector of length1427$n$ with ones exactly at the positions $p[1], p[2], \ldots$14281429\fun{GEN}{nfsign}{GEN nf,GEN x} $x$ being a number field element and \kbd{nf}1430any form of number field, return the $0-1$-vector giving the signs of the1431$r_1$ real embeddings of $x$, as a \typ{VECSMALL}. Linear algebra functions1432like \tet{Flv_add_inplace} then allow keeping track of signs in series of1433multiplications.14341435If $x$ is a \typ{VEC} of number field elements, return the matrix whose1436columns are the signs of the $x[i]$.14371438\fun{GEN}{nfsign_arch}{GEN nf,GEN x,GEN arch} \kbd{arch} being a list of1439distinct real places, either in \kbd{vec01} (\typ{VEC} with \kbd{gen\_0} or1440\kbd{gen\_1} entries) or \kbd{indices} (\typ{VECSMALL}) form (see1441\tet{vec01_to_indices}), returns the signs of $x$ at the corresponding1442places. This is the low-level function underlying \kbd{nfsign}.14431444\fun{int}{nfchecksigns}{GEN nf, GEN x, GEN pl} \var{pl} is a1445\typ{VECSMALL} with $r_1$ components, all of which are in $\{-1,0,1\}$.1446Return $1$ if $\sigma_i(x) \var{pl}[i] \geq 0$ for all $i$, and $0$ otherwise.14471448\fun{GEN}{nfsign_units}{GEN bnf, GEN archp, int add_tu}1449\kbd{archp} being a divisor at infinity in \kbd{indices} form (or \kbd{NULL}1450for the divisor including all real places), return the signs at \kbd{archp}1451of a \kbd{bnf.tu} and of system of fundamental units for the field1452\kbd{bnf.fu}, in that order if \kbd{add\_tu} is set; and in the same order as1453\kbd{bnf.fu} otherwise.14541455\fun{GEN}{nfsign_fu}{GEN bnf, GEN archp} returns the signs at \kbd{archp}1456of the fundamental units \kbd{bnf.fu}. This is an alias for1457\kbd{nfsign\_units} with \kbd{add\_tu} unset.14581459\fun{GEN}{nfsign_tu}{GEN bnf, GEN archp} returns the signs at \kbd{archp}1460of the torsion unit generator \kbd{bnf.tu}.14611462\fun{GEN}{nfsign_from_logarch}{GEN L, GEN invpi, GEN archp} given $L$1463the vector of the $\log \sigma(x)$, where $\sigma$ runs through the (real1464or complex) embeddings of some number field, \kbd{invpi} being1465a floating point approximation to $1/\pi$, and \kbd{archp} being a divisor1466at infinity in \kbd{indices} form, return the signs of $x$1467at the corresponding places. This is the low-level function underlying1468\kbd{nfsign\_units}; the latter is actually a trivial wrapper1469\kbd{bnf} structures include the $\log \sigma(x)$ for a system of fundamental1470units of the field.14711472\fun{GEN}{set_sign_mod_divisor}{GEN nf, GEN x, GEN y, GEN sarch}1473let $f = f_0f_\infty$ be a divisor, let \kbd{sarch} be the output of1474\kbd{nfarchstar(nf, f0, finf)}, let $x$ encode a vector of signs at1475the places of $f_\infty$ (see below), and let $y$ be a nonzero1476number field element. Returns $z$ congruent to $y$ mod $f_0$ (integral if $y$1477is) such that $z$ and $x$ have the same signs at $f_\infty$.14781479The following formats are supported for $x$: a $\{0,1\}$-vector of signs1480as a \typ{VECSMALL} (0 for positive, 1 for negative); \kbd{NULL} for a1481totally positive element (only $0$s); a number field element which1482is replaced by its signature at $f_\infty$.14831484\fun{GEN}{nfarchstar}{GEN nf, GEN f0, GEN finf} for a divisor $f =1485f_0f_\infty$ represented by the integral ideal \kbd{f0} in HNF and1486the \kbd{finf} in \kbd{indices} form, returns $(\Z_K/f_\infty)^*$ in a form1487suitable for computations mod $f$. See \tet{set_sign_mod_divisor}.14881489\fun{GEN}{idealprincipalunits}{GEN nf, GEN pr, long e} returns the1490multiplicative group $(1 + \var{pr}) / (1 + \var{pr}^e)$ as an abelian group.1491Faster than \tet{idealstar} when the norm of \var{pr} is large, since it1492avoids (useless) work in the multiplicative group of the residue field.14931494\subsec{Complex embeddings}14951496\fun{GEN}{nfembed}{GEN nf, GEN x, long k} returns a floating point1497approximation of the $k$-th embedding of $x$ (attached to the $k$-th1498complex root in \kbd{nf.roots}).14991500\fun{GEN}{nf_cxlog}{GEN nf, GEN x, long prec} return the vector of complex1501logarithmic embeddings $(e_i \text{Log}(\sigma_i X))$ where $e_i = 1$ if $i \leq1502r_1$ and $e_i = 2$ if $r_1 < i \leq r_2$ of $X = \kbd{Q\_primpart}(x)$.1503Returns \kbd{NULL} if loss of accuracy. Not \kbd{gerepile}-clean but suitable1504for \kbd{gerepileupto}. Allows $x$ in compact representation, in which1505case \kbd{Q\_primpart} is taken componentwise.15061507\fun{GEN}{nf_cxlog_normalize}{GEN nf, GEN x, long prec} an \var{nf} structure1508attached to a number field $K$ and $x$ from \kbd{nf\_cxlog}$(\var{nf}, X)$1509(a column vector of complex logarithmic embeddings with $r_1 + r_2$1510components) and let $e = (e_1,\dots,e_{r_1+r_2})$.1511Return1512$$ x - \dfrac{\log \big(N_{K/\Q} X\big)}{[K:\Q]} e $$1513where the imaginary parts are further normalized modulo $2\pi i \cdot e$.15141515The composition \kbd{nf\_cxlog} followed by~\kbd{nf\_cxlog\_normalize} is a1516morphism from $(K^*/\Q_+^*, \times)$ to1517$((\C/2\pi i\Z)^{r_1} \times (\C/4\pi i\Z)^{r_2}, +)$.1518Its real part maps the units $\Z_K^*$ to a lattice in the hyperplane1519$\sum_i x_i = 0$ in $\R^{r_1+r_2}$.15201521\fun{GEN}{nfV_cxlog}{GEN nf, GEN x, long prec} applies \kbd{nf\_cxlog}1522to each component of the vector $x$. Returns \kbd{NULL} if loss of1523accuracy for even one component. Not \kbd{gerepile}-clean.15241525\fun{GEN}{nflogembed}{GEN nf, GEN x, GEN *emb, long prec}1526return the vector of real logarithmic embeddings $(e_i \text{Log}|\sigma_i x|)$1527where $e_i = 1$ if $i \leq r_1$ and $e_i = 2$ if $r_1 < i \leq r_2$. Returns1528\kbd{NULL} if loss of accuracy. Not \kbd{gerepile}-clean. If \kbd{emb}1529is non-\kbd{NULL} set it to $(e_i \sigma_i x)$.1530Allows $x$ in compact representation, in which case \kbd{emb} is returned1531in compact representation as well, as a factorization matrix (expanding the1532factorization may overflowexponents).15331534\subsec{Maximal order and discriminant, conversion to \kbd{nf} structure}15351536A number field $K = \Q[X]/(T)$ is defined by a monic $T\in\Z[X]$. The1537low-level function computing a maximal order is15381539\fun{void}{nfmaxord}{nfmaxord_t *S, GEN T0, long flag}, where1540the polynomial $T_0$ is squarefree with integer coefficients. Let $K$ be the1541\'etale algebra $\Q[X]/(T_0)$ and let $T = \kbd{ZX\_Q\_normalize}(T_0)$,1542i.e. $T = C T_0(X/L)$ is monic and integral for some $C,Q\in \Q$.15431544The structure \tet{nfmaxord_t} is initialized by the call; it has the1545following fields:1546\bprog1547GEN T0, T, dT, dK; /* T0, T, discriminants of T and K */1548GEN unscale; /* the integer L */1549GEN index; /* index of power basis in maximal order */1550GEN dTP, dTE; /* factorization of |dT|, primes / exponents */1551GEN dKP, dKE; /* factorization of |dK|, primes / exponents */1552GEN basis; /* Z-basis for maximal order of Q[X]/(T) */1553@eprog\noindent The exponent vectors are \typ{VECSMALL}. The primes1554in \kbd{dTP} and \kbd{dKP} are pseudoprimes, not proven primes. We recommend1555restricting to $T = T_0$, i.e. either to pass the input polynomial through1556\tet{ZX_Q_normalize} \emph{before} the call, or to forget about $T_0$1557and go on with the polynomial $T$; otherwise $\kbd{unscale}\neq 1$, all data1558is expressed in terms of $T\neq T_0$, and needs to be converted to $T_0$. For1559instance to convert the basis to $\Q[X]/(T_0)$:1560\bprog1561RgXV_unscale(S.basis, S.unscale)1562@eprog15631564Instead of passing $T$ (monic \kbd{ZX}), one can use the format1565$[T,\var{listP}]$ as in \kbd{nfbasis} or \kbd{nfinit}, which computes an1566order which is maximal at a set of primes, but need not be the maximal order.15671568The \kbd{flag} is an or-ed combination of the binary flags, both of them1569deprecated:15701571\tet{nf_PARTIALFACT}: do not try to fully factor \kbd{dT} and only look for1572primes less than \kbd{primelimit}. In that case, the elements in \kbd{dTP}1573and \kbd{dKP} need not all be primes. But the resulting \kbd{dK},1574\kbd{index} and \kbd{basis} are correct provided there exists no prime $p >1575\kbd{primelimit}$ such that $p^2$ divides the field discriminant \kbd{dK}.1576This flag is \emph{deprecated}: the $[T,\var{listP}]$ format is safer and more1577flexible.15781579\tet{nf_ROUND2}: this flag is \emph{deprecated} and now ignored.15801581\fun{void}{nfinit_basic}{nfmaxord_t *S, GEN T0} a wrapper around1582\kbd{nfmaxord} (without the deprecated \kbd{flag}) that also accepts number1583field structures (\var{nf}, \var{bnf}, \dots) for \kbd{T0}.15841585\fun{GEN}{nfmaxord_to_nf}{nfmaxord_t *S, GEN ro, long prec} convert an1586\tet{nfmaxord_t} to an \var{nf} structure at precision \kbd{prec},1587where \kbd{ro} is \kbd{NULL}. The argument \kbd{ro} may also be set to a1588vector with $r_1 + r_2$ components containing the roots of \kbd{S->T}1589suitably ordered, i.e. first $r_1$ \typ{REAL} roots, then $r_2$ \typ{COMPLEX}1590representing the conguate pairs, but this is \emph{strongly discouraged}: the1591format is error-prone, and it is hard to compute the roots to the right1592accuracy in order to achieve \kbd{prec} accuracy for the \kbd{nf}. This1593function uses the integer basis \kbd{S->basis} as is, \emph{without}1594performing LLL-reduction. Unless the basis is already known to be reduced,1595use rather the following higher-level function:15961597\fun{GEN}{nfinit_complete}{nfmaxord_t *S, long flag, long prec} convert1598an \tet{nfmaxord_t} to an \var{nf} structure at precision \kbd{prec}.1599The \kbd{flag} has the same meaning as in \kbd{nfinitall}. If1600\kbd{S->basis} is known to be reduced, it will be faster to1601use \tet{nfmaxord_to_nf}.16021603\fun{GEN}{indexpartial}{GEN T, GEN dT} $T$ a monic separable \kbd{ZX},1604\kbd{dT} is either \kbd{NULL} (no information) or a multiple of the1605discriminant of $T$. Let $K = \Q[X]/(T)$ and $\Z_K$ its maximal order.1606Returns a multiple of the exponent of the quotient group $\Z_K/(\Z[X]/(T))$.1607In other word, a \emph{denominator} $d$ such that $d x\in\Z[X]/(T)$ for all1608$x\in\Z_K$.16091610\fun{GEN}{FpX_gcd_check}{GEN x, GEN y, GEN D} let $x$ and $y$ be two1611coprime polynomials with integer coefficients and let $D$ be1612a factor of the resultant of $x$ and $y$; try to factor $D$ by running the1613Euclidean algorithm on $x$ and $y$ modulo $D$. This returns \kbd{NULL}1614or a non trivial factor of $D$. This is the low-level function underlying1615\kbd{poldiscfactors} (applied to $x$, \kbd{ZX\_deriv}$(x)$ and the1616discriminant of $x$). It succeeds when $D$ has at least two prime divisors1617$p$ and $q$ such that one sub-resultant of $x$ and $y$ is divisible by $p$1618but not by $q$.16191620\subsec{Computing in the class group}16211622We compute with arbitrary ideal representatives (in any of the various1623formats seen above), and call16241625\fun{GEN}{bnfisprincipal0}{GEN bnf, GEN x, long flag}. The \kbd{bnf}1626structure already contains information about the class group in the form1627$\oplus_{i=1}^n (\Z/d_i\Z) g_i$ for canonical integers $d_i$1628(with $d_n\mid\dots\mid d_1$ all $> 1$) and essentially random generators1629$g_i$, which are ideals in HNF. We normally do not need the value of the1630$g_i$, only that they are fixed once and for all and that any (nonzero)1631fractional ideal $x$ can be expressed uniquely as $x = (t)\prod_{i=1}^n1632g_i^{e_i}$, where $0 \leq e_i < d_i$, and $(t)$ is some principal ideal.1633Computing $e$ is straightforward, but $t$ may be very expensive to obtain1634explicitly. The routine returns (possibly partial) information about the pair1635$[e,t]$, depending on \kbd{flag}, which is an or-ed combination of the1636following symbolic flags:16371638\item \tet{nf_GEN} tries to compute $t$.1639Returns $[e,t]$, with $t$ an empty vector if the computation failed. This1640flag is normally useless in nontrivial situations since the next two serve1641analogous purposes in more efficient ways.16421643\item \tet{nf_GENMAT} tries to compute $t$ in factored form, which is1644much more efficient than \kbd{nf\_GEN} if the class group is moderately1645large; imagine a small ideal $x = (t)g^{10000}$: the norm of $t$ has $10000$1646as many digits as the norm of $g$; do we want to see it as a vector1647of huge meaningless integers? The idea is to compute $e$ first, which is1648easy, then compute $(t)$ as $x \prod g_i^{-e_i}$ using successive1649\tet{idealmulred}, where the ideal reduction extracts small principal ideals1650along the way, eventually raised to large powers because of the binary1651exponentiation technique; the point is to keep this principal part in1652factored \emph{unexpanded} form. Returns $[e,t]$, with $t$ an empty vector if1653the computation failed; this should be exceedingly rare, unless the initial1654accuracy to which \kbd{bnf} was computed was ridiculously low (and then1655\kbd{bnfinit} should not have succeeded either). Setting/unsetting1656\kbd{nf\_GEN} has no effect when this flag is set.16571658\item \tet{nf_GEN_IF_PRINCIPAL} tries to compute $t$ \emph{only} if the1659ideal is principal ($e = 0$). Returns \kbd{gen\_0} if the ideal is not1660principal. Setting/unsetting \kbd{nf\_GEN} has no effect when this flag is1661set, but setting/unsetting \kbd{nf\_GENMAT} is possible.16621663\item \tet{nf_FORCE} in the above, insist on computing $t$, even if it1664requires recomputing a \kbd{bnf} from scratch. This is a last resort, and1665normally the accuracy of a \kbd{bnf} can be increased without trouble, but it1666may be that some algebraic information simply cannot be recovered from what1667we have: see \tet{bnfnewprec}. It should be very rare, though.16681669In simple cases where you do not care about $t$, you may use16701671\fun{GEN}{isprincipal}{GEN bnf, GEN x}, which is a shortcut for1672\kbd{bnfisprincipal0(bnf, x, 0)}.16731674The following low-level functions are often more useful:16751676\fun{GEN}{isprincipalfact}{GEN bnf, GEN C, GEN L, GEN f, long flag} is1677about the same as \kbd{bnfisprincipal0} applied to $C \prod L[i]^{f[i]}$,1678where the $L[i]$ are ideals, the $f[i]$ integers and $C$ is either an ideal1679or \kbd{NULL} (omitted). Make sure to include \tet{nf_GENMAT} in \kbd{flag}!16801681\fun{GEN}{isprincipalfact_or_fail}{GEN bnf, GEN C, GEN L, GEN f} is1682for delicate cases, where we must be more clever than \kbd{nf\_FORCE}1683(it is used when trying to increase the accuracy of a \var{bnf}, for1684instance). If performs1685\bprog1686isprincipalfact(bnf,C, L, f, nf_GENMAT);1687@eprog\noindent1688but if it fails to compute $t$, it just returns a \typ{INT}, which is the1689estimated precision (in words, as usual) that would have been sufficient to1690complete the computation. The point is that \kbd{nf\_FORCE} does exactly this1691internally, but goes on increasing the accuracy of the \kbd{bnf}, then1692discarding it, which is a major inefficiency if you intend to compute lots of1693discrete logs and have selected a precision which is just too low.1694(It is sometimes not so bad since most of the really expensive data is cached1695in \kbd{bnf} anyway, if all goes well.) With this function, the \emph{caller}1696may decide to increase the accuracy using \tet{bnfnewprec} (and keep the1697resulting \kbd{bnf}!), or avoid the computation altogether. In any case the1698decision can be taken at the place where it is most likely to be correct.16991700\fun{void}{bnftestprimes}{GEN bnf, GEN B} is an ingredient to certify1701unconditionnally a \kbd{bnf} computed assuming GRH, cf. \kbd{bnfcertify}.1702Running this function successfully proves that the classes of all prime1703ideals of norm $\leq B$ belong to the subgroup of the class group generated1704by the factorbase used to compute the \kbd{bnf} (equal to the class group1705under GRH). If the condition is not true, then (GRH is false and) the1706function will run forever.17071708If it is known that primes of norm less than $B$ generate the class group1709(through variants of Minkowski's convex body or Zimmert's twin classes1710theorems), then the true class group is proven to be a quotient of1711\kbd{bnf.clgp}.17121713\subsec{Floating point embeddings, the $T_2$ quadratic form}17141715We assume the \var{nf} is a true \kbd{nf} structure, attached to a number1716field $K$ of degree $n$ and signature $(r_1,r_2)$. We saw that17171718\fun{GEN}{nf_get_M}{GEN nf} returns the $(r_1+r_2)\times n$ matrix $M$1719giving the embeddings of $K$, so that if $v$ is an $n$-th dimensional1720\typ{COL} representing the element $\sum_{i=1}^n v[i] w_i$ of $K$, then1721\kbd{RgM\_RgC\_mul(M,v)} represents the embeddings of $v$. Its first $r_1$1722components are real numbers (\typ{INT}, \typ{FRAC} or \typ{REAL}, usually the1723latter), and the last $r_2$ are complex numbers (usually of \typ{COMPLEX},1724but not necessarily for embeddings of rational numbers).17251726\fun{GEN}{embed_T2}{GEN x, long r1} assuming $x$ is the vector of floating point1727embeddings of some algebraic number $v$, i.e.1728\bprog1729x = RgM_RgC_mul(nf_get_M(nf), algtobasis(nf,v));1730@eprog\noindent returns $T_2(v)$. If the floating point embeddings themselves1731are not needed, but only the values of $T_2$, it is more efficient to1732restrict to real arithmetic and use1733\bprog1734gnorml2( RgM_RgC_mul(nf_get_G(nf), algtobasis(nf,v)));1735@eprog17361737\fun{GEN}{embednorm_T2}{GEN x, long r1} analogous to \tet{embed_T2},1738applied to the \kbd{gnorm} of the floating point embeddings. Assuming that1739\bprog1740x = gnorm( RgM_RgC_mul(nf_get_M(nf), algtobasis(nf,v)) );1741@eprog\noindent returns $T_2(v)$.17421743\fun{GEN}{embed_roots}{GEN z, long r1} given a vector $z$ of $r_1+r_2$1744complex embeddings of the algebraic number $v$, return the $r_1+2r_2$ roots1745of its characteristic polynomial. Shallow function.17461747\fun{GEN}{embed_disc}{GEN z, long r1, long prec} given a vector $z$ of1748$r_1+r_2$ complex embeddings of the algebraic number $v$, return a floating1749point approximation of the discriminant of its characteristic polynomial as a1750\typ{REAL} of precision \kbd{prec}.17511752\fun{GEN}{embed_norm}{GEN x, long r1} given a vector $z$ of $r_1+r_2$ complex1753embeddings of the algebraic number $v$, return (a floating point1754approximation of) the norm of $v$.17551756\subsec{Ideal reduction, low level}17571758In the following routines \var{nf} is a true \kbd{nf}, attached to a number1759field $K$ of degree $n$:17601761\fun{GEN}{nf_get_Gtwist}{GEN nf, GEN v} assuming $v$ is a \typ{VECSMALL}1762with $r_1+r_2$ entries, let1763$$|| x ||_v^2 = \sum_{i=1}^{r_1+r_2} 2^{v_i}\varepsilon_i|\sigma_i(x)|^2,$$1764where as usual the $\sigma_i$ are the (real and) complex embeddings and1765$\varepsilon_i = 1$, resp.~$2$, for a real, resp.~complex place.1766This is a twisted variant of the $T_2$ quadratic form, the standard Euclidean1767form on $K\otimes \R$. In applications, only the relative size of the $v_i$1768will matter.17691770Let $G_v\in M_n(\R)$ be a square matrix such that if $x\in K$ is represented by1771the column vector $X$ in terms of the fixed $\Z$-basis of $\Z_K$ in \var{nf},1772then1773$$||x||_v^2 = {}^t (G_v X) \cdot G_v X.$$1774(This is a kind of Cholesky decomposition.) This function1775returns a rescaled copy of $G_v$, rounded to nearest integers, specifically1776\tet{RM_round_maxrank}$(G_v)$.1777Suitable for \kbd{gerepileupto}, but does not collect garbage. For1778convenience, also allow $v = $\kbd{NULL} (\tet{nf_get_roundG}) and $v$1779a \typ{MAT} as output from the function itself: in both these cases,1780shallow function.17811782\fun{GEN}{nf_get_Gtwist1}{GEN nf, long i}. Simple special case. Returns the1783twisted $G$ matrix attached to the vector $v$ whose entries are all $0$1784except the $i$-th one, which is equal to $10$.17851786\fun{GEN}{idealpseudomin}{GEN x, GEN G}. Let $x$, $G$ be two \kbd{ZM}s,1787such that the product $Gx$ is well-defined. This returns a ``small'' integral1788linear combinations of the columns of $x$, given by the LLL-algorithm applied1789to the lattice $G x$. Suitable for \kbd{gerepileupto}, but does not collect1790garbage.17911792In applications, $x$ is an integral ideal, $G$ approximates a Cholesky form for1793the $T_2$ quadratic form as returned by \tet{nf_get_Gtwist}, and we return1794a small element $a$ in the lattice $(x,T_2)$. This is used to implement1795\tet{idealred}.17961797\fun{GEN}{idealpseudomin_nonscalar}{GEN x, GEN G}. As \tet{idealpseudomin},1798but we insist of returning a nonscalar $a$ (\kbd{ZV\_isscalar} is false), if1799the dimension of $x$ is $> 1$.18001801In the interpretation where $x$ defines an integral ideal on a fixed $\Z_K$1802basis whose first element is $1$, this means that $a$ is not rational.18031804\fun{GEN}{idealpseudominvec}{GEN x, GEN G}. As \tet{idealpseudomin_nonscalar},1805but we return about $n^2/2$ nonscalar elements in $x$ with small $T_2$-norm,1806where the dimension of $x$ is $n$.18071808\fun{GEN}{idealpseudored}{GEN x, GEN G}. As \tet{idealpseudomin} but we1809return the full reduced $\Z$-basis of $x$ as a \typ{MAT} instead of a single1810vector.18111812\fun{GEN}{idealred_elt}{GEN nf, GEN x} shortcut for1813\bprog1814idealpseudomin(x, nf_get_roundG(nf))1815@eprog18161817\subsec{Ideal reduction, high level} \label{se:Ideal_reduction}18181819Given an ideal $x$ this means finding a ``simpler'' ideal in the same ideal1820class. The public GP function is of course available18211822\fun{GEN}{idealred0}{GEN nf, GEN x, GEN v} finds an $a\in K^*$ such that1823$(a) x$ is integral of small norm and returns it, as an ideal in HNF.1824What ``small'' means depends on the parameter $v$, see the GP description.1825More precisely, $a$ is returned by \kbd{idealpseudomin}$((x_\Z) x^(-1),G)$1826divided by $x_\Z$, where $x_\Z = (x\cap \Z)$ and where $G$ is1827\tet{nf_get_Gtwist}$(\var{nf}, v)$ for $v\neq \kbd{NULL}$ and1828\tet{nf_get_roundG}$(\var{nf})$ otherwise.18291830\noindent Usually one sets $v = \kbd{NULL}$ to obtain an element of small $T_2$1831norm in $x$:18321833\fun{GEN}{idealred}{GEN nf, GEN x} is a shortcut for \kbd{idealred0(nf,x,NULL)}.18341835The function \kbd{idealred} remains complicated to use: in order not to lose1836information $x$ must be an extended ideal, otherwise the value of $a$ is lost.1837There is a subtlety here: the principal ideal $(a)$ is easy to recover, but $a$1838itself is an instance of the principal ideal problem which is very difficult1839given only an \var{nf} (once a \var{bnf} structure is available,1840\tet{bnfisprincipal0} will recover it).18411842\fun{GEN}{idealmoddivisor}{GEN bnr, GEN x} A proof-of-concept implementation,1843useless in practice. If \kbd{bnr} is attached to some modulus $f$, returns a1844``small'' ideal in the same class as $x$ in the ray class group modulo $f$.1845The reason why this is useless is that using extended ideals with principal1846part in a computation, there is a simple way to reduce them: simply reduce1847the generator of the principal part in $(\Z_K/f)^*$.18481849\fun{GEN}{famat_to_nf_moddivisor}{GEN nf, GEN g, GEN e, GEN bid}1850given a true \var{nf} attached to a number field $K$, a \var{bid} structure1851attached to a modulus $f$, and an algebraic number in factored form $\prod1852g[i]^{e[i]}$, such that $(g[i],f) = 1$ for all $i$, returns a small element in1853$\Z_K$ congruent to it mod $f$. Note that if $f$ contains places at infinity,1854this includes sign conditions at the specified places.18551856A simpler case when the conductor has no place at infinity:18571858\fun{GEN}{famat_to_nf_modideal_coprime}{GEN nf, GEN g, GEN e, GEN f, GEN expo}1859as above except that the ideal $f$ is now integral in HNF (no need for a full1860\var{bid}), and we pass the exponent of the group $(\Z_K/f)^*$ as \kbd{expo};1861any multiple will also do, at the expense of efficiency. Of course if a1862\var{bid} for $f$ is available, if is easy to extract $f$ and the exact value1863of \kbd{expo} from it (the latter is the first elementary divisor in the1864group structure). A useful trick: if you set \kbd{expo} to \emph{any}1865positive integer, the result is correct up to \kbd{expo}-th powers, hence1866exact if \kbd{expo} is a multiple of the exponent; this is useful when trying1867to decide whether an element is a square in a residue field for instance!1868(take \kbd{expo}$ = 2$).18691870\fun{GEN}{nf_to_Fp_coprime}{GEN nf, GEN x, GEN modpr} this low-level function1871is variant of1872\tet{famat_to_nf_modideal_coprime}: \var{nf} is a true \var{nf} structure,1873\kbd{modpr} is from \kbd{zkmodprinit} attached to a prime of degree $1$ above1874the prime number $p$, and $x$ is either a number field element or a1875\kbd{famat} factorization matrix. We finally assume that no component of $x$1876has a denominator $p$.18771878What to do when the $g[i]$ are not coprime to $f$, but only $\prod1879g[i]^{e[i]}$ is? Then the situation is more complicated, and we advise to1880solve it one prime divisor of $f$ at a time. Let $v$ be the valuation1881attached to a maximal ideal \kbd{pr}:18821883\fun{GEN}{famat_makecoprime}{GEN nf, GEN g, GEN e, GEN pr, GEN prk, GEN expo}1884returns an element in $(\Z_K/\kbd{pr}^k)^*$ congruent to the product1885$\prod g[i]^{e[i]}$, assumed to be globally coprime to \kbd{pr}. As above,1886\kbd{expo} is any positive multiple of the exponent of $(\Z_K/\kbd{pr}^k)^*$,1887for instance $(Nv-1)p^{k-1}$, if $p$ is the underlying rational prime. You1888may use other values of \kbd{expo} (see the useful trick in1889\tet{famat_to_nf_modideal_coprime}).18901891\fun{GEN}{sunits_makecoprime}{GEN g, GEN pr, GEN prk} is a1892specialized variant that allows to precondition a vector of $g[i]$ assumed to1893be integral primes or algebraic integers so that it becomes suitable for1894\kbd{famat\_to\_nf\_modideal\_coprime} modulo \kbd{pr}. This is in particular1895useful for the output of \kbd{bnf\_get\_sunits}.18961897\fun{GEN}{Idealstarprk}{GEN nf, GEN pr, long k, long flag} same as1898\kbd{Idealstar} for $I = \kbd{pr}^k$18991900\subsec{Class field theory}19011902Under GP, a class-field theoretic description of a number field is given by a1903triple $A$, $B$, $C$, where the defining set $[A,B,C]$ can have any of the1904following forms: $[\var{bnr}]$, $[\var{bnr},\var{subgroup}]$,1905$[\var{bnf},\var{modulus}]$, $[\var{bnf},\var{modulus},\var{subgroup}]$.1906You can still use directly all of (\kbd{libpari}'s routines implementing) GP's1907functions as described in Chapter~3, but they are often awkward in the context1908of \kbd{libpari} programming. In particular, it does not make much sense to1909always input a triple $A,B,C$ because of the fringe1910$[\var{bnf},\var{modulus},\var{subgroup}]$. The first routine to call, is1911thus19121913\fun{GEN}{Buchray}{GEN bnf, GEN mod, long flag} initializes a \var{bnr}1914structure from \kbd{bnf} and modulus \kbd{mod}. \kbd{flag} is an or-ed1915combination of \kbd{nf\_GEN} (include generators) and \kbd{nf\_INIT} (if1916omitted, do not return a \var{bnr}, only the ray class group as an abelian1917group). In fact, the single most useful value of \kbd{flag} is1918\kbd{nf\_INIT} to initialize a proper \var{bnr}: omitting1919\kbd{nf\_GEN} saves a lot of time and will not adversely affect1920any class field theoretic function; adding \kbd{nf\_GEN} makes debugging1921easier. The flag 0 allows to compute only the ray class group structure but1922will gain little time; if we only need the \emph{order} of the ray class1923group, then \tet{bnrclassno} is fastest.19241925Now we have a proper \var{bnr} encoding a \kbd{bnf} and a modulus, we no longer1926need the $[\var{bnf},\var{modulus}]$ and1927$[\var{bnf},\var{modulus},\var{subgroup}]$ forms, which would internally call1928\tet{Buchray} anyway. Recall that a subgroup $H$ is given by a matrix in HNF,1929whose column express generators of $H$ on the fixed generators of the ray class1930group that stored in our \var{bnr}. You may also code the trivial subgroup by1931\kbd{NULL}. It is also allowed to replace $H$ by a character $\chi$ of the ray1932class group modulo \kbd{mod}: it represents the subgroup $\text{Ker} \chi$.19331934\fun{GEN}{bnr_subgroup_check}{GEN bnr, GEN H, GEN *pdeg} given a \var{bnr}1935attached to a modulus \var{mod}, check whether $H$ represents a congruence1936subgroup (of the ray class group modulo \var{mod}) and returns a normalized1937representation: \kbd{NULL} for the trivial subgroup, or in HNF, reduced1938modulo the elementary divisors of the ray class group. In particular, if $H$1939is a character of the ray class group, the returned value is the character1940kernel. If \kbd{pdeg} is not \kbd{NULL}, \kbd{*pdeg} is set to the degree of the1941attached class field: the index of $H$ in the ray class group.19421943\fun{GEN}{bnrconductor}{GEN bnr, GEN H, long flag} see the documentation of1944the GP function.19451946\fun{GEN}{bnrconductor_factored}{GEN bnr, GEN H}1947return a pair $[F,\var{fa}]$ where $F$ is the conductor and \var{fa} is the1948factorization of the finite part of the conductor. Shallow function.19491950\fun{GEN}{bnrconductor_raw}{GEN bnr, GEN H} return the conductor of $H$.1951Shallow function.19521953\fun{long}{bnrisconductor}{GEN bnr, GEN H} returns 1 is the class field1954defined by the subgroup $H$ (of the ray class group mod $f$ coded in \kbd{bnr})1955has conductor $f$. Returns 0 otherwise.19561957\fun{GEN}{ideallog_units}{GEN bnf, GEN bid} return the images of the units1958generators \kbd{bnf.tu} and \kbd{bnf.tu} in the finite abelian group1959$(\Z_K/f)^*$ attached to \kbd{bid}.19601961\fun{GEN}{ideallog_units0}{GEN bnf, GEN bid, GEN N} let1962$G = (\Z_K/f)^*$ be the finite abelian group attached to \kbd{bid}.1963Return the images of the units generators \kbd{bnf.tu} and \kbd{bnf.tu} in1964$G / G^N$. If $N$ is \kbd{NULL}, same as \tet{ideallog_units}.19651966\fun{GEN}{bnrchar_primitive}{GEN bnr, GEN chi, GEN bnrc}1967Given a normalized character $\kbd{chi} = [d,c]$ on \kbd{bnr.clgp} (see1968\tet{char_normalize}) of conductor \kbd{bnrc.mod}, compute the primitive1969character \kbd{chic} on \kbd{bnrc.clgp} equivalent to \kbd{chi}, given as a1970normalized character $[D,C]$ : \kbd{chic(bnrc.gen[i])} is $\zeta_D^{C[i]}$,1971where $D$ is minimal. It is easier to use \kbd{bnrconductor\_i(bnr,chi,2)},1972but the latter recomputes \kbd{bnrc} for each new character.19731974\fun{GEN}{bnrchar_primitive_raw}{GEN bnr, GEN chi, GEN bnrc} as1975\tet{bnrchar_primitive}, with \kbd{chi} a regular (unnormalized) character1976on \kbd{bnr.clgp} of conductor \kbd{bnrc.mod}. Return a regular1977(unnormalized) primitive character on \kbd{bnrc}.19781979\fun{GEN}{bnrdisc}{GEN bnr, GEN H, long flag} returns the discriminant and1980signature of the class field defined by \kbd{bnr} and $H$. See the description1981of the GP function for details. \fl\ is an or-ed combination of the flags1982\tet{rnf_REL} (output relative data) and \tet{rnf_COND} (return 0 unless the1983modulus is the conductor).19841985\fun{GEN}{bnrsurjection}{GEN BNR, GEN bnr} \kbd{BNR} and \kbd{bnr}1986defined over the same field $K$, for moduli $F$ and $f$ with1987$F\mid f$, returns the canonical surjection1988$\text{Cl}_K(F)\to \text{Cl}_K(f)$ as a triple $[M,\var{cyc}_F,\var{cyc}_f]$.1989$M$ gives the image of the fixed ray class group generators of \kbd{BNR} in1990terms of the ones in \kbd{bnr}, $\var{cyc}_F$ and $\var{cyc}_f$ are the cyclic1991structures of \kbd{BNR} and \kbd{bnr} respectively (as per \tet{bnr_get_cyc}).1992Shallow function.19931994\fun{GEN}{ABC_to_bnr}{GEN A, GEN B, GEN C, GEN *H, int addgen} This is a1995quick conversion function designed to go from the too general (inefficient)1996$A$, $B$, $C$ form to the preferred \var{bnr}, $H$ form for class fields.1997Given $A$, $B$, $C$ as explained above (omitted entries coded by \kbd{NULL}),1998return the attached \var{bnr}, and set $H$ to the attached subgroup. If1999\kbd{addgen} is $1$, make sure that if the \var{bnr} needed to be computed,2000then it contains generators.20012002\subsec{Grunwald--Wang theorem}20032004\fun{GEN}{nfgwkummer}{GEN nf, GEN Lpr, GEN Ld, GEN pl, long var}2005low-level version of \kbd{nfgrunwaldwang}, assuming that \kbd{nf} contains2006suitable roots of unity, and directly using Kummer theory to construct the2007extension.20082009\fun{GEN}{bnfgwgeneric}{GEN bnf, GEN Lpr, GEN Ld, GEN pl, long var}2010low-level version of \kbd{nfgrunwaldwang}, assuming that \kbd{bnf} is a2011\kbd{bnfinit} structure, and calling \kbd{rnfkummer} to construct the extension.20122013\subsec{Relative equations, Galois conjugates}20142015\fun{GEN}{nfissquarefree}{GEN nf, GEN P} given $P$ a polynomial with2016coefficients in \var{nf}, return $1$ is $P$ is squarefree, and $0$2017otherwise. If is allowed (though less efficient) to replace \var{nf}2018by a monic \kbd{ZX} defining the field.20192020\fun{GEN}{rnfequationall}{GEN A, GEN B, long *pk, GEN *pLPRS} $A$ is either an2021\var{nf} type (corresponding to a number field $K$) or an irreducible \kbd{ZX}2022defining a number field $K$. $B$ is an irreducible polynomial in $K[X]$.2023Returns an absolute equation $C$ (over $\Q$) for the number field $K[X]/(B)$.2024$C$ is the characteristic polynomial of $b + k a$ for some roots $a$ of $A$2025and $b$ of $B$, and $k$ is a small rational integer. Set \kbd{*pk} to $k$.20262027If \kbd{pLPRS} is not \kbd{NULL} set it to $[h_0, h_1]$, $h_i\in \Q[X]$,2028where $h_0+h_1 Y$ is the last nonconstant polynomial in the pseudo-Euclidean2029remainder sequence attached to $A(Y)$ and $B(X-kY)$, leading to $C =2030\text{Res}_Y(A(Y), B(X-kY))$. In particular $a := -h_0/h_1$ is a root of $A$2031in $\Q[X]/(C)$, and $X - ka$ is a root of $B$.20322033\fun{GEN}{nf_rnfeq}{GEN A, GEN B} wrapper around \tet{rnfequationall} to allow2034mapping $K\to L$ (\kbd{eltup}) and converting elements of $L$2035between absolute and relative form (\kbd{reltoabs}, \kbd{abstorel}),2036\emph{without} computing a full \var{rnf} structure, which is useful if the2037relative integral basis is not required. In fact, since $A$ may be a \typ{POL}2038or an \var{nf}, the integral basis of the base field is not needed either. The2039return value is the same as \tet{rnf_get_map}. Shallow function.20402041\fun{GEN}{nf_rnfeqsimple}{GEN A, GEN B} as \tet{nf_rnfeq} except some2042fields are omitted, so that only the \tet{abstorel} operation is supported.2043Shallow function.20442045\fun{GEN}{eltabstorel}{GEN rnfeq, GEN x} \kbd{rnfeq} is as2046given by \tet{rnf_get_map} (but in this case \tet{rnfeltabstorel} is more2047robust), \tet{nf_rnfeq} or \tet{nf_rnfeqsimple}, return $x$ as an element2048of $L/K$, i.e. as a \typ{POLMOD} with \typ{POLMOD} coefficients. Shallow2049function.20502051\fun{GEN}{eltabstorel_lift}{GEN rnfeq, GEN x} same as \tet{eltabstorel},2052except that $x$ is returned in partially lifted form, i.e.~ as a2053\typ{POL} with \typ{POLMOD} coefficients.20542055\fun{GEN}{eltreltoabs}{GEN rnfeq, GEN x} \kbd{rnfeq} is as given by2056\tet{rnf_get_map} (but in this case \tet{rnfeltreltoabs} is more robust)2057or \tet{nf_rnfeq}, return $x$ in absolute form.20582059\fun{GEN}{nf_nfzk}{GEN nf, GEN rnfeq} \kbd{rnfeq} as2060given by \tet{nf_rnfeq}, \kbd{nf} a true \var{nf} structure, return a2061a suitable representation of \kbd{nf.zk} allowing quick2062computation of the map $K\to L$ by the function \tet{nfeltup}, \emph{without}2063computing a full \var{rnf} structure, which is useful if the relative2064integral basis is not required. The computed value is the same as in2065\tet{rnf_get_nfzk}. Shallow function.20662067\fun{GEN}{nfeltup}{GEN nf, GEN x, GEN zknf} \kbd{zknf} and is initialized by2068\tet{nf_nfzk} or \tet{rnf_get_nfzk} (but in this case \tet{rnfeltup} is more2069robust); \kbd{nf} is a true \var{nf} structure for $K$, returns $x \in K$ as2070a (lifted) element of $L$, in absolute form.20712072\fun{GEN}{rnfdisc_factored}{GEN nf, GEN pol, GEN *pd} variant of \kbd{rnfdisc}2073returning the relative discriminant ideal \emph{factorization}, and setting2074\kbd{*pd} to the discriminant as an element in $K^*/(K^*)^2$. Shallow2075function.20762077\fun{GEN}{Rg_nffix}{const char *f, GEN T, GEN c, int lift} given2078a \kbd{ZX} $T$ and a ``coefficient'' $c$ supposedly belonging to $\Q[y]/(T)$,2079check whether this is a the case and return a cleaned up version of $c$.2080The string $f$ is the calling function name, used to report errors.20812082This means that $c$ must be one of \typ{INT}, \typ{FRAC}, \typ{POL} in the2083variable $y$ with rational coefficients, or \typ{POLMOD} modulo $T$ which lift2084to a rational \typ{POL} as above. The cleanup consists in the following2085improvements:20862087\item \typ{POL} coefficients are reduced modulo $T$.20882089\item \typ{POL} and \typ{POLMOD} belonging to $\Q$ are converted to rationals,2090\typ{INT} or \typ{FRAC}.20912092\item if \kbd{lift} is nonzero, convert \typ{POLMOD} to \typ{POL},2093and otherwise convert \typ{POL} to \typ{POLMOD}s modulo $T$.20942095\fun{GEN}{RgX_nffix}{const char *f, GEN T, GEN P, int lift} check whether2096$P$ is a polynomials with coefficients in the number field defined by the2097absolute equation $T(y) = 0$, where $T$ is a \kbd{ZX} and returns a cleaned2098up version of $P$. This checks whether $P$ is indeed a \typ{POL}2099with variable compatible with coefficients in $\Q[y]/(T)$, i.e.2100\bprog2101varncmp(varn(P), varn(T)) < 02102@eprog\noindent and applies \tet{Rg_nffix} to each coefficient.21032104\fun{GEN}{RgV_nffix}{const char *f, GEN T, GEN P, int lift} as \tet{RgX_nffix}2105for a vector of coefficients.21062107\fun{GEN}{polmod_nffix}{const char *f, GEN rnf, GEN x, int lift} given2108a \typ{POLMOD} $x$ supposedly defining an element of \var{rnf}, check this2109and perform \tet{Rg_nffix} cleanups.21102111\fun{GEN}{polmod_nffix2}{const char *f, GEN T, GEN P, GEN x, int lift}2112as in \tet{polmod_nffix}, where the relative extension is explicitly2113defined as $L = (\Q[y]/(T))[x]/(P)$, instead of by an \kbd{rnf} structure.21142115\fun{long}{numberofconjugates}{GEN T, long pinit} returns a quick2116multiple for the number of $\Q$-automorphism of the (integral, monic)2117\typ{POL} $T$, from modular factorizations, starting from prime \kbd{pinit}2118(you can set it to $2$). This upper bounds often coincides with the2119actual number of conjugates. Of course, you should use \tet{nfgaloisconj}2120to be sure.21212122\fun{GEN}{nfroots_if_split}{GEN *pt, GEN T} let \kbd{*pt} point2123either to a number field structure or an irreducible \kbd{ZX}, defining2124a number field $K$. Given $T$ a monic squarefree polynomial with2125coefficients in $\Z_K$, return the list of roots of \kbd{pol} in $K$2126if the polynomial splits completely, and \kbd{NULL} otherwise.2127In other words, this checks whether $K[X]/(T)$ is normal over $K$ (hence2128Galois since $T$ is separable by assumption).21292130In the case where \kbd{*pT} is a \kbd{ZX}, the function has to compute2131internally a conditional \kbd{nf} attached to $K$ , whose \kbd{nf.zk} may not2132define the maximal order $\Z_K$ (see \kbd{nfroots}); \kbd{*pT} is then2133replaced by the conditional \kbd{nf} to avoid losing that information.21342135\subsec{Cyclotomics units}21362137\fun{GEN}{nfrootsof1}{GEN nf} returns a two-component vector $[w,z]$ where $w$2138is the number of roots of unity in the number field \var{nf}, and $z$ is a2139primitive $w$-th root of unity.21402141\fun{GEN}{nfcyclotomicunits}{GEN nf, GEN zu} where \kbd{zu} is as output by2142\kbd{nfrootsof1(nf)}, return the vector of the cyclotomic units in \kbd{nf}2143expressed over the integral basis.21442145\subsec{Obsolete routines}21462147Still provided for backward compatibility, but should not be used in new2148programs. They will eventually disappear.21492150\fun{GEN}{zidealstar}{GEN nf, GEN x} short for \kbd{Idealstar(nf,x,nf\_GEN)}21512152\fun{GEN}{zidealstarinit}{GEN nf, GEN x}2153short for \kbd{Idealstar(nf,x,nf\_INIT)}21542155\fun{GEN}{zidealstarinitgen}{GEN nf, GEN x}2156short for \kbd{Idealstar(nf,x,nf\_GEN|nf\_INIT)}21572158\fun{GEN}{idealstar0}{GEN nf, GEN x,long flag} short2159for \kbd{idealstarmod(nf, ideal, flag, NULL)}. Use \kbd{Idealstarmod} or2160\kbd{Idealstar}.21612162\fun{GEN}{bnrinit0}{GEN bnf,GEN ideal,long flag} short2163for \kbd{bnrinitmod(bnf,ideal,flag,NULL)}. Use \kbd{Buchray} or2164\kbd{Buchraymod}.21652166\fun{GEN}{buchimag}{GEN D, GEN c1, GEN c2, GEN gCO} short for2167\bprog2168Buchquad(D,gtodouble(c1),gtodouble(c2), /*ignored*/0)2169@eprog21702171\fun{GEN}{buchreal}{GEN D, GEN gsens, GEN c1, GEN c2, GEN RELSUP, long prec}2172short for2173\bprog2174Buchquad(D,gtodouble(c1),gtodouble(c2), prec)2175@eprog21762177The following use a naming scheme which is error-prone and not easily2178extensible; besides, they compute generators as per \kbd{nf\_GEN} and2179not \kbd{nf\_GENMAT}. Don't use them:21802181\fun{GEN}{isprincipalforce}{GEN bnf,GEN x}21822183\fun{GEN}{isprincipalgen}{GEN bnf, GEN x}21842185\fun{GEN}{isprincipalgenforce}{GEN bnf, GEN x}21862187\fun{GEN}{isprincipalraygen}{GEN bnr, GEN x}, use \tet{bnrisprincipal}.21882189\noindent Variants on \kbd{polred}: use \kbd{polredbest}.21902191\fun{GEN}{factoredpolred}{GEN x, GEN fa}21922193\fun{GEN}{factoredpolred2}{GEN x, GEN fa}21942195\fun{GEN}{smallpolred}{GEN x}21962197\fun{GEN}{smallpolred2}{GEN x}, use \tet{Polred}.21982199\fun{GEN}{polred0}{GEN x, long flag, GEN p}22002201\fun{GEN}{polredabs}{GEN x}22022203\fun{GEN}{polredabs2}{GEN x}22042205\fun{GEN}{polredabsall}{GEN x, long flun}22062207\noindent Superseded by \tet{bnrdisclist0}:22082209\fun{GEN}{discrayabslist}{GEN bnf,GEN L}22102211\fun{GEN}{discrayabslistarch}{GEN bnf, GEN arch, long bound}22122213\noindent Superseded by \tet{idealappr} (\fl is ignored)22142215\fun{GEN}{idealappr0}{GEN nf, GEN x, long flag}22162217\noindent Superseded by \kbd{bnrconductor\_raw} or \kbd{bnrconductormod}:22182219\fun{GEN}{bnrconductor_i}{GEN bnr, GEN H, long flag} shallow variant of2220\kbd{bnrconductor}.22212222\fun{GEN}{bnrconductorofchar}{GEN bnr, GEN chi}22232224\section{Galois extensions of $\Q$}22252226This section describes the data structure output by the function2227\tet{galoisinit}. This will be called a \kbd{gal} structure in2228the following.22292230\subsec{Extracting info from a \kbd{gal} structure}22312232The functions below expect a \kbd{gal} structure and are shallow. See the2233documentation of \tet{galoisinit} for the meaning of the member functions.22342235\fun{GEN}{gal_get_pol}{GEN gal} returns \kbd{gal.pol}22362237\fun{GEN}{gal_get_p}{GEN gal} returns \kbd{gal.p}22382239\fun{GEN}{gal_get_e}{GEN gal} returns the integer $e$ such that2240\kbd{gal.mod==gal.p\pow e}.22412242\fun{GEN}{gal_get_mod}{GEN gal} returns \kbd{gal.mod}.22432244\fun{GEN}{gal_get_roots}{GEN gal} returns \kbd{gal.roots}.22452246\fun{GEN}{gal_get_invvdm}{GEN gal} \kbd{gal[4]}.22472248\fun{GEN}{gal_get_den}{GEN gal} return \kbd{gal[5]}.22492250\fun{GEN}{gal_get_group}{GEN gal} returns \kbd{gal.group}.22512252\fun{GEN}{gal_get_gen}{GEN gal} returns \kbd{gal.gen}.22532254\fun{GEN}{gal_get_orders}{GEN gal} returns \kbd{gal.orders}.22552256\subsec{Miscellaneous functions}22572258\fun{GEN}{nfgaloispermtobasis}{GEN nf, GEN gal}2259return the images of the field generator by the automorphisms2260\kbd{gal.orders} expressed on the integral basis \kbd{nf.zk}.22612262\fun{GEN}{nfgaloismatrix}{GEN nf, GEN s} returns the \kbd{ZM} attached to2263the automorphism $s$, seen as a linear operator expressend on the number2264field integer basis. This allows to use2265\bprog2266M = nfgaloismatrix(nf, s);2267sx = ZM_ZC_mul(M, x); /* or RgM_RgC_mul(M, x) if x is not integral */2268@eprog\noindent2269instead of2270\bprog2271sx = nfgaloisapply(nf, s, x);2272@eprog\noindent2273for an algebraic integer $x$.22742275\fun{GEN}{nfgaloismatrixapply}{GEN nf, GEN M, GEN x} given an automorphism2276$M$ in \kbd{nfgaloismatrix} form, return the image of $x$ under the2277automorphism. Variant of \kbd{galoisapply}.22782279\section{Quadratic number fields and quadratic forms}22802281\subsec{Checks}22822283\fun{void}{check_quaddisc}{GEN x, long *s, long *mod4, const char *f}2284checks whether the \kbd{GEN} $x$ is a quadratic discriminant (\typ{INT},2285not a square, congruent to $0,1$ modulo $4$), and raise an exception2286otherwise. Set \kbd{*s} to the sign of $x$ and \kbd{*mod4} to $x$ modulo2287$4$ (0 or 1), unless \kbd{mod4} is \kbd{NULL}.22882289\fun{void}{check_quaddisc_real}{GEN x, long *mod4, const char *f} as2290\tet{check_quaddisc}; check that \kbd{signe(x)} is positive.22912292\fun{void}{check_quaddisc_imag}{GEN x, long *mod4, const char *f} as2293\tet{check_quaddisc}; check that \kbd{signe(x)} is negative.22942295\subsec{Class number}22962297The function \kbd{quadclassunit} uses index calculus and runs in2298subexponential time but it assumes the truth of the GRH. For imaginary2299quadratic orders, it is comparatively slow for \emph{small} values,2300say $|D|\leq 10^{18}$. Here are some alternatives:23012302\fun{GEN}{classno}{GEN D} corresponds to \kbd{qfbclassno(D,0)} and is only2303useful for $D < 0$, uses a baby-step giant-step technique and runs in time2304$O(D{1/4})$. The result is guaranteed correct for $|D| < 2\cdot 10^{10}$2305and fastest in that range. For larger values of $|D|$, the algorithm is no2306longer rigorous and may give incorrect results (we know no concrete example);2307it also becomes relatively less interesting compared to \kbd{quadclassunit}.23082309\fun{GEN}{classno2}{GEN D} corresponds to \kbd{qfbclassno(D,1)} and runs in2310time $O(D^{1/2})$; it is provided for testing purposes only: it is never2311competitive.23122313\fun{GEN}{hclassno}{GEN d} returns the Hurwitz-Kronecker class number $H(d)$.2314These play a central role in trace fomulas and are usually needed for many2315consecutive values of $d$. Thus, the function uses a cache so that later2316calls for \emph{small} consecutive values of $d$ are instantaneous, see2317\kbd{getcache}. Large values of $d$ ($d > 500000$) call \kbd{quadclassunit}2318individually and are not memoized.23192320\fun{GEN}{hclassno6}{GEN d} assuming $d > 0$, returns the integer $6 H(d)$.2321This is a low-level function behind \kbd{hclassno}.23222323\fun{ulong}{hclassno6u}{ulong d} assuming $d > 0$, returns the integer2324$6 H(d)$.23252326\subsec{\typ{QFB}}23272328The functions in this section operate on binary quadratic forms of type2329\typ{QFB}. When specified, a \typ{QFB} argument $q$ attached to an2330indefinite form can be replaced by the pair $[q, d]$ where the \typ{REAL}2331$d$ is Shanks's distance.23322333\fun{GEN}{qfb_1}{GEN q} given a \typ{QFB} $q$, return the unit form $q^0$.23342335\fun{int}{qfb_equal1}{GEN q} returns 1 if the \typ{QFB}2336$q$ is the unit form.23372338\subsubsec{Reduction}23392340\fun{GEN}{qfbred}{GEN x} reduction of a \typ{QFB} $x$. Also allow extended2341indefinite forms.23422343\fun{GEN}{qfbred_i}{GEN x} internal version of \kbd{qfbred}: assume $x$2344is a \typ{QFB}.23452346\subsubsec{Composition}23472348\fun{GEN}{qfbcomp}{GEN x, GEN y} compose the two \typ{QFB} $x$ and $y$ (with2349same discriminant), then reduce the result. This is the same as2350\kbd{gmul(x,y)}. Also allow extended indefinite forms.23512352\fun{GEN}{qfbcomp_i}{GEN x, GEN y} internal version of \kbd{qfbcomp}: assume2353$x$ and $y$ are \typ{QFB} of the same discriminant.23542355\fun{GEN}{qfbsqr}{GEN x} as \kbd{qfbcomp(x,x)}.23562357\fun{GEN}{qfbsqr_i}{GEN x} as \kbd{qfbcomp\_i(x,y)}.23582359\noindent Same as above, \emph{without} reducing the result:23602361\fun{GEN}{qfbcompraw}{GEN x, GEN y} compose two \typ{QFB}s,2362without reducing the result. Also allow extended indefinite forms.23632364\fun{GEN}{qfbcompraw_i}{GEN x, GEN y} internal version of \kbd{qfbcompraw}:2365assume $x$ and $y$ are \typ{QFB} of the same discriminant.23662367\subsubsec{Powering}23682369\fun{GEN}{qfbpow}{GEN x, GEN n} computes $x^n$ and reduce the result. Also2370allow extended indefinite forms.23712372\fun{GEN}{qfbpow_i}{GEN x, GEN n} internal version of \kbd{qfbcomp}. Assume2373$x$ is a \kbd{QFB}.23742375\fun{GEN}{qfbpowraw}{GEN x, long n} compute $x^n$ (pure composition, no2376reduction), for a \typ{QFB} $x$. Also allow indefinite forms.23772378\subsubsec{Order, discrete log}23792380\fun{GEN}{qfi_order}{GEN q, GEN o}2381assuming that the imaginary \typ{QFB} $q$ has order dividing $o$, compute its2382order in the class group. The order can be given in all formats allowed by2383generic discrete log functions, the preferred format being \kbd{[ord, fa]}2384(\typ{INT} and its factorization).23852386\fun{GEN}{qfi_log}{GEN a, GEN g, GEN o} given an imaginary \typ{QFB} $a$ and2387assuming2388that the \typ{QFB} $g$ has order $o$, compute an integer $k$ such that $a^k =2389g$. Return \kbd{cgetg(1, t\_VEC)} if there are no solutions. Uses a generic2390Pollig-Hellman algorithm, then either Shanks (small $o$) or Pollard rho2391(large $o$) method. The order can be given in all formats allowed by generic2392discrete log functions, the preferred format being \kbd{[ord, fa]}2393(\typ{INT} and its factorization).23942395\fun{GEN}{qfi_Shanks}{GEN a, GEN g, long n} given an imaginary \typ{QFB} $a$ and2396assuming that the \typ{QFB} $g$ has (small) order $n$, compute an integer $k$2397such that $a^k = g$. Return \kbd{cgetg(1, t\_VEC)} if there are no solutions.2398Directly uses Shanks algorithm, which is inefficient when $n$ is composite.23992400\subsubsec{Solve, Cornacchia}24012402The following functions underly \tet{qfbsolve}; $p$ denotes a prime number.24032404\fun{GEN}{qfisolvep}{GEN Q, GEN p} solves $Q(x,y) = p$ over the integers, for2405an imaginary \typ{QFB} $Q$. Return \kbd{gen\_0} if there are no solutions.24062407\fun{GEN}{qfrsolvep}{GEN Q, GEN p} solves $Q(x,y) = p$ over the integers, for2408a real \typ{QFB} $Q$. Return \kbd{gen\_0} if there are no solutions.24092410\fun{long}{cornacchia}{GEN d, GEN p, GEN *px, GEN *py} solves2411$x^2+ dy^2 = p$ over the integers, where $d > 0$. Return $1$ if there is a2412solution (and store it in \kbd{*x} and \kbd{*y}), $0$ otherwise.24132414\fun{long}{cornacchia2}{GEN d, GEN p, GEN *px, GEN *py} as \kbd{cornacchia},2415for the equation $x^2 + dy^2 = 4p$.24162417\fun{long}{cornacchia2_sqrt}{GEN d, GEN p, GEN b, GEN *px, GEN *py} as \kbd{cornacchia2},2418where $p > 2$ and $b$ is the smallest squareroot of $d$ modulo $p$.24192420\subsubsec{Prime forms}24212422\fun{GEN}{primeform_u}{GEN D, ulong p} \typ{QFB} of discriminant $D$2423whose first coefficient is the prime $p$, assuming $(D/p) \geq 0$.24242425\fun{GEN}{primeform}{GEN D, GEN p}24262427\subsec{Efficient real quadratic forms} Unfortunately, real \typ{QFB}s2428are very inefficient, and are only provided for backward compatibility.24292430\item they do not contain needed quantities, which are thus constantly2431recomputed (the discriminant square root $\sqrt{D}$ and its integer part),24322433\item the distance component is stored in logarithmic form, which involves2434computing one extra logarithm per operation. It is much more efficient2435to store its exponential, computed from ordinary multiplications and2436divisions (taking exponent overflow into account), and compute its logarithm2437at the very end.24382439Internally, we have two representations for real quadratic forms:24402441\item \tet{qfr3}, a container $[a,b,c]$ with at least 3 entries: the three2442coefficients; the idea is to ignore the distance component.24432444\item \tet{qfr5}, a container with at least 5 entries $[a,b,c,e,d]$: the2445three coefficients a \typ{REAL} $d$ and a \typ{INT} $e$ coding the distance2446component $2^{Ne} d$, in exponential form, for some large fixed $N$.24472448It is a feature that \kbd{qfr3} and \kbd{qfr5} have no specified length or2449type. It implies that a \kbd{qfr5} or \typ{QFB} will do whenever a \kbd{qfr3}2450is expected. Routines using these objects require a global context,2451provided by a \kbd{struct qfr\_data *}:2452\bprog2453struct qfr_data {2454GEN D; /* discriminant, t_INT */2455GEN sqrtD; /* sqrt(D), t_REAL */2456GEN isqrtD; /* floor(sqrt(D)), t_INT */2457};2458@eprog2459\fun{void}{qfr_data_init}{GEN D, long prec, struct qfr_data *S}2460given a discriminant $D > 0$, initialize $S$ for computations at precision2461\kbd{prec} ($\sqrt{D}$ is computed to that initial accuracy).24622463\noindent All functions below are shallow, and not stack clean.24642465\fun{GEN}{qfr3_comp}{GEN x, GEN y, struct qfr_data *S} compose two2466\kbd{qfr3}, reducing the result.24672468\fun{GEN}{qfr3_compraw}{GEN x, GEN y}2469as \kbd{qfr3\_comp}, without reducing the result.24702471\fun{GEN}{qfr3_pow}{GEN x, GEN n, struct qfr_data *S} compute $x^n$, reducing2472along the way.24732474\fun{GEN}{qfr3_red}{GEN x, struct qfr_data *S} reduce $x$.24752476\fun{GEN}{qfr3_rho}{GEN x, struct qfr_data *S} perform one reduction step;2477\kbd{qfr3\_red} just performs reduction steps until we hit a reduced form.24782479\fun{GEN}{qfr3_to_qfr}{GEN x, GEN d} recover an ordinary \typ{QFB} from the2480\kbd{qfr3} $x$, adding disriminant component $d$.24812482Before we explain \kbd{qfr5}, recall that it corresponds to an ideal, that2483reduction corresponds to multiplying by a principal ideal, and that the2484distance component is a clever way to keep track of these principal ideals.2485More precisely, reduction consists in a number of reduction steps,2486going from the form $(a,b,c)$ to $\rho(a,b,c) = (c, -b \mod 2c, *)$;2487the distance component is multiplied by (a floating point approximation to)2488$(b + \sqrt{D}) / (b - \sqrt{D})$.24892490\fun{GEN}{qfr5_comp}{GEN x, GEN y, struct qfr_data *S} compose two2491\kbd{qfr5}, reducing the result, and updating the distance component.24922493\fun{GEN}{qfr5_compraw}{GEN x, GEN y}2494as \kbd{qfr5\_comp}, without reducing the result.24952496\fun{GEN}{qfr5_pow}{GEN x, GEN n, struct qfr_data *S} compute $x^n$, reducing2497along the way.24982499\fun{GEN}{qfr5_red}{GEN x, struct qfr_data *S} reduce $x$.25002501\fun{GEN}{qfr5_rho}{GEN x, struct qfr_data *S} perform one reduction step.25022503\fun{GEN}{qfr5_dist}{GEN e, GEN d, long prec} decode the distance component2504from exponential (\kbd{qfr5}-specific) to logarithmic form (true Shanks's2505distance).25062507\fun{GEN}{qfr_to_qfr5}{GEN x, long prec} convert a real \typ{QFB} to a2508\kbd{qfr5} with initial trivial distance component ($= 1$).25092510\fun{GEN}{qfr5_to_qfr}{GEN x, GEN d}, assume $x$ is a \kbd{qfr5} and2511$d$ is \kbd{NULL} or the original distance component of some real \typ{QFB}.2512Convert $x$ to a \typ{QFB}, with the correct (logarithmic) distance component2513if $d$ is not \kbd{NULL}.25142515\section{Linear algebra over $\Z$}2516\subsec{Hermite and Smith Normal Forms}25172518\fun{GEN}{ZM_hnf}{GEN x} returns the upper triangular Hermite Normal Form of the2519\kbd{ZM} $x$ (removing $0$ columns), using the \tet{ZM_hnfall} algorithm. If you2520want the true HNF, use \kbd{ZM\_hnfall(x, NULL, 0)}.25212522\fun{GEN}{ZM_hnfmod}{GEN x, GEN d} returns the HNF of the \kbd{ZM} $x$2523(removing $0$ columns), assuming the \typ{INT} $d$ is a multiple of the2524determinant of $x$. This is usually faster than \tet{ZM_hnf} (and uses less2525memory) if the dimension is large, $> 50$ say.25262527\fun{GEN}{ZM_hnfmodid}{GEN x, GEN d} returns the HNF of the matrix $(x \mid d2528\text{Id})$ (removing $0$ columns), for a \kbd{ZM} $x$ and a \typ{INT} $d$.25292530\fun{GEN}{ZM_hnfmodprime}{GEN x, GEN p} returns the HNF of the matrix $(x \mid p2531\text{Id})$ (removing $0$ columns), for a \kbd{ZM} $x$ and a prime number $p$.2532The algorithm involves only $\F_p$-linear algebra and is is faster than2533\tet{ZM_hnfmodid} (which will call it when $d$ is prime).25342535\fun{GEN}{ZM_hnfmodall}{GEN x, GEN d, long flag} low-level function2536underlying the \kbd{ZM\_hnfmod} variants. If \kbd{flag} is $0$, calls2537\kbd{ZM\_hnfmod(x,d)}; \kbd{flag} is an or-ed combination of:25382539\item \tet{hnf_MODID} call \kbd{ZM\_hnfmodid} instead of \kbd{ZM\_hnfmod},25402541\item \tet{hnf_PART} return as soon as we obtain an upper triangular matrix,2542saving time. The pivots are nonnegative and give the diagonal of the true HNF,2543but the entries to the right of the pivots need not be reduced, i.e.~they may be2544large or negative.25452546\item \tet{hnf_CENTER} returns the centered HNF, where the entries to the2547right of a pivot $p$ are centered residues in $[-p/2, p/2[$, hence smallest2548possible in absolute value, but possibly negative.25492550\fun{GEN}{ZM_hnfmodall_i}{GEN x, GEN d, long flag} as \tet{ZM_hnfmodall}2551without final garbage collection. Not \kbd{gerepile}-safe.25522553\fun{GEN}{ZM_hnfall}{GEN x, GEN *U, long remove} returns the upper triangular2554HNF $H$ of the \kbd{ZM} $x$; if $U$ is not \kbd{NULL}, set if to the matrix2555$U$ such that $x U = H$. If $\kbd{remove} = 0$, $H$ is the true HNF,2556including $0$ columns; if $\kbd{remove} = 1$, delete the $0$ columns from $H$2557but do not update $U$ accordingly (so that the integer kernel may still be2558recovered): we no longer have $x U = H$; if $\kbd{remove} = 2$, remove $0$2559columns from $H$ and update $U$ so that $x U = H$. The matrix $U$ is square2560and invertible unless $\kbd{remove} = 2$.25612562This routine uses a naive algorithm which is potentially exponential in the2563dimension (due to coefficient explosion) but is fast in practice, although it2564may require lots of memory. The base change matrix $U$ may be very large,2565when the kernel is large.25662567\fun{GEN}{ZM_hnfall_i}{GEN x, GEN *U, long remove} as \tet{ZM_hnfall} without2568final garbage collection. Not \kbd{gerepile}-safe.25692570\fun{GEN}{ZM_hnfperm}{GEN A, GEN *ptU, GEN *ptperm} returns the hnf2571$H = P A U$ of the matrix $P A$, where $P$ is a suitable permutation matrix,2572and $U\in \text{Gl}_n(\Z)$. $P$ is chosen so as to (heuristically) minimize the2573size of $U$; in this respect it is less efficient than \kbd{ZM\_hnflll}2574but usually faster. Set \kbd{*ptU} to $U$ and \kbd{*pterm} to a \typ{VECSMALL}2575representing the row permutation attached to $P = (\delta_{i,\kbd{perm}[i]}$.2576If \kbd{ptU} is set to \kbd{NULL}, $U$ is not computed, saving some time;2577although useless, setting \kbd{ptperm} to \kbd{NULL} is also allowed.25782579\fun{GEN}{ZM_hnf_knapsack}{GEN x} given a \kbd{ZM} $x$, compute its2580HNF $h$. Return $h$ if it has the knapsack property: every column contains2581only zeroes and ones and each row contains a single $1$;2582return \kbd{NULL} otherwise. Not suitable for gerepile.25832584\fun{GEN}{ZM_hnflll}{GEN x, GEN *U, int remove} returns the HNF $H$ of the2585\kbd{ZM} $x$; if $U$ is not \kbd{NULL}, set if to the matrix $U$ such that $x2586U = H$. The meaning of \kbd{remove} is the same as in \tet{ZM_hnfall}.25872588This routine uses the \idx{LLL} variant of Havas, Majewski and Mathews, which is2589polynomial time, but rather slow in practice because it uses an exact LLL2590over the integers instead of a floating point variant; it uses polynomial2591space but lots of memory is needed for large dimensions, say larger than 300.2592On the other hand, the base change matrix $U$ is essentially optimally small2593with respect to the $L_2$ norm.25942595\fun{GEN}{ZM_hnfcenter}{GEN M}. Given a \kbd{ZM} in HNF $M$, update it in2596place so that nondiagonal entries belong to a system of \emph{centered}2597residues. Not suitable for gerepile.25982599Some direct applications: the following routines apply to upper triangular2600integral matrices; in practice, these come from HNF algorithms.26012602\fun{GEN}{hnf_divscale}{GEN A, GEN B,GEN t} $A$ an upper triangular \kbd{ZM},2603$B$ a \kbd{ZM}, $t$ an integer, such that $C := tA^{-1}B$ is integral.2604Return $C$.26052606\fun{GEN}{hnf_invscale}{GEN A, GEN t} $A$ an upper triangular \kbd{ZM},2607$t$ an integer such that $C := tA^{-1}$ is integral. Return $C$. Special case2608of \tet{hnf_divscale} when $B$ is the identity matrix.26092610\fun{GEN}{hnf_solve}{GEN A, GEN B} $A$ a \kbd{ZM} in upper HNF (not2611necessarily square), $B$ a \kbd{ZM} or \kbd{ZC}. Return $A^{-1}B$ if it is2612integral, and \kbd{NULL} if it is not.26132614\fun{GEN}{hnf_invimage}{GEN A, GEN b} $A$ a \kbd{ZM} in upper HNF2615(not necessarily square), $b$ a \kbd{ZC}. Return $A^{-1}B$ if it is2616integral, and \kbd{NULL} if it is not.26172618\fun{int}{hnfdivide}{GEN A, GEN B} $A$ and $B$ are two upper triangular2619\kbd{ZM}. Return $1$ if $A^{-1} B$ is integral, and $0$ otherwise.26202621\misctitle{Smith Normal Form}26222623\fun{GEN}{ZM_snf}{GEN x} returns the Smith Normal Form (vector of2624elementary divisors) of the \kbd{ZM} $x$.26252626\fun{GEN}{ZM_snfall}{GEN x, GEN *U, GEN *V} returns2627\kbd{ZM\_snf(x)} and sets $U$ and $V$ to unimodular matrices such that $U\,2628x\, V = D$ (diagonal matrix of elementary divisors). Either (or both) $U$ or2629$V$ may be \kbd{NULL} in which case the corresponding matrix is not computed.26302631\fun{GEN}{ZV_snfall}{GEN d, GEN *U, GEN *V} here $d$ is a \kbd{ZV}; same as2632\tet{ZM_snfall} applied to \kbd{diagonal(d)}, but faster.26332634\fun{GEN}{ZM_snfall_i}{GEN x, GEN *U, GEN *V, long flag} low level version of2635\kbd{ZM\_snfall}:26362637\item if the first bit of \fl\ is $0$, return a diagonal matrix (as in2638\kbd{ZM\_snfall}), else a vector of elementary divisors (as in2639\kbd{ZM\_snf}).26402641\item if the second bit of \fl\ is $1$, assume that $x$ is invertible2642and allow $U$ and $V$ to have determinant congruent to $1$ modulo $d$,2643where $d$ is the largest elementary divisor of $x$. Rationale: the finite2644group $G = \Z^n/\Im x$ has exponent $d$ and we are only interested2645in the action of $U$, $V$ as they act on $G$ not in genuine unimodular2646matries. (See \kbd{ZM\_snf\_group}.)26472648\fun{void}{ZM_snfclean}{GEN d, GEN U, GEN V} assuming $d$, $U$, $V$ come2649from \kbd{d = ZM\_snfall(x, \&U, \&V)}, where $U$ or $V$ may be \kbd{NULL},2650cleans up the output in place. This means that elementary divisors equal to 12651are deleted and $U$, $V$ are updated. The output is not suitable for2652\kbd{gerepileupto}.26532654\fun{void}{ZV_snf_trunc}{GEN D} given a vector $D$ of elementary divisors2655(i.e. a \kbd{ZV} such that $d_i \mid d_{i+1}$), truncate it \emph{in place}2656to leave out the trivial divisors (equal to $1$).26572658\fun{GEN}{ZM_snf_group}{GEN H, GEN *U, GEN *Uinv} this function computes data2659to go back and forth between an abelian group (of finite type) given by2660generators and relations, and its canonical SNF form. Given an abstract2661abelian group with generators $g = (g_1,\dots,g_n)$ and a vector2662$X=(x_i)\in\Z^n$, we write $g X$ for the group element $\sum_i x_i g_i$;2663analogously if $M$ is an $n\times r$ integer matrix $g M$ is a vector2664containing $r$ group elements. The group neutral element is $0$; by abuse of2665notation, we still write $0$ for a vector of group elements all equal to the2666neutral element. The input is a full relation matrix $H$ among the2667generators, i.e. a \kbd{ZM} (not necessarily square) such that $gX = 0$ for2668some $X\in\Z^n$ if and only if $X$ is in the integer image of $H$, so that2669the abelian group is isomorphic to $\Z^n/\text{Im} H$. \emph{The routine2670assumes that $H$ is in HNF;} replace it by its HNF if it is not the case. (Of2671course this defines the same group.)26722673Let $G$ a minimal system of generators in SNF for our abstract group:2674if the $d_i$ are the elementary divisors ($\dots \mid d_2\mid d_1$), each2675$G_i$ has either infinite order ($d_i = 0$) or order $d_i > 1$. Let $D$2676the matrix with diagonal $(d_i)$, then2677$$G D = 0,\quad G = g U_{\text{inv}},\quad g = G U,$$2678for some integer matrices $U$ and $U_{\text{inv}}$. Note that these are not2679even square in general; even if square, there is no guarantee that these are2680unimodular: they are chosen to have minimal entries given the known relations2681in the group and only satisfy $D \mid (U U_{\text{inv}} - \text{Id})$ and $H2682\mid (U_{\text{inv}}U - \text{Id})$.26832684The function returns the vector of elementary divisors $(d_i)$; if \kbd{U} is2685not \kbd{NULL}, it is set to $U$; if \kbd{Uinv} is not \kbd{NULL} it is2686set to $U_{\text{inv}}$. The function is not memory clean.26872688\fun{GEN}{ZV_snf_group}{GEN d, GEN *newU, GEN *newUi}, here $d$ is a2689\kbd{ZV}; same as \tet{ZM_snf_group} applied to \kbd{diagonal(d)}, but faster.26902691\fun{GEN}{ZV_snf_gcd}{GEN v, GEN N} given a vector $v$ of integers and a2692positive integer $N$, return the vector whose entries are the gcds2693$(v[i],N)$. Use case: if $v$ gives the cyclic components for some Abelian2694group $G$ of finite type, then this returns the structure of the finite2695groupe $G/G^N$.26962697The following routines underly the various \tet{matrixqz} variants.2698In all case the $m\times n$ \typ{MAT} $x$ is assumed to have rational2699(\typ{INT} and \typ{FRAC}) coefficients27002701\fun{GEN}{QM_ImQ}{GEN x} returns a basis for2702$\text{Im}_\Q x \cap \Z^n$.27032704\fun{GEN}{QM_ImZ}{GEN x} returns a basis for2705$\text{Im}_\Z x \cap \Z^n$.27062707\fun{GEN}{QM_ImQ_hnf}{GEN x} returns an HNF basis for2708$\text{Im}_\Q x \cap \Z^n$.27092710\fun{GEN}{QM_ImZ_hnf}{GEN x} returns an HNF basis for2711$\text{Im}_\Z x \cap \Z^n$.27122713\fun{GEN}{QM_ImQ_hnfall}{GEN A, GEN *pB, long remove} as \tet{QM_ImQ_hnf},2714further returning the transformation matrix as in \tet{ZM_hnfall}.27152716\fun{GEN}{QM_ImZ_hnfall}{GEN A, GEN *pB, long remove} as \tet{QM_ImZ_hnf},2717further returning the transformation matrix as in \tet{ZM_hnfall}.27182719\fun{GEN}{QM_ImQ_all}{GEN A, GEN *pB, long remove, long hnf} as \tet{QM_ImQ},2720further returning the transformation matrix as in \tet{ZM_hnfall}, and2721returning an HNF basis if \kbd{hnf} is nonzero.27222723\fun{GEN}{QM_ImZ_all}{GEN A, GEN *pB, long remove, long hnf} as \tet{QM_ImZ},2724further returning the transformation matrix as in \tet{ZM_hnfall}, and2725returning an HNF basis if \kbd{hnf} is nonzero.27262727\fun{GEN}{QM_minors_coprime}{GEN x, GEN D}, assumes $m\geq n$, and returns2728a matrix in $M_{m,n}(\Z)$ with the same $\Q$-image as $x$, such that2729the GCD of all $n\times n$ minors is coprime to $D$; if $D$ is \kbd{NULL},2730we want the GCD to be $1$.2731\smallskip27322733The following routines are simple wrappers around the above ones and are2734normally useless in library mode:27352736\fun{GEN}{hnf}{GEN x} checks whether $x$ is a \kbd{ZM}, then calls \tet{ZM_hnf}.2737Normally useless in library mode.27382739\fun{GEN}{hnfmod}{GEN x, GEN d} checks whether $x$ is a \kbd{ZM}, then calls2740\tet{ZM_hnfmod}. Normally useless in library mode.27412742\fun{GEN}{hnfmodid}{GEN x,GEN d} checks whether $x$ is a \kbd{ZM}, then calls2743\tet{ZM_hnfmodid}. Normally useless in library mode.27442745\fun{GEN}{hnfall}{GEN x} calls2746\kbd{ZM\_hnfall(x, \&U, 1)} and returns $[H, U]$. Normally useless in library2747mode.27482749\fun{GEN}{hnflll}{GEN x} calls \kbd{ZM\_hnflll(x, \&U, 1)} and returns $[H,2750U]$. Normally useless in library mode.27512752\fun{GEN}{hnfperm}{GEN x} calls \kbd{ZM\_hnfperm(x, \&U, \&P)} and returns2753$[H, U, P]$. Normally useless in library mode.27542755\fun{GEN}{smith}{GEN x} checks whether $x$ is a \kbd{ZM}, then calls2756\kbd{ZM\_snf}. Normally useless in library mode.27572758\fun{GEN}{smithall}{GEN x} checks whether $x$ is a \kbd{ZM}, then calls2759\kbd{ZM\_snfall(x, \&U, \&V)} and returns $[U,V,D]$. Normally useless in2760library mode.27612762\noindent Some related functions over $K[X]$, $K$ a field:27632764\fun{GEN}{gsmith}{GEN A} the input matrix must be square, returns the2765elementary divisors.27662767\fun{GEN}{gsmithall}{GEN A} the input matrix must be square, returns the2768$[U,V,D]$, $D$ diagonal, such that $UAV = D$.27692770\fun{GEN}{RgM_hnfall}{GEN A, GEN *pB, long remove} analogous to \tet{ZM_hnfall}.27712772\fun{GEN}{smithclean}{GEN z} cleanup the output of \kbd{smithall} or2773\kbd{gsmithall} (delete elementary divisors equal to $1$, updating base2774change matrices).27752776\subsec{The LLL algorithm}\sidx{LLL}27772778The basic GP functions and their immediate variants are normally not very2779useful in library mode. We briefly list them here for completeness, see the2780documentation of \kbd{qflll} and \kbd{qflllgram} for details:27812782\item \fun{GEN}{qflll0}{GEN x, long flag}27832784\fun{GEN}{lll}{GEN x} \fl = 027852786\fun{GEN}{lllint}{GEN x} \fl = 127872788\fun{GEN}{lllkerim}{GEN x} \fl = 427892790\fun{GEN}{lllkerimgen}{GEN x} \fl = 527912792\fun{GEN}{lllgen}{GEN x} \fl = 827932794\item \fun{GEN}{qflllgram0}{GEN x, long flag}27952796\fun{GEN}{lllgram}{GEN x} \fl = 027972798\fun{GEN}{lllgramint}{GEN x} \fl = 127992800\fun{GEN}{lllgramkerim}{GEN x} \fl = 428012802\fun{GEN}{lllgramkerimgen}{GEN x} \fl = 528032804\fun{GEN}{lllgramgen}{GEN x} \fl = 828052806\smallskip28072808The basic workhorse underlying all integral and floating point LLLs is28092810\fun{GEN}{ZM_lll}{GEN x, double D, long flag}, where $x$ is a \kbd{ZM};2811$D \in ]1/4,1[$ is the Lov\'{a}sz constant determining the frequency of2812swaps during the algorithm: a larger values means better guarantees for2813the basis (in principle smaller basis vectors) but longer running times2814(suggested value: $D = 0.99$).28152816\misctitle{Important} This function does not collect garbage and its output2817is not suitable for either \kbd{gerepile} or \kbd{gerepileupto}. We expect2818the caller to do something simple with the output (e.g. matrix2819multiplication), then collect garbage immediately.28202821\noindent\kbd{flag} is an or-ed combination of the following flags:28222823\item \tet{LLL_GRAM}. If set, the input matrix $x$ is the Gram matrix ${}^t2824v v$ of some lattice vectors $v$.28252826\item \tet{LLL_INPLACE}. Incompatible with \kbd{LLL\_GRAM}. If unset, we2827return the base change matrix $U$, otherwise the transformed matrix $x U$.2828Implies \tet{LLL_IM} (see below).28292830\item \tet{LLL_KEEP_FIRST}. The first vector in the output basis is the same2831one as was originally input. Provided this is a shortest nonzero vector of2832the lattice, the output basis is still LLL-reduced. This is used to reduce2833maximal orders of number fields with respect to the $T_2$ quadratic form, to2834ensure that the first vector in the output basis corresponds to $1$ (which is2835a shortest vector).28362837\item \tet{LLL_COMPATIBLE}. DEPRECATED. This is now a no-op.28382839The last three flags are mutually exclusive, either 0 or a single one must be2840set:28412842\item \tet{LLL_KER} If set, only return a kernel basis $K$ (not LLL-reduced).28432844\item \tet{LLL_IM} If set, only return an LLL-reduced lattice basis $T$.2845(This is implied by \tet{LLL_INPLACE}).28462847\item \tet{LLL_ALL} If set, returns a 2-component vector $[K, T]$2848corresponding to both kernel and image.284928502851\fun{GEN}{lllfp}{GEN x, double D, long flag} is a variant for matrices2852with inexact entries: $x$ is a matrix with real coefficients (types2853\typ{INT}, \typ{FRAC} and \typ{REAL}), $D$ and $\fl$ are as in \tet{ZM_lll}.2854The matrix is rescaled, rounded to nearest integers, then fed to2855\kbd{ZM\_lll}. The flag \kbd{LLL\_INPLACE} is still accepted but less useful2856(it returns an LLL-reduced basis attached to rounded input, instead of an2857exact base change matrix).28582859\fun{GEN}{ZM_lll_norms}{GEN x, double D, long flag, GEN *ptB} slightly more2860general version of \kbd{ZM\_lll}, setting \kbd{*ptB} to a vector containing2861the squared norms of the Gram-Schmidt vectors $(b_i^*)$ attached to the2862output basis $(b_i)$, $b_i^* = b_i + \sum_{j < i} \mu_{i,j} b_j^*$.28632864\fun{GEN}{lllintpartial_inplace}{GEN x} given a \kbd{ZM} $x$ of maximal rank,2865returns a partially reduced basis $(b_i)$ for the space spanned by the2866columns of $x$: $|b_i \pm b_j| \geq |b_i|$ for any two distinct basis vectors2867$b_i$, $b_j$. This is faster than the LLL algorithm, but produces much larger2868bases.28692870\fun{GEN}{lllintpartial}{GEN x} as \kbd{lllintpartial\_inplace}, but returns2871the base change matrix $U$ from the canonical basis to the $b_i$, i.e. $x U$2872is the output of \kbd{lllintpartial\_inplace}.28732874\fun{GEN}{RM_round_maxrank}{GEN G} given a matrix $G$ with real floating2875point entries and independent columns, let $G_e$ be the2876rescaled matrix $2^e G$ rounded to nearest integers, for $e \geq 0$.2877Finds a small $e$ such that the rank of $G_e$ is equal to the rank of $G$2878(its number of columns) and return $G_e$. This is useful as a preconditioning2879step to speed up LLL reductions, see \tet{nf_get_Gtwist}.2880Suitable for \kbd{gerepileupto}, but does not collect garbage.28812882\fun{GEN}{Hermite_bound}{long n, long prec}2883return a majoration of $\gamma_n^n$ where $\gamma_n$ is the2884Hermite constant for lattices of dimension $n$. The bound is sharp in2885dimension $n \leq 8$ and $n = 24$.28862887\subsec{Linear dependencies}28882889The following functions underly the \kbd{lindep} GP function:28902891\fun{GEN}{lindep}{GEN v} real/complex entries, guess that about only the289280\% leading bits of the input are correct.28932894\fun{GEN}{lindep_bit}{GEN v, long b} real/complex entries, explicit form of the2895above: multiply the input by $2^b$ and round to nearest integer before2896looking for a linear dependency. Truncating dubious bits allows to find2897better relations.28982899\fun{GEN}{lindepfull_bit}{GEN v, long b} as \kbd{lindep\_bit} but return a2900matrix $M$ with $n = \#v$ columns and $r$ rows, with $r = n+1$ (if $v$ is2901real) or $n+2$ (general case) which is an LLL-reduced basis of the lattice2902formed by concatenating vertically an identity matrix and the floor of $2^b2903\kbd{real}(v)$ and $2^b \kbd{imag}(v)$ if $r = n+2$. The first $n$ rows of2904$M$ potentially correspond to relations: whenever the last $r-n$ entries of a2905column are small. The function \kbd{lindep\_bit} essentially returns the2906first column of $M$ truncated to $n$ components.29072908\fun{GEN}{lindep_padic}{GEN v} $p$-adic entries.29092910\fun{GEN}{lindep_Xadic}{GEN v} polynomial entries.29112912\fun{GEN}{deplin}{GEN v} returns a nonzero kernel vector for a \typ{MAT} input.29132914Deprecated routine:29152916\fun{GEN}{lindep2}{GEN x, long dig} analogous to \kbd{lindep\_bit}, with2917\kbd{dig} counting decimal digits.29182919\subsec{Reduction modulo matrices}29202921\fun{GEN}{ZC_hnfremdiv}{GEN x, GEN y, GEN *Q} assuming $y$ is an2922invertible \kbd{ZM} in HNF and $x$ is a \kbd{ZC}, returns the \kbd{ZC} $R$2923equal to $x$ mod $y$ (whose $i$-th entry belongs to $[-y_{i,i}/2, y_{i,i}/2[$).2924Stack clean \emph{unless} $x$ is already reduced (in which case, returns $x$2925itself, not a copy). If $Q$ is not \kbd{NULL}, set it to the \kbd{ZC} such that2926$x = yQ + R$.29272928\fun{GEN}{ZM_hnfdivrem}{GEN x, GEN y, GEN *Q} reduce2929each column of the \kbd{ZM} $x$ using \kbd{ZC\_hnfremdiv}. If $Q$ is not2930\kbd{NULL}, set it to the \kbd{ZM} such that $x = yQ + R$.29312932\fun{GEN}{ZC_hnfrem}{GEN x, GEN y} alias for \kbd{ZC\_hnfremdiv(x,y,NULL)}.29332934\fun{GEN}{ZM_hnfrem}{GEN x, GEN y} alias for \kbd{ZM\_hnfremdiv(x,y,NULL)}.29352936\fun{GEN}{ZC_reducemodmatrix}{GEN v, GEN y} Let $y$ be a ZM, not necessarily2937square, which is assumed to be LLL-reduced (otherwise, very poor reduction is2938expected). Size-reduces the ZC $v$ modulo the $\Z$-module $Y$ spanned by $y$2939: if the columns of $y$ are denoted by $(y_1,\dots, y_{n-1})$, we return $y_n2940\equiv v$ modulo $Y$, such that the Gram-Schmidt coefficients $\mu_{n,j}$ are2941less than $1/2$ in absolute value for all $j < n$. In short, $y_n$ is almost2942orthogonal to $Y$.29432944\fun{GEN}{ZM_reducemodmatrix}{GEN v, GEN y} Let $y$ be as in2945\tet{ZC_reducemodmatrix}, and $v$ be a ZM. This returns a matrix $v$ which is2946congruent to $v$ modulo the $\Z$-module spanned by $y$, whose columns are2947size-reduced. This is faster than repeatedly calling \tet{ZC_reducemodmatrix}2948on the columns since most of the Gram-Schmidt coefficients can be reused.29492950\fun{GEN}{ZC_reducemodlll}{GEN v, GEN y} Let $y$ be an arbitrary ZM,2951LLL-reduce it then call \tet{ZC_reducemodmatrix}.29522953\fun{GEN}{ZM_reducemodlll}{GEN v, GEN y} Let $y$ be an arbitrary ZM,2954LLL-reduce it then call \tet{ZM_reducemodmatrix}.29552956Besides the above functions, which were specific to integral input, we also2957have:29582959\fun{GEN}{reducemodinvertible}{GEN x, GEN y} $y$ is an invertible matrix2960and $x$ a \typ{COL} or \typ{MAT} of compatible dimension.2961Returns $x - y\lfloor y^{-1}x \rceil$, which has small entries and differs2962from $x$ by an integral linear combination of the columns of $y$. Suitable2963for \kbd{gerepileupto}, but does not collect garbage.29642965\fun{GEN}{closemodinvertible}{GEN x, GEN y} returns $x -2966\kbd{reducemodinvertible}(x,y)$, i.e. an integral linear combination of2967the columns of $y$, which is close to $x$.29682969\fun{GEN}{reducemodlll}{GEN x,GEN y} LLL-reduce the nonsingular \kbd{ZM} $y$2970and call \kbd{reducemodinvertible} to find a small representative of $x$ mod $y2971\Z^n$. Suitable for \kbd{gerepileupto}, but does not collect garbage.29722973\section{Finite abelian groups and characters}29742975\subsec{Abstract groups}29762977A finite abelian group $G$ in GP format is given by its Smith2978Normal Form as a pair $[h,d]$ or triple $[h,d,g]$.2979Here $h$ is the cardinality of $G$, $(d_i)$ is the vector of elementary2980divisors, and $(g_i)$ is a vector of generators. In short,2981$G = \oplus_{i\leq n} (\Z/d_i\Z) g_i$, with $d_n \mid \dots \mid d_2 \mid d_1$2982and $\prod d_i = h$.29832984Let $e(x) := \exp(2i\pi x)$. For ease of exposition, we restrict to2985complex-valued characters, but everything applies to more general fields $K$2986where $e$ denotes a morphism $(\Q,+) \to (K^*,\times)$ such that $e(a/b)$2987denotes a $b$-th root of unity.29882989A \tev{character} on the abelian group $\oplus (\Z/d_j\Z) g_j$2990is given by a row vector $\chi = [a_1,\ldots,a_n]$ such that2991$\chi(\prod g_j^{n_j}) = e(\sum a_j n_j / d_j)$.29922993\fun{GEN}{cyc_normalize}{GEN d} shallow function. Given a vector2994$(d_i)_{i \leq n}$2995of elementary divisors for a finite group (no $d_i$ vanish), returns the vector2996$D = [1]$ if $n = 0$ (trivial group) and2997$[d_1, d_1/d_2, \dots, d_1/d_n]$ otherwise. This will allow to define2998characters as $\chi(\prod g_j^{x_j}) = e(\sum_j x_j a_j D_j / D_1)$,2999see \tet{char_normalize}.30003001\fun{GEN}{char_normalize}{GEN chi, GEN ncyc} shallow function. Given a3002character \kbd{chi} $ = (a_j)$ and \var{ncyc} from \kbd{cyc\_normalize}3003above, returns the normalized representation $[d, (n_j)]$, such that3004$\chi(\prod g_j^{x_j}) = \zeta_d^{\sum_j n_j x_j}$, where $\zeta_d =3005e(1/d)$ and $d$ is \emph{minimal}. In particular, $d$ is the order3006of \kbd{chi}. Shallow function.30073008\fun{GEN}{char_simplify}{GEN D, GEN N} given a quasi-normalized character3009$[D, (N_j)]$ such that $\chi(\prod g_j^{x_j}) = \zeta_D^{\sum_j N_j x_j}$,3010but where we only assume that $D$ is a multiple of the character3011order, return a normalized character $[d, (n_j)]$ with $d$ \emph{minimal}.3012Shallow function.30133014\fun{GEN}{char_denormalize}{GEN cyc, GEN d, GEN n} given a normalized3015representation $[d, n]$ (where $d$ need not be minimal) of a character on the3016abelian group with abelian divisors \kbd{cyc}, return the attached character3017(where the image of each generator $g_i$ is given in terms of roots3018of unity of different orders $\kbd{cyc}[i]$).30193020\fun{GEN}{charconj}{GEN cyc, GEN chi} return the complex conjugate of3021\kbd{chi}.30223023\fun{GEN}{charmul}{GEN cyc, GEN a, GEN b} return the product character $a\times3024b$.30253026\fun{GEN}{chardiv}{GEN cyc, GEN a, GEN b} returns the character3027$a / b = a \times \overline{b}$.30283029\fun{int}{char_check}{GEN cyc, GEN chi} return $1$ if \kbd{chi} is a character3030compatible with cyclic factors \kbd{cyc}, and $0$ otherwise.30313032\fun{GEN}{cyc2elts}{GEN d} given a \typ{VEC} $d = (d_1,\dots,d_n)$3033of nonnegative integers, return the vector of all \typ{VECSMALL}s of length3034$n$ whose $i$-th entry lies in $[0,d_i[$. Assumes that the product3035of the $d_i$ fits in a \kbd{long}.30363037\fun{long}{zv_cyc_minimize}{GEN d, GEN c, GEN coprime} given $d =3038(d_1,\dots,d_n)$, $d_n \mid \dots \mid d_1 \neq 0$ a list of elementary3039divisors for a finite abelian group as a \typ{VECSMALL}, given $c =3040[g_1,\dots,g_n]$ representing an element in the group, and given a mask3041\kbd{coprime} (as from \kbd{coprimes\_zv}$(o)$) representing a list of3042forbidden congruence classes modulo $o$, return an integer $k$ such that3043\kbd{coprime}$[k \% o]$ is nonzero and $k \cdot c$ is lexicographically3044minimal. For instance, if $c$ is attached to a Dirichlet character $\chi$ of3045order $o$ via the usual identification $\chi(g_i) = \zeta_{g_i}^{c_i}$, then3046$\chi^k$ is a ``canonical'' representative in the Galois orbit of $\chi$.30473048\fun{long}{zv_cyc_minimal}{GEN d, GEN c, GEN coprime} return $1$ if3049\tet{zv_cyc_minimize} would return $k = 1$, i.e. $c$ is already the canonical3050representative for the attached character orbit.30513052\subsec{Dirichlet characters}30533054The functions in this section are specific to characters on $(\Z/N\Z)^*$.3055The argument $G$ is a special \kbd{bid} structure as returned by3056\kbd{znstar0(N, nf\_INIT)}. In this case, there are additional ways3057to input character via Conrey's representation. The character \kbd{chi} is3058either a \typ{INT} (Conrey label), a \typ{COL} (a Conrey logarithm) or a3059\typ{VEC} (generic character on \kbd{bid.gen} as explained in the previous3060subsection). The following low-level functions are called by GP's generic3061character functions.30623063\fun{int}{zncharcheck}{GEN G, GEN chi} return $1$ if \kbd{chi} is3064a valid character and $0$ otherwise.30653066\fun{GEN}{zncharconj}{GEN G, GEN chi} as \kbd{charconj}.30673068\fun{GEN}{znchardiv}{GEN G, GEN a, GEN b} as \kbd{chardiv}.30693070\fun{GEN}{zncharker}{GEN G, GEN chi} as \kbd{charker}.30713072\fun{GEN}{znchareval}{GEN G, GEN chi, GEN n, GEN z} as \kbd{chareval}.30733074\fun{GEN}{zncharmul}{GEN G, GEN a, GEN b} as \kbd{charmul}.30753076\fun{GEN}{zncharpow}{GEN G, GEN a, GEN n} as \kbd{charpow}.30773078\fun{GEN}{zncharorder}{GEN G, GEN chi} as \kbd{charorder}.30793080The following functions handle characters in Conrey notation (attached to3081Conrey generators, not \kbd{G.gen}):30823083\fun{int}{znconrey_check}{GEN cyc, GEN chi} return $1$ if \kbd{chi} is3084a valid Conrey logarithm and $0$ otherwise.30853086\fun{GEN}{znconrey_normalized}{GEN G, GEN chi} return normalized character3087attached to \kbd{chi}, as in \kbd{char\_normalize} but on Conrey generators.30883089\fun{GEN}{znconreyfromchar}{GEN G, GEN chi} return Conrey logarithm3090attached to the generic (\typ{VEC}, on \kbd{G.gen})30913092\fun{GEN}{znconreyfromchar_normalized}{GEN G, GEN chi} return normalized3093Conrey character attached to the generic (\typ{VEC}, on \kbd{G.gen})3094character \kbd{chi}.30953096\fun{GEN}{znconreylog_normalize}{GEN G, GEN m} given a Conrey logarithm $m$3097(\typ{COL}), return the attached normalized Conrey character, as in3098\kbd{char\_normalize} but on Conrey generators.30993100\fun{GEN}{znchar_quad}{GEN G, GEN D} given a nonzero \typ{INT} $D$ congruent3101to $0,1$ mod $4$, return $(D/.)$ as a character modulo $N$, given by a Conrey3102logarithm (\typ{COL}). Assume that $|D|$ divides $N$.31033104\fun{GEN}{Zideallog}{GEN G, GEN x} return the \kbd{znconreylog} of $x$3105expressed on \kbd{G.gen}, i.e. the ordinary discrete logarithm3106from \kbd{ideallog}.31073108\fun{GEN}{ncharvecexpo}{GEN G, GEN nchi}3109given \kbd{nchi} $= [d,n]$ a quasi-normalized character ($d$3110may be a multiple of the character order), i.e. $\chi(g_i) = e(n[i]/d)$3111for all Conrey or SNF generators $g_i$ (as usual, we use SNF generators3112if $n$ is a \typ{VEC} and the Conrey generators otherwise).3113Return a \typ{VECSMALL} $v$ such that $v[i] = -1$ if $(i,N) > 1$ else3114$\chi(i) = e(v[i]/d)$, $1 \leq i \leq N$.31153116\section{Central simple algebras}31173118\subsec{Initialization}31193120Low-level routines underlying \kbd{alginit}.31213122\fun{GEN}{alg_csa_table}{GEN nf, GEN mt, long v, long maxord}3123algebra defined by a multiplication table.31243125\fun{GEN}{alg_cyclic}{GEN rnf, GEN aut, GEN b, long maxord}3126cyclic algebra~$(L/K,\sigma,b)$.31273128\fun{GEN}{alg_hasse}{GEN nf, long d, GEN hi, GEN hf, long v, long maxord}3129algebra defined by local Hasse invariants.31303131\fun{GEN}{alg_hilbert}{GEN nf, GEN a, GEN b, long v, long maxord}3132quaternion algebra.31333134\fun{GEN}{alg_matrix}{GEN nf, long n, long v, GEN L, long maxord}3135matrix algebra.31363137\fun{GEN}{alg_complete}{GEN rnf, GEN aut, GEN hi, GEN hf, long maxord}3138cyclic algebra~$(L/K,\sigma,b)$ with~$b$ computed from the Hasse invariants.31393140\fun{GEN}{alg_changeorder}{GEN alg, GEN ord}3141return the algebra with the integral basis replaced by~\kbd{ord} (a \typ{MAT}3142expressing the basis of the new order in terms of the integral basis of \kbd{alg}).3143No checks are performed.31443145\subsec{Type checks}31463147\fun{void}{checkalg}{GEN a} raise an exception if $a$ was not initialized3148by \tet{alginit}.31493150\fun{void}{checklat}{GEN al, GEN lat} raise an exception if \kbd{lat} is not a3151valid full lattice in the algebra~\kbd{al}.31523153\fun{void}{checkhasse}{GEN nf, GEN hi, GEN hf, long n} raise an exception3154if~$(\kbd{hi},\kbd{hf})$ do not describe valid Hasse invariants of a central3155simple algebra of degree~\kbd{n} over~\kbd{nf}.31563157\fun{long}{alg_type}{GEN al} internal function called by \tet{algtype}: assume3158\kbd{al} was created by \tet{alginit} (thereby saving a call to \kbd{checkalg}).3159Return values are symbolic rather than numeric:31603161\item \kbd{al\_NULL}: not a valid algebra.31623163\item \kbd{al\_TABLE}: table algebra output by \kbd{algtableinit}.31643165\item \kbd{al\_CSA}: central simple algebra output by \kbd{alginit} and3166represented by a multiplication table over its center.31673168\item \kbd{al\_CYCLIC}: central simple algebra output by \kbd{alginit} and3169represented by a cyclic algebra.31703171\fun{long}{alg_model}{GEN al, GEN x} given an element $x$ in algebra \var{al},3172check for inconsistencies (raise a type error) and return the representation3173model used for $x$:31743175\item \kbd{al\_ALGEBRAIC}: \kbd{basistoalg} form, algebraic representation.31763177\item \kbd{al\_BASIS}: \kbd{algtobasis} form, column vector on the integral3178basis.31793180\item \kbd{al\_MATRIX}: matrix with coefficients in an algebra.31813182\item \kbd{al\_TRIVIAL}: trivial algebra of degree $1$; can be understood3183as both basis or algebraic form (since $e_1 = 1$).31843185\subsec{Shallow accessors}31863187All these routines assume their argument was initialized by \tet{alginit}3188and provide minor speedups compared to the GP equivalent. The routines3189returning a \kbd{GEN} are shallow.31903191\fun{long}{alg_get_absdim}{GEN al} low-level version of \kbd{algabsdim}.31923193\fun{long}{alg_get_dim}{GEN al} low-level version of \kbd{algdim}.31943195\fun{long}{alg_get_degree}{GEN al} low-level version of \kbd{algdegree}.31963197\fun{GEN}{alg_get_aut}{GEN al} low-level version of \kbd{algaut}.31983199\fun{GEN}{alg_get_auts}{GEN al}, given a cyclic algebra $\var{al} =3200(L/K,\sigma,b)$ of degree $n$, returns the vector of $\sigma^i$,3201$1 \leq i < n$.32023203\fun{GEN}{alg_get_b}{GEN al} low-level version of \kbd{algb}.32043205\fun{GEN}{alg_get_basis}{GEN al} low-level version of \kbd{algbasis}.32063207\fun{GEN}{alg_get_center}{GEN al} low-level version of \kbd{algcenter}.32083209\fun{GEN}{alg_get_char}{GEN al} low-level version of \kbd{algchar}.32103211\fun{GEN}{alg_get_hasse_f}{GEN al} low-level version of \kbd{alghassef}.32123213\fun{GEN}{alg_get_hasse_i}{GEN al} low-level version of \kbd{alghassei}.32143215\fun{GEN}{alg_get_invbasis}{GEN al} low-level version of \kbd{alginvbasis}.32163217\fun{GEN}{alg_get_multable}{GEN al} low-level version of \kbd{algmultable}.32183219\fun{GEN}{alg_get_relmultable}{GEN al} low-level version of3220\kbd{algrelmultable}.32213222\fun{GEN}{alg_get_splittingfield}{GEN al}3223low-level version of \kbd{algsplittingfield}.32243225\fun{GEN}{alg_get_abssplitting}{GEN al} returns the absolute \var{nf}3226structure attached to the \var{rnf} returned by \kbd{algsplittingfield}.32273228\fun{GEN}{alg_get_splitpol}{GEN al} returns the relative polynomial3229defining the \var{rnf} returned by \kbd{algsplittingfield}.32303231\fun{GEN}{alg_get_splittingdata}{GEN al}3232low-level version of \kbd{algsplittingdata}.32333234\fun{GEN}{alg_get_splittingbasis}{GEN al}3235the matrix \var{Lbas} from \kbd{algsplittingdata}32363237\fun{GEN}{alg_get_splittingbasisinv}{GEN al}3238the matrix \var{Lbasinv} from \kbd{algsplittingdata}.32393240\fun{GEN}{alg_get_tracebasis}{GEN al} returns the traces of the3241basis elements; used by \kbd{algtrace}.32423243\fun{GEN}{alglat_get_primbasis}{GEN lat} from the description of \kbd{lat}3244as~$\lambda L$ with~$L\subset{\cal O}_0$ and~$\lambda\in\Q$, returns a basis3245of~$L$.32463247\fun{GEN}{alglat_get_scalar}{GEN lat} from the description of \kbd{lat}3248as~$\lambda L$ with~$L\subset{\cal O}_0$ and~$\lambda\in\Q$, returns~$\lambda$.32493250\subsec{Other low-level functions}32513252\fun{GEN}{conjclasses_algcenter}{GEN cc, GEN p} low-level function underlying3253\kbd{alggroupcenter}, where \kbd{cc} is the output of3254\kbd{groupelts\_to\_conjclasses}, and $p$ is either \kbd{NULL} or a prime3255number. Not stack clean.32563257\fun{GEN}{algsimpledec_ss}{GEN al, long maps} assuming that~\kbd{al} is3258semisimple, returns the second component of~\kbd{algsimpledec(al,maps)}.32593260\newpage326132623263