Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Ich versuche eine Prozedur in SageMath zuschreiben mit der ich eine gerade natürliche Zahl n als summe von zwei primzahlen schreiben lässt. Allerdings tauchen immer error auf. Vielleicht findet ja jemand fehler(?) oder hat eine andere Ansatz-Idee?
(die Sternchen sind nur damit es auf der richtigen Stufe steht...)
Schon nicht schlecht, das du mit * die Einrueckungen gemacht hast - den meisten neuen Leuten hier ist das egal & der Code ist nicht mehr lesbar.
Besser ist es aber trotzdem die code-Tags zu benutzen. Das ist dann auch weniger Arbeit fuer dich. Dazu den Code einkopieren, und im vollstaendigen Editor auf das "</>"-Icon klicken.
Und zu deinem Problem: ich sehe diverse Fehler wie zB "Def" das "def" geschrieben werden muss, gleiches gilt fuer fast alle anderen Schluesselworte wie if, while, else. Auch Print muss klein etc.
Und "&" ist bitweises und, was du dort suchst ist "and".
Auch solltest du dich entscheiden, ob du mit "print etwas" arbeiten kannst (dann ist das Python 2), oder mit "print(etwas)" arbeiten musst - dann ist das Python 3.
[/code[code][code]]---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-13-d2beed09dfd1> in <module>()
4 k + (n-k)
5
----> 6 if n%Integer(2)==Integer(0):
7 while k<n:
8
/opt/sagemath-8.6/local/lib/python2.7/site-packages/sage/rings/integer.pyx in sage.rings.integer.Integer.__mod__ (build/cythonized/sage/rings/integer.c:21551)()
3316
3317 # Use the coercion model
-> 3318 return coercion_model.bin_op(x, y, operator.mod)
3319
3320 def quo_rem(Integer self, other):
/opt/sagemath-8.6/local/lib/python2.7/site-packages/sage/structure/coerce.pyx in sage.structure.coerce.CoercionModel_cache_maps.bin_op (build/cythonized/sage/structure/coerce.c:10649)()
1209 # We should really include the underlying error.
1210 # This causes so much headache.
-> 1211 raise bin_op_exception(op, x, y)
1212
1213 cpdef canonical_coercion(self, x, y):
TypeError: unsupported operand parent(s) for %: '<type 'function'>' and 'Integer Ring
@Sarah1111: Der Code dazu wäre auch wichtig. Und zwar nicht in einer Textverarbeitung etwas schreiben was so ähnlich aussieht, sondern tatsächlich den Code der zu diesem Stacktrace geführt hat.
Der Compiler gibt nicht die Stelle an, an der ein Syntaxfehler ist, sondern die Stelle an dem ihm auffällt das der vorliegende Code syntaktisch nicht korrekt sein kann. Der Fehler ist dann an der Stelle oder irgendwo davor.
Edit: Moment mal: Das ist jetzt aber gar kein Syntaxfehler mehr, sondern ein `TypeError`. Und der sagt recht deutlich was das Problem ist: der Modulo-Operator (``%``) ist für Python-Funktionen und etwas vom Typ `Integer Ring` nicht definiert. Was hättest Du denn da erwartet als Ergebnis dieser Operation?
Zuletzt geändert von __blackjack__ am Montag 15. April 2019, 14:56, insgesamt 1-mal geändert.
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
Also das ist ja schonmal deutlich anderer Code als der, den du da oben zeigst. Und es ist auch kein SyntaxError. Sondern ein TypeError. Warum hast du diese Integer-Objekte erzeugt? Ich kenne SageMath nicht, aber wenn sehe auch keinen Grund, das so zu aendern wenn du wirklich nur wissen willst, ob eine Zahl n gearde ist. Da ist dein alter Code schon ok.
Und nochmal, bitte den GANZEN Code hier einstellen. Sonst kann dir nicht geholfen werden.
wenn ich die Funktion f(k) nennen, bleibt die Funktion aber dennoch f(k)= k + (n-k), oder?
Und die While-Schleife läuft dann trotzdem noch über k? Oder müssen die variablen sich da auch unterscheiden?
Vor allem muss die Funktion ja auch was machen. Sie berechnet eine Summe, aber tut ja nichts damit. Da fehlt (denke ich mal) mindestens ein return. Ausserdem ist deine Schleife falsch. Wenn jemals die if-Bedingung zutreffen sollte, bist du in einer Endloschleife gefangen, denn dann wird dein k niemals wieder inkrementiert. Du willst also eigentlich eher
Als Ersatz fuer die Schleife. Und der Einzeiler kann wahrscheinlich auch direkt verwandt werden, mir fehlt momentan aufgrund der Namenskollision die Stelle, an der du das verwenden willst.
n=var('n')
k=0
def f(k):
k + (n-k)
if n%2==0:
for k in range(n):
((n-k).is_prime) and (k.is_prime()):
print(n-k)
print(k)
else: k += 1
else: print("ERROR")
Dann bekomme ich allerdings folgende Fehlermeldung:
Du rätst hier wild herum, statt Deinen Code Zeile für Zeile aufzubauen und auch zu verstehen, was jede Zeile macht. Die Funktion `f` wird gar nicht benutzt, kann also weg.
k = 0 und k += 1 werden nicht mehr gebraucht, weil Du jetzt eine for-Schleife hast.
Die Klammersetzung ist falsch. Und in der Zeile, in der der Compiler meckert, hast Du etwas gelöscht, was vorher da war.
Einrückungen sind in Python wichtig, und man sollte sehr sorgfältig sein, richtig (mit jeweils 4 Leerzeichen pro Ebene) einzurücken. Dann fällt dem Leser auch viel schneller auf, wenn etwas nicht richtig ist (z.B. ein else-Block bei einer for-Schleife, der hier nicht sinnvoll ist).
Ich bin tatsächlich noch nicht sehr erfahren mit Programmieren. Ich hab jetzt es so geändert, wie du meinstest, bis auf die Klammersetzung, da verstehe ich nicht, welche falsch sind(?):
__blackjack__ hat geschrieben: Montag 15. April 2019, 14:53
Edit: Moment mal: Das ist jetzt aber gar kein Syntaxfehler mehr, sondern ein `TypeError`. Und der sagt recht deutlich was das Problem ist: der Modulo-Operator (``%``) ist für Python-Funktionen und etwas vom Typ `Integer Ring` nicht definiert. Was hättest Du denn da erwartet als Ergebnis dieser Operation?
Ich möchte mit %2 gewährleisten, dass nur gerade zahlen genommen werden für n. Ich kenne den Befehl nur aus Java und der bedeutet in Sage doch das selbe, oder? Vertue ich mich?
Prinzipiell bedeutet der in Python dasselbe, aber du hast ein anderes Objekt dort gehabt. Integer(i). Was auch immer das nun sein soll. Und hier ist dein n ja auch ein "var"-Objekt. Was auch immer *DAS* nun genau ist. Und in dem Code da oben gibt's auch kein k, und mal rufst du is_prime auf (mit Klammern dahinter), und mal nicht.... so geht das nicht. Der Code den du hier postest, das muss auch GENAU der Code sein, den du laufen laesst, UND die GENAU dazu passende Fehlermeldung. Nicht irgendwas das du dir gemerkt hast, und das auf irgendwelchen frueheren Zustaenden basiert. Sonst kann dir hier leider keiner helfen.