Ich finde den Fehler nicht (SageMath)

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.
Sarah1111
User
Beiträge: 22
Registriert: Sonntag 14. April 2019, 14:21

Hallo zusammen,

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...)

n=('var')
k=0
Def n(k) :
****k+ (n-k)

If n%2==0:
******While k<n:
*************If ((n-k).is_prime() & k.is_prime()):
****************Print (n-k)
****************Print (k)
*************Else: k+=1
Else: print "error"


Danke für jede Antwort :)
__deets__
User
Beiträge: 14539
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
Sarah1111
User
Beiträge: 22
Registriert: Sonntag 14. April 2019, 14:21

Alle Befehle sind klein kleimgeschrieben :) das hat mein PC leider automatisch gemacht.

Das "and" ist korrigiert, danke :)

Und beim print hab ich die klammern jetzt weg gemacht.

Leider funktioniert der Code immernoch nicht... :/
__deets__
User
Beiträge: 14539
Registriert: Mittwoch 14. Oktober 2015, 14:29

Aber was heisst "funktioniert nicht"? Tut nich was er soll, oder schmeisst einen Fehler? Wenn letzteres, was genau ist der Fehler?
Sarah1111
User
Beiträge: 22
Registriert: Sonntag 14. April 2019, 14:21

Es gibt eine Fehlermeldung.
Die bezieht sich auf die Zeile
if n%2==0
Da gibt er einen Syntax Fehler vor.
__deets__
User
Beiträge: 14539
Registriert: Mittwoch 14. Oktober 2015, 14:29

Bitte den gesamten Code nochmal posten (mit dem code-tag wie beschrieben), und bitte die gesamte Fehlermeldung auch einkopieren.
Sarah1111
User
Beiträge: 22
Registriert: Sonntag 14. April 2019, 14:21

Das ist der fehlercode als ganzes:

Code: Alles auswählen

[/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
[/code]'
Benutzeravatar
__blackjack__
User
Beiträge: 13103
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
__deets__
User
Beiträge: 14539
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
Sarah1111
User
Beiträge: 22
Registriert: Sonntag 14. April 2019, 14:21

Code: Alles auswählen

n=var('n') 
k=0
def n(k):
    k + (n-k)
    
if n%2==0:
    while k<n: 
            
            if  ((n-k).is_prime) and (k.is_prime()):
                print(n-k)
                print(k)
            else: k += 1    
else: print("ERROR")
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Gib deinen Variablen und Funktionen mal vernünftige (und unterschiedliche) Namen, dann klappt das auch
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Sarah1111
User
Beiträge: 22
Registriert: Sonntag 14. April 2019, 14:21

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?
__deets__
User
Beiträge: 14539
Registriert: Mittwoch 14. Oktober 2015, 14:29

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

Code: Alles auswählen

for k in range(n):
     ...
Sarah1111
User
Beiträge: 22
Registriert: Sonntag 14. April 2019, 14:21

Benötige ich denn überhaupt die Funktion? Ginge das nicht auch ohne? Also indem ich einfach n als k + (n-k) definiere?

und für deinen neuen Code: (for k in range (n)… ): Muss der zusätzlich? oder dann als ersatz für die Schleife?

(ich bin gerade etwas hilflos, entschuldigt… )
__deets__
User
Beiträge: 14539
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
Sarah1111
User
Beiträge: 22
Registriert: Sonntag 14. April 2019, 14:21

Wenn ich das jetzt richtig verstanden habe, bekomme ich das folgende:

Code: Alles auswählen

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:

Code: Alles auswählen

  File "<ipython-input-9-89255abdad00>", line 9
    ((n-k).is_prime) and (k.is_prime()):
                                       ^
SyntaxError: invalid syntax
Und an welcher stelle muss dann der return?
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

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).
Sarah1111
User
Beiträge: 22
Registriert: Sonntag 14. April 2019, 14:21

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(?):

Code: Alles auswählen

n=var('n')
    
if n%2==0:
    while k<n:
        for k in range(n):
            if ((n-k).is_prime and k.is_prime()):
                print(n-k)
                print(k)
          
else: print("ERROR")
Sarah1111
User
Beiträge: 22
Registriert: Sonntag 14. April 2019, 14:21

__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?
__deets__
User
Beiträge: 14539
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
Antworten