Вернуться к списку примеров


Применение GAP для изучения теории многочленов

Проще всего задать многочлен от одной переменной можно следующим образом. Сначала определим кольцо коэффициентов, а затем определим трансцендентный элемент над этим кольцом:

gap> Q:=Rationals;
Rationals
gap> x:=Indeterminate(Q);
x_1

После этого многочлены можно задавать следующим очевидным образом:

gap> f:=1+x+x^2+5*x^4;
1+x_1+x_1^2+5*x_1^4
gap> g:=(x+1)*(x-1/2);
-1/2+1/2*x_1+x_1^2

Не очень удобно то, что хотя мы обозначили переменную как х, при выводе она все равно обозначается как x_1. Этого можно избежать, если определить ее следующим образом:

gap> x:=Indeterminate(Q,"x");
x

Тогда определенные выше многочлены f и g будут выглядеть так:

gap> f:=1+x+x^2+5*x^4;
1+x+x^2+5*x^4
gap> g:=(x+1)*(x-1/2);
-1/2+1/2*x+x^2

Ниже продемонстрированы действия над многочленами - сложение, вычитание, умножение, сравнение:

gap> f+g; f-g; f*g;
1/2+3/2*x+2*x^2+5*x^4
3/2+1/2*x+5*x^4
-1/2+x^2+3/2*x^3-3/2*x^4+5/2*x^5+5*x^6
gap> f=g;
false

Степень многочлена определяется следующим образом:

gap> DegreeIndeterminate(f,x);
4
gap> DegreeIndeterminate(g,x);
2

Список коэффициентов многочлена и коэффициент при старшем члене можно получить так:

gap> PolynomialCoefficientsOfPolynomial(f,x);
[ 1, 1, 1, 0, 5 ]
gap> LeadingCoefficient(f);
5

Производная многочлена вычисляется функцией Derivative:

gap> Derivative(f);
1+2*x+20*x^3
gap> Derivative(last);
2+60*x^2
gap> Derivative(last);
120*x
gap> Derivative(last);
120
gap> Derivative(last);
0

Многочлены можно разложить на множители. В следующем примере видно, что первый из многочленов является неприводимым над полем рациональных чисел, а второй - нет:

gap> Factors(f);
[ 1+x+x^2+5*x^4 ]
gap> Factors(g);
[ -1/2+x, 1+x ]

Неприводимость многочленов можно проверить и следующим образом:

gap> IsIrreducibleRingElement(h);
true
gap> IsIrreducibleRingElement(g);
false

Функция Value вычисляет значение многочлена при заданном значении переменной:

gap> Value(f,0);
1
gap> Value(f,100);
500010101
gap> Value(f,1);
8

Функция RootsOfUPol находит рациональные корни многочленов. В следующем примере первый из многочленов не имеет рациональных корней.

gap> RootsOfUPol(f);
[  ]
gap> RootsOfUPol(g);
[ 1/2, -1 ]

Теперь проверим второй из результатов:

gap> Value(g,-1);
0
gap> Value(g,1/2);
0

Зададим еще один многочлен:

gap> h:=2*(x+1);
2+2*x

Теперь проверим, делится ли f на g и g на h. Функция Quotient возвращает частное от деления первого многочлена на второй, если такое деление выполнимо, и fail - в противном случае.

gap> Quotient(f,g);
fail
gap> Quotient(g,h);
-1/4+1/2*x

Ассоциированность многочленов проверяется следующим образом:

gap> IsAssociated(g,h);
false
gap> IsAssociated(h,1+x);
true

Для деления многочлена на многочлен с остатком используются функции EuclideanQuotient и  EuclideanRemainder, которые возвращают неполное частное и остаток соответственно:

gap> q:=EuclideanQuotient(f,g);
19/4-5/2*x+5*x^2
gap> r:=EuclideanRemainder(f,g);
27/8-21/8*x

Несложно проверить, что это действительно так:

gap> f=q*g+r;
true

Наибольший общий делитель многочленов определяется с помощью функции Gcd:

gap> Gcd(f,g);
1
gap> Gcd(g,h);
1+x

Линейное представление наибольшего общего делителя находит функция GcdRepresentation :

gap> v:=GcdRepresentation(f,g);
[ 25/66+7/33*x, -41/33-2/33*x-15/11*x^2-35/33*x^3 ]

Проверим, что оно найдено правильно:

gap> Gcd(f,g)=f*v[1]+g*v[2];
true

Функция Lcm вычисляет наименьшее общее кратное многочленов:

gap> Lcm(f,g);
-1/10+1/5*x^2+3/10*x^3-3/10*x^4+1/2*x^5+x^6
gap> Factors(last);
[ -1/2+x, 1+x, 1/5+1/5*x+1/5*x^2+x^4 ]

gap> Lcm(g,h);
-1/2+1/2*x+x^2
gap> Factors(last);
[ -1/2+x, 1+x ]

Подробное описание используемых в этом примере функций и других возможностей работы с многочленами, в том числе с многочленами от нескольких переменных, может быть найдено в разделах  "Rings" и "Polynomials and Rational Functions" руководства по системе GAP.



Вернуться к списку примеров