false
> irreduc(х^2-2);
true
> Irreduc(2*x^2+6*x+6) mod 7;
false
> Irreduc(x^4+x+1) mod 2;
true
> alias(alpha=RootOf(x^4+x+1)):
> Irreduc(х^4+х+1,alpha) mod 2;
false
5.3.6. Разложение полинома по степеням
Для разложения полинома р по степеням служат инертные функции AFactor(p) и AFactors(p). Полином может быть представлен в виде зависимости от одной или нескольких переменных.
Функция Afactor(p) выполняет полную факторизацию (разложение) полинома p от нескольких переменных с коэффициентами в виде алгебраических чисел над полем комплексных чисел. При этом справедливо отношение evala(AFactor(p))= factor(p.complex). Таким образом, эта функция является, по существу, избыточной.
В случае одномерного полинома полное разложение на множители является разложением на линейные множители. Функция AFactors аналогична функции Afactor, но создает структуру данных формы [u,[[f[1],e[1]],…,[f[n],e[n]]]] так, что p=u*f[1]^e[1]*…*f[n]^e[n], где каждый f[i] — неприводимый полином.
Ниже даны примеры применения функции Afactor:
> evala(AFactor(2*х^2+4*х-6));
2(x+3)(х-1)
> evala(AFactor(х^2+2*у^2));
(х - RootOf(_Z² + 2)y) (x + RootOf(_Z² + 2)y)
> expand((x-1) * (x-2) * (x-3) * (x-4));
x 4- 10 x 3+ 35 x 2- 50 x + 24
> AFactor(%);
AFactor(x 4- 10 x 3+ 35 x 2 - 50 x + 24)
> evala(%);
(x-1)(x-2)(x-3)(x-4)
> expand((x-1+I*2)*(x+1-I*2)*(x-3));
x³ - 3x² + 3x - 9 + 4 I x-12 I
> evala(AFactor(%));
(x - 3)(x² + 3 + 4I)
> evala(AFactors(х^2-2*у^2));
[1, [[x - RootOf(_Z² - 2)y, 1], [x + RootOf(_Z² + 2)y, 1]]]
Нетрудно заметить, что разложение полинома на множители позволяет оценить наличие у него корней. Однако для этого удобнее воспользоваться специальными функциями, рассмотренными ниже.
5.3.7. Вычисление корней полинома
Для вычисления действительных и комплексных корней полиномов служит уже известная нам функции solve(p, x), возвращающая список корней полинома p одной переменной. Кроме того, имеются следующие функции для вычисления корней полиномов:
roots(р)
roots(р, K)
roots(р, х)
roots(р, x, K)
Эти функции вычисляют точные корни в рациональной или алгебраической области чисел. Корни возвращаются в виде [[r1,m1], [rn, mn]], где mi — это корень полинома, a mi — порядковый номер полинома. С действиями этих функций можно разобраться с помощью приведенных ниже примеров:
> р:=х^4 1-9*х^3+31*х^2+59*х+60;
р:=х 4+ 9х 3+ 31х 2+ 59 х + 60
> solve(р,х);
-3, -4, -1 + 2I, -1-2I
> roots(р,х);
[[-4, 1], [-3, 1]]
> roots(х^2-4,х);
[[2, 1], [-2, 1]]
> expend((х-1)*(х-2)*(х-3)*(х-4));
х 4-10х 3+35х 2- 50 х + 24
> roots(%,х);
[[1, 1], [2, 1], [3, 1], [4, 1]]
5.3.8. Основные операции с полиномами
С полиномами могут выполняться различные операции. Прежде всего, отметим некоторые функции, которые относятся к одному полиному:
psqrt(p) — возвращает квадрат полинома;
proot(p,n) — возвращает n-ю степень полинома;
realroot(p) — возвращает интервал, в котором находятся действительные корни полинома;
randpoly(vars, eqns) — возвращает случайный полином по переменным vars (список) с максимальной степенью eqns;
discrim(p, var) — вычисление дискриминанта полинома по переменной var;
Primitive(a) mod p — проверка полинома на примитивность (возвращает true, если полином примитивен).
Действие этих функций достаточно очевидно, поэтому ограничимся приведением примеров их использования (файл polop):
> psqrt(х^2+2*х*у+у^2);
у + x
> proot(х^3+3*х^2+3*х+1, 3);
x+1
> psqrt(x+y);
_NOSQRT
> proot(x+y, 2);
_ NOROOT
> р:=х^3-3*х^2+5*х-10;
p:=x³ - 3x² + 5x - 10
> discrim(p,x);
-1355
> readlib(realroot):
> realroot(p);
[[0, 4]]
> randpoly([x],degree=10);
63x 10+ 57x 8- 59x 5+ 45x 4- 8x 3- 93
> randpoly([x],degree=10);
-5x 9+ 99x 8- 61x 6- 50x 5- 12x 3- 18x
> randpoly([x],degree=10);
Читать дальше
Конец ознакомительного отрывка
Купить книгу