NzF

No­ta­ti­onel­le Zu­gän­ge zur Fa­kul­tät

Jonathan Frech
Produkt der ersten n natürlichen Zahlen

Nicht über die Ma­ße lang, so­wie ver­ständ­lich; die Null mit ins Pro­dukt rein­zu­neh­men wä­re Grem­lin-haft un­sin­nig, da das Un­gleich­ge­wicht zwi­schen der Län­ge des Aus­drucks und der des Aus­drucks kon­stant Null auf­fällt. Dass 0! == 1 ist even­tu­ell un­klar, da hier die Kon­ven­ti­on des lee­ren Pro­dukts ein­fließt.

Öf­ter an­zu­tref­fen ist fol­gen­de Punkt­punkt­punkt-Be­schrei­bung:

n · (n-1) · (n-2) · ... · 1

Oder als an­ge­ris­sene Wert­tab­el­le:

{ 0 |-> 1, 1 |-> 1, 2 |-> 2, 3 |-> 6, 4 |-> 24, ... }

Ge­gen­über der Punkt­punkt­punkt-Kon­ven­ti­on, pas­send wei­ter­zu­zäh­len (sie­he vor­he­ri­gen Aus­druck), kann die El­lip­se hier ohne Ap­pell an die In­tu­i­ti­on der Le­ser­in ver­stan­den wer­den: Falls sich auf ei­ne syn­tax­in­amorphe Aus­drucks­spra­che ge­ei­nigt wer­den kann, kön­nen, auf­grund der Wohl­ord­nung der Men­ge al­ler end­li­chen Wör­ter über end­li­chen (allg. wohl­ge­ord­ne­ten) Al­pha­be­ten, die Punk­te als Re­fe­renz auf ei­ne Kol­mo­go­rof-Kom­ple­xi­tät-mi­ni­mie­ren­de, ta­bel­len­über­ein­stim­mende Im­ple­men­tie­rung ge­sehen wer­den.

Lei­der bin ich mir kei­nes kon­struk­ti­ven – sans uti­li­ser la force brute – Zu­gangs be­wusst, wie man ei­ne obe­re Schran­ke an die Län­ge der Ta­bel­le fin­det – an­ders aus­ge­drückt, ob das le­xi­ko­gra­phi­sche Mi­ni­mum fol­gen­der ⁠ ⁠mi­ni­Kan­rena-Su­che nicht ir­gend­ei­ne abgespacete Funk­ti­on 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 Fa­kul­tät als end­lich gro­ßer S-Aus­druck de­fi­nier­bar ist, also ein Wort­län­gen-mi­ni­mal­er sol­cher Aus­druck exi­stiert, gibt es für je­den klei­ne­ren (Lamb­da-förmig­en, ›⁠aus­führ­bar­en⁠‹) Aus­druck ei­ne (auf­grund der Wohl­ord­nung) klein­ste Zahl, die Un­gleich­heit auf­zeigt (an­sons­ten wä­re der Aus­gangs­aus­druck nicht mi­ni­mal ge­we­sen). Das Ma­xi­mum all die­ser end­lich vie­len Zeu­gen ist ei­ne obe­re Schran­ke an die mi­ni­mal not­wen­di­ge Wert­ta­bel­len­länge über der die oben be­schrie­be­ne Kol­mo­go­rof-Kom­ple­xi­täts-Mi­ni­mie­rung tat­säch­lich die Fa­kul­tät be­schreibt.

Lei­der ist die mi­ni­Kan­ren-Such­rei­hen­fol­ge (wie sie in der Func­tion­al-Pearl [Byrd­Ballan­tyne­Rosen­blatt­Might2017] via evalo dar­ge­legt ist) nicht ord­nungs­gleich zur le­xi­ko­gra­phi­schen Ord­nung der S-Aus­drü­cke; sie ori­en­tiert sich der­art stark an der tabel­la­risch­en Form, dass sie schlicht man­nig­fal­tige Um­for­mu­lie­rung­en ih­rer her­vor­bringt.

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ß Pro­sa mit ei­ner va­gen El­lip­se zu er­setz­en, scheint nicht das Wahre. Sich all­ge­mein­be­kannt­er No­ta­ti­on be­dien­end, sind un­un­ein­deu­tigere Zu­gän­ge fass­bar:

\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)

Eben­so kann die ⁠ ⁠De­ter­mi­nan­teb der hoch­zähl­end­en Dia­go­nal­ma­trix den Fa­kul­täts­ope­ra­tor ko­dier­en:

