Arithmetisch mit beliebig großen Ganzzahlen in PHP

8

Ok, PHP ist nicht die beste Sprache, um mit beliebig großen Ganzzahlen zu arbeiten, wenn man bedenkt, dass es nur nativ 32-Bit-Ganzzahlen mit Vorzeichen unterstützt. Was ich versuche, ist jedoch, eine Klasse zu erstellen, die eine beliebig große Binärzahl darstellen und einfache arithmetische Operationen für zwei davon ausführen kann (addieren / subtrahieren / multiplizieren / dividieren).

Mein Ziel beschäftigt sich mit 128-Bit-Ganzzahlen.

Es gibt ein paar Ansätze, die ich sehe, und Probleme, die ich mit ihnen sehe. Irgendwelche Eingaben oder Kommentare dazu, was Sie wählen würden und wie Sie darüber entscheiden könnten, wären sehr willkommen.

Ansatz # 1: Erstellen Sie eine ganze 128-Bit-Klasse, die ihre Ganzzahl intern als vier 32-Bit-Ganzzahlen speichert. Das einzige Problem bei diesem Ansatz besteht darin, dass ich nicht sicher bin, wie ich mit Überlauf- / Unterlaufproblemen umgehen soll, wenn ich einzelne Blöcke der beiden Operanden manipuliere.

Approach # 2: Verwenden Sie die Erweiterung bcmath, da dies aussieht, als ob sie entwickelt wurde. Meine einzige Sorge bei diesem Ansatz ist die Skalierung der bcmath-Erweiterung, da es keine Rundungsfehler in meinen 128-Bit-Ganzzahlen geben kann. Sie müssen genau sein. Ich mache mir auch Sorgen, das Ergebnis der bcmath-Funktionen in eine binäre Zeichenfolge konvertieren zu können (die ich später in einige Verschlüsselungsfunktionen von mcrypt einfügen muss).

Ansatz Nr. 3: Speichern Sie die Zahlen als Binärzeichenfolgen (wahrscheinlich zuerst LSB). Theoretisch sollte ich auf diese Weise ganze Zahlen beliebiger Größe speichern können. Alles, was ich tun müsste, wäre, die vier grundlegenden arithmetischen Funktionen zu schreiben, um add / sub / mult / div an zwei binären Strings auszuführen und ein binäres String-Ergebnis zu erzeugen. Dies ist genau das Format, das ich auch an mcrypt übergeben muss, das ist ein zusätzliches Plus. Dies ist der Ansatz, von dem ich denke, dass er im Moment am vielversprechendsten ist, aber der einzige Knackpunkt, den ich habe, ist, dass PHP mir keine Möglichkeit bietet, die einzelnen Bits (die ich kenne) zu manipulieren. Ich glaube, ich müsste es in bytegroße Stücke zerlegen (kein Wortspiel beabsichtigt), an diesem Punkt gelten meine Fragen über die Behandlung von Überlauf / Unterlauf von Ansatz # 1.

    
Bob Somers 01.09.2008, 02:37
quelle

4 Antworten

4

Die PHP GMP-Erweiterung wird dafür besser sein. Als zusätzlichen Bonus können Sie damit Ihre Dezimal-zu-Binär-Konvertierung durchführen:

%Vor%     
Jonathon Hill 04.09.2009, 22:46
quelle
3

Es gibt bereits verschiedene Klassen verfügbar , damit Sie sich das anschauen können bevor Sie Ihre eigene Lösung schreiben (falls Sie tatsächlich Ihre eigene Lösung schreiben müssen).

    
SCdF 01.09.2008 03:37
quelle
1

Soweit ich das beurteilen kann, ist die bcmath Erweiterung die, die Sie wollen. Die Daten im PHP-Handbuch sind etwas spärlich, aber Sie können die Genauigkeit genau so einstellen, wie Sie sie benötigen, indem Sie die bcscale () - Funktion oder den optionalen dritten Parameter in den meisten anderen bcmath-Funktionen verwenden. Ich bin mir nicht sicher, was das Binary-Strings-Ding angeht, aber ein bisschen Googeln sagt mir, dass Sie damit umgehen sollten, indem Sie die Funktion pack () verwenden.

    
watchwood 01.09.2008 03:54
quelle
0

Ich habe den folgenden PEMDAS-Beschwerde-BC-Evaluator implementiert, der sein könnte nützlich für Sie.

%Vor%

Es behandelt automatisch Rundungsfehler, stellen Sie die Genauigkeit einfach auf die von Ihnen benötigten Stellen ein.

    
Alix Axel 22.12.2013 15:12
quelle

Tags und Links