Vector 在PARI/GP中作为向量返回二元多项式的幂?

Vector 在PARI/GP中作为向量返回二元多项式的幂?,vector,polynomials,pari,pari-gp,Vector,Polynomials,Pari,Pari Gp,我试图以向量的形式来观察二元多项式的单项式。因此,例如,如果我输入x^2+x^3*y+x*y+y^2+1,我想将其视为[[2;0],[3;1],[1;1],[0;2],[0;0]]-一个由列向量组成的向量 如果我在一个两变量多项式上使用Vec,它只是把第二个变量当作一个数字,给出Vec(x^2+x^3*y+x*y+y^2+1)=[y,1,y,y^2+1],我认为这不能被扭曲成对我有用的东西 有什么办法可以做到这一点吗?你必须自己计算所有的单项式。二元多项式可以看作是具有多项式系数的一元多项式。首

我试图以向量的形式来观察二元多项式的单项式。因此,例如,如果我输入
x^2+x^3*y+x*y+y^2+1
,我想将其视为
[[2;0],[3;1],[1;1],[0;2],[0;0]]
-一个由列向量组成的向量

如果我在一个两变量多项式上使用
Vec
,它只是把第二个变量当作一个数字,给出
Vec(x^2+x^3*y+x*y+y^2+1)=[y,1,y,y^2+1]
,我认为这不能被扭曲成对我有用的东西


有什么办法可以做到这一点吗?

你必须自己计算所有的单项式。二元多项式可以看作是具有多项式系数的一元多项式。首先,选择主变量(例如,
'x
)并查找其指数及其非零系数:

exponents(f, v=variable(f)) = {
    if(type(f) != "t_POL",
        return([[0, f]])
    );
    my(x = varhigher("#"));
    my(coeffs = Vecrev(subst(f, v, x)));
    my(indexes = select((c) -> c != 0, coeffs, 1));

    [[n-1, coeffs[n]] | n <- Vec(indexes)]
};

exponents(1)
> [[0, 1]]
exponents(x^2 + x^3*y + x*y + y^2 + 1)
> [[0, y^2 + 1], [1, y], [2, 1], [3, y]]
exponents(x^2 + x^3*y + x*y + y^2 + 1, 'y)
> [[0, x^2 + 1], [1, x^3 + x], [2, 1]]
指数(f,v=变量(f))={ 如果(类型(f)!=“t_POL”, 返回([[0,f]]) ); my(x=varhigher(“#”); my(coeffs=Vecrev(subst(f,v,x)); my(索引=选择((c)->c!=0,系数,1)); [n-1,系数[n]|n[[0,1]] 指数(x^2+x^3*y+x*y+y^2+1) >[0,y^2+1],[1,y],[2,1],[3,y]] 指数(x^2+x^3*y+x*y+y^2+1,'y) >[0,x^2+1],[1,x^3+x],[2,1]] 其次,给出这样的指数和系数列表,您很容易获得单项式的完整列表:

monomial_list(f) = {
    concat(
        apply(
            (xs) -> [[xs[1], p[1]] | p <- exponents(xs[2])],
            exponents(f)
        )
    )
};

monomial_list(0)
> [[0, 0]]
monomial_list(x^2 + x^3*y + x*y + y^2 + 1)
> [[0, 0], [0, 2], [1, 1], [2, 0], [3, 1]]
单项列表(f)={
海螺(
申请(
(xs)->[[xs[1],p[1]]| p[[0,0]]
单项式列表(x^2+x^3*y+x*y+y^2+1)
> [[0, 0], [0, 2], [1, 1], [2, 0], [3, 1]]