Testing latest pari + WASM + node.js... and it works?! Wow.
License: GPL3
ubuntu2004
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 nonzero 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 63ms
? algdep(z, 30, 100); \\ wrong in 39ms
? algdep(z, 30, 170); \\ right in 61ms
? algdep(z, 30, 200); \\ wrong in 146ms
? \p250
? z = 2^(1/6)+3^(1/5); \\ recompute to new, higher, accuracy !
? algdep(z, 30); \\ right in 68ms
? algdep(z, 30, 200); \\ right in 68ms
? \p500
? algdep(2^(1/6)+3^(1/5), 30); \\ right in 138ms
? \p1000
? algdep(2^(1/6)+3^(1/5), 30); \\ right in 276s
@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: a 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\noindent
This 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 1000 as much time as the
current version (on slower hardware of course).
Note that this function does not work if $z$ is a power series. The function
\kbd{seralgdep} can be used in this case to find linear relations wich
polynomial coefficients between powers of $z$.
Variant: Also available is \fun{GEN}{algdep}{GEN z, long k} ($\fl=0$).