Signatur
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;
}
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
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;
// 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.