Start · Sprachen · PHP · Referenz · gmp_div_qr

gmp_div_qr

Funktion

Dividiert zwei GMP-Zahlen und liefert sowohl Quotient als auch Rest als Array zurück.

seit PHP 4.0.4 Kategorie: math

Signatur

gmp_div_qr(GMP|int|string $num1, GMP|int|string $num2, int $rounding_mode = GMP_ROUND_ZERO): array

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

Typ
array
Beschreibung
Gibt ein Array mit zwei GMP-Objekten zurück: Index 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;
Quotient: 3 Rest: 2

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;
GMP_ROUND_ZERO — Quotient: -3, Rest: -2 GMP_ROUND_PLUSINF — Quotient: -3, Rest: -2 GMP_ROUND_MINUSINF— Quotient: -4, Rest: 3

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;
Quotient: 12499999988737500001262 Rest: 4106518510

// 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.