Signatur
Beschreibung
gmp_div_r() dividiert $num1 durch $num2 und liefert ausschließlich den Rest der Division als GMP-Zahl zurück. Die Funktion ist Teil der GMP-Erweiterung (GNU Multiple Precision Arithmetic Library) und eignet sich für beliebig große Ganzzahlen, die den nativen PHP-Integer-Bereich überschreiten.
Das Verhalten bei negativen Zahlen wird über den Parameter $rounding_mode gesteuert: GMP_ROUND_ZERO rundet den Quotienten in Richtung null (Standard), GMP_ROUND_PLUSINF rundet in Richtung positiv unendlich und GMP_ROUND_MINUSINF in Richtung negativ unendlich. Das Vorzeichen des Rests hängt dabei direkt vom gewählten Rundungsmodus ab.
Typische Einsatzgebiete sind kryptografische Berechnungen (z. B. Modular-Arithmetik), Primzahltests sowie alle Anwendungen, die mit sehr großen Ganzzahlen und Teilbarkeit arbeiten. Für reine Modulo-Operationen mit positiven Zahlen kann alternativ gmp_mod() verwendet werden, das stets ein nicht-negatives Ergebnis liefert.
Die Eingabeparameter können als GMP-Objekte, native PHP-Integer oder numerische Strings übergeben werden, was die Funktion sehr flexibel einsetzbar macht.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $num1 Pflicht | GMP|int|string | Der Dividend (Zähler) der Division. Kann ein GMP-Objekt, ein PHP-Integer oder ein numerischer String sein. | |
| $num2 Pflicht | GMP|int|string | Der Divisor (Nenner) der Division. Darf nicht null sein, da dies einen Fehler auslöst. Kann ein GMP-Objekt, ein PHP-Integer oder ein numerischer String sein. | |
| $rounding_mode | int | GMP_ROUND_ZERO | Steuert die Rundungsrichtung des Quotienten und damit das Vorzeichen des Rests. Erlaubte Werte: GMP_ROUND_ZERO (Richtung null), GMP_ROUND_PLUSINF (Richtung +∞) und GMP_ROUND_MINUSINF (Richtung −∞). |
Rückgabewert
$num1 durch $num2 enthält. Das Vorzeichen des Rests hängt vom gewählten $rounding_mode ab.Beispiele
Einfacher Rest einer Division
<?php
$a = gmp_init(17);
$b = gmp_init(5);
$rest = gmp_div_r($a, $b);
echo gmp_strval($rest); // 17 / 5 = 3 Rest 2
Verschiedene Rundungsmodi mit negativen Zahlen
<?php
// -17 / 5 mit unterschiedlichen Rundungsmodi
$num1 = gmp_init(-17);
$num2 = gmp_init(5);
// Standard: Richtung null runden => Quotient = -3, Rest = -17 - (-3*5) = -2
$restZero = gmp_div_r($num1, $num2, GMP_ROUND_ZERO);
echo 'GMP_ROUND_ZERO: ' . gmp_strval($restZero) . PHP_EOL;
// Richtung positiv unendlich => Quotient = -3, Rest = -2
$restPlus = gmp_div_r($num1, $num2, GMP_ROUND_PLUSINF);
echo 'GMP_ROUND_PLUSINF: ' . gmp_strval($restPlus) . PHP_EOL;
// Richtung negativ unendlich => Quotient = -4, Rest = -17 - (-4*5) = 3
$restMinus = gmp_div_r($num1, $num2, GMP_ROUND_MINUSINF);
echo 'GMP_ROUND_MINUSINF: ' . gmp_strval($restMinus) . PHP_EOL;
Verwendung mit sehr großen Zahlen (Kryptografie-Kontext)
<?php
// Großen Rest berechnen, wie er z. B. in RSA-artigen Berechnungen vorkommt
$n = gmp_init('123456789012345678901234567890');
$p = gmp_init('9876543210');
$rest = gmp_div_r($n, $p);
echo 'Rest: ' . gmp_strval($rest);
// Wichtig · Fallstricke
Achtung bei Division durch null: Wird $num2 als 0 übergeben, löst PHP einen Fehler vom Typ DivisionByZeroError (ab PHP 8) bzw. eine Warnung mit dem Rückgabewert false (PHP 7 und älter) aus. Vor dem Aufruf sollte daher stets geprüft werden, ob der Divisor ungleich null ist.
Unterschied zu gmp_mod(): gmp_mod() liefert immer einen nicht-negativen Rest (analog zum mathematischen Modulo), während gmp_div_r() das Vorzeichen entsprechend dem gewählten Rundungsmodus anpassen kann. Für rein positive Ganzzahlen sind beide Funktionen äquivalent.
Die GMP-Erweiterung muss beim Kompilieren von PHP aktiviert worden sein (--with-gmp). Auf vielen Systemen ist sie als Paket (php-gmp) nachinstallierbar.