Start · Sprachen · PHP · Referenz · gmp_fact

gmp_fact

Funktion

Berechnet die Fakultät einer nicht-negativen ganzen Zahl und gibt das Ergebnis als <code>GMP</code>-Objekt zurück.

seit PHP 4.0.4 Kategorie: math

Signatur

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

Beschreibung

gmp_fact() berechnet die Fakultät (n!) der übergebenen nicht-negativen ganzen Zahl. Die Fakultät ist definiert als das Produkt aller positiven ganzen Zahlen von 1 bis n, also n! = 1 × 2 × 3 × … × n, mit dem Sonderfall 0! = 1.

Da PHP-interne Integer-Typen bereits ab relativ kleinen Werten (etwa 20! bei 64-Bit-Systemen) überlaufen, ist gmp_fact() besonders wertvoll: Die GMP-Bibliothek arbeitet mit beliebig großen ganzen Zahlen und ermöglicht es, extrem große Fakultäten exakt zu berechnen – z. B. 1000! oder noch größere Werte.

Der Rückgabewert ist ein GMP-Objekt, das direkt an andere GMP-Funktionen wie gmp_strval(), gmp_mul() oder gmp_div() übergeben werden kann. Seit PHP 5.6 können GMP-Objekte auch direkt in arithmetischen Ausdrücken verwendet werden.

Die Funktion erfordert, dass die GMP-Erweiterung installiert und aktiviert ist. Dies ist auf den meisten Systemen standardmäßig der Fall, kann aber bei speziellen Hosting-Umgebungen fehlen.

Parameter

Name Typ Default Beschreibung
$num Pflicht int|string|GMP Die nicht-negative ganze Zahl, deren Fakultät berechnet werden soll. Kann als PHP-int, als numerischer string oder als GMP-Objekt übergeben werden. Negative Werte führen zu einem Fehler.

Rückgabewert

Typ
GMP
Beschreibung
Gibt ein GMP-Objekt zurück, das das exakte Ergebnis von num! enthält. Das Ergebnis kann mit gmp_strval() in einen String oder mit gmp_intval() (bei kleinen Werten) in einen Integer umgewandelt werden.

Beispiele

Einfache Fakultäts-Berechnung und Ausgabe als String

<?php
// 10! berechnen und als String ausgeben
$result = gmp_fact(10);
echo gmp_strval($result); // 3628800

// 20! (überschreitet normalen int-Bereich auf 32-Bit-Systemen)
$big = gmp_fact(20);
echo "\n" . gmp_strval($big); // 2432902008176640000
3628800 2432902008176640000

Sehr große Fakultät berechnen (1000!)

<?php
// Berechnung von 1000! — weit jenseits des PHP-int-Bereichs
$fact1000 = gmp_fact(1000);
$str = gmp_strval($fact1000);

echo "Anzahl der Ziffern von 1000!: " . strlen($str) . PHP_EOL;
echo "Erste 20 Ziffern: " . substr($str, 0, 20) . "..." . PHP_EOL;
Anzahl der Ziffern von 1000!: 2568 Erste 20 Ziffern: 40238726007709377354...

Binomialkoeffizient mit gmp_fact berechnen

<?php
// Binomialkoeffizient C(n, k) = n! / (k! * (n-k)!)
function binomial(int $n, int $k): GMP {
    $numerator   = gmp_fact($n);
    $denominator = gmp_mul(gmp_fact($k), gmp_fact($n - $k));
    return gmp_div_q($numerator, $denominator);
}

// C(52, 5) — Anzahl möglicher Pokerblätter
$result = binomial(52, 5);
echo gmp_strval($result) . PHP_EOL;
2598960

// Wichtig · Fallstricke

Negative Zahlen: Das Übergeben eines negativen Wertes führt zu einem ValueError (ab PHP 8.0) bzw. zu einer PHP-Warnung mit Rückgabe von false in älteren Versionen. Daher sollte die Eingabe immer vorher auf >= 0 geprüft werden.

Performance: Sehr große Fakultäten (z. B. gmp_fact(100000)) können erheblich Rechenzeit und Speicher beanspruchen. Bei solchen Berechnungen sollte auf ausreichende PHP-Ressourcen (memory_limit, max_execution_time) geachtet werden.

Erweiterung: Die GMP-Erweiterung muss aktiviert sein. Prüfbar mit extension_loaded('gmp').