Warum wird es als schwierig angesehen, große ganze Zahlen zu faktorisieren?

17

Ich habe irgendwo gelesen , dass der effizienteste Algorithmus gefunden können die Faktoren berechnen Zeit, aber der Code , den ich geschrieben habe , ist O ( n ) oder Möglicherweise O ( n log n ), je nachdem, wie schnell Division und Modul sind. Ich bin mir ziemlich sicher, dass ich irgendwo etwas falsch verstanden habe, aber ich bin mir nicht sicher, wo. Hier ist, was ich in Pseudocode-Form geschrieben habe.Ö(exp((64/9b)1/3(Logb)2/3)Ö(n)Ö(nLogn)

function factor(number) -> list
    factors = new list
    if number < 0
        factors.append(-1)
        number = -number
    i = 2
    while i <= number
        while number % i == 0
            factors.append(i)
            number /= i
        i++
    return factors
EnderShadow
quelle
3
Google "Pseudo-Polynom".
Raphael
Dieser Algorithmus ist tatsächlich sehr langsam - wenn number eine Primzahl ist, wird die Schleife wiederholt. Es gibt ein sehr einfaches Argument, mit dem Sie mit sqrt (number) -Iterationen davonkommen können.
gnasher729

Antworten:

26

Sie verwechseln die Zahl mit der Anzahl der Bits, die zur Darstellung von n benötigt werden . Hier ist b = die Anzahl der zur Darstellung von n benötigten Bits (also b lg n ). Das macht einen großen Unterschied. A O ( n ) -Zeit - Algorithmus ist ein O ( 2 b ) -Zeit - Algorithmus - exponential in der Anzahl der Bits. Im Vergleich dazu hat der von Ihnen gefundene "effiziente" Algorithmus eine Laufzeit, die in b subexponentiell ist .nnb=nblgnÖ(n)Ö(2b)b

Beispiel: Betrachten Sie (2 Millionen). Dann genügen b = 21 Bits, um die Zahl n darzustellen . Also, ein Algorithmus, ist O ( 2 b 1 / 3 ) wird viel schneller als ein Algorithmus, ist O ( 2 b ) . Ein O ( n ) -Algorithmus fällt in die letztere Kategorie, dh sehr langsam.n=2,000,000b=21nÖ(2b1/3)Ö(2b)Ö(n)

Siehe https://en.wikipedia.org/wiki/Integer_factorization

DW
quelle
1
Ich wusste, dass es so etwas Einfaches war.
EnderShadow
3
@EnderShadow: Auch die Art von Zahlen , dessen Factoring gilt als hart derzeit verfügbare Hardware, und gebrauchten zB in der RSA - Verschlüsselung hat (dh n > 2 1000 ) oder so. Als Übung, vorausgesetzt , dass Sie Computer Ihr laufen kann O ( n ) Algorithmus auf, sagen wir, eine Milliarde Iterationen pro Sekunde berechnen , wie viele Jahre es dauern würde Faktor n 2 1000 . (Wenn Ihre anfängliche Reaktion "das kann nicht richtig sein!" Ist, haben Sie es wahrscheinlich richtig berechnet.)b>1.000n>21,000O(n)n21.000
Ilmari Karonen
1

Sie haben hier ungefähr zwei Fragen, eine allgemeine und eine spezifische zu Ihrem Code. das spezifische wird in der anderen Antwort behandelt. Die allgemeine Frage im Titel über die Komplexität des Factorings ist sehr tief. Leider gibt es keine soliden wissenschaftlichen Beweise dafür, dass Factoring außerhalb von P liegt, mit Ausnahme der (meist umständlichen) Vermutung, dass viele Experten es innerhalb von P versucht haben und gescheitert sind. Es gilt als eines der wichtigsten (und schwer zu lösenden) offenen Probleme der Komplexitätstheorie. nach jahrzehntelangen "heftigen angriffen" sind die besten algorithmen exponentiell. Die Faktorisierungskomplexität ist eines der "wenigen außergewöhnlichen Probleme", von denen bekannt ist, dass sie zwischen " P " und "NP " liegen, die jedoch bisher nicht als vollständig eingestuft wurden.

Wie bereits erwähnt, war die Komplexität kein großes Problem, bis sie Mitte der achtziger Jahre ("grob") in den RSA-Kryptosystemen zum Einsatz kam, in denen die kryptografische Sicherheit von der Annahme abhängt . (Zwei weitere "nicht genau ermutigende" Datenpunkte: Shors-Algorithmus für P-Zeit-Quantenfaktor- und Primalitätstests wurde in den frühen 2000er-Jahren im berühmten / gefeierten AKS-Algorithmus als P-Wert nachgewiesen .) Ein mögliches positives Ergebnis wäre der folgende Die quasipolynomiale Zeit ist schwächer als NP complete (vorausgesetzt, dass P P NP und NP complete eine Exponentialzeituntergrenze haben ), aber technisch immer noch "hart".

Ich habe noch keine großartige Umfrage zu diesem Schlüssel-Thema gefunden. siehe aber auch

vzn
quelle
Ein anderes mögliches, etwas scheinbar "Edge-Case" -Szenario ist, dass Factoring in P sein könnte, aber es gibt immer noch keinen realisierbaren Algorithmus. aka galaktische Algorithmen
vzn
Es sollte erwähnt werden, dass es bei RSA darum geht, das Produkt aus zwei großen Primzahlen zu faktorisieren (wobei jemand die Primzahlen kennt und sie einfach multipliziert, und jemand anderes das Produkt erhält und die Primzahlen finden soll). Es ist denkbar, dass es einen Algorithmus gibt, der Produkte von zwei großen Primzahlen, aber nicht Produkte von mehr als zwei großen Primzahlen, faktorisieren kann. Ebenso kann die Faktorisierung von Zahlen, bei denen es sich um große Primzahlen handelt (von denen jedoch vorher nicht bekannt war, dass sie große Primzahlen sind), in Polynomzeit erfolgen.
gnasher729