Signatur
Beschreibung
gmp_sqrt() berechnet die ganzzahlige Quadratwurzel (Floor-Quadratwurzel) einer nicht-negativen Ganzzahl beliebiger Größe, dargestellt als GMP-Objekt. Das Ergebnis ist stets der größte ganzzahlige Wert n, für den gilt: n² ≤ num.
Die Funktion ist Teil der GMP-Erweiterung und kann mit beliebig großen Zahlen umgehen, für die der Standard-PHP-Integer-Typ nicht ausreicht. Das Ergebnis wird als neues GMP-Objekt zurückgegeben und kann direkt mit anderen GMP-Funktionen weiterverarbeitet werden.
Typische Anwendungsfälle sind kryptografische Algorithmen, Primzahltests (z. B. Trial Division bis zur Wurzel) sowie mathematische Berechnungen im Bereich großer Zahlen, bei denen Fließkomma-Ungenauigkeiten von sqrt() nicht akzeptabel sind.
- Der Parameter
numdarf keine negative Zahl sein — andernfalls wird ein Fehler ausgelöst. - Das Ergebnis ist immer eine ganze Zahl (abgerundet), kein Fließkommazahl.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $num Pflicht | GMP|int|string | Die nicht-negative Ganzzahl, deren Quadratwurzel berechnet werden soll. Kann ein GMP-Objekt, ein PHP-int oder ein numerischer string sein. |
Rückgabewert
GMP-Objekt zurück, das die ganzzahlige Quadratwurzel (abgerundet) des übergebenen Werts enthält.Beispiele
Einfache Quadratwurzel einer großen Zahl
<?php
// GMP-Erweiterung muss aktiviert sein
$zahl = gmp_init('123456789012345678901234567890');
$wurzel = gmp_sqrt($zahl);
echo gmp_strval($wurzel);
Primzahltest mit gmp_sqrt (Trial Division)
<?php
function ist_prim(string $n): bool {
$zahl = gmp_init($n);
if (gmp_cmp($zahl, gmp_init(2)) < 0) {
return false;
}
if (gmp_mod($zahl, gmp_init(2)) == 0) {
return gmp_cmp($zahl, gmp_init(2)) === 0;
}
$grenze = gmp_sqrt($zahl);
$teiler = gmp_init(3);
while (gmp_cmp($teiler, $grenze) <= 0) {
if (gmp_mod($zahl, $teiler) == 0) {
return false;
}
$teiler = gmp_add($teiler, gmp_init(2));
}
return true;
}
var_dump(ist_prim('104729')); // bekannte Primzahl
var_dump(ist_prim('104730')); // keine Primzahl
Verhalten bei nicht-perfekter Quadratzahl (Abrundung)
<?php
// sqrt(10) = 3.162..., ganzzahlig also 3
$wurzel = gmp_sqrt(10);
echo gmp_strval($wurzel); // 3
// sqrt(9) = exakt 3
$wurzel2 = gmp_sqrt(9);
echo PHP_EOL . gmp_strval($wurzel2); // 3
// Wichtig · Fallstricke
Negative Zahlen: Das Übergeben einer negativen Zahl führt zu einem PHP-Fehler (ValueError in neueren PHP-Versionen). Die Funktion ist ausschließlich für nicht-negative Ganzzahlen ausgelegt.
Präzision: Im Gegensatz zur PHP-Funktion sqrt(), die mit Fließkommazahlen arbeitet und bei sehr großen Zahlen an Genauigkeit verliert, liefert gmp_sqrt() immer ein exaktes ganzzahliges Ergebnis (Floor). Wer wissen möchte, ob das Ergebnis exakt ist (also ob num ein vollständiges Quadrat ist), kann gmp_perfect_square() nutzen oder das Quadrat des Ergebnisses mit gmp_pow() und gmp_cmp() prüfen.