Start · Sprachen · PHP · Referenz · gmp_div_r

gmp_div_r

Funktion

Berechnet den Rest einer Division zweier GMP-Zahlen und gibt ihn als GMP-Objekt zurück.

seit PHP 4.0.4 Kategorie: math

Signatur

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

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

Typ
GMP
Beschreibung
Gibt ein GMP-Objekt zurück, das den Rest der Division von $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
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;
GMP_ROUND_ZERO: -2 GMP_ROUND_PLUSINF: -2 GMP_ROUND_MINUSINF: 3

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);
Rest: 3455677290

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