{dfns.det((⊢∘.=⊢)⍳⍵)×⍵ ⍵⍴⍳⍵}n ⍝ Dyalog-APL (naiv)

Man be­ach­te, dass ⁠ ⁠Dya­log-APLc pro­pri­e­tä­re Soft­ware ist, ich also auf ge­wis­ser Ebe­ne von ei­nem abs­trak­ten ›⁠Iver­son­ischem APL⁠‹ re­den will. An­de­rer­seits ste­hen die C++-ISO-Spe­zi­fi­ka­ti­o­nen auch nicht un­ter Open-Ac­cess, und über­dies bin ich all dem »⁠Open-Source⁠«-Ge­schwa­fel ⁠ ⁠über­drüs­sig!d

Wei­ter ge­ben in ⁠ ⁠OEIS A000142e die Au­to­ren Phi­lippe De­lé­ham (2003-12-15) und Rick L. Shep­herd (2006-02-05) an:

\mathrm{perm}(\mathbb{1}_n)
\#\{K\subseteq\{1,\dots,n\};
          \textrm{$K$ maximale Kette}\}

Be­son­ders der letz­te Aus­druck hebt sich ab von den an­de­ren, da er voll­stän­dig in­ner­halb der Men­gen­leh­re for­mu­liert ist, also kei­ner Kon­ven­ti­onen der Arith­me­tik, Ana­ly­sis oder li­ne­ar­en Al­ge­bra be­darf. Ein an­de­rer sol­cher Aus­druck ist der rein kom­bi­na­to­rische Zu­gang:

\#\{ f: \{1,\dots,n\} \xrightarrow{\sim} \{1,\dots,n\} \}
\#\mathbb{S}_n

De­kla­ra­ti­vi­tät in ge­schlos­sen­er Form bei­sei­te­le­gend, ist Fol­gen­des (in mög­lich­er­weise qua end­stän­di­ger Re­kur­si­vi­tät schlei­fen­haf­ter Form) der Aus­gangs­punkt:

n · (n-1)! ; 0! := 1

