Zu lange Zahlen? Berechnen.

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
TimeMen
User
Beiträge: 16
Registriert: Samstag 24. Dezember 2016, 10:25
Wohnort: Deutschland

Zu lange Zahlen? Berechnen.

Beitragvon TimeMen » Freitag 13. Januar 2017, 20:08

Hallo ihr Lieben,
nachdem ich heute meinen kleinen Primzahlrechner ein wenig erweitert habe, und nun einiges an Zeit gespart habe, dachte ich mir mal, aus Spaß eine der Mersenne-Primzahlen zu berechnen.

Dabei kann ich noch 2³¹-1 (2147483647) berechnen.
Verwende ich allerdings die nächste Mersenne-Primzahl 2⁶¹-1 (2305843009213693951) bricht das Programm ohne einen Error ab.
Woran liegt das?
Also die höchste Primzahl die ich bis jetzt berechnen konnte war 100000000003.
Liegt mein Problem an der Größe der Zahlen?
Und wenn ja, ist es möglich das Zahlenspektrum in Python zu erweitern, oder die Zahlen irgendwie zu komprimieren?

Liebe Grüße
TimeMen
Wie poste ich richtig?
Nachdem du Google, die FAQ und die Suchfunktion erfolgreich ignoriert hast, erstellst du zwei bis fünf neue Themen in den falschen Unterforen mit kreativen Titel und undeutlichen Text, unter dem sich jeder etwas anders vorstellen kann.
Benutzeravatar
BlackJack
Moderator
Beiträge: 31402
Registriert: Dienstag 25. Januar 2005, 23:29
Wohnort: Berlin
Kontaktdaten:

Re: Zu lange Zahlen? Berechnen.

Beitragvon BlackJack » Freitag 13. Januar 2017, 20:14

@TimeMen: Woran das liegt kann man ohne den Code zu kennen nicht sagen. 2⁶¹-1 ist jedenfalls keine Zahl die zu gross für Python wäre:
  1. In [10]: 2**61-1
  2. Out[10]: 2305843009213693951L
“A lesson I've learned over and over is that computer programs live far longer than you expect. It pays to do 'em better at the beginning, 'cause you're likely to live with them quite a while.” — Cameron Laird in c.l.p
TimeMen
User
Beiträge: 16
Registriert: Samstag 24. Dezember 2016, 10:25
Wohnort: Deutschland

Re: Zu lange Zahlen? Berechnen.

Beitragvon TimeMen » Freitag 13. Januar 2017, 20:19

  1. for i in progressbar(range(3, int(sqrt(int(zahl)))+1, 2), "Rechne: ", 50):
  2.     zChk = int(zahl) / float(i)
  3.     if zChk.is_integer():
  4.         exit()


Das ist ein Auszug. "progressbar" ist ein Modul, dass mir den Status der Berechnung anzeigt.
zahl ist meine Eingabe,
und es wird eben überprüft ob die Zahl durch das aktuelle i eine Natürliche Zahl ist oder eben nicht.
Ist das der Fall, wird man aus der Schleife geschmissen, ansonsten geht das immer so weiter, bis die Schleife eben durch ist, und ich das Ergebnis bekomme.

Hoffe der Codeschnipsel reicht, ansonsten einfach mehr verlangen, wobei hier das Problem sein sollte meiner Meinung nach.

LG
TimeMen
Zuletzt geändert von BlackJack am Freitag 13. Januar 2017, 20:21, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Wie poste ich richtig?
Nachdem du Google, die FAQ und die Suchfunktion erfolgreich ignoriert hast, erstellst du zwei bis fünf neue Themen in den falschen Unterforen mit kreativen Titel und undeutlichen Text, unter dem sich jeder etwas anders vorstellen kann.
Benutzeravatar
BlackJack
Moderator
Beiträge: 31402
Registriert: Dienstag 25. Januar 2005, 23:29
Wohnort: Berlin
Kontaktdaten:

Re: Zu lange Zahlen? Berechnen.

Beitragvon BlackJack » Freitag 13. Januar 2017, 20:34

@TimeMen: Was soll das `int()` bei `zahl`? `zahl` sollte schon eine ganze Zahle sein und Du solltest nicht mit Gleitkommazahlen operieren wenn das nicht nötig ist, denn ich vermute mal ganz stark, dass das hier Dein Problem ist. Ob eine ganze Zahl ohne Rest durch eine andere ganze Zahl teilbar ist, prüft man indem man den Rest der Division, also die Modulo-Operation mit 0 vergleicht. Wenn Du irgendwo Gleitkommazahlen in der Rechnung hast, dann bekommst Du auch die ganzen Probleme die die so haben. Als Gleitkommazahl lässt sich 2⁶¹-1 nämlich nicht darstellen und das muss man können wenn man diese Zahl durch eine Gleitkommazahl teilt:
  1. In [21]: x = 2**61-1
  2.  
  3. In [22]: x
  4. Out[22]: 2305843009213693951L
  5.  
  6. In [23]: x == float(x)
  7. Out[23]: False


