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

01 Okt '15, 08:52

saputello's gravatar image

saputello
11.1k174365

Man kann den im zweiten Beispiel [meiner `lualatex`-Anwort](#14532) umgesetzten effizienteren Algorithmus natürlich auch direkt in LaTeX umsetzen. umsetzen, also **`pdflatex` oder `xelatex` verwenden**. Dabei bietet es sich an die e-TeX-Erweiterung `\numexpr` zu verwenden, da LaTeX bei allen aktuellen Distributionen bereits seit Jahren e-TeX verwendet. Dann ergibt sich beispielsweise: \documentclass[margin=2mm]{standalone} %\documentclass{article} \usepackage{amsmath} \usepackage{tikz} % \usetikzlibrary{positioning} \makeatletter \newcommand{\binomial}[2]{% \ifnum #2=0 % \typeout{binomial(#1,#2)=1}% 1% \else \ifnum \numexpr 2*#2\relax>#1 \binomial{#1}{\the\numexpr #1-#2\relax}% \else \@tempcnta=\numexpr #1 - #2 + 1\relax \@tempcntb=1 \@whilenum \@tempcntb<#2 \do {% \advance\@tempcntb by 1 \@tempcnta=\numexpr \@tempcnta * (#1 - #2 + \@tempcntb)\relax \@tempcnta=\numexpr \@tempcnta / \@tempcntb }% % \typeout{binomial(#1,#2)=\the\@tempcnta}% \the\@tempcnta \fi \fi } \begin{document} \pagecolor{yellow!65} \begin{tikzpicture}[%scale=2.0,transform shape, font=\footnotesize, ] % Binomialkoeffizienten \foreach \n in {0,...,20} {%----------------------------------------- \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} ![TeX-Lösung bis 20][1] Wer die ganzen Low-Level-(La)TeX-Bedingungen, -Scheifen und LaTeX-internen TeX-Zähler nicht mag, kann dafür auch das Paket [`ifthen`](http://www.ctan.org/pkg/ifthen) und selbst definierte LaTeX-Zähler verwenden: \documentclass[margin=2mm]{standalone} %\documentclass{article} \usepackage{amsmath} \usepackage{tikz} % \usetikzlibrary{positioning} \usepackage{ifthen} \newcounter{binomiali}% Schleifenzähler \newcounter{binomialresult}% Zwischen- und Endergebnis \newcommand{\binomial}[2]{% \ifthenelse{#2=0}{% % \typeout{binomial(#1,#2)=1}% 1% }{% \ifthenelse{\numexpr 2*#2\relax>#1}{% \binomial{#1}{\the\numexpr #1-#2\relax}% }{% \setcounter{binomialresult}{\numexpr #1 - #2 + 1}% \setcounter{binomiali}{1}% \whiledo{\value{binomiali}<#2}{% \stepcounter{binomiali}% \setcounter{binomialresult}{% \numexpr \value{binomialresult} * (#1 - #2 + \value{binomiali})% } \setcounter{binomialresult}{% \numexpr \value{binomialresult}/\value{binomiali}% } }% % \typeout{binomial(#1,#2)=\thebinomialresult}% \thebinomialresult }% }% } \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} Wie zu sehen ist, kommt man mit diesem Algorithmus deutlich weiter als bis n=7. Bei 29 ist mit dieser Lösung allerdings Schluss, während die `lualatex`-Lösung [`lualatex`-Lösung](#14532) auch noch weit größere Werte für n verarbeiten kann. Für n>29 könnte man eventuell das Paket [`xint`](http://www.ctan.org/pkg/xint) für die Berechnung des Ergebnisses verwenden. Dessen Anwendung ist allerdings nicht ganz so einfach. Da bereits für n=20 die Darstellung problematisch wird und ich mit mich mit `xint` nicht wirklich auskenne, werde ich auf die Vorführung einer entsprechenden Lösung verzichten. Ich selbst empfehle übrigens eher die [`lualatex`-Lösung](#14532). Diverse Möglichkeiten von `tikz`, die in der pgf-Anleitung, angegeben sind, setzen ohnehin `lualatex` voraus. Darüber hinaus, bestehen bei Verwendung von `lualatex` keine statischen Speicherbegrenzung, die bei `tikz`/`pgf`-Grafiken mit sehr vielen Punkten bei Verwendung von `pdflatex` häufiger zu einem Problem werden. [1]: http://texwelt.de/wissen/upfiles/test7_4.png
Klicke auf Einblenden/Ausblenden von Überarbeitungen 4

01 Okt '15, 08:31

saputello's gravatar image

saputello
11.1k174365

Man kann den im zweiten Beispiel [meiner `lualatex`-Anwort](#14532) umgesetzten effizienteren Algorithmus natürlich auch direkt in LaTeX umsetzen. Dabei bietet es sich an die e-TeX-Erweiterung `\numexpr` zu verwenden, da LaTeX bei allen aktuellen Distributionen bereits seit Jahren e-TeX verwendet. Dann ergibt sich beispielsweise: \documentclass[margin=2mm]{standalone} %\documentclass{article} \usepackage{amsmath} \usepackage{tikz} % \usetikzlibrary{positioning} \makeatletter \newcommand{\binomial}[2]{% \ifnum #2=0 % \typeout{binomial(#1,#2)=1}% 1% \else \ifnum \numexpr 2*#2\relax>#1 \binomial{#1}{\the\numexpr #1-#2\relax}% \else \@tempcnta=\numexpr #1 - #2 + 1\relax \@tempcntb=1 \@whilenum \@tempcntb<#2 \do {% \advance\@tempcntb by 1 \@tempcnta=\numexpr \@tempcnta * (#1 - #2 + \@tempcntb)\relax \@tempcnta=\numexpr \@tempcnta / \@tempcntb }% % \typeout{binomial(#1,#2)=\the\@tempcnta}% \the\@tempcnta \fi \fi } \begin{document} \pagecolor{yellow!65} \begin{tikzpicture}[%scale=2.0,transform shape, font=\footnotesize, ] % Binomialkoeffizienten \foreach \n in {0,...,20} {%----------------------------------------- \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} ![TeX-Lösung bis 20][1] Wer die ganzen Low-Level-(La)TeX-Bedingungen, -Scheifen und LaTeX-internen TeX-Zähler nicht mag, kann dafür auch das Paket [`ifthen`](http://www.ctan.org/pkg/ifthen) und selbst definierte LaTeX-Zähler verwenden: \documentclass[margin=2mm]{standalone} %\documentclass{article} \usepackage{amsmath} \usepackage{tikz} % \usetikzlibrary{positioning} \usepackage{ifthen} \newcounter{binomiali}% Schleifenzähler \newcounter{binomialresult}% Zwischen- und Endergebnis \newcommand{\binomial}[2]{% \ifthenelse{#2=0}{% % \typeout{binomial(#1,#2)=1}% 1% }{% \ifthenelse{\numexpr 2*#2\relax>#1}{% \binomial{#1}{\the\numexpr #1-#2\relax}% }{% \setcounter{binomialresult}{\numexpr #1 - #2 + 1}% \setcounter{binomiali}{1}% \whiledo{\value{binomiali}<#2}{% \stepcounter{binomiali}% \setcounter{binomialresult}{% \numexpr \value{binomialresult} * (#1 - #2 + \value{binomiali})% } \setcounter{binomialresult}{% \numexpr \value{binomialresult}/\value{binomiali}% } }% % \typeout{binomial(#1,#2)=\thebinomialresult}% \thebinomialresult }% }% } \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} Wie zu sehen ist, kommt man mit diesem Algorithmus deutlich weiter als bis n=7. Bei 29 ist mit dieser Lösung allerdings Schluss, während die `lualatex`-Lösung auch noch weit größere Werte für n verarbeiten kann. Für n>29 könnte man eventuell das Paket [`xint`](http://www.ctan.org/pkg/xint) für die Berechnung des Ergebnisses verwenden. Dessen Anwendung ist allerdings nicht ganz so einfach. Da bereits für n>25 n=20 die Darstellung problematisch wird und ich mit mit `xint` nicht wirklich auskenne, werde ich auf die Vorführung einer entsprechenden Lösung verzichten. [1]: http://texwelt.de/wissen/upfiles/test7_4.png
Klicke auf Einblenden/Ausblenden von Überarbeitungen 3

01 Okt '15, 08:31

saputello's gravatar image

saputello
11.1k174365

Klicke auf Einblenden/Ausblenden von Überarbeitungen 2

01 Okt '15, 08:27

saputello's gravatar image

saputello
11.1k174365

Klicke auf Einblenden/Ausblenden von Überarbeitungen 1

01 Okt '15, 08:18

saputello's gravatar image

saputello
11.1k174365