Vorlesung 27.11.2015 -- Sage https://sage.tugraz.at/home/cfrei/9/print Vorlesung 27.11.2015 Sage als Taschenrechner Es folgen einfache Beispiele um die grundlegende mathematische Funktionalität von Sage zu demonstrieren - Auswerten von Zellen mit SHIFT+ENTER (zumindest in vernünftigen Webbrowsern) - Zellen einfügen mit Klick auf blauen Balken - Text-Zellen einfügen mit SHIFT + Klick auf blauen Balken 1+1 2 (4+5)^2-13 68 (5+3)/3 8/3 Ergebnisse in Variablen speichern a=(5+3)/3 a 8/3 a+1 11/3 Inhalt der Variable "schön" anzeigen show(a) 8 3 Irrationale Zahlen 1 of 17 2015-11-27 17:29 Vorlesung 27.11.2015 -- Sage https://sage.tugraz.at/home/cfrei/9/print b=sqrt(2) b sqrt(2) show(b) √2 b^2 2 Formale Ausdrücke. x ist hier eine symbolische Variable expr=(x-b)*(x+b) expr (x + sqrt(2))*(x - sqrt(2)) expr.expand() x^2 - 2 b sqrt(2) Numerische Näherungen an symbolische Ausdrücke b.n() 1.41421356237310 b.n(digits=500) 1.414213562373095048801688724209698078569671875376948073176679737990\ 73247846210703885038753432764157273501384623091229702492483605585073\ 72126441214970999358314132226659275055927557999505011527820605714701\ 09559971605970274534596862014728517418640889198609552329230484308714\ 32145083976260362799525140798968725339654633180882964062061525835239\ 50547457502877599617298355752203375318570113543746034084988471603868\ 99970699004815030544027790316454247823068492936918621580578463111596\ 6687130130156185689872372 pi pi pi.n() 3.14159265358979 pi.n(digits=100) 3.141592653589793238462643383279502884197169399375105820974944592307\ 816406286208998628034825342117068 (Polynom-)funktionen als symbolische Ausdrücke 2 of 17 2015-11-27 17:29 Vorlesung 27.11.2015 -- Sage https://sage.tugraz.at/home/cfrei/9/print f=x^2+5*x+6 f x^2 + 5*x + 6 Hier ergibt numerische Auswertung keinen Sinn f.n() Traceback (click to the left of this block for traceback) ... TypeError: cannot evaluate symbolic expression numerically Plot der Funktion f.plot() f.plot(0,5,color='red') 3 of 17 2015-11-27 17:29 Vorlesung 27.11.2015 -- Sage https://sage.tugraz.at/home/cfrei/9/print Nulstellen finden f.solve(x) [x == -3, x == -2] Faktorisieren f.factor() (x + 3)*(x + 2) Wir plotten den Graphen von f und zeichnen die Nullstellen in rot ein img = f.plot(-5,0) img 4 of 17 2015-11-27 17:29 Vorlesung 27.11.2015 -- Sage https://sage.tugraz.at/home/cfrei/9/print p1 = point((-3,0),color='red',size=50) p2 = point((-2,0),color='red',size=50) Kombination von Grafiken mittels + img+p1+p2 5 of 17 2015-11-27 17:29 Vorlesung 27.11.2015 -- Sage https://sage.tugraz.at/home/cfrei/9/print Ableiten und integrieren f x^2 + 5*x + 6 f.diff(x) 2*x + 5 f.diff(x,2) 2 f.integrate(x) 1/3*x^3 + 5/2*x^2 + 6*x f.integrate(x,0,5) 805/6 Matrizen 6 of 17 2015-11-27 17:29 Vorlesung 27.11.2015 -- Sage https://sage.tugraz.at/home/cfrei/9/print M=matrix(2,[1,1,0,1]) M [1 1] [0 1] show(M) ( 1 1 ) 0 1 M^2 [1 2] [0 1] M.transpose() [1 0] [1 1] Klassen und Objekte Sage basiert auf der objektorientierten Programmiersprache Python. Sehr einfach gesagt, ist in Sage alles ein Objekt, und jedes Objekt ist einer Klasse zugeordnet. Die Klasse stellt sämtliche Funktionen (genannt Methoden) bereit, um das Objekt zu bearbeiten. type(12345) # bestimmt Klasse des Objekts <type 'sage.rings.integer.Integer'> Methoden können auf verschiedene Art aufgerufen werden, manche sollte man nicht verwenden. Integer.factor(12345) # schlecht! 3 * 5 * 823 12345.factor() # gut! 3 * 5 * 823 Mit der "Punkt - Schreibweise" können mehrere Methoden bequem hintereinander ausgeführt werden, und der Code bleibt trotzdem lesbar (x^3).diff(x).integrate(x) x^3 (x^3).diff(x) 7 of 17 2015-11-27 17:29 Vorlesung 27.11.2015 -- Sage https://sage.tugraz.at/home/cfrei/9/print 3*x^2 Viele Methoden sind auch global verfügbar, sollten aber wenn möglich vermieden werden factor(12345) # schlecht! 3 * 5 * 823 Auch + ist als Methode implementiert 3+5 8 3.__add__(5) 8 Auto-Vervollständigung mittels <tab> ist verfügbar (und sehr praktisch!). a=3 a. # Nach dem Punkt <tab> drücken, um eine Liste aller Methoden der Klasse von a (Integer) angezeigt zu bekommen Hilfe mit ? a.factor? File: /usr/local/sage-6.3/src/sage/rings/integer.pyx Type: <type ‘builtin_function_or_method’> Definition: a.factor(algorithm=’pari’, proof=None, limit=None, int_=False, verbose=0) Docstring: Return the prime factorization of this integer as a formal Factorization object. INPUT: algorithm - string 'pari' - (default) use the PARI library 'kash' - use the KASH computer algebra system (requires the optional kash package) 'magma' - use the MAGMA computer algebra system (requires an installation of MAGMA) 'qsieve' - use Bill Hart’s quadratic sieve code; WARNING: this may not work as expected, see qsieve? for more information 'ecm' - use ECM-GMP, an implementation of Hendrik Lenstra’s elliptic curve method. proof - bool (default: True) whether or not to prove 8 of 17 2015-11-27 17:29 Vorlesung 27.11.2015 -- Sage https://sage.tugraz.at/home/cfrei/9/print primality of each factor (only applicable for 'pari' and 'ecm'). limit - int or None (default: None) if limit is given it must fit in a signed int, and the factorization is done using trial division and primes up to limit. OUTPUT: a Factorization object containing the prime factors and their multiplicities EXAMPLES: sage: n = 2^100 - 1; n.factor() 3 * 5^3 * 11 * 31 * 41 * 101 * 251 * 601 * 1801 * 4051 * 8101 * 268501 This factorization can be converted into a list of pairs (p, e), where p is prime and e is a positive integer. Each pair can also be accessed directly by its index (ordered by increasing size of the prime): sage: f = 60.factor() sage: list(f) [(2, 2), (3, 1), (5, 1)] sage: f[2] (5, 1) Similarly, the factorization can be converted to a dictionary so the exponent can be extracted for each prime: sage: f = (3^6).factor() sage: dict(f) {3: 6} sage: dict(f)[3] 6 We use proof=False, which doesn’t prove correctness of the primes that appear in the factorization: sage: n = 920384092842390423848290348203948092384082349082 sage: n.factor(proof=False) 2 * 11 * 1531 * 4402903 * 10023679 * 619162955472170540533894518173 sage: n.factor(proof=True) 2 * 11 * 1531 * 4402903 * 10023679 * 619162955472170540533894518173 We factor using trial division only: sage: n.factor(limit=1000) 2 * 11 * 41835640583745019265831379463815822381094652231 We factor using a quadratic sieve algorithm: sage: p = next_prime(10^20) sage: q = next_prime(10^21) sage: n = p*q sage: n.factor(algorithm='qsieve') doctest:... RuntimeWarning: the factorization returned by qsieve may be incomplete (the factors may not be prime) or even wrong; see qsieve? for details 100000000000000000039 * 1000000000000000000117 We factor using the elliptic curve method: sage: p = next_prime(10^15) sage: q = next_prime(10^21) 9 of 17 2015-11-27 17:29 Vorlesung 27.11.2015 -- Sage https://sage.tugraz.at/home/cfrei/9/print sage: n = p*q sage: n.factor(algorithm='ecm') 1000000000000037 * 1000000000000000000117 TESTS: sage: n.factor(algorithm='foobar') Traceback (click to the left of this block for traceback) ... pi.n? File: /usr/local/sage-6.3/src/sage/symbolic/expression.pyx Type: <type ‘builtin_function_or_method’> Definition: pi.n(prec=None, digits=None, algorithm=None) Docstring: Return a numerical approximation this symbolic expression as either a real or complex number with at least the requested number of bits or digits of precision. EXAMPLES: sage: sin(x).subs(x=5).n() -0.958924274663138 sage: sin(x).subs(x=5).n(100) -0.95892427466313846889315440616 sage: sin(x).subs(x=5).n(digits=50) -0.95892427466313846889315440615599397335246154396460 sage: zeta(x).subs(x=2).numerical_approx(digits=50) 1.6449340668482264364724151666460251892189499012068 sage: cos(3).numerical_approx(200) -0.98999249660044545727157279473126130239367909661558832881409 sage: numerical_approx(cos(3),200) -0.98999249660044545727157279473126130239367909661558832881409 sage: numerical_approx(cos(3), digits=10) -0.9899924966 sage: (i + 1).numerical_approx(32) 1.00000000 + 1.00000000*I sage: (pi + e + sqrt(2)).numerical_approx(100) 7.2740880444219335226246195788 TESTS: We test the evaluation of different infinities available in Pynac: sage: t = x - oo; t -Infinity sage: t.n() -infinity sage: t = x + oo; t +Infinity sage: t.n() 10 of 17 2015-11-27 17:29 Vorlesung 27.11.2015 -- Sage https://sage.tugraz.at/home/cfrei/9/print +infinity sage: t = x - unsigned_infinity; t Infinity sage: t.n() Traceback (click to the left of this block for traceback) ... Quellcode mit ?? a.factorial?? File: /usr/local/sage-6.3/src/sage/rings/integer.pyx Source Code (starting at line 3946): def factorial(self): r""" Return the factorial `n! = 1 \cdot 2 \cdot 3 \cdots n`. If the input does not fit in an ``unsigned long int`` a symbolic expression is returned. EXAMPLES:: sage: for n in srange(7): ... print n, n.factorial() 0 1 1 1 2 2 3 6 4 24 5 120 6 720 sage: 234234209384023842034.factorial() factorial(234234209384023842034) """ if mpz_sgn(self.value) < 0: raise ValueError, "factorial -- self = (%s) must be nonnegative"%self if not mpz_fits_uint_p(self.value): from sage.functions.all import factorial return factorial(self, hold=True) cdef Integer z = PY_NEW(Integer) sig_on() mpz_fac_ui(z.value, mpz_get_ui(self.value)) sig_off() return z 11 of 17 2015-11-27 17:29 Vorlesung 27.11.2015 -- Sage https://sage.tugraz.at/home/cfrei/9/print Zahlen Sage kann in verschiedenen Zahlbereichen rechnen. Jede Zahl ist dabei immer genau einem Zahlbereich zugeordnet. ZZ # exakt Integer Ring QQ # exakt Rational Field RR # Fließkommazahlen Real Field with 53 bits of precision CC # Fließkommazahlen Complex Field with 53 bits of precision AA # Fließkommazahlen Algebraic Real Field QQbar # Fließkommazahlen Algebraic Field SR Symbolic Ring a.parent() gibt den Zahlbereich von a aus Ganze Zahlen 1.parent() Integer Ring Brüche (1/2).parent() Rational Field Der Zahlbereich wird nicht automatisch gewechselt, auch wenn es möglich wäre (2*1/2).parent() Rational Field 2*1/2 1 a=2*1/2 a 12 of 17 2015-11-27 17:29 Vorlesung 27.11.2015 -- Sage https://sage.tugraz.at/home/cfrei/9/print 1 a.parent() Rational Field Will man in einen anderen Zahlbereich konvertieren, muss das explizit angegeben werden b=ZZ(a) b 1 b.parent() Integer Ring Natürlich sind nicht alle Konvertierungen sinnvoll ZZ(1/2) Traceback (click to the left of this block for traceback) ... TypeError: no conversion of this rational to integer Wurzeln werden als symbolische Ausdrücke behandelt sqrt(2).parent() Symbolic Ring AA(sqrt(2)) 1.414213562373095? sqrt(2)^2 2 _.parent() Aufrufs # _ ist immer das Ergebnis des letzten Symbolic Ring QQ(sqrt(2)^2) 2 _.parent() Rational Field ZZ(sqrt(2)^2) 2 _.parent() Integer Ring Reelle und komplexe Zahlen als Fließkommazahlen mit beliebiger (aber fixer) Genauigkeit. Standard: 53 bit 13 of 17 2015-11-27 17:29 Vorlesung 27.11.2015 -- Sage https://sage.tugraz.at/home/cfrei/9/print RR Real Field with 53 bits of precision RRprecise = RealField(prec=500) RRprecise Real Field with 500 bits of precision RR(pi) 3.14159265358979 RRprecise(pi) 3.141592653589793238462643383279502884197169399375105820974944592307\ 81640628620899862803482534211706798214808651328230664709384460955058\ 223172535940813 piprecise=_ piprecise 3.141592653589793238462643383279502884197169399375105820974944592307\ 81640628620899862803482534211706798214808651328230664709384460955058\ 223172535940813 1.234.parent() Real Field with 53 bits of precision piprecise 3.141592653589793238462643383279502884197169399375105820974944592307\ 81640628620899862803482534211706798214808651328230664709384460955058\ 223172535940813 Bei Operationen mit Fleißkommazahlen unterschiedlicher Präzision hat das Ergebnis immer die kleinste Präzision a=piprecise+1.234 a 4.37559265358979 a.parent() Real Field with 53 bits of precision Die ersten 5000000 Stellen von pi. Achtung: langer Output, und ein paar Minuten Rechenzeit pi.n(digits=5000000) komplexe Zahlen 14 of 17 2015-11-27 17:29 Vorlesung 27.11.2015 -- Sage https://sage.tugraz.at/home/cfrei/9/print I I I^2 -1 I ist a priori ein symbolischer Ausdruck, keine Fließkommazahl I.parent() Symbolic Ring CC(I) 1.00000000000000*I Symbolische Ausdrücke y ist standardmäßig als Variable definiert x.parent() Symbolic Ring Symbolische Ausdrücke x ist standardmäßig als Variable definiert y.parent() Traceback (click to the left of this block for traceback) ... NameError: name 'y' is not defined var('y') y y.parent() Symbolic Ring f=(x+y)^2 f (x + y)^2 f.expand() x^2 + 2*x*y + y^2 Sage vereinfacht symbolische Ausdrücke nicht automatisch, erkennt aber Identitäten 15 of 17 2015-11-27 17:29 Vorlesung 27.11.2015 -- Sage https://sage.tugraz.at/home/cfrei/9/print g=(x+y)^2-x^2-2*x*y-y^2 g (x + y)^2 - x^2 - 2*x*y - y^2 g.is_zero() True f=sin(2*y) f sin(2*y) f-2*sin(y)*cos(y) -2*cos(y)*sin(y) + sin(2*y) _.is_zero() True VORSICHT: symbolisches Rechnen ist fehleranfällig, wenn man über "Standardaufgaben" hinausgeht. Bei Problemen, wo man "denken" muss, anstatt nur mechansich zu rechnen, sollte man sich nicht blind auf den Computer verlassen. f=x*sgn(x^2-1) # sgn ist die Signumfunktion, d.h. 1 für positive Zahlen, -1 für negative Zahlen und 0 für 0 f x*sgn(x^2 - 1) f.integrate(x,-2,0) 2 Das letzte Ergebnis ist falsch. Eine einfache händische Rechnung ergibt den richtigen Wert -1 Wenn man den Integrationsbereich händisch aufteilt, um die Unstetigkeiten der Funktion zu vermeiden, liefert auch Sage dieses Ergebnis f.integrate(x,-2,-1) -3/2 f.integrate(x,-1,0) 1/2 f.plot(x,-3,3) 16 of 17 2015-11-27 17:29 Vorlesung 27.11.2015 -- Sage 17 of 17 https://sage.tugraz.at/home/cfrei/9/print 2015-11-27 17:29