`zChk` ist ein schlechter Name. Zum einen hält er sich nicht an die übliche Schreibweise für Werte (`kleinbuchstaben_mit_unterstrichen`), dann ist es eine kryptische Abkürzung.

`exit()` verlässt nicht die Schleife sondern das Programm, was da wohl eher nicht hingehört. Die ``break``-Anweisung würde die Schleife verlassen. Oder eine ``return``-Anweisung die gesamte Funktion.
“A lesson I've learned over and over is that computer programs live far longer than you expect. It pays to do 'em better at the beginning, 'cause you're likely to live with them quite a while.” — Cameron Laird in c.l.p
TimeMen
User
Beiträge: 16
Registriert: Samstag 24. Dezember 2016, 10:25
Wohnort: Deutschland

Re: Zu lange Zahlen? Berechnen.

Beitragvon TimeMen » Freitag 13. Januar 2017, 20:44

Danke für die Hinweise zur Programmierung bzgl. Stil.
Gibt es da eigentlich irgendwo ein Regelwerk?
Denn ich wüsste schon gerne wie man das so "regelkonform" ^^ macht wie es sich gehört.

Nein, die Eingabe war noch keine ganze Zahl, da ich das 'int' bei der Eingabe vergessen habe...
Und die Modulo Sache habe ich sogar in einem anderen Skript verwendet, nur leider nicht hierbei daran gedacht.
Sollte es dann so ausschauen?

  1. for i in progressbar(range(3, int(sqrt(zahl))+1, 2), "Rechne: ", 50):
  2.     if zahl % i == 0:
  3.         exit()


LG
TimeMen
Wie poste ich richtig?
Nachdem du Google, die FAQ und die Suchfunktion erfolgreich ignoriert hast, erstellst du zwei bis fünf neue Themen in den falschen Unterforen mit kreativen Titel und undeutlichen Text, unter dem sich jeder etwas anders vorstellen kann.
Benutzeravatar
BlackJack
Moderator
Beiträge: 31402
Registriert: Dienstag 25. Januar 2005, 23:29
Wohnort: Berlin
Kontaktdaten:

Re: Zu lange Zahlen? Berechnen.

Beitragvon BlackJack » Freitag 13. Januar 2017, 21:14

@TimeMen: Es gibt den Style Guide for Python Code.

Mich stört da ja noch das `exit()`. :-)
“A lesson I've learned over and over is that computer programs live far longer than you expect. It pays to do 'em better at the beginning, 'cause you're likely to live with them quite a while.” — Cameron Laird in c.l.p
TimeMen
User
Beiträge: 16
Registriert: Samstag 24. Dezember 2016, 10:25
Wohnort: Deutschland

Re: Zu lange Zahlen? Berechnen.

Beitragvon TimeMen » Freitag 13. Januar 2017, 21:21

Danke für den Link,
Naja, was soll ich sonst machen?
Wenn die Schleife durchgerattert ist bekomme ich eine Auswertung bezüglich dessen, dass die Zahl prim ist, die Dauer, und wieviele zahlen pro Sekunde getestet wurden.
Und wenn die Zahl eben nicht prim ist fliege ich aus dem Programm. Nicht gut so? :D
Man kann natürlich noch die Aussage bekommen dass die Zahl nicht prim ist, aber was ist an dem exit() so verwerflich?

LG
TimeMen
Wie poste ich richtig?
Nachdem du Google, die FAQ und die Suchfunktion erfolgreich ignoriert hast, erstellst du zwei bis fünf neue Themen in den falschen Unterforen mit kreativen Titel und undeutlichen Text, unter dem sich jeder etwas anders vorstellen kann.
Benutzeravatar
BlackJack
Moderator
Beiträge: 31402
Registriert: Dienstag 25. Januar 2005, 23:29
Wohnort: Berlin
Kontaktdaten:

Re: Zu lange Zahlen? Berechnen.

Beitragvon BlackJack » Freitag 13. Januar 2017, 22:05

@TimeMen: Es ist einfach das falsche Sprachmittel an dieser Stelle das gesamte Programm zu beenden wenn man eigentlich nur die Schleife verlassen möchte. Das sagt etwas ganz anderes aus. `exit()` sollte man nur verwenden wenn man einen Rückgabewert an das Betriebssystem zurückgeben will, also wenn man das mit einer Zahl als Argument aufruft mit der der Aufrufer des Programms dann irgend etwas anfangen kann. Ansonsten kann man den Programmfluss immer so arrangieren das man ohne diese Aufruf auskommt. Und das ist einfach sauberer, einfacher nachvollziebar, erweiterbar, testbar. Also so wie Code sein sollte.
“A lesson I've learned over and over is that computer programs live far longer than you expect. It pays to do 'em better at the beginning, 'cause you're likely to live with them quite a while.” — Cameron Laird in c.l.p

Zurück zu „Wissenschaftliches Rechnen“

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder