Integer
statt int
), um beispielsweise eine bessere Genauigkeit zu erreichen, und eben auch die Operatoren passender belegen zu können. Ein String.
{{{id=136| a="abc" a /// 'abc' }}}"Addition" von Strings bedeutet Verkettung.
{{{id=137| a+"de" /// 'abcde' }}} Neben den einfachen Datentypen sind Listen ein sehr wichtiger Typ in Sage (und Python). Listen werden durch Angeben der Listenelemente zwischen eckigen Klammern [] erstellt. Die Einträge müssen nicht denselben Typ haben. Man kann Listen auch verschachteln. Um Speicherangelegenheiten braucht man sich dabei als Programmierer überhaupt nicht zu kümmern (anders als bei Arrays o.ä. in C): {{{id=17| b = [5, 4/3, 23, "string", [2,3,4]] b /// [5, 4/3, 23, 'string', [2, 3, 4]] }}} {{{id=159| l1=[1,2] l2=[] print l1, l2 /// [1, 2] [] }}}Element an Liste anhöngen mit append() und Konkatenation mit "+"
{{{id=154| l1.append(8) l2.append(3) l3=l1+l2 print l1, l3 /// [1, 2, 8] [1, 2, 8, 3] }}}Zugreifen auf einzelne Elemente der Liste. Index startet mit 0!
{{{id=160| l1[1] /// 2 }}}Teillisten
{{{id=161| print l1[1:] /// [2, 8] }}} {{{id=165| l4=[0,1,2,3,4,5] print l4[1:3] /// [1, 2] }}} Der Integer-Typ ist nicht auf 32-Bit-Werte eingeschränkt, sondern kann mit beliebig großen Zahlen umgehen: {{{id=20| 2^1000 /// 10715086071862673209484250490600018105614048117055336074437503883703510511249361224931983788156958581275946729175531468251871452856923140435984577574698574803934567774824230985421074605062371141877954182153046474983581941267398767559165543946077062914571196477686542167660429831652624386837205668069376 }}} Bei Kommazahlen kann man die Präzision (Anzahl der Binär-Stellen/Bits) auch frei wählen. Der Befehl RealField erstellt quasi den dazugehörigen Datentyp (Parameter ist die Anzahl der Bits für die Rechen-Genauigkeit). Um Zahlen in dieser Präzision zu berechnen, kann man R() zum Umwandeln verwenden. Vorsicht: Bei Rechnungen wird die Präzision des jeweils ungenauesten Wertes übernommen. Im folgenden Beispiel findet nur die erste Rechung tatsächlich mit 1000 Bits Präzision statt; die zweite rechnet zuerst in Standard-Präzision und konvertiert erst danach zu 1000 Bit durch Auffüllen mit 0; die dritte übernimmt bei der Division die Standard-Präzision des ungenaueren Operanden: {{{id=18| R = RealField(1000) genau = R(5.0)/R(3.0) ungenau1 = R(5.0/3.0) ungenau2 = R(5.0)/3.0 genau, ungenau1, ungenau2 /// (1.66666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666667, 1.66666666666666674068153497501043602824211120605468750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, 1.66666666666667) }}}div
+TAB, a.
+TAB für eine Liste der möglichen Funktionen von Variable a).File: /usr/local/sage-6.3/local/lib/python2.7/site-packages/sage/rings/arith.py
Type: <type ‘function’>
Definition: gcd(a, b=None, **kwargs)
Docstring:
The greatest common divisor of a and b, or if a is a list and b is omitted the greatest common divisor of all elements of a.
INPUT:
- a,b - two elements of a ring with gcd or
- a - a list or tuple of elements of a ring with gcd
Additional keyword arguments are passed to the respectively called methods.
OUTPUT:
The given elements are first coerced into a common parent. Then, their greatest common divisor in that common parent is returned.
EXAMPLES:
sage: GCD(97,100) 1 sage: GCD(97*10^15, 19^20*97^2) 97 sage: GCD(2/3, 4/5) 2/15 sage: GCD([2,4,6,8]) 2 sage: GCD(srange(0,10000,10)) # fast !! 10Note that to take the gcd of n elements for n \not= 2 you must put the elements into a list by enclosing them in [..]. Before #4988 the following wrongly returned 3 since the third parameter was just ignored:
sage: gcd(3,6,2) Traceback (most recent call last): ... TypeError: gcd() takes at most 2 arguments (3 given) sage: gcd([3,6,2]) 1Similarly, giving just one element (which is not a list) gives an error:
sage: gcd(3) Traceback (most recent call last): ... TypeError: 'sage.rings.integer.Integer' object is not iterableBy convention, the gcd of the empty list is (the integer) 0:
sage: gcd([]) 0 sage: type(gcd([])) <type 'sage.rings.integer.Integer'>TESTS:
The following shows that indeed coercion takes place before computing the gcd. This behaviour was introduced in trac ticket #10771:
sage: R.<x>=QQ[] sage: S.<x>=ZZ[] sage: p = S.random_element() sage: q = R.random_element() sage: parent(gcd(1/p,q)) Fraction Field of Univariate Polynomial Ring in x over Rational Field sage: parent(gcd([1/p,q])) Fraction Field of Univariate Polynomial Ring in x over Rational FieldMake sure we try QQ and not merely ZZ (trac ticket #13014):
sage: bool(gcd(2/5, 3/7) == gcd(SR(2/5), SR(3/7))) TrueMake sure that the gcd of Expressions stays symbolic:
sage: parent(gcd(2, 4)) Integer Ring sage: parent(gcd(SR(2), 4)) Symbolic Ring sage: parent(gcd(2, SR(4))) Symbolic Ring sage: parent(gcd(SR(2), SR(4))) Symbolic RingVerify that objects without gcd methods but which can’t be coerced to ZZ or QQ raise an error:
sage: F.<a,b> = FreeMonoid(2) sage: gcd(a,b) Traceback (most recent call last): ... TypeError: unable to find gcd
If | If-Else | If-Elif-Else | |
---|---|---|---|
In C: |
if (condition) { statements } |
if (condition) { statements } else { statements } |
— |
In Sage/Python: |
if condition: statements |
if condition: statements else: statements |
if condition: statements elif condition: statements ... elif condition: statements else: statements |
float x = 355.0/113.0; if (x >= 3 && x <= 5) { printf("%d is between 3 and 5\n", x); }In Python/Sage: {{{id=49| x = pi if x >= 3 and x <= 5: print x, "is between 3 and 5" /// pi is between 3 and 5 }}} oder auch: {{{id=51| if 3 <= x <= 5: print "{x} is between 3 and 5".format(x=x) /// pi is between 3 and 5 }}} Einrückung statt Klammern!
While | While-Else | ||
---|---|---|---|
In C: |
while (condition) { statements } |
— | |
In Sage/Python: |
while condition: statements |
while condition: statements else: statements |
For | For-Else | ||
---|---|---|---|
In C: |
for (init; condition; update) { statements } |
— | |
In Sage/Python: |
for element in sequence: statements |
for element in sequence: statements else: statements |
int i; for (i = 0; i < 10; i++) { printf("%d^2 = %d\n", i, i*i); }In Python/Sage wird stattdessen eine Liste der Werte angegeben, für die die Schleife ausgeführt werden soll: {{{id=5| for i in [0,1,2,3,4,5,6,7,8,9]: print i, "^2 = ", i^2 /// 0 ^2 = 0 1 ^2 = 1 2 ^2 = 4 3 ^2 = 9 4 ^2 = 16 5 ^2 = 25 6 ^2 = 36 7 ^2 = 49 8 ^2 = 64 9 ^2 = 81 }}} {{{id=79| for letter in "alternativlos": if letter in "aeiou": print 3 * letter, else: print letter, /// aaa l t eee r n aaa t iii v l ooo s }}} Natürlich braucht man diese Sequence nicht immer explizit selbst händisch erzeugen, sondern viele eingebaute Funktionen liefern eine Liste oder andere solche Sequence als Ergebnis zurück: In Sage/Python: {{{id=22| for i in range(10): print i, "^2 = ", i^2 /// 0 ^2 = 0 1 ^2 = 1 2 ^2 = 4 3 ^2 = 9 4 ^2 = 16 5 ^2 = 25 6 ^2 = 36 7 ^2 = 49 8 ^2 = 64 9 ^2 = 81 }}} In Sage: {{{id=59| for i in [0..9]: print i, "^2 = ", i^2 /// 0 ^2 = 0 1 ^2 = 1 2 ^2 = 4 3 ^2 = 9 4 ^2 = 16 5 ^2 = 25 6 ^2 = 36 7 ^2 = 49 8 ^2 = 64 9 ^2 = 81 }}}
Oder mit anderer Schrittweite
{{{id=142| for i in [0,2..9]: print i, "^2 = ", i^2 /// 0 ^2 = 0 2 ^2 = 4 4 ^2 = 16 6 ^2 = 36 8 ^2 = 64 }}}Achtung: range erzeugt den Python-Integertyp. Manche Funktionen funktionieren damit nicht!
{{{id=146| for i in range(3,6): print parent(i) i.is_prime() ///Für solche Zwecke besser srange verwenden.
{{{id=148| for i in srange(3,6): print parent(i) i.is_prime() /// Integer Ring True Integer Ring False Integer Ring True }}}Im Prinzip kann über alle endlichen Kollektionen iteriert werden. Mehr dazu später unter dem Stichwort "generator".
{{{id=150| for k in Integers(7): print k /// 0 1 2 3 4 5 6 }}}int plus(int a, int b) { return a + b; }In Sage/Python ist es nicht notwendig, Datentypen (insb. Typ des Rückgabewerts) anzugeben: {{{id=81| def plus(a, b): return a + b /// }}} Diese Funktion funktioniert also für alle Datentypen, die den +-Operator unterstützen, auch Strings, Listen etc: {{{id=71| print plus(4, 6) print plus("hello", "world") print plus(pi/2, 1/2) /// }}} Wenn für Parameter Default-Werte angegeben werden, müssen beim Aufruf nicht alle Parameter angegeben werden: {{{id=72| def diff(a, b=1): return a - b /// }}} {{{id=151| diff(5) /// 4 }}} {{{id=152| diff(2,5) /// -3 }}} {{{id=48| diff(b=2, a=5) /// 3 }}} Vorsicht: bei den untenstehenden Beispielen wird nur jeweils das Ergebnis der letzten Zeile einer Box tatsächlich ausgegeben! Zum Experimentieren Befehle jeweils in eigene Boxen kopieren oder Box mit der Tastenkombination STRG plus ; in mehrere Boxen zerteilen und einzeln ausführen. STRG plus BACKSPACE verbindet zwei Boxen wieder.