unterschiedliche Rechenzeiten: Distributivgesetz gilt nicht für pow und %

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.
Antworten
hubertgrassmann
User
Beiträge: 61
Registriert: Montag 26. Dezember 2022, 14:53

Beim Fermatschen Primzahltest berechnet man a**(p-1)%p. Ich gehe davon aus, dass python (zumindest für ganze Zahlen) einen schnellen Potenzierungsalgorithmus besitzt. Wenn man aber diesen Algorithmus selbst implementiert und nach jeder Multpilikation modulo p reduziert, ergeben sich erstaunlich unterschiedliche Rechenzeiten:
Dauer powmod(2,p-1,p): 0:00:00
Dauer pow(2,p-1)%p: 0:00:00.28
Hier war p = 20996011, 2**p-1 war vor einigen Jahren die größte bekannte Primzahl.
Benutzeravatar
darktrym
User
Beiträge: 784
Registriert: Freitag 24. April 2009, 09:26

Ich sehe da ein Bruchteil einer Sekunde, kann man da irgendwelche Erkenntnisse daraus ziehen?
„gcc finds bugs in Linux, NetBSD finds bugs in gcc.“[Michael Dexter, Systems 2008]
Bitbucket, Github
hubertgrassmann
User
Beiträge: 61
Registriert: Montag 26. Dezember 2022, 14:53

Ergänzung:
Dauer powmod(2,p-1,p): 0:00:00
Dauer pow(2,p-1)%p: 0:00:00.30
Dauer 2**(p-1)%p: 0:00:00.13

Es gibt verschiedene Zeitkomplexitäten; es ist ein Unterschied, ob ein Verfahren exponentielle, polynomiale oder logarithmische Zeit braucht (nicht im täglichen Leben, aber bei großen Problemen kann das schon kritisch sein).
Man kann es ja mal für größere Werte von p versuchen.
nezzcarth
User
Beiträge: 1633
Registriert: Samstag 16. April 2011, 12:47

hubertgrassmann hat geschrieben: Montag 17. April 2023, 18:00 Man kann es ja mal für größere Werte von p versuchen.
Auf einem normalen Rechner mit einem normalen Betriebssystem passiert so viel im Hintergrund/parallel, dass es m.M.n. bei so niedrigen Zeitskalen bei einer einmaligen Messung schwierig wird, eindeutig zu sagen, wie stark der gemessene Wert mit der Berechnung zusammenhängt. Vielleicht sollte man es daher eher mit Mittelwert+Streumaß von sehr vielen Durchläufen derselben Berechnung versuchen?
Benutzeravatar
__blackjack__
User
Beiträge: 13079
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Mindestens mal sollte man das `timeit`-Modul verwenden. Und dann vielleicht auch noch mal die `pow()`-Funktion von Python benutzen. Also für alles. Die hat ein optionales drittes Argument.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten