Karim BELABAS on Mon, 1 Jul 2002 19:49:27 +0200 (MEST)

 Re: polcoeff() mystery

```On Mon, 1 Jul 2002, Ilya Zakharevich wrote:
> How polcoeff() is supposed to work?  I try to understand why the
> coeff() example of the manual works, and fail...  I try this:
>
>    coeffs(P, nbvar) =
>    {
>      local(v);
>
>      if (type(P) != "t_POL",
>        for (i=0, nbvar-1, P = [P]);
>        return (P)
>      );
>      v = vector(poldegree(P)+1, i, polcoeff(P,i-1));
>      vector(length(v), i, coeffs(v[i], nbvar-1))
>    }
>
>    c(P) = coeffs(P,2)
>
>    PP = x^2 + x*y + z;
>    temp  = polcoeff(PP,0);
>    temp1 = polcoeff(PP,1);
>    print("z     -> "z", c(z)        -> "c(z));
>    print("temp  -> "z", c(temp)     -> "c(temp));
>    print("y     -> "y", c(y)        -> "c(y));
>    print("temp1 -> "temp1", c(temp)     -> "c(temp1));
>
> This gives
>
>   z     -> z, c(z)        -> [, ]
>   temp  -> z, c(temp)     -> [[0, 1]]
>   y     -> y, c(y)        -> [, ]
>   temp1 -> y, c(temp)     -> [, ]
>
> As one can see, z and temp have the same value,

No. They evaluate to the same printed output.

> but the results of c() are different!  Moreover, x and temp give the same \x

They don't. The history objects obtained from x and temp give the same \x.

But, assuming factory settings, the history result is obtained after
simplify() has been applied to the result of the command evaluation. So
? temp  = polcoeff(PP,0) \\ in R[z][y]  (degree 0 in y)
%1 = z \\ in R[z] after simplification

? \x
[&=00a5d93c] POL(lg=4,CLONE):15000004  (+,varn=10,lgef=4):400a0004  00a5d958 00a5d94c
coef of degree 0 = [&=00a5d958] INT(lg=2):02000002  (0,lgef=2):00000002
coef of degree 1 = [&=00a5d94c] INT(lg=3):02000003  (+,lgef=3):40000003 00000001

? install(voir, "vGD,-1,L,")  \\ library routine underlying \x
? voir(temp)
[&=00a5d58c] POL(lg=3,CLONE):15000003  (+,varn=9,lgef=3):40090003  00a5d5ac
coef of degree 0 = [&=00a5d5ac] POL(lg=4):14000004 (+,varn=10,lgef=4):400a0004  00a5d5a4  00a5d598
coef of degree 0 = [&=00a5d5a4] INT(lg=2):02000002  (0,lgef=2):00000002
coef of degree 1 = [&=00a5d598] INT(lg=3):02000003  (+,lgef=3):40000003 00000001

You have the same kind of weird problems with

? x = 2 + 0*I;
? factor(%)
%2 =
[2 1]
? factor(x)
***   can't factor 2.  \\ huh ?

Type coercion is nearly inexistent in PARI, you have to force it with
simplify().

Cheers,

Karim.
--
Karim Belabas                    Tel: (+33) (0)1 69 15 57 48
Dép. de Mathematiques, Bat. 425  Fax: (+33) (0)1 69 15 60 19
Université Paris-Sud             Email: Karim.Belabas@math.u-psud.fr
F-91405 Orsay (France)           http://www.math.u-psud.fr/~belabas/
--