Cvičení 1: Polynomy

Tomáš Kalvoda, KAM FIT ČVUT, 2016-2019

Úvod

(Komplexním) polynomem nazýváme funkci p:CCp: \mathbb{C} \to \mathbb{C} pro kterou existuje nN0n \in \mathbb{N}_0 a konstanty a0,a1,,anCa_0,a_1,\ldots,a_n \in \mathbb{C} takové, že p(z)=k=0nakzk,pro kazˇdeˊ zC.p(z) = \sum_{k=0}^n a_k z^k, \quad \text{pro každé} \ z\in\mathbb{C}.

V tomto sešitu si ukážeme, jak s polynomy pracovat v SageMath. Zejména jak hledat jejich kořeny a provádět dělení se zbytkem.

SageMath je založen na Pythonu a s polynomy se tedy pracuje velmi příjemně jako s abstraktními objekty.

Konstrukce polynomu

Budeme pracovat s polynomy nad komplexními čísly. V SageMath k tomu účelu použijeme polynomy na symbolickým okruhem (v BI-LIN občas bude potřeba pracovat i se symbolickými koeficienty).

R.<z> = PolynomialRing(SR) # R bude množina všech polynomů v proměnné z se
R                          # symbolickými koeficienty (viz úvodní povídání o číselných množinách)
Univariate Polynomial Ring in z over Symbolic Ring

O RR můžete přemýšlet jako o množině všech polynomů v proměnné zz (ta byla definována předchozím příkazem), na které je definováno jejich sčítání a násobení. Ukažme si to na příkladu.

p = z^3 - z^2 + 2*z + 1 # jeden polynom,
q = z^2 + 7*z - 1       # druhý polynom

print("p patří do R:")
print(p in R)

print("součet p a q:")
print(p + q)
p patří do R:
True
součet p a q:
z^3 + 9*z

Kolik má RR prvků?

R.cardinality()
+Infinity

Užitečné metody související s polynomy

Sage nabízí i pěkné LaTeX zobrazení polynomu:

show(p)
z3z2+2z+1\newcommand{\Bold}[1]{\mathbf{#1}}z^{3} - z^{2} + 2 z + 1

Můžeme požádat i pro LaTex zdrojový kód.

latex(p)
z^{3} - z^{2} + 2 z + 1

Sage o polynomu pp ví spoustu věcí. Například zná jeho stupeň:

p.degree()
3

Umí extrahovat jeho koeficienty (od nejmenšího stupně k nejvyššímu):

p.coefficients()
[1, 2, -1, 1]

Můžeme počítat jeho funkční hodnoty:

[p(2), p(pi), p(I)]
[9, 2*pi + pi^3 - pi^2 + 1, I + 2]

Lze počítat jeho derivace:

show(p.diff())  # první derivace
show(p.diff(2)) # druhá derivace
3z22z+2\newcommand{\Bold}[1]{\mathbf{#1}}3 z^{2} - 2 z + 2
6z2\newcommand{\Bold}[1]{\mathbf{#1}}6 z - 2

A konečně, hledat kořeny:

q.roots()
[(-1/2*sqrt(53) - 7/2, 1), (1/2*sqrt(53) - 7/2, 1)]

Vidíme, že SageMath vrací Pythonovský list dvojic (kořen, násobnost kořene).

Další metody lze prozkoumat po stisknutí tabulátoru za tečkou (automatické doplňování příkazů):

q. # stiskněte tabulátor za tečkou (q musí být definováno výše)

Pokud nevíme co která metoda dělá, můžeme se podívat na její dokumentaci zavoláním metody s otazníkem:

q.is_cyclotomic?# "spusťte" tuto buňku stiskem kláves SHIFT+ENTER

Operace s polynomy

Polynomy můžeme přirozeně sčítat a násobit pomocí standardních operátorů + a *.

show(p + q)
z3+9z\newcommand{\Bold}[1]{\mathbf{#1}}z^{3} + 9 z
show(p * q)
z5+6z46z3+16z2+5z1\newcommand{\Bold}[1]{\mathbf{#1}}z^{5} + 6 z^{4} - 6 z^{3} + 16 z^{2} + 5 z - 1

Dále můžeme počítat například zbytek po dělení polynomu pp polynomem qq.

show(p.mod(q))
59z7\newcommand{\Bold}[1]{\mathbf{#1}}59 z - 7

Naopak podíl získáme pomocí operátoru //.

p // q
z - 8

Platí tedy následující rovnost (polynomy lze porovnávat pomocí operátoru ==):

p == (p // q) * q + p.mod(q)
True

Největší společný dělitel můžeme počítat například u polynomů s celočíselnými koeficitenty.

R.<z> = PolynomialRing(ZZ) # předefinujeme R (a tedy i z)
R
Univariate Polynomial Ring in z over Integer Ring
p = (z - 1)*(z - 2)^2*(z - 3)
q = (z - 1)*(z - 2)*(z - 3)^2
gcd(p, q)
z^3 - 6*z^2 + 11*z - 6
gcd(p, q) - (z - 1)*(z -2 )*(z - 3)
0

Zvídavý čtenář může dál vesele experimentovat.