파스칼의 삼각형으로 구해볼 수 없을까 싶어서 한번 해봤는데요, Pascal's rule에 의하여
\[ \binom{n}{k}=\binom{n-1}{k-1} + \binom{n-1}{k} \]
이고, \(\binom{n}{0}=1, \binom{n}{n}=1\) 임을 이용하면 재귀적인 덧셈으로 이항계수를 구할 수 있을 거라고 추측했습니다.
expl3에서 재귀함수를 정의하는 게 가능하다고는 하지만 속도를 떨어뜨리는 건 어쩔 수 없을테니 되도록 재귀되는 횟수를 줄이고 싶어서 다음 몇 가지 규칙을 더 적용했습니다.
(1) \( \binom{n}{k} = \binom{n}{n-k} \) (2) \( \binom{n}{1} = n \) (3) \( \binom{n}{2} = \sum_{i=1}^{n-1} i \)
이상을 expl3로 고대로 옮겨쓰면:
\ExplSyntaxOn \NewDocumentCommand \simplecombination { m m } { \simple_comb:nn { #1 } { #2 } } \cs_new:Npn \simple_comb:nn #1 #2 { \int_compare:nTF { #2 < #1 - #2 } { \simp_comb_fn:nn { #1 } { #2 } } { \simp_comb_fn:nn { #1 } { \int_eval:n { #1 - #2 } } } } \cs_new:Npn \simp_comb_fn:nn #1 #2 { \int_case:nnF { #2 } { { 0 } { 1 } { 1 } { #1 } { 2 } { \sum_to:n { #1 - 1 } } { #1 } { 1 } } { \int_eval:n { \simple_comb:nn { \int_eval:n { #1 - 1 } } { \int_eval:n { #2 - 1 } } + \simple_comb:nn { \int_eval:n { #1 - 1 } } { \int_eval:n { #2 } } } } } \cs_new:Npn \sum_to:n #1 { \int_compare:nTF { #1 <= 1 } { 1 } { \int_eval:n { #1 + \sum_to:n { \int_eval:n { #1 - 1 } } } } } \ExplSyntaxOff
그런데 아무래도 효율적이지는 못해서 30 정도만 돼도 꽤 오래 기다려야 하더군요. 그냥 이런 게 되더라...
KTUG 한국 텍 사용자 그룹
파스칼의 삼각형으로 구해볼 수 없을까 싶어서 한번 해봤는데요, Pascal's rule에 의하여
\[
\binom{n}{k}=\binom{n-1}{k-1} + \binom{n-1}{k}
\]
이고, \(\binom{n}{0}=1, \binom{n}{n}=1\) 임을 이용하면 재귀적인 덧셈으로 이항계수를 구할 수 있을 거라고 추측했습니다.
expl3에서 재귀함수를 정의하는 게 가능하다고는 하지만 속도를 떨어뜨리는 건 어쩔 수 없을테니 되도록 재귀되는 횟수를 줄이고 싶어서 다음 몇 가지 규칙을 더 적용했습니다.
(1) \( \binom{n}{k} = \binom{n}{n-k} \)
(2) \( \binom{n}{1} = n \)
(3) \( \binom{n}{2} = \sum_{i=1}^{n-1} i \)
이상을 expl3로 고대로 옮겨쓰면:
그런데 아무래도 효율적이지는 못해서 30 정도만 돼도 꽤 오래 기다려야 하더군요. 그냥 이런 게 되더라...