Возвращаемые степени многочлена с двумя переменными как вектора в PARI / GP? - PullRequest
1 голос
/ 18 июня 2020

Я пытаюсь просмотреть одночлены многочлена с двумя переменными в векторной форме. Так, например, если я ввожу 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 ], которое, я не думаю, можно преобразовать во что-то, что могло бы работать для меня.

Есть идеи, как это можно сделать?

1 Ответ

2 голосов
/ 21 июня 2020

Вы должны набрать c все одночлены самостоятельно. Ваш двумерный многочлен можно рассматривать как одномерный многочлен, имеющий полиномиальные коэффициенты. Во-первых, вы выбираете первичную переменную (например, '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]]
...