Notationelle Zugänge zur Fakultät
Produkt der ersten n natürlichen Zahlen
Nicht über die Maße lang, sowie verständlich; die Null mit ins Produkt reinzunehmen wäre Gremlin-haft unsinnig, da das Ungleichgewicht zwischen der Länge des Ausdrucks und der des Ausdrucks konstant Null auffällt. Dass 0! == 1 ist eventuell unklar, da hier die Konvention des leeren Produkts einfließt.
Öfter anzutreffen ist folgende Punktpunktpunkt-Beschreibung:
n · (n-1) · (n-2) · ... · 1
Oder als angerissene Werttabelle:
{ 0 |-> 1, 1 |-> 1, 2 |-> 2, 3 |-> 6, 4 |-> 24, ... }Gegenüber der Punktpunktpunkt-Konvention, passend weiterzuzählen (siehe vorherigen Ausdruck), kann die Ellipse hier ohne Appell an die Intuition der Leserin verstanden werden: Falls sich auf eine syntaxinamorphe Ausdruckssprache geeinigt werden kann, können, aufgrund der Wohlordnung der Menge aller endlichen Wörter über endlichen (allg. wohlgeordneten) Alphabeten, die Punkte als Referenz auf eine Kolmogorof-Komplexität-minimierende, tabellenübereinstimmende Implementierung gesehen werden.
Leider bin ich mir keines konstruktiven – sans utiliser la force brute – Zugangs bewusst, wie man eine obere Schranke an die Länge der Tabelle findet – anders ausgedrückt, ob das lexikographische Minimum folgender ↱ miniKanrena-Suche nicht irgendeine abgespacete Funktion ist:
((eval (car (sort (run ∞ (f)
(evalo (list f 0) 1)
(evalo (list f 1) 1)
(evalo (list f 2) 2)
(evalo (list f 3) 6)
(evalo (list f 4) 24)
(evalo (list f 5) 120)
(evalo (list f 6) 720)
(evalo (list f 7) 5040)
(evalo (list f 8) 40320)
; Ob das ausreicht?
)))) n)
Da aber Fakultät als endlich großer S-Ausdruck definierbar ist, also ein Wortlängen-minimaler solcher Ausdruck existiert, gibt es für jeden kleineren (Lambda-förmigen, ›ausführbaren‹) Ausdruck eine (aufgrund der Wohlordnung) kleinste Zahl, die Ungleichheit aufzeigt (ansonsten wäre der Ausgangsausdruck nicht minimal gewesen). Das Maximum all dieser endlich vielen Zeugen ist eine obere Schranke an die minimal notwendige Werttabellenlänge über der die oben beschriebene Kolmogorof-Komplexitäts-Minimierung tatsächlich die Fakultät beschreibt.
Leider ist die miniKanren-Suchreihenfolge (wie sie in der Functional-Pearl [ByrdBallantyneRosenblattMight2017] via evalo dargelegt ist) nicht ordnungsgleich zur lexikographischen Ordnung der S-Ausdrücke; sie orientiert sich derart stark an der tabellarischen Form, dass sie schlicht mannigfaltige Umformulierungen ihrer hervorbringt.
LITERATUR.
[ByrdBallantyneRosenblattMight2017] William E. Byrd, Michael
Ballantyne, Gregory Rosenblatt, Matthew Might: "A Unified
Approach to Solving Seven Programming Problems (Functional
Pearl)". In: Proceedings of the ACM on Programming
Languages, Band 1, Ausgabe ICFP. September 2017.
Online: https://dl.acm.org/doi/10.1145/3110252
[2025-11-26],
https://io.livecode.ch/learn/gregr/icfp2017-artifact-
auas7pp [2025-11-24]
Bloß Prosa mit einer vagen Ellipse zu ersetzen, scheint nicht das Wahre. Sich allgemeinbekannter Notation bedienend, sind ununeindeutigere Zugänge fassbar:
\prod_{k=1}^n k\Gamma(n+1) = \int_0^\infty t^n e^{-t} \,\mathrm{d}t\mathrm{d}^n\mathrm{id}^n(0)Ebenso kann die ↱ Determinanteb der hochzählenden Diagonalmatrix den Fakultätsoperator kodieren:
{dfns.det((⊢∘.=⊢)⍳⍵)×⍵ ⍵⍴⍳⍵}n ⍝ Dyalog-APL (naiv)Man beachte, dass ↱ Dyalog-APLc proprietäre Software ist, ich also auf gewisser Ebene von einem abstrakten ›Iversonischem APL‹ reden will. Andererseits stehen die C++-ISO-Spezifikationen auch nicht unter Open-Access, und überdies bin ich all dem »Open-Source«-Geschwafel ↱ überdrüssig!d
Weiter geben in ↱ OEIS A000142e die Autoren Philippe Deléham (2003-12-15) und Rick L. Shepherd (2006-02-05) an:
\mathrm{perm}(\mathbb{1}_n)\#\{K\subseteq\{1,\dots,n\};
\textrm{$K$ maximale Kette}\}Besonders der letzte Ausdruck hebt sich ab von den anderen, da er vollständig innerhalb der Mengenlehre formuliert ist, also keiner Konventionen der Arithmetik, Analysis oder linearen Algebra bedarf. Ein anderer solcher Ausdruck ist der rein kombinatorische Zugang:
\#\{ f: \{1,\dots,n\} \xrightarrow{\sim} \{1,\dots,n\} \}\#\mathbb{S}_nDeklarativität in geschlossener Form beiseitelegend, ist Folgendes (in möglicherweise qua endständiger Rekursivität schleifenhafter Form) der Ausgangspunkt:
n · (n-1)! ; 0! := 1
Als ↱ C++f-(↱ Clangg)-Template-Metaprogramming-Berechnung formuliert (↱ TIOh):
//Factorial<n>::Boxed
template<int N> struct Factorial {
static const int Boxed{N * Factorial<N-1>::Boxed}; };
template<> struct Factorial<0> {
static const int Boxed{1}; };
Oder in der C++-(Clang)-Compiler-internen virtuelle Maschine implementiert (↱ TIOi):
//factorial(n)
constexpr long long factorial(long long n) noexcept {
return n <= 0 ? 1 : n * factorial(n - 1);
}
Man kann den Tail-Call auch händisch eliminieren (↱ Go-Playgroundj):
//Factorial(n)
func Factorial(n int) (nbang *big.Int) {
nbang = big.NewInt(1)
for k := range n {
nbang = nbang.Mul(nbang,
big.NewInt(int64(k+1)))
}
return
}
Wählt man eine quatschigere Sprache wie ↱ krrpk, kommt folgender Buchstabensalat zustande (↱ TIOl):
,^n:?n*n@-n11.n
An der ↱ Zpr’(hm-Stdlib-Implementierung (geschrieben 2020) gefällt mir besonders die symbolische Dekonstruktion der Peano-Kodierung links des Ausdrucks. Standard-Haskell z. B. versteht »dec (n+1) = n« nicht. Dass Zpr’(h leserichtungsagnostisch ist und auch rechtsliegende unäre Verknüpfungen wie ›!‹ rechtsliegend definierbar macht, ist auch hübsch. »S« steht hier für die Nachfolgerfunktion, »()« repräsentiert die Null:
;(n !) (() !) |> (S ()) ((S .n) !) |> ((S n) * (n !))
Wenn ich schon von ↱ Haskelln spreche (↱ TIOo):
foldr (*) 1 [1..n]
Eine dem obigen Zpr’(h-Fragment ähnlichere Setzung wäre auch möglich, jedoch schlägt der Array-Language-Ansatz die Brücke zu meiner neuen, lange nur von der Zuschauertribüne aus beäugten Liebe, APL (↱ TIOp, ↱ TryAPLq):
×/⍳n
| a | https:// |
| b | https:// |
| c | https:// |
| d | https:// |
| e | https:// |
| f | https:// |
| g | https:// |
| h | https:// |
| i | https:// |
| j | https:// |
| k | https:// |
| l | https:// |
| m | https:// |
| n | https:// |
| o | https:// |
| p | https:// |
| q | https:// |