Karim BELABAS on Tue, 13 Jun 2000 11:20:08 +0200 (MET DST)

 Re: turn matrix to polynomial

```> [Hui Zhu:]
>> Hi - does anyone know a fastest way in gp to convert a matrix c_{i,j} into
>> a polynomial sum c_{i,j}.x^i.y^j of two variables? vice versa ?
[Michael Somos:]
> gp> m2p(c)=local(rc);rc=matsize(c);sum(i=1,rc[1],sum(j=1,rc[2],c[i,j]*x^i*y^j))
> gp> m2p([1,2;3,4])
> %1 = (4*y^2 + 3*y)*x^2 + (2*y^2 + y)*x

This one is more cryptic but should be faster (no computation); it also
normalizes the coordinates (i,j) to start at (0,0):

? m2p2(c) = Polrev(vector(matsize(c)[1],i, Polrev(c[i,], y)), x)
? m2p2([1,2;3,4])
%1 = (4*y + 3)*x + (2*y + 1)

? m2p2(mathilbert(100));
time = 90 ms.
? m2p(mathilbert(100));
***   collecting garbage in sum.
***   collecting garbage in sum.
***   collecting garbage in sum.
***   collecting garbage in sum.
time = 2,590 ms.

The other way round is more complicated since the x coefficients (say) need
not have the same degree in y.

? p2v(p, n) = vectorv(n, i, polcoeff(p, i-1))
? p2m(p) =
{
local(n,l); p = Vec(p); l = length(p);
n = 1+ vecmax(vector(l,i,poldegree(p[i])));
p = vector(l, i, p2v(p[l-i+1], n));
p[1] = Mat(p[1]); concat(p)~;
}
? p2m(%1)
%4 =
[1 2]

[3 4]

Both scripts assume that x has higher priority than y (the first would create
an invalid object, the second would return the transpose of the expected
matrix).

Cheers,

Karim.
__
Karim Belabas                    email: Karim.Belabas@math.u-psud.fr
Dep. de Mathematiques, Bat. 425
Universite Paris-Sud             Tel: (00 33) 1 69 15 57 48
F-91405 Orsay (France)           Fax: (00 33) 1 69 15 60 19
--