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

Returning Powers of a Two-Variable Polynomial as a Vector in 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 ],我认为这不能被扭曲成这样的东西对我有用。

关于如何做到这一点有什么想法吗?

你必须自己计算所有的单项式。您的双变量多项式可以被视为具有多项式系数的单变量多项式。首先,你 select 主变量(例如 '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]]

其次,给定这样的指数和系数列表,您可以轻松获得完整的单项式列表:

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]]