Rabin-Miller Strong Pseudoprime Test-Implementierung nicht funktionieren

Versucht, das umzusetzen, Rabin-Miller Strong Pseudoprime Test heute.

Verwendet haben Wolfram Mathworld als Referenz, Zeilen 3-5 fasst mein code ziemlich viel.

Jedoch wenn ich das Programm starte, sagt es (manchmal), dass Primzahlen (auch niedrig wie 5, 7, 11) sind keine Primzahlen. Habe ich mich über den code für eine sehr lange Zeit und kann nicht herausfinden, was falsch ist.

Für die Hilfe ich habe mir auf dieser Website aswell als viele andere Seiten, aber die meisten verwenden eine andere definition (wahrscheinlich das gleiche, aber da bin ich neu in dieser Art von Mathematik, die ich nicht sehen kann die gleiche offensichtliche Verbindung).

Mein Code:

import random

def RabinMiller(n, k):

    # obviously not prime
    if n < 2 or n % 2 == 0:
        return False

    # special case        
    if n == 2:
        return True

    s = 0
    r = n - 1

    # factor n - 1 as 2^(r)*s
    while r % 2 == 0:
        s = s + 1
        r = r // 2  # floor

    # k = accuracy
    for i in range(k):
        a = random.randrange(1, n)

        # a^(s) mod n = 1?
        if pow(a, s, n) == 1:
            return True

        # a^(2^(j) * s) mod n = -1 mod n?
        for j in range(r):
            if pow(a, 2**j*s, n) == -1 % n:
                return True

    return False

print(RabinMiller(7, 5))

Wie unterscheidet sich dies von der gegebenen definition bei Mathworld?

  • Warum muss das in Java als ein tag? Sieht aus wie Python zu mir...
  • Wenn Sie mit Java, vielleicht könnte Sie uns zeigen Sie Ihre java-code zu vergleichen, um den Algorithmus.
  • Sorry, es ursprünglich geschrieben in Java und dann umgeschrieben in Python machen es leichter zu Lesen. Dann, wenn ich gebucht, ich war nicht erlaubt, neues zu schaffen-tags (nicht zu sagen, Python ist ein neuer tag) und nahm einfach Java, da bin ich alles in es. Wieder einmal, sorry für dieses.
  • Sie sollten if n == 2 vor dem check für gerade zahlen, da du sonst zurück False bevor Sie selbst prüfen, ob die Zahl 2.
  • FWIW, eine Menge von der Logik ist umgedreht hier. Die Idee hinter Rabin-Miller-ist, dass Sie testen ein paar Dinge, und wenn die Zahl eine Primzahl ist, dass Sie passieren, also, wenn Sie nicht pass, dann sind es die composite. Jetzt bist du True zurück, sobald eine Prüfung geschieht zu übergeben. Stattdessen, Sie wirklich wollen, testen Sie diese Bedingungen, und wenn Sie Versagen, dann sollten Sie False zurück, und am Ende return True (bedeutet das womöglich, prime).
  • Danke für den Tipp - das ist natürlich wahr. Ich habe die Plätze getauscht auf Sie jetzt. Aber das Allgemeine problem, für n ungleich 2 (wie 7 im code) das problem bleibt immer noch.
  • pow(a, 2**j*s, n) == -1 % n - Ich denke, die % n am Ende ist überflüssig.
  • vergleicht man das Ergebnis der pow mit positiven Argumenten zu -1 (ohne Modul) ist keine gute Idee.
  • war nicht sicher, thx

InformationsquelleAutor Maxwell | 2013-01-30
Schreibe einen Kommentar