Signatur
Beschreibung
gmp_rootrem berechnet die ganzzahlige n-te Wurzel einer beliebig großen ganzen Zahl (repräsentiert durch ein GMP-Objekt, einen Integer oder einen numerischen String) und liefert ein Array mit zwei Werten: dem ganzzahligen Anteil der Wurzel sowie dem Rest, der übrig bleibt.
Das Ergebnis-Array enthält an Index 0 den ganzzahligen Anteil r der n-ten Wurzel, d. h. floor(num^(1/n)), und an Index 1 den Rest rem, sodass gilt: num = r^n + rem. Damit kann exakt überprüft werden, ob eine Zahl eine perfekte n-te Potenz ist (Rest = 0).
Diese Funktion ist besonders nützlich in der Zahlentheorie, Kryptographie und überall dort, wo mit sehr großen ganzen Zahlen gearbeitet wird und eine exakte ganzzahlige Wurzelberechnung ohne Gleitkomma-Ungenauigkeiten benötigt wird.
Voraussetzung für die Verwendung ist, dass die GMP-Erweiterung installiert und aktiviert ist. Die Eingabe kann als GMP-Objekt, als PHP-Integer oder als numerischer String übergeben werden.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $num Pflicht | GMP|int|string | Die Zahl, von der die n-te Wurzel berechnet werden soll. Kann ein GMP-Objekt, ein PHP-Integer oder ein numerischer String sein. Muss nicht-negativ sein (für gerade n). |
|
| $n Pflicht | int | Der Grad der Wurzel. Muss eine positive ganze Zahl größer als 0 sein (z. B. 2 für Quadratwurzel, 3 für Kubikwurzel). |
Rückgabewert
0 enthält den ganzzahligen Anteil der n-ten Wurzel (floor(num^(1/n))), Index 1 den Rest, sodass num = root^n + rest gilt.Beispiele
Quadratwurzel mit Rest berechnen
<?php
// Quadratwurzel von 27: floor(sqrt(27)) = 5, Rest = 27 - 5^2 = 2
$num = gmp_init(27);
[$root, $remainder] = gmp_rootrem($num, 2);
echo "Zahl: " . gmp_strval($num) . PHP_EOL;
echo "Wurzel: " . gmp_strval($root) . PHP_EOL;
echo "Rest: " . gmp_strval($remainder) . PHP_EOL;
echo "Probe: " . gmp_strval(gmp_add(gmp_pow($root, 2), $remainder)) . PHP_EOL;
Perfekte Kubikzahl erkennen
<?php
// Prüfen ob eine Zahl eine perfekte dritte Potenz ist
function istPerfekteKubikzahl(int|string $zahl): bool {
[$root, $rest] = gmp_rootrem(gmp_init($zahl), 3);
return gmp_cmp($rest, 0) === 0;
}
$zahlen = [8, 27, 64, 100, 125, 1000000000];
foreach ($zahlen as $z) {
$ergebnis = istPerfekteKubikzahl($z) ? 'Ja' : 'Nein';
echo "$z ist perfekte Kubikzahl: $ergebnis" . PHP_EOL;
}
Sehr große Zahlen mit GMP-String
<?php
// 5. Wurzel einer sehr großen Zahl
$bigNum = gmp_init('100000000000000000000'); // 10^20
[$root, $rest] = gmp_rootrem($bigNum, 5);
echo "5. Wurzel von 10^20: " . gmp_strval($root) . PHP_EOL;
echo "Rest: " . gmp_strval($rest) . PHP_EOL;
// Wichtig · Fallstricke
Voraussetzung: Die GMP-Erweiterung muss installiert und aktiviert sein (--with-gmp beim Kompilieren oder als Paket php-gmp installiert).
Negative Zahlen: Für gerade Wurzeln (z. B. Quadratwurzel) ist eine negative Eingabe nicht erlaubt und führt zu einem Fehler. Für ungerade Wurzeln (z. B. Kubikwurzel) können negative Zahlen ab bestimmten PHP/GMP-Versionen unterstützt werden – Verhalten sollte geprüft werden.
Unterschied zu gmp_sqrt: gmp_sqrt berechnet nur die ganzzahlige Quadratwurzel ohne Rest. gmp_rootrem ist allgemeiner (beliebiger Grad) und gibt zusätzlich den Rest zurück. Für einfache Quadratwurzeln ohne Restbedarf ist gmp_sqrt oder gmp_sqrtrem ausreichend.