Function: algdep
Section: linear_algebra
C-Name: algdep0
Prototype: GLD0,L,
Help: algdep(z,k,{flag=0}): algebraic relations up to degree n of z, using
 lindep([1,z,...,z^(k-1)], flag).
Doc: \sidx{algebraic dependence}
 $z$ being real/complex, or $p$-adic, finds a polynomial (in the variable
 \kbd{'x}) of degree at most
 $k$, with integer coefficients, having $z$ as approximate root. Note that the
 polynomial which is obtained is not necessarily the ``correct'' one. In fact
 it is not even guaranteed to be irreducible. One can check the closeness
 either by a polynomial evaluation (use \tet{subst}), or by computing the
 roots of the polynomial given by \kbd{algdep} (use \tet{polroots} or
 \tet{polrootspadic}).

 Internally, \tet{lindep}$([1,z,\ldots,z^k], \fl)$ is used. A non-zero value of
 $\fl$ may improve on the default behavior if the input number is known to a
 \emph{huge} accuracy, and you suspect the last bits are incorrect: if $\fl > 0$
 the computation is done with an accuracy of $\fl$ decimal  digits; to get
 meaningful results,  the parameter $\fl$ should be smaller than the number of
 correct decimal digits in the input.
 But default values are usually sufficient, so try without $\fl$ first:
 \bprog
 ? \p200
 ? z = 2^(1/6)+3^(1/5);
 ? algdep(z, 30);      \\ right in 280ms
 ? algdep(z, 30, 100); \\ wrong in 169ms
 ? algdep(z, 30, 170); \\ right in 288ms
 ? algdep(z, 30, 200); \\ wrong in 320ms
 ? \p250
 ? z = 2^(1/6)+3^(1/5); \\ recompute to new, higher, accuracy !
 ? algdep(z, 30);      \\ right in 329ms
 ? algdep(z, 30, 200); \\ right in 324ms
 ? \p500
 ? algdep(2^(1/6)+3^(1/5), 30); \\ right in 677ms
 ? \p1000
 ? algdep(2^(1/6)+3^(1/5), 30); \\ right in 1.5s
 @eprog\noindent
 The changes in \kbd{realprecision} only affect the quality of the
 initial approximation to $2^{1/6} + 3^{1/5}$, \kbd{algdep} itself uses
 exact operations. The size of its operands depend on the accuracy of the
 input of course: more accurate input means slower operations.

 Proceeding by increments of 5 digits of accuracy, \kbd{algdep} with default
 flag produces its first correct result at 195 digits, and from then on a
 steady stream of correct results:
 \bprog
   \\ assume T contains the correct result, for comparison
   forstep(d=100, 250, 5, localprec(d);\
     print(d, " ", algdep(2^(1/6)+3^(1/5),30) == T))
 @eprog

 The above example is the test case studied in a 2000 paper by Borwein and
 Lisonek: Applications of integer relation algorithms, \emph{Discrete Math.},
 {\bf 217}, p.~65--82. The version of PARI tested there was 1.39, which
 succeeded reliably from precision 265 on, in about 200 as much time as the
 current version.

Variant: Also available is \fun{GEN}{algdep}{GEN z, long k} ($\fl=0$).
