Überarbeitungsverlauf[Zurück]
Klicke auf Einblenden/Ausblenden von Überarbeitungen 7

01 Okt '15, 08:47

saputello's gravatar image

saputello
11.1k174365

Für große Zahlen bietet es sich an, Berechnungen mit Lua zu machen (setzt natürlich die **die Verwendung von `lualatex` `lualatex`** voraus): \documentclass[margin=30mm]{standalone} %\documentclass{article} \usepackage{amsmath} \usepackage{tikz} % \usetikzlibrary{positioning} \usepackage{luacode} \begin{luacode} function factorial (n) if (n == 0) then return 1 else return n*factorial(n-1) end end function binomial (n,k) return factorial(n)/(factorial(k)*factorial(n-k)) end \end{luacode} \newcommand{\binomial}[2]{% \directlua{tex.print ( binomial ( #1, #2 ) ) } } \begin{document} \pagecolor{yellow!65} \begin{tikzpicture}[%scale=2.0,transform shape, font=\footnotesize, ] % Binomialkoeffizienten \foreach \n in {0,...,10} {%----------------------------------------- \foreach \k in {0,...,\n} {% % Ausführliches Ergebnis \node[align=center](\n) at (2*\k-1*\n,-\n) { $\binom{\n}{\k} = \binomial{\n}{\k}$ }; % % Kurzes Ergebnis % \node(\n) at (\k-\n/2,-\n) {$\binomial{\n}{\k}$}; % }%% }%----------------------------------------- \node[above of = 0]{\underline{Binomialkoeffizienten $\dbinom{n}{k}$}}; \end{tikzpicture} \end{document} ![alt text][1] Die Rechenfähigkeiten von Lua sind weit besser als die von TeX. Übrigens ist die Formel mit den Fakultäten eine sehr ineffektive Methode zur Berechnung von Binomialkoeffizienten. Die Umsetzung der Produktformel als Algorithmus (egal ob als Schleife oder Rekursion) ist dagegen wesentlich effizienter, weil dabei keine riesigen Zwischenergebnisse wie n! oder k! entstehen, die sehr schnell zu Überläufen führen. Im mit Deiner Grafik noch darstellbaren Bereich bis ca. 25 ist die Fakultätsformel in Lua aber kein Problem, weshalb ich sie beibehalten habe. Spaßeshalber habe ich es sogar mit n=100 durchlaufen lassen, was zwar zu Darstellungsproblemen führt, die Berechnung selbst funktioniert aber sogar in erträglicher Zeit (weniger als eine Minute auf meinem langsamen Notebook). Aus Lust und Laune hier trotzdem eine für größere n effizientere Lösung: \documentclass[margin=2mm]{standalone} %\documentclass{article} \usepackage{amsmath} \usepackage{tikz} % \usetikzlibrary{positioning} \usepackage{luacode} \begin{luacode} function binomial (n,k) if (k == 0) then return 1 else if (2*k > n) then return binomial (n, n-k) else b = n - k + 1 for i=2,k,1 do b = b * (n - k + i) b = b / i end return b end end end \end{luacode} \newcommand{\binomial}[2]{% \directlua{tex.print ( binomial ( #1, #2 ) ) } } \begin{document} \pagecolor{yellow!65} \begin{tikzpicture}[%scale=2.0,transform shape, font=\footnotesize, ] % Binomialkoeffizienten \foreach \n in {0,...,10} {%----------------------------------------- \foreach \k in {0,...,\n} {% % Ausführliches Ergebnis \node[align=center](\n) at (2*\k-1*\n,-\n) { $\binom{\n}{\k} = \binomial{\n}{\k}$ }; % % Kurzes Ergebnis % \node(\n) at (\k-\n/2,-\n) {$\binomial{\n}{\k}$}; % }%% }%----------------------------------------- \node[above of = 0]{\underline{Binomialkoeffizienten $\dbinom{n}{k}$}}; \end{tikzpicture} \end{document} [1]: http://texwelt.de/wissen/upfiles/test5_6.png
Klicke auf Einblenden/Ausblenden von Überarbeitungen 6

30 Sep '15, 11:06

saputello's gravatar image

saputello
11.1k174365

Für große Zahlen bietet es sich an, Berechnungen mit Lua zu machen (setzt natürlich die Verwendung von `lualatex` voraus): \documentclass[margin=30mm]{standalone} %\documentclass{article} \usepackage{amsmath} \usepackage{tikz} % \usetikzlibrary{positioning} \usepackage{luacode} \begin{luacode} function factorial (n) if (n == 0) then return 1 else return n*factorial(n-1) end end function binomial (n,k) return factorial(n)/(factorial(k)*factorial(n-k)) end \end{luacode} \newcommand{\binomial}[2]{% \directlua{tex.print ( binomial ( #1, #2 ) ) } } \begin{document} \pagecolor{yellow!65} \begin{tikzpicture}[%scale=2.0,transform shape, font=\footnotesize, ] % Binomialkoeffizienten \foreach \n in {0,...,10} {%----------------------------------------- \foreach \k in {0,...,\n} {% % Ausführliches Ergebnis \node[align=center](\n) at (2*\k-1*\n,-\n) { $\binom{\n}{\k} = \binomial{\n}{\k}$ }; % % Kurzes Ergebnis % \node(\n) at (\k-\n/2,-\n) {$\binomial{\n}{\k}$}; % }%% }%----------------------------------------- \node[above of = 0]{\underline{Binomialkoeffizienten $\dbinom{n}{k}$}}; \end{tikzpicture} \end{document} ![alt text][1] Die Rechenfähigkeiten von Lua sind weit besser als die von TeX. Übrigens ist die Formel mit den Fakultäten eine sehr ineffektive Methode zur Berechnung von Binomialkoeffizienten. Die Umsetzung der Produktformel als Algorithmus (egal ob als Schleife oder Rekursion) ist dagegen wesentlich effizienter, weil dabei keine riesigen Zwischenergebnisse wie n! oder k! entstehen, die sehr schnell zu Überläufen führen. Im mit Deiner Grafik noch darstellbaren Bereich bis ca. 25 ist die Fakultätsformel in Lua aber kein Problem, weshalb ich sie beibehalten habe. Spaßeshalber habe ich es sogar mit n=100 durchlaufen lassen, was zwar zu Darstellungsproblemen führt, die Berechnung selbst funktioniert aber sogar in erträglicher Zeit (weniger als eine Minute auf meinem langsamen Notebook). Aus Lust und Laune hier trotzdem eine wesentlich für größere n effizientere Lösung: \documentclass[margin=2mm]{standalone} %\documentclass{article} \usepackage{amsmath} \usepackage{tikz} % \usetikzlibrary{positioning} \usepackage{luacode} \begin{luacode} function binomial (n,k) if (k == 0) then return 1 else if (2*k > n) then return binomial (n, n-k) else b = n - k + 1 for i=2,k,1 do b = b * (n - k + i) b = b / i end return b end end end \end{luacode} \newcommand{\binomial}[2]{% \directlua{tex.print ( binomial ( #1, #2 ) ) } } \begin{document} \pagecolor{yellow!65} \begin{tikzpicture}[%scale=2.0,transform shape, font=\footnotesize, ] % Binomialkoeffizienten \foreach \n in {0,...,10} {%----------------------------------------- \foreach \k in {0,...,\n} {% % Ausführliches Ergebnis \node[align=center](\n) at (2*\k-1*\n,-\n) { $\binom{\n}{\k} = \binomial{\n}{\k}$ }; % % Kurzes Ergebnis % \node(\n) at (\k-\n/2,-\n) {$\binomial{\n}{\k}$}; % }%% }%----------------------------------------- \node[above of = 0]{\underline{Binomialkoeffizienten $\dbinom{n}{k}$}}; \end{tikzpicture} \end{document} [1]: http://texwelt.de/wissen/upfiles/test5_6.png
Klicke auf Einblenden/Ausblenden von Überarbeitungen 5
Anpassung an entfernten Debug-Code

30 Sep '15, 11:00

saputello's gravatar image

saputello
11.1k174365

Klicke auf Einblenden/Ausblenden von Überarbeitungen 4

30 Sep '15, 10:59

saputello's gravatar image

saputello
11.1k174365

Klicke auf Einblenden/Ausblenden von Überarbeitungen 3

30 Sep '15, 10:36

saputello's gravatar image

saputello
11.1k174365

Klicke auf Einblenden/Ausblenden von Überarbeitungen 2

30 Sep '15, 10:25

saputello's gravatar image

saputello
11.1k174365

Klicke auf Einblenden/Ausblenden von Überarbeitungen 1

30 Sep '15, 09:52

saputello's gravatar image

saputello
11.1k174365