Function: idealtwoelt
Section: number_fields
C-Name: idealtwoelt0
Prototype: GGDG
Help: idealtwoelt(nf,x,{a}): two-element representation of an ideal x in the
 number field nf. If (optional) a is non-zero, first element will be equal to a.
Doc: computes a two-element representation of the ideal $x$ in the number
 field $\var{nf}$, combining a random search and an approximation theorem; $x$
 is an ideal in any form (possibly an extended ideal, whose principal part is
 ignored)

 \item When called as \kbd{idealtwoelt(nf,x)}, the result is a row vector
 $[a,\alpha]$ with two components such that $x=a\Z_K+\alpha\Z_K$ and $a$ is
 chosen to be the positive generator of $x\cap\Z$, unless $x$ was given as a
 principal ideal in which case we may choose $a = 0$. The algorithm
 uses a fast lazy factorization of $x\cap \Z$ and runs in randomized
 polynomial time.

 \bprog
 ? K = nfinit(t^5-23);
 ? x = idealhnf(K, t^2*(t+1), t^3*(t+1))
 %2 =  \\ some random ideal of norm 552*23
 [552 23 23 529 23]

 [  0 23  0   0  0]

 [  0  0  1   0  0]

 [  0  0  0   1  0]

 [  0  0  0   0  1]

 ? [a,alpha] = idealtwoelt(K, x)
 %3 = [552, [23, 0, 1, 0, 0]~]
 ? nfbasistoalg(K, alpha)
 %4 = Mod(t^2 + 23, t^5 - 23)
 @eprog

 \item When called as \kbd{idealtwoelt(nf,x,a)} with an explicit non-zero $a$
 supplied as third argument, the function assumes that $a \in x$ and returns
 $\alpha\in x$ such that $x = a\Z_K + \alpha\Z_K$. Note that we must factor
 $a$ in this case, and the algorithm is generally slower than the
 default variant and gives larger generators:
 \bprog
 ? alpha2 = idealtwoelt(K, x, 552)
 %5 = [-161, -161, -183, -207, 0]~
 ? idealhnf(K, 552, alpha2) == x
 %6 = 1
 @eprog\noindent Note that, in both cases, the return value is \emph{not}
 recognized as an ideal by GP functions; one must use \kbd{idealhnf} as
 above to recover a valid ideal structure from the two-element representation.

Variant: Also available are
 \fun{GEN}{idealtwoelt}{GEN nf, GEN x} and
 \fun{GEN}{idealtwoelt2}{GEN nf, GEN x, GEN a}.
