2011-01-03 12 views
0

Wie würde ich Python mit Werten in der Größenordnung von 1099511627776 Bits groß (ja. 137 GB) arbeiten? Ich habe etwas, was Sie implementieren müssen (oder wenn Sie einen besseren Weg vorschlagen können, wird die Methoden ändern). Offensichtlich haben die neuen Länge-Typen von PGP 3 Abschnitte anstelle von 2. Jetzt sind es: Länge Typ, Länge-Wert-Typ und die Länge. Der Länge-Typ ist 2 Bits, was zu 191 Bytes, 8383 Bytes, 4294967296 Bytes oder Teillängen übersetzt. Die Länge wird dann in Bytes codiert. Wie würde ich überprüfen, ob ein Wert weniger als 4294967296 Bytes groß ist, wenn ich nicht sogar 1 << (4294967296 << 8) tun kann? es ist zu groß, um sogar lange zu passen.Wie gehen Sie mit extrem großen Werten in Python um?

+4

... yikes! Es ist nicht vernünftig, praktisch oder ratsam, mit einer "Nummer" dieser Größe umzugehen. Es muss in Stücke zerlegt werden - z.B. Eine 50-GB-Datenbank wird in der Regel nicht sofort geladen. –

+0

wissen Sie zufällig, wie PGP es tut? – calccrypto

+0

@calcrypto Wenn es sich mit so großen Zahlen beschäftigt, würde ich mir vorstellen, dass es es in einer "komprimierten" Form speichert - wie auf http://primes.utm.edu/largest.html :-) Ist die Quelle verfügbar? Obwohl, wenn man die Primzahlen betrachtet, ist der größte "nur" 12 Millionen Ziffern lang. –

Antwort

1

Mit der Drei-Argument-Form von pow().

+0

was? 'pow (2, 4294967296 << 8)'? Das Problem ist nicht berechnet den Wert. Das Problem besteht darin, den Wert zu speichern. und ich habe keine Nummer zum Mod von – calccrypto

+2

@calccrypto: ich denke, was Ignacio hier meinte ist wie in Mathe schreiben Sie nicht 10 ..... 0, 1000 Null Sie nur 10^1000 geschrieben, so können Ihre Zahlen sein in dieser Form gespeichert :), und ich denke, dass das Muster, das Ignacio Ihnen gegeben hat, sehr hilfreich sein kann, um Berechnungen durchzuführen, schauen Sie sich den RSA-Algorithmus an, um zu sehen, was ich meine, alles basierend auf Arithmetik, insbesondere dem Modulo-Operator. +1 für Ignacio. – mouad

1

Verwenden Sie eine große Nummernbibliothek wie GMPY.

+1

Netter Link. Dies löst jedoch nicht das Problem, sich mit einer Nummer zu befassen, die 137 GB an Daten zum Speichern benötigt ;-) –

2

Es ist nicht nur zu groß, um lange zu passen, es ist zu groß, um in den Speicher eines Computers zu passen. Ich glaube, du hast etwas falsch verstanden.

Wie ich es verstehe, ist der größte Schlüsselwert 4.294.967.295 Bytes. Das sind 4 GB, nicht 137 GB. Sie halten diesen Schlüssel im Speicher nicht als eine Zahl, sondern als eine Folge von Bytes. Also ich weiß nicht, wo Sie eine Nummer bekommen, die 137 GB groß ist.

Wenn PGP dies erfordert, wäre es unmöglich zu implementieren. Da es Implementierungen gibt, bin ich mir sicher, dass das nicht so ist.

(Auch ich bin sicher, es gibt PGP-Module für Python, aber wenn Sie dies tun, nicht weil Sie es brauchen, aber für die Praxis und weil Sie wollen lernen, dann halten!)

+1

4GB. Hoppla. Ich habe wahrscheinlich etwas seltsames in Wolfram Alpha gemacht. Ja, ich lese durch RFC4880 einen zufälligen Abschnitt zu einer Zeit.Ich bin die Art von Person, die wissen will, was hinter den Kulissen ist, anstatt nur bestimmte Befehle zu verwenden – calccrypto

0

Ich interpretiere RFC4880 (November 2007) anders. Abschnitt 3.2 beschreibt Mehrfachpräzisions-Ganzzahlen mit einer Länge von 2 Oktetten, so dass die größte Größe 64 KB betragen würde. Abschnitt 4.2.2 beschreibt das neue Paketformat und die Dokumentennummern der von Ihnen beschriebenen Skala. Aber das Paketformat ist nicht dasselbe wie das Ganzzahlformat mit Mehrfachpräzision. Wenn Sie es anders interpretieren, aktualisieren Sie bitte Ihre Frage mit den genauen Abschnitten des RFC, den Sie gerade lesen.

Verwandte Themen