Vorlesung 27.11.2015 Sage als Taschenrechner

Werbung
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
Zugehörige Unterlagen
Herunterladen