Seite 1 von 1

Zu lange Zahlen? Berechnen.

Verfasst: Freitag 13. Januar 2017, 20:08
von TimeMen
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

Re: Zu lange Zahlen? Berechnen.

Verfasst: Freitag 13. Januar 2017, 20:14
von BlackJack
@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:

Code: Alles auswählen

In [10]: 2**61-1
Out[10]: 2305843009213693951L

Re: Zu lange Zahlen? Berechnen.

Verfasst: Freitag 13. Januar 2017, 20:19
von TimeMen

Code: Alles auswählen

for i in progressbar(range(3, int(sqrt(int(zahl)))+1, 2), "Rechne: ", 50):
	zChk = int(zahl) / float(i)
	if zChk.is_integer():
		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

Re: Zu lange Zahlen? Berechnen.

Verfasst: Freitag 13. Januar 2017, 20:34
von BlackJack
@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:

Code: Alles auswählen

In [21]: x = 2**61-1

In [22]: x
Out[22]: 2305843009213693951L

In [23]: x == float(x)
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.

Re: Zu lange Zahlen? Berechnen.

Verfasst: Freitag 13. Januar 2017, 20:44
von TimeMen
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?

Code: Alles auswählen

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

Re: Zu lange Zahlen? Berechnen.

Verfasst: Freitag 13. Januar 2017, 21:14
von BlackJack
@TimeMen: Es gibt den Style Guide for Python Code.

Mich stört da ja noch das `exit()`. :-)

Re: Zu lange Zahlen? Berechnen.

Verfasst: Freitag 13. Januar 2017, 21:21
von TimeMen
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

Re: Zu lange Zahlen? Berechnen.

Verfasst: Freitag 13. Januar 2017, 22:05
von BlackJack
@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.