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