Programmieren mit Python/Cython in SAGE

Neue Frage »

ChilliJilli Auf diesen Beitrag antworten »
Programmieren mit Python/Cython in SAGE
Meine Frage:
Huhu

Wie ich heute schonmal in einem ähnlichen Beitrag geschrieben habe, bin ich blutiger Anfänger was das Programmieren im Allgemeinen angeht. Nachdem ich mich den ganzen Tag über mit dem SAGE-System auseinandergesetzt habe, wage ich mich nun an die folgende Aufgabe, die ich Lösen muss:

a)
Man implementiere in SAGE eine Funktion ggT, die zwei ganze Zahlen a und b übergeben bekommt, mit dem Euklidischen Algorithmus den größten gemeinsamen Teiler d von a und b berechnet und sowohl d als auch die Anzahl der benötigten Divisionen mit Rest zurückgibt.

b)
Man stelle eine Tabelle auf, aus der für alle n Element Z>=1 abgelesen werden kann, wie viele Paare (a,b)Element{ 1,...,10^4}^2 es gibt, für die der Euklidische Algorithmus genau n Divisionen mit Rest benötigt.


Meine Ideen:
Mein Ansatz zu a)
def ggT(a,b):
____while b>0:
________r= a%b
________a=b
________b=r
____return a
Damit bekomme ich schonmal den ggT, aber was mir noch fehlt ist eine Art "Schleifenzähler" oder ähnliches (keine Ahnung ob es sowas gibt oder wie das dann heißt), damit ich die Anzahl der Durchgänge auch ausgegeben bekomme.

zu b)
Hier habe ich noch gar keine Ahnung, da ich nicht weiß, wie man eine Tabelle programmieren kann oder was diese Tabelle dann enthalten soll. Ich soll glaub ich eine Tabelle erstellen in der ich ablesen kann wie viele Schritte ich bei bestimmten (a,b) brauchen werde, aber wie das gehen soll ...
soase Auf diesen Beitrag antworten »

Schleifenzähler: Führ eine Variable ein, die sich bei jedem Schleifendurchgang um 1 erhöht.

Tabelle: siehe z.B. deutsches Sage-Tutorial Seite 12. (Googeln und Dokumente durchsuchen scheint nicht deine Stärke zu sein)
ChilliJilli Auf diesen Beitrag antworten »

Ich habs jetzt mal so probiert:

def ggT(a,b):
____i=0
____while b>0:
________r= a%b
________a=b
________b=r
________i+=1
____return a,i


stimmt das dann so?
soase Auf diesen Beitrag antworten »

Keine Ahnung ob i+=1 gültige Syntax in Sage ist, ansonsten sollte es funktionieren.
Probiers doch einfach aus.
ChilliJilli Auf diesen Beitrag antworten »

Ich habs jetzt mal versucht und in einer Datei angehängt.

Ich bekomme zumindest eine Lösung, aber ob der Zähler so richtig läuft?
Ich find problematisch, dass er anzeigt, dass ggT(10,0) =ggT(0,10) = 10 ist wobei er bei
ggT(10,0) keinen Durchgang zählt und bei ggT(0,10) einen.
Darf das so sein, oder muss ich den Zähler anders setzen?
Mystic Auf diesen Beitrag antworten »

Daran ist nix problematisch: Wenn a<b ist, dann verbraucht der Algorithmus eine Division für's Vertauschen von a und b... Augenzwinkern
 
 
ChilliJilli Auf diesen Beitrag antworten »

ok - das ging ja noch recht gut...

bleibt noch Aufgabenteil b...

Da ich noch überhaupt keine Ahnung hab wie ich eine Tabelle erstelle und auch wie diese Tabelle aussehen soll muss ich wohl zuvor noch einige Foren und Tutorien durchforsten *juhuu* :/ *seufz*

Vielen Dank schonmal für die Hilfe bisher
Mystic Auf diesen Beitrag antworten »

Lass einfach deinen Algorithmus für alle zulässigen Werte von a und b laufen und vergrößere in einem array c der Größe mindestens 20 (mit Nullen initialisiert, falls nicht automatisch) das Feld c[n] jeweils um 1 falls für ein Paar (a,b) gilt, dass für die Berechnung von ggT(a,b) gerade n Divisionen notwendig waren...
ChilliJilli Auf diesen Beitrag antworten »

Ich hab leider echt nichts gefunden, was mir helfen könnte und versuche es jetzt so, aber alle Versuche verlaufen im sande (fehlermeldungen wie "invalide syntax" oder undefined)

Also ich wollte ganz gerne erstmal angeben, dass a und b in diesem speziellen Definitionsbereich sein müssen, aber schon das geht nicht. Ich hatte verschiedene Versionen versucht, aber keine wurde von SAGE akzeptiert traurig
Hier zwei Versionen die ich Versucht hatte:

for a in range (1,10000) and b in range (1,10000):
____print (a,b)

for (a,b) in range (1,10000):
____print (a,b)


was dann noch anders sein müsste, wenn das mit dem Definitionsbereich dann mal klappt, ist, dass SAGE mit dann nicht nur alle (a,b) ausgeben sollte, sondern sie nach den Anzahlen der Divisionen sortieren sollte.
Ich weiß nur leider auch noch gar nicht wie mal etwas in mehrere Spalten packt, also Spalte 1: alle Paare, die eine Division brauchen; Spalte 2: alle die zwei brauchen usw.


zu dem Hinweiß von Mystic: ich hab leider keine Ahnung, was ein "array" sein soll und als ich versuchte so etwas wie "array c = 20" einzugeben, bekam ich auch nur Syntaxfehlermeldungen...
ChilliJilli Auf diesen Beitrag antworten »

Hab jetzt i-wie Glück gehabt und zufällig doch noch n bissl was geschafft Big Laugh

Ich hab erstmal meine ggT Funktion so modifiziert, dass sie mir nicht mehr den ggT ausgibt, sondern nur die Anzahl der Divisionen.
Dann hab ich a und b erstmal nur Element aus {1,...,4} gewählt (ging schneller, ist übersichtlicher)
und SAGE gibt mir nun aus Anzahl der Divisionen, (a,b) (siehe Abbildung unten)

Ich muss das also jetzt noch ordnen nach der Anzahl der Divisionen ordnen und n bisschen tabellenartiger aussehen lassen. Kann dabei jemand helfen?
Neue Frage »
Antworten »



Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »