Seite 1 von 1

Hochzahlen *schäm*

Verfasst: Mittwoch 8. Dezember 2004, 15:19
von FiRe^
Moin,
ich komm aus der VB-Ecke und da bereche ich Hochzahlen so: 5^3
Das "^" ist aber in Python (und in allen andren Sprachen auch :D ) ein XOR!
Ich muss doch nicht wirklich 5*5*5 rechnen, oder? :oops:

mfg,
fiRe

Verfasst: Mittwoch 8. Dezember 2004, 15:44
von mawe
Hi!

5**3 sollte reichen :wink:

Gruß, mawe

Verfasst: Mittwoch 8. Dezember 2004, 15:48
von Dookie
Hi FiRe^,

es gibt auch die Builtinfunktion pow(x, y[, z])
pow(x, y) ist dabei gleichbedeutend mit x**y,
pow(x, y, z) entspricht (x**y) % z ist aber effizienter.


Gruß

Dookie

Verfasst: Mittwoch 8. Dezember 2004, 16:05
von FiRe^
Danke! Ich hab noch eine Frage. Also ich erstelle einen "Zufalls"-long int mit dem random-Modul und will nun prüfen ob es sich um eine Primzahl handelt:

Code: Alles auswählen

def IsPrime(Number):
    for i in xrange(2, Number - 1):
        if Number % i == 0: return False
    return True


nr1, nr2 = pow(10, 200), pow(10, 300)

while 1:
    myNumber = random.randint(nr1, nr2)
    if IsPrime(myNumber):
        break
Aber ich bekomme bei der Funktion IsPrime einen Overflow (OverflowError: long int too large to convert to int)

Wie kann ich das beheben? Oder gibts auch eine eingebaute Funktion zur Primzahlenprüfung?

Verfasst: Mittwoch 8. Dezember 2004, 16:18
von mawe
Hi!
FiRe^ hat geschrieben: Oder gibts auch eine eingebaute Funktion zur Primzahlenprüfung?
Glaub ich nicht. Aber hier findest Du einige Varianten.

Gruß, mawe

Verfasst: Mittwoch 8. Dezember 2004, 16:45
von FiRe^
Hi mawe. Die Varianten da funktionieren alle nicht. Gibt nen Overflow :(

Verfasst: Mittwoch 8. Dezember 2004, 17:22
von fs111
Du musst ja gar nicht alle Zahlen überprüfen, sondern nur bis zur Hälfte der Zahl, denn jede Zahl die größer ist als die Hälfte kann kein Teiler mehr sein.

fs111

Verfasst: Mittwoch 8. Dezember 2004, 17:29
von Leonidas
Soll ich dir mal meinen Primzahlen Benchmark schicken? Der ist extra auf Performance programmiert, auch wenn mir das mißlungen ist.

Verfasst: Mittwoch 8. Dezember 2004, 17:32
von Gast
Hi!

@fs111: Selbst wenn ich die Zahl durch 2 Teile gibts noch einen Overflow
@Leonidas: Funktioniert der denn mit solch großen Zahlen?

Verfasst: Mittwoch 8. Dezember 2004, 17:32
von mawe
Hi fs111!

Es reicht schon bis zur Wurzel.

Gruß, mawe

Verfasst: Mittwoch 8. Dezember 2004, 17:42
von Leonidas
Anonymous hat geschrieben:@Leonidas: Funktioniert der denn mit solch großen Zahlen?
Ich seh grad, nein.. interessant.. für's xrange brauche ich einen int und keinen long int..

Verfasst: Mittwoch 8. Dezember 2004, 18:08
von FiRe^
Hoi! :D

Als ich habs jetzt so gelöst:

Code: Alles auswählen

def IsPrime(Number):
    for i in xrange(999999999, int(math.sqrt(Number)) + 1, 2):
        if Number % i == 0: return False
    return True
Das sieht zwar super blöd aus, aber was solls..

Verfasst: Mittwoch 8. Dezember 2004, 18:14
von mawe
Hi!

Und das funktioniert? Ich bekomm die selbe Fehlermeldung wie vorher. Ausserdem testest Du ja jetzt nur zwischen 999999999 und der Wurzel.

Gruß, mawe

Verfasst: Mittwoch 8. Dezember 2004, 18:18
von Gast
ja aber die kleinste Zahl is ja pow(10, 10)

Verfasst: Mittwoch 8. Dezember 2004, 18:58
von Dookie
Hi,

Milan hat mal ein xrange für Longs gemacht:
http://python.sandtner.org/viewtopic.php?t=1366


Gruß

Dookie

Verfasst: Mittwoch 8. Dezember 2004, 19:40
von Leonidas
Dookie hat geschrieben:Milan hat mal ein xrange für Longs gemacht:
http://python.sandtner.org/viewtopic.php?t=1366
Cooler Code, muss ich bei Gelegenheit in meinen Benchmark einbauen und dann mal gucken. :)