Als ⁠ ⁠C++f-(⁠ ⁠Clangg)-Tem­plate-Meta­pro­gram­ming-Be­rech­nung for­mu­liert (⁠ ⁠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)-Com­pi­ler-in­ter­nen vir­tu­el­le Ma­schi­ne im­ple­men­tiert (⁠ ⁠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än­disch eli­mi­nie­ren (⁠ ⁠Go-Play­groundj):

//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 ei­ne quat­schi­gere Spra­che wie ⁠ ⁠krrpk, kommt fol­gen­der Buch­sta­ben­sa­lat zu­stan­de (⁠ ⁠TIOl):

,^n:?n*n@-n11.n

An der ⁠ ⁠Zpr⁠’⁠(⁠hm-Stdlib-Im­ple­men­tie­rung (ge­schrieben 2020) ge­fällt mir be­son­ders die sym­bo­li­sche De­kon­struk­ti­on der Pe­ano-Ko­die­rung links des Aus­drucks. Stan­dard-Has­kell z⁠.⁠ ⁠B⁠. ver­steht »⁠dec (n+1) = n⁠« nicht. Dass Zpr⁠’⁠(⁠h lese­rich­tungs­agnos­tisch ist und auch rechts­lie­gen­de unä­re Ver­knüp­fung­en wie ›⁠!⁠‹ rechts­lie­gend de­fi­nier­bar macht, ist auch hübsch. »⁠S⁠« steht hier für die Nach­fol­ger­funk­ti­on, »⁠()⁠« re­prä­sen­tiert die Null:

;(n !)
(() !)     |> (S ())
((S .n) !) |> ((S n) * (n !))

Wenn ich schon von ⁠ ⁠Has­kelln spre­che (⁠ ⁠TIOo):

foldr (*) 1 [1..n]

Ei­ne dem obi­gen Zpr⁠’⁠(⁠h-Frag­ment ähn­li­che­re Set­zung wä­re auch mög­lich, je­doch schlägt der Ar­ray-Lan­guage-An­satz die Brü­cke zu mei­ner neu­en, lan­ge nur von der Zu­schau­er­tri­bü­ne aus be­äug­ten Lie­be, APL (⁠ ⁠TIOp, ⁠ ⁠TryAPLq):

×/⍳n

Fußnoten.
ahttps://minikanren.org/
bhttps://dfns.dyalog.com/c_det.htm
chttps://www.dyalog.com/
dhttps://blog.jfrech.com/299/
ehttps://oeis.org/A000142
fhttps://isocpp.org/
ghttps://clang.llvm.org/
hhttps://tio.run/##jY/BaoQwEIbvPsVAD9staDa220MMHrqwR5@gl5CM3UBMREcsKz67VSnbQrvgf/znm28YXdexdsp/TIzBqUzgQlS3grG@75MKjUVfNqgviUFWBgqsuJ5ZekiPMedx@ho9WK9dZxCkDS01qKp8Iqxqpwil9QRFDnPfaYKz0hQaqxwMc6XIatDBtwQL9hY@0QwFPP1gsoh5LsQ6GTMYs@gm/uuUh/y@lq/r01JUyvrHPQwRzGnJCKFDRyDlWiz5rfy@Po9h9@53/2N8G5Zuw563YS/bsOM9bH0dvXFZNE5f
ihttps://tio.run/##hY@9asNAEIR7PcVAClsB6SQlTqHIThFImSdIc9yt7IPTnjitkEnIsyv@KRxIQFsM7PcxxZi@z4zXvJ@Vwmub4yDSD7VS0zTlHVlH3EYyh9ySaoME9f75pqqi2mRlmVVPyZ1j40dLaFwYJJLudrMJPAgd@wgfeH@NVhsJ0Wm/vjFOwYGOhnrBVwIgkoyRwWi2KPCCEvXpuf9VZmQo0@fke3Ys6LTjdXrtYhBb1yaMgqa5gPPdmkV64lh98Op/Xy74asE/LPjHBb/54y@DiK0/z/0B
jhttps://go.dev/play/p/x6UyaQvKIaY
khttps://blog.jfrech.com/214/
lhttps://tio.run/##TZBBa4NAEIXv/ooRb42uWSE9mICBYk/SPyAJrDobl66zsm4itDR/Pd3YtPQ0zMz7Ho/3bu14u8KLZNA7N055ms7zzAbsFJK02Pasw1QaZ9K3j9c0W2ebhPMke76FtRStM1YJfThSXtAT7RPinHk7rSY3gZigwxMSWuGwA2cRpyAso5JBWEWVtAyC4Aq90DIxIxIocmgvQkMt4qYOwtoKOuHhKJq82ImmEo/DSvCmZHeWzkODdoJPHmcxYyymL48p48Q900POV5wW9SBGkGdqnTIEEswF7RIVtIf883CUOi@iotRlJaNQ6v3WD6sXuDXDeHYIrkeQynpK4gx/HfxGCRajAGD7rx@/VuufWJvbNw
mhttps://blog.jfrech.com/226/
nhttps://www.haskell.org/
ohttps://tio.run/##FccxCwIhGAbgvV/xDg0VqClcQ9B00Bg3BtUg52dKnneoIPTjs5oeHqfzi0JojKG3HK6UJR@FqLXyiYynaBONjhsSdi6zuLzPQu1Vx6Rk6rCatI84IVDB3w6/LsnHgjXuzc7BJGx2W0jcJOfx0dpntEE/c2PXfhi@
phttps://tio.run/##AVYAqf9hcGwtZHlhbG9n/@KNnSBDZi4gaHR0cHM6Ly93d3cubWVkaWVuZnJlY2guZGUvZm90by9OekYvMjAyNS0xMS0yNv/ijpXihpAgw5cv4o2z4oqiIDX//w
qhttps://tryapl.org/?q=%C3%97/%E2%8D%B3%205&run
Zitierempfehlung (.BibTeX, .txt):
Frech, Jonathan: »No­ta­ti­onel­le Zu­gän­ge zur Fa­kul­tät«. In: Notizen zur Fotografie, 2025-11-26. Online: https://www.medienfrech.de/foto/NzF/2025-11-26_Jonathan-Frech_Notationelle-Zugaenge-zur-Fakultaet.html
Zitierempfehlung:
@article{NzF.2025-11-26,
	author  = {Frech, Jonathan},
	date    = {2025-11-26},
	title   = {No­ta­ti­onel­le Zu­gän­ge zur Fa­kul­tät},
	journal = {Notizen zur Fotografie},
	url     = {https://www.medienfrech.de/foto/NzF/2025-11-26\_Jonathan-Frech\_Notationelle-Zugaenge-zur-Fakultaet.html},
	urldate = {$0},
}
Zitierempfehlung:
Frech, Jonathan: »No­ta­ti­onel­le Zu­gän­ge zur Fa­kul­tät«. In: Notizen zur Fotografie, 2025-11-26. Online: https://www.medienfrech.de/foto/NzF/2025-11-26_Jonathan-Frech_Notationelle-Zugaenge-zur-Fakultaet.html$1