Start · Sprachen · PHP · Referenz · GMP

GMP

Klasse

Repräsentiert eine beliebig große Ganzzahl (GNU Multiple Precision) mit überladenen arithmetischen, bitweisen und Vergleichsoperatoren.

seit PHP 5.6.0 Kategorie: math

Signatur

class GMP

Beschreibung

Die Klasse GMP kapselt eine GMP-Zahl (GNU Multiple Precision Arithmetic Library) und ermöglicht die Arbeit mit ganzen Zahlen beliebiger Größe – weit über den Wertebereich von PHP-int hinaus. GMP-Objekte werden primär durch Funktionen wie gmp_init(), gmp_add() oder mathematische Operationen erzeugt.

Ab PHP 5.6 unterstützt GMP überladene Operatoren: Arithmetik (+, -, *, /, %, **), bitweise Operationen (&, |, ^, ~, <<, >>) sowie Vergleiche (==, <, >, <=, >=) können direkt auf GMP-Objekten verwendet werden. Dadurch lässt sich mit GMP-Zahlen fast so natürlich rechnen wie mit gewöhnlichen PHP-Integers.

Typische Anwendungsfälle sind Kryptographie (RSA, Diffie-Hellman), Primzahlberechnungen, Faktorisierungen und überall dort, wo Zahlen entstehen, die den 64-Bit-Integer-Bereich überschreiten. Die Extension muss beim Kompilieren von PHP mit --with-gmp aktiviert sein oder als PECL-Paket eingebunden werden.

GMP-Objekte können nicht direkt mit new GMP() aus Benutzerkode instanziiert werden; stattdessen nutzt man gmp_init() oder schreibt einen Integer-Literal-String. Zur Ausgabe dient gmp_strval() oder eine implizite String-Konvertierung des Objekts.

Beispiele

Überladene Operatoren mit GMP-Objekten

<?php
// GMP-Zahlen erzeugen
$a = gmp_init('123456789012345678901234567890');
$b = gmp_init('987654321098765432109876543210');

// Überladene Arithmetik (ab PHP 5.6)
$summe     = $a + $b;
$differenz = $b - $a;
$produkt   = $a * $b;

echo gmp_strval($summe)     . PHP_EOL;
echo gmp_strval($differenz) . PHP_EOL;
echo gmp_strval($produkt)   . PHP_EOL;

// Vergleich
if ($a < $b) {
    echo "a ist kleiner als b" . PHP_EOL;
}
1111111110111111111011111111100 864197532086419753208641975320 121932631137021795226185032733622923332237463801111263526900 a ist kleiner als b

Primzahltest und modulare Exponentiation (Kryptographie)

<?php
// Prüfen, ob eine große Zahl prim ist
$p = gmp_init('32416187567');
if (gmp_prob_prime($p) > 0) {
    echo gmp_strval($p) . ' ist (wahrscheinlich) prim.' . PHP_EOL;
}

// Modulare Exponentiation: base^exp mod modulus
$base    = gmp_init('4');
$exp     = gmp_init('13');
$modulus = gmp_init('497');
$result  = gmp_powm($base, $exp, $modulus);
echo '4^13 mod 497 = ' . gmp_strval($result) . PHP_EOL;

// Bitweise Operation
$x = gmp_init('0b11001100', 0); // binär: 204
$y = gmp_init('0b10101010', 0); // binär: 170
$und = $x & $y;
echo 'AND: ' . gmp_strval($und) . PHP_EOL; // 136
32416187567 ist (wahrscheinlich) prim. 4^13 mod 497 = 445 AND: 136

Fakultät einer großen Zahl

<?php
// 50! berechnen – weit jenseits von PHP int
$result = gmp_init(1);
for ($i = 2; $i <= 50; $i++) {
    $result = $result * gmp_init($i); // überladener Operator
}
echo '50! = ' . gmp_strval($result) . PHP_EOL;
50! = 30414093201713378043612608166979581188299763898377856000000000000

// Wichtig · Fallstricke

Extension-Verfügbarkeit: Die GMP-Extension ist nicht in jeder PHP-Installation aktiv. Mit extension_loaded('gmp') lässt sich die Verfügbarkeit prüfen. Unter Debian/Ubuntu installiert man sie mit sudo apt install php-gmp.

Instanziierung: Direkte Erzeugung via new GMP() ist intern nicht vorgesehen; nutze stets gmp_init(). Ab PHP 8.1 kann ein Integer direkt als Argument zu GMP-Funktionen übergeben werden, ohne vorher gmp_init() aufzurufen.

Division: Der /-Operator bei GMP-Objekten führt eine ganzzahlige Division durch (wie gmp_div_q()); der Rest wird verworfen. Für den Rest nutze % oder gmp_mod().

Serialisierung: GMP-Objekte können seit PHP 8.0 mit serialize()/unserialize() persistiert werden.