[CPW] 0. Werken met Sage

1645 days ago by Jens.Bossaert

Om een eerste gevoel te krijgen voor Sage beginnen we met een kort overzicht. Het volstaat gewoon om telkens SHIFT-ENTER te typen of op evaluate te klikken. Probeer wel telkens te begrijpen waarom je een bepaalde uitvoer krijgt!

Sage als rekenmachine

1+1 
       
2
2

Merk op dat Sage hier gewoon de breuk laat staan en die niet omzet naar een kommagetal:

4/3 
       
4/3
4/3
4/3 + 5/4 
       
31/12
31/12
(4/3) * (5/4) 
       
5/3
5/3
(4/3)^10 
       
1048576/59049
1048576/59049

Sage heeft geen moeite met grote getallen:

(4/3)^1000 
       
114813069527425452423283320117768198402231770208869520047764273682576626\
139237031385665948631650626991844596463898746277344711896086305533142593\
135616665318539129989145312280000688779148240044871428926990063486244781\
615463646388363947317026040466353970904996558162398808944629605623311649\
536164221970332681344168908984458505602379484807914058900934776500429002\
716706625830522008132236281291761267883317206598995396418127021779858404\
042159853183251540889433902091920554957783589672039160081957216630582755\
380425583726015528348786419432054508915275783882625175435528800822842770\
817965453762184851149029376/13220708194808066368904552597521443659654220\
327521481676649203682268285973467048995407783138506080619639097776968725\
823559509545821006189118653427252579536740276202251983208038780147742289\
648412743904001175886180411289478156230944380615661730540866744905061781\
254803444055470543970388958174653682549161362208302685637785822902284163\
983078878969185564040848989376093732421718463599386955167650189405881090\
604260896714388641028143503856487471658320106143661321731027689028552200\
01
114813069527425452423283320117768198402231770208869520047764273682576626139237031385665948631650626991844596463898746277344711896086305533142593135616665318539129989145312280000688779148240044871428926990063486244781615463646388363947317026040466353970904996558162398808944629605623311649536164221970332681344168908984458505602379484807914058900934776500429002716706625830522008132236281291761267883317206598995396418127021779858404042159853183251540889433902091920554957783589672039160081957216630582755380425583726015528348786419432054508915275783882625175435528800822842770817965453762184851149029376/1322070819480806636890455259752144365965422032752148167664920368226828597346704899540778313850608061963909777696872582355950954582100618911865342725257953674027620225198320803878014774228964841274390400117588618041128947815623094438061566173054086674490506178125480344405547054397038895817465368254916136220830268563778582290228416398307887896918556404084898937609373242171846359938695516765018940588109060426089671438864102814350385648747165832010614366132173102768902855220001

Als je een kommagetal ingeeft, zal Sage de berekening altijd uitvoeren met kommagetallen:

3.14 + 1/2 
       
3.64000000000000
3.64000000000000
3.141592653589793238462643383279502884197169399375105820975 + 1 
       
4.14159265358979323846264338327950288419716939937510582097
4.14159265358979323846264338327950288419716939937510582097

log() is de natuurlijke logaritme (die op rekenmachines meestal met ln aangeduid wordt):

log(2.718281828) 
       
0.999999999831127
0.999999999831127
sqrt(8.0) 
       
2.82842712474619
2.82842712474619

Bij exacte invoer worden functies symbolisch toegepast:

sqrt(8) 
       
2*sqrt(2)
2*sqrt(2)
log(3/4) 
       
log(3/4)
log(3/4)

Variabelen

Toekennen aan een variabele gebeurt met "=". Merk op dat de waarde niet getoond wordt als die toegekend wordt.

a = 27 
       

Toon de waarde van a en 1/a:

       
27
27
1/a 
       
1/27
1/27

Meerdere lijnen in één cel, merk op dat alleen het laatste resultaat getoond wordt:

a = 20 a*a b = a + 40 b*b 
       
3600
3600

Gebruik het print commando om eender waar een resultaat te tonen:

print "b is gelijk aan", b print "b*b is gelijk aan", b*b 
       
b is gelijk aan 60
b*b is gelijk aan 3600
b is gelijk aan 60
b*b is gelijk aan 3600

Een eenvoudige for-lus:

for i in [1..10]: print i^3 
       
1
8
27
64
125
216
343
512
729
1000
1
8
27
64
125
216
343
512
729
1000

Een foutmelding:

1/0 
       
Traceback (click to the left of this block for traceback)
...
ZeroDivisionError: rational division by zero
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "_sage_input_110.py", line 10, in <module>
    exec compile(u'open("___code___.py","w").write("# -*- coding: utf-8 -*-\\n" + _support_.preparse_worksheet_cell(base64.b64decode("MS8w"),globals())+"\\n"); execfile(os.path.abspath("___code___.py"))
  File "", line 1, in <module>
    
  File "/var/sage/tmpCfvssu/___code___.py", line 3, in <module>
    exec compile(u'_sage_const_1 /_sage_const_0 
  File "", line 1, in <module>
    
  File "sage/rings/integer.pyx", line 1845, in sage.rings.integer.Integer.__div__ (/opt/sage/sage-7.4/src/build/cythonized/sage/rings/integer.c:12532)
ZeroDivisionError: rational division by zero

Onderbreken van een lange berekening kan met de ESC toets of met Action/Interrupt in het menu bovenaan:

sleep(30) # Dit doet 30 seconden gewoon niets. Voer dit uit en onderbreek dit commando 
       

Het zou niet mogen, maar soms kan iets niet onderbroken worden of werkt Sage in het geheel niet meer. In dit geval kan je wel nog Action/Restart worksheet doen. Dit stopt het volledige werkblad. Het gevolg is onder andere dat alle variabelen verloren gaan.

 
       

Bewerken van een werkblad

Probeer zelf eens alle volgende dingen in Sage:

  • Cel uitvoeren: SHIFT-ENTER of op evaluate klikken
  • Cel uitvoeren en eronder een nieuwe cel maken: ALT-ENTER
  • Nieuwe regel in een cel: ENTER
  • Nieuwe cel maken: op het "plus" icoontje klikken of op een blauwe lijn (verborgen tussen 2 cellen) klikken
  • Cel splitsen: CTRL-ENTER
  • Cellen samenvoegen: CTRL-BACKSPACE in het begin van een cel
  • Nieuw tekstblok: op het "tekstballon" icoontje klikken of SHIFT-klikken op een (verborgen) blauwe lijn
  • Bestaand tekstblok aanpassen: dubbelklikken op het tekstblok

Tekstblokken ondersteunen ook (elementaire) LaTeX-wiskunde: $x^{25} \equiv y^2 + y \pmod{17}$.

Let op de fijne rode lijntjes links van de cellen: deze geven aan dat een cel nog niet uitgevoerd is.

 
       
 
       

parent()

We hebben eerder al gezien dat Sage de getallen "3" en "3.0" anders interpreteert. Het commando parent geeft de wiskundige verzameling terug waarvan het object een element is. Dit toont inderdaad een duidelijk verschil (de "with 53 bits of precision" mag je voorlopig negeren):

parent(3) 
       
Integer Ring
Integer Ring
parent(3.0) 
       
Real Field with 53 bits of precision
Real Field with 53 bits of precision
parent(3/1) 
       
Rational Field
Rational Field

Deze ringen en velden hebben ook een naam in Sage: ZZ voor de gehele getallen, QQ voor de rationale getallen, RR voor de reële, CC voor de complexe. Als R zo'n ring of veld is en x een object, dan kan je R(x) gebruiken om x om te zetten naar een element van R.  Hiermee kan je dus types veranderen:

CC 
       
Complex Field with 53 bits of precision
Complex Field with 53 bits of precision
RR 
       
Real Field with 53 bits of precision
Real Field with 53 bits of precision
RR(3) 
       
3.00000000000000
3.00000000000000
parent(RR(3)) 
       
Real Field with 53 bits of precision
Real Field with 53 bits of precision
QQ(0.25) 
       
1/4
1/4
ZZ(1/2) 
       
Traceback (click to the left of this block for traceback)
...
TypeError: no conversion of this rational to integer
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "_sage_input_128.py", line 10, in <module>
    exec compile(u'open("___code___.py","w").write("# -*- coding: utf-8 -*-\\n" + _support_.preparse_worksheet_cell(base64.b64decode("WlooMS8yKQ=="),globals())+"\\n"); execfile(os.path.abspath("___code___.py"))
  File "", line 1, in <module>
    
  File "/var/sage/tmpLmjfU1/___code___.py", line 3, in <module>
    exec compile(u'ZZ(_sage_const_1 /_sage_const_2 )
  File "", line 1, in <module>
    
  File "sage/structure/parent.pyx", line 953, in sage.structure.parent.Parent.__call__ (/opt/sage/sage-7.4/src/build/cythonized/sage/structure/parent.c:9126)
  File "sage/rings/rational.pyx", line 3894, in sage.rings.rational.Q_to_Z._call_ (/opt/sage/sage-7.4/src/build/cythonized/sage/rings/rational.c:31282)
TypeError: no conversion of this rational to integer

Dit werkt ook met symbolische constanten zoals pi:

pi 
       
pi
pi
cos(pi) 
       
-1
-1
RR(pi) 
       
3.14159265358979
3.14159265358979

Bij de reële en complexe velden zie je een precisie in bits, die standaard gelijk is aan 53 (dit lijkt een raar getal maar dit is een precisie die heel vaak gebruikt wordt voor computerberekeningen, de zogenaamde double precision). Deze 53 bits komen overeen met ongeveer 16 decimale cijfers. Als je een getal met meer cijfers ingeeft krijg je een grotere precisie:

a = 3.141592653589793238462643383279502884197169399375105820975 parent(a) 
       
Real Field with 193 bits of precision
Real Field with 193 bits of precision
       
3.14159265358979323846264338327950288419716939937510582097
3.14159265358979323846264338327950288419716939937510582097

Je vraagt je misschien af waarom Sage hier het laatste cijfer van a schijnbaar weglaat: dit heeft te maken met de manier waarop getallen door de computer worden voorgesteld. Intern gebeurt alles binair en de decimale uitvoer die Sage weergeeft is "slechts" een voorstelling van dat binair getal (in de cursus Numerieke Analyse wordt hier verder op ingegaan). Dit heeft onder andere ook het bizarre gevolg dat volgend resultaat niet exact 0 is:

0.2 + 0.1 - 0.3 
       
5.55111512312578e-17
5.55111512312578e-17

Een getal x omzetten naar een kommagetal met een expliciet gekozen precisie gebeurt met de methode x.numerical_approx(bits) of het veel kortere x.n(bits):

a = 3/5 a.numerical_approx(100) 
       
0.60000000000000000000000000000
0.60000000000000000000000000000
r = a.numerical_approx(100) parent(r) 
       
Real Field with 100 bits of precision
Real Field with 100 bits of precision
2.numerical_approx(20) 
       
2.0000
2.0000

Je kan ook het argument digits gebruiken, dit geeft de precisie in decimale cijfers. Hieronder staat $\pi$ met 999 cijfers na de komma (in de 1000 cijfers is de $3$ voor de komma ook meegerekend):

pi.n(digits=1000) 
       
3.1415926535897932384626433832795028841971693993751058209749445923078164\
062862089986280348253421170679821480865132823066470938446095505822317253\
594081284811174502841027019385211055596446229489549303819644288109756659\
334461284756482337867831652712019091456485669234603486104543266482133936\
072602491412737245870066063155881748815209209628292540917153643678925903\
600113305305488204665213841469519415116094330572703657595919530921861173\
819326117931051185480744623799627495673518857527248912279381830119491298\
336733624406566430860213949463952247371907021798609437027705392171762931\
767523846748184676694051320005681271452635608277857713427577896091736371\
787214684409012249534301465495853710507922796892589235420199561121290219\
608640344181598136297747713099605187072113499999983729780499510597317328\
160963185950244594553469083026425223082533446850352619311881710100031378\
387528865875332083814206171776691473035982534904287554687311595628638823\
53787593751957781857780532171226806613001927876611195909216420199
3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117067982148086513282306647093844609550582231725359408128481117450284102701938521105559644622948954930381964428810975665933446128475648233786783165271201909145648566923460348610454326648213393607260249141273724587006606315588174881520920962829254091715364367892590360011330530548820466521384146951941511609433057270365759591953092186117381932611793105118548074462379962749567351885752724891227938183011949129833673362440656643086021394946395224737190702179860943702770539217176293176752384674818467669405132000568127145263560827785771342757789609173637178721468440901224953430146549585371050792279689258923542019956112129021960864034418159813629774771309960518707211349999998372978049951059731732816096318595024459455346908302642522308253344685035261931188171010003137838752886587533208381420617177669147303598253490428755468731159562863882353787593751957781857780532171226806613001927876611195909216420199

We komen nog eens terug op het omzetten naar een rationaal getal met QQ(x). Dit geeft altijd een benaderende breuk terug op basis van de gegeven precisie van x. Hieronder zien we dus twee benaderingen van $\pi$:

pi20 = pi.n(20) pi20 
       
3.1416
3.1416
QQ(pi20) 
       
355/113
355/113
QQ(pi.n(8)) 
       
22/7
22/7

Methoden en functies

De syntax a.numerical_approx(100) geeft een zogenaamde methode aan: het is een functie numerical_approx() die op een bepaald object inwerkt, in dit geval a. We schrijven object.methode(argumenten). Dit in tegenstelling tot een gewone functie-oproep zoals sin(1.5). Doordat Sage zo object-georiënteerd is, zal je vaak met methodes moeten werken. We geven hieronder enkele voorbeelden:

15.is_prime() 
       
False
False
(5/11).denominator() 
       
11
11
M = Matrix(3,3,[1,2,3,4,5,6,7,8,-9]) M 
       
[ 1  2  3]
[ 4  5  6]
[ 7  8 -9]
[ 1  2  3]
[ 4  5  6]
[ 7  8 -9]
M.determinant() 
       
54
54
M.det() 
       
54
54

In al deze gevallen hierboven werkt een gewone functie ook. Dit is zeker geen algemene regel, enkel voor de meest gebruikte methoden:

is_prime(7) 
       
True
True
denominator(5/11) 
       
11
11
det(M) 
       
54
54

TAB-completie en help

Een zeer handig hulpmiddel in Sage is TAB-Completie: als x een object is en je typt x.[TAB] (de TAB-toets op het toetsenbord), dan krijg je een lijst met alle methoden die op x werken. Als je eerst een paar letters typt, enkel de methoden die met die letters beginnen. Als er maar één mogelijkheid is, wordt de naam automatisch aangevuld:

a = 8 
       
a. 
       

Zet je cursus op het einde van de cel hieronder en druk op [TAB]:

a.numeri 
       

Dit werkt ook voor functies die geen methode zijn, maar dan enkel als je al een letter getypt hebt. Druk hier op de TAB-toets:

de 
       

Als je een functie/methode en het haakje ( getypt hebt, geeft TAB de documentatie:

a.numerical_approx( 
       

De documentatie van een specifieke functie/methode bekijken kan ook met ?. Alles wordt goed geïllustreerd met voorbeelden (EXAMPLES):

a.numerical_approx? 
       

Twee vraagtekens ?? geven de broncode weer. Zo kan je zien hoe een bepaalde functie/methode in Sage geprogrammeerd is. Het is uiteraard geen probleem als je hier niets van begrijpt.

a.is_perfect_power?? 
       

Voor uitgebreiderde help kan je terecht bij de Sage help, bijvoorbeeld door rechtsbovenaan het werkblad op "Help" te klikken.