Ich versuche, Pollard Rho Faktorisierungsmethode in Haskell zu implementieren. Hier ist, was ich zuSchnelle Pollard-Rho-Faktorisierung in Haskell
kamfunc :: Int -> Int -> Int
func x n = mod (x * x - 1) n
pollardStep :: Int -> Int -> Int -> Int -> Int -> Int
pollardStep i k n x y
| d /= 1 && d /= n = d
| i == k = pollardStep (i+1) (2*k) n x1 x1
| otherwise = pollardStep (i+1) k n x1 y
where d = gcd n $ abs $ y - x
x1 = func x n
pollard_rho :: Int -> Int
pollard_rho n = pollardStep 1 2 n 2 2
Diese Funktion, wenn fein für kleine Zahlen wie 8051. Aber wenn ich versuche Faktoren für eine große Zahl zu finden, zum Beispiel 1724114033281923457 (I geprüft habe, ist es Verbund mit Faktoren 11363592254 und 1229739323) es dauert ewig (in diesem Fall endet die Funktion nie). Was mache ich falsch? Ich wäre sehr dankbar für jede Hilfe.
nur Schalter 'Int' zu' Integer' überall - es ist nicht die richtige Antwort ist, aber wenn ich Ihren Algorithmus mit nur diese Änderungen verwenden und fragen 'pollard_rho 1724114033281923457' es gibt mir 1402015859 recht schnell) – Carsten
der Grund dafür ist wahrscheinlich, dass' x * (x-1) 'Überläufe bei Verwendung von' Int' – Carsten
@Carsten Das funktioniert !! geniale Antwort) Ich verbrachte 2 Tage um herauszufinden, was falsch ist! – ponkin