2. Číselné množiny a důležité konstanty
Celá čísla
Celá čísla lze v počítačových algebraických systémech reprezentovat přesně, dokud stačí paměť.
Objekt odpovídající množině celých čísel (z pohledu matematika se jedná o okruh) je v SageMath značen ZZ
.
print ZZ
show(ZZ)
-> Integer ring
-> Z
Celá čísla lze konstruovat několika způsoby.
# ekvivalentní způsoby vytvoření obektu typy SageMath Integer
j = 1
k = ZZ(1)
l = Integer(1)
print j == k
print k == l
type(j)
-> True
-> True
-> <type 'sageMath.rings.integer.Integer'>
SageMathovské celé číslo je daleko bohatší objekt než Pythonovský integer (ten zkonstruujete například příkazem int(2)
).
Na celém čísle můžete provádět celou řadu operací, například:
k = 123475
print k.binary()
print k.factor()
print k.divisors()
-> 11110001001010011 \\
-> 5^2 * 11 * 449
-> [1, 5, 11, 25, 55, 275, 449, 2245, 4939, 11225, 24695, 123475]
Racionální čísla
Podobně jako s celými čísly lze pracovat i s racionálními čísly s absolutní přesností (dokud vystačíme s pamětí).
Racionálním číslům odpovídá objekt onačovaný jako QQ
.
Racionální čísla již tvoří těleso (anglicky field).
print QQ
show(QQ)
-> Rational Field
-> Q
Racionální čísla lze opět vytvářet několika různými způsoby (dělením celých čísel přirozeně vzniká objekt typu racionální číslo). Algebraickými operacemi sčítání, násobení či dělení již množinu racionálních čísel neopustíme.
k = 1/2
j = QQ(1/2)
print j == k
print j^10*3^2/5^21
-> True
-> 9/488281250000000000
Reálná čísla (v dané přesnosti)
Stručně lze říci, že v SageMath jsou čísla se pohyblivou desetinnou čárkou s přesností $p$ chápána jako čísla tvaru
kde je znaménko, je mantisa a je exponent.
Obě i jsou nezáporná celá čísla.
Defaultně SageMath pracuje s těmito čísly v přesnosti , a reprodukuje tak typ double
známý z C ovšem s větším rozsahem exponentu.
Další detaily týkající se těchto strojových čísel může čtenář dohledat v dokumentaci.
a = 2.7
print type(a)
print a.precision()
-> <type 'sageMath.rings.real_mpfr.RealLiteral'>|
-> 53
Reálná čísla v této pevné přesností tvoří pouze aproximaci tělesa reálných čísel.
Nejsou ani uzavřená na algebraické operace, neustále dochází k zaokrouhlování.
SageMath tato čísla značí symbolem RR
.
print RR
show(RR)
-> Real Field with 53 bits of precision \\
-> R
Pokud chceme, můžeme experimentovat i s menší či větší přesností.
F = RR(prec=10)
a = F(1)
print a
print a.precision()
-> 1.0
-> 10
Jaký exponent a mantisa odpovídají takovémuto číslu?
# jako exponent již vrací $e-p$
sign, mantisa, exponent = a.sign_mantissa_exponent()
print sign, mantisa, exponent
-> 1 512 -9
Z těchto údajů zrekonstruujeme zpětně naše číslo :
sign*mantisa*2^exponent
-> 1
Je důležité si uvědomit, že k zaokrouhlování může docházet už při ukládání čísla do paměti. V předchozím příkladě jsme číslo dostali zpět přesně. Zkusme jiné číslo.
a = F(0.3)
sign, mantisa, exponent = a.sign_mantissa_exponent()
print 'znaménko, mantisa, exponent'
print sign, mantisa, exponent
print 'odpovídající strojové číslo'
exact = sign*mantisa*2^exponent
print exact
print 'numerická hodnota'
print n(exact,digits=15)
-> znaménko, mantisa, exponent
-> 1 614 -11
-> odpovídající strojové číslo
-> 307/1024
-> numerická hodnota
-> 0.299804687500000
Tohoto problému se nezbavíme zvýšením přesnosti.
a = RR(0.3)
print 'přesnost'
print a.precision()
print 'znaménko, mantisa, exponent'
sign, mantisa, exponent = a.sign_mantissa_exponent()
print sign, mantisa, exponent
print 'odpovídající strojové číslo'
exact = sign*mantisa*2^exponent
print exact
print 'numerická hodnota'
print n(exact,digits=60)
-> přesnost
-> 53
-> znaménko, mantisa, exponent
-> 1 5404319552844595 -54
-> odpovídající strojové číslo
-> 5404319552844595/18014398509481984
-> numerická hodnota
-> 0.299999999999999988897769753748434595763683319091796875000000
Při práci s čísly s plovoucí desetinnou čárkou je nutné být opatrný.
Na závěr kapitolky o reálných číslech poznamenejme, že Eulerovo číslo se v SageMath označuje symbolem e
a Ludolfovo číslo symbolem pi
Komplexní čísla
S komplexními čísly se v SageMath pracuje poměrně jednoduše. Imaginární jednotka je označena následovně
I
type(I)
<type 'sageMath.symbolic.expression.Expression'>
Například dle očekávání platí:
I^2
-> -1
Všechny očekávané algebraické operace lze provádět i s komplexními čísly.
(1+2*I)*(1 - I)
I + 3