Start · Sprachen · PHP · Referenz · gmp_sqrt

gmp_sqrt

Funktion

Berechnet die ganzzahlige Quadratwurzel einer GMP-Zahl (abgerundet auf die nächste ganze Zahl).

seit PHP 4.0.4 Kategorie: math

Signatur

gmp_sqrt(GMP|int|string $num): GMP

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 num darf 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

Typ
GMP
Beschreibung
Gibt ein 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);
11111111106611111111

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
bool(true) bool(false)

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