Tomáš Kalvoda, KAM FIT ČVUT, 2016-2019
(Komplexním) polynomem nazýváme funkci pro kterou existuje a konstanty takové, že
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.
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 můžete přemýšlet jako o množině všech polynomů v proměnné (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á prvků?
R.cardinality()
+Infinity
Sage nabízí i pěkné LaTeX zobrazení polynomu:
show(p)
Můžeme požádat i pro LaTex zdrojový kód.
latex(p)
z^{3} - z^{2} + 2 z + 1
Sage o polynomu 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
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
Polynomy můžeme přirozeně sčítat a násobit pomocí standardních operátorů +
a *
.
show(p + q)
show(p * q)
Dále můžeme počítat například zbytek po dělení polynomu polynomem .
show(p.mod(q))
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.