Signatur
Beschreibung
gmp_div_qr() führt eine ganzzahlige Division von $num1 durch $num2 durch und gibt ein Array mit zwei Elementen zurück: Index 0 enthält den Quotienten, Index 1 den Rest. Die Funktion kombiniert damit die Ergebnisse von gmp_div_q() und gmp_div_r() in einem einzigen Aufruf und ist daher effizienter, wenn beide Werte benötigt werden.
Der optionale Parameter $rounding_mode steuert, wie der Rest beim Auftreten negativer Zahlen behandelt wird. Zur Verfügung stehen die Konstanten GMP_ROUND_ZERO (Rest wird in Richtung null gerundet, Standard), GMP_ROUND_PLUSINF (Quotient wird in Richtung +∞ gerundet) und GMP_ROUND_MINUSINF (Quotient wird in Richtung −∞ gerundet). Das Verhalten beeinflusst direkt das Vorzeichen des zurückgegebenen Rests.
Die Funktion ist besonders nützlich in der Kryptografie, Zahlentheorie und überall dort, wo sehr große ganze Zahlen geteilt werden müssen, die den Wertebereich nativer PHP-Integer überschreiten. Alle Eingaben können als GMP-Objekt, als Integer oder als Dezimalzahl-String übergeben werden.
Wird $num2 als 0 übergeben, löst die Funktion einen Fehler aus. Der Rückgabewert ist stets ein Array mit zwei GMP-Objekten.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $num1 Pflicht | GMP|int|string | Der Dividend. Kann ein GMP-Objekt, eine native PHP-Ganzzahl oder ein Dezimalzahl-String sein. | |
| $num2 Pflicht | GMP|int|string | Der Divisor. Darf nicht 0 sein, da sonst ein Fehler ausgelöst wird. |
|
| $rounding_mode | int | GMP_ROUND_ZERO | Steuert das Rundungsverhalten bei negativen Zahlen. Mögliche Werte: GMP_ROUND_ZERO, GMP_ROUND_PLUSINF, GMP_ROUND_MINUSINF. |
Rückgabewert
0 enthält den Quotienten der Division, Index 1 den Rest. Beide Werte sind GMP-Objekte und können mit anderen GMP-Funktionen weiterverarbeitet werden.Beispiele
Einfache Division mit Quotient und Rest
<?php
$dividend = gmp_init(17);
$divisor = gmp_init(5);
[$quotient, $remainder] = gmp_div_qr($dividend, $divisor);
echo 'Quotient: ' . gmp_strval($quotient) . PHP_EOL;
echo 'Rest: ' . gmp_strval($remainder) . PHP_EOL;
Division mit negativem Dividenden und verschiedenen Rundungsmodi
<?php
$dividend = gmp_init(-17);
$divisor = gmp_init(5);
[$q0, $r0] = gmp_div_qr($dividend, $divisor, GMP_ROUND_ZERO);
echo 'GMP_ROUND_ZERO — Quotient: ' . gmp_strval($q0) . ', Rest: ' . gmp_strval($r0) . PHP_EOL;
[$qp, $rp] = gmp_div_qr($dividend, $divisor, GMP_ROUND_PLUSINF);
echo 'GMP_ROUND_PLUSINF — Quotient: ' . gmp_strval($qp) . ', Rest: ' . gmp_strval($rp) . PHP_EOL;
[$qm, $rm] = gmp_div_qr($dividend, $divisor, GMP_ROUND_MINUSINF);
echo 'GMP_ROUND_MINUSINF— Quotient: ' . gmp_strval($qm) . ', Rest: ' . gmp_strval($rm) . PHP_EOL;
Division sehr großer Zahlen (jenseits des Integer-Bereichs)
<?php
$big = gmp_init('123456789012345678901234567890');
$div = gmp_init('9876543210');
[$q, $r] = gmp_div_qr($big, $div);
echo 'Quotient: ' . gmp_strval($q) . PHP_EOL;
echo 'Rest: ' . gmp_strval($r) . PHP_EOL;
// Wichtig · Fallstricke
Division durch null: Wird 0 als Divisor übergeben, erzeugt PHP einen DivisionByZeroError bzw. eine entsprechende Warnung, abhängig von der PHP-Version. Überprüfe den Divisor vor dem Aufruf.
GMP-Erweiterung erforderlich: Die Funktion setzt voraus, dass PHP mit der GMP-Erweiterung kompiliert wurde. Unter Debian/Ubuntu kann diese z. B. mit apt install php-gmp nachinstalliert werden.
Rückgabetyp: Beide Array-Elemente sind GMP-Objekte, keine Integer. Für die Ausgabe oder den Vergleich mit nativen PHP-Typen müssen sie mit gmp_strval() oder gmp_intval() konvertiert werden.