Start · Sprachen · PHP · Referenz · gmp_rootrem

gmp_rootrem

Funktion

Berechnet die ganzzahlige n-te Wurzel einer GMP-Zahl und gibt sowohl den Wurzelanteil als auch den Rest zurück.

seit PHP 5.6.0 Kategorie: math

Signatur

gmp_rootrem(GMP|int|string $num, int $n): array

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

Typ
array
Beschreibung
Gibt ein Array mit zwei GMP-Objekten zurück: Index 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;
Zahl: 27 Wurzel: 5 Rest: 2 Probe: 27

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;
}
8 ist perfekte Kubikzahl: Ja 27 ist perfekte Kubikzahl: Ja 64 ist perfekte Kubikzahl: Ja 100 ist perfekte Kubikzahl: Nein 125 ist perfekte Kubikzahl: Ja 1000000000 ist perfekte Kubikzahl: Ja

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;
5. Wurzel von 10^20: 10000 Rest: 0

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