
Я задал вопрос по комбинаторике на math stack exchange и получил следующееОтвет в стиле LaTeX. Я попытался преобразовать это уравнение в нечто, что может понять wolfram alpha; однако, похоже, это не работает. Есть идеи, как редактировать синтаксис уравнения? Я разместил ниже используемый синтаксис.
\[
n!+\sum_{i=1}^{n-1}(-1)^i\sum_{k=1}^i\binom{i-1}{i-k}\binom{n-i}{k}2^k(n-i)!
\]
решение1
Оглавление:
первоначальный ответ с использованиемxintexprи формула ОП. Реализация расширяемая...
второй ответ с использованием рекуррентной формулы, приведенной вhttp://oeis.org/A002464. Этот второй подход создает раз и навсегда массив значений данного выражения. Он использует пакетbnumexprдля больших целочисленных вычислений.
Вычислить это можно с помощью TeX или LaTeX.
Некоторые немного болезненные детали подробно описаны в комментариях к коду: главная из них заключается в том, что функция binomial(x,y) в настоящее время выдает ошибку, если y>x, а не молча возвращает ноль.
\documentclass{article}
\usepackage{xintexpr}[2016/03/12]% 1.2f or more recent needed for binomial
\begin{document}
% unfortunately the default binomial(x,y) function raises an error
% if y>x. Hence define wrapper to intercept the case.
\xintdefiifunc bbinomial(x,y):=if(y>x,0,binomial(x,y));
% unfortunately we can not use \xintdefiifunc F(n):=....; syntax because the
% function variable "n" appears in the summation range. This is current
% limitation, documented in §10.10.3 of xint.pdf.
% Hence we use a macro interface, which will need braces: \myF{10}.
% We employ parentheses around #1 in case
% it is itself some math expression.
% we choose \xintiiexpr rather than \xinttheiiexpr, for efficiency
% if used in other expressions.
\newcommand\myF [1]{% n = #1
\xintiiexpr (#1)!+
add((-1)^i % probably faster: ifodd(i, -1, +1)
*add(binomial(i-1,i-k)*bbinomial((#1)-i,k)*2^k,
k=1..i)*((#1)-i)!,
i=1..(#1)-1)\relax }
% unfortunately in xintiiexpr, currently 1..0 does not evaluate
% to empty range, but proceeds by negative steps, hence evaluate to
% 1, 0 which we don't want.
% 1..[1]..0 would create such an empty range.
% but further problem is that add(<expression>, i = <range>) syntax
% currently does not work with range being empty.
% Consequently the above expression requires n > 1.
% test
% \xinttheiiexpr seq(\myF{n}, n=2..10)\relax
\medskip
\begin{tabular}{c|r}
$n$&$F(n)$\\
\hline
\xintFor* #1 in {\xintSeq{2}{20}}
\do
{$#1$&$\xintthe\myF{#1}$\\}
\end{tabular}
\end{document}
Более реалистичный подход, который раз и навсегда определяет макросы, расширяющиеся до комбинаторных значений. Основан на рекуррентной формуле.
\documentclass{article}
\usepackage{bnumexpr}
% http://oeis.org/A002464
% If n = 0 or 1 then a(n) = 1; if n = 2 or 3 then a(n) = 0; otherwise a(n) =
% (n+1)*a(n-1) - (n-2)*a(n-2) - (n-5)*a(n-3) + (n-3)*a(n-4)
% 1, 1, 0, 0, 2, 14, 90, 646, 5242, 47622, 479306, 5296790, 63779034
\begin{document}
\begingroup
\makeatletter
\@namedef{F<0>}{1}
\@namedef{F<1>}{1}
\@namedef{F<2>}{0}
\@namedef{F<3>}{0}
\count@=4
\loop
% no \@nameedef in latex
\expandafter\edef\csname F<\the\count@>\endcsname
{\thebnumexpr (\count@+1)*\@nameuse{F<\the\numexpr\count@-1>}
-(\count@-2)*\@nameuse{F<\the\numexpr\count@-2>}
-(\count@-5)*\@nameuse{F<\the\numexpr\count@-3>}
+(\count@-3)*\@nameuse{F<\the\numexpr\count@-4>}\relax}%
\ifnum\count@<30
\advance\count@\@ne
\repeat
\count@=0
\ttfamily
http://oeis.org/A002464
\loop
\the\count@: \@nameuse{F<\the\count@>}\endgraf
\ifnum\count@<30
\advance\count@\@ne
\repeat
\endgroup
\end{document}
решение2
Вот подход на основе LuaLaTeX к вычислению F(n)
как функции от n
. Относительно предоставленной вами версии формула немного перефразирована, чтобы (a) добавить фигурные скобки и скобки для визуальной группировки и (b) некоторый пояснительный текст для выделения внешнего («i») и внутреннего («k») циклов for.
Таблица начинается с n=2
тривиально F(1)=1
. (F(1)
является(Кстати, вычислено правильно.) Для таблицы я установил n_{\max}
значение 15; на самом деле, метод расчета не приводит к переполнению, пока n<20
.
\documentclass{article}
\usepackage{amsmath} % for "\binom" macro
\usepackage{luacode} % for "luacode" env. and "\luaexec" macro
\begin{luacode}
-- First, define two helper functions: "factorial" and "mchoose"
function factorial ( n )
local k
if n==0 or n==1 then
return 1
else
return n * factorial(n-1)
end
end
-- 'mchoose' is patterned after the posting in http://stackoverflow.com/a/15302448.
-- Thanks, @egreg, for pointing me to this posting!
function mchoose( n, k )
if ( k == 0 or k == n ) then
return 1
else
return ( n * mchoose(n - 1, k - 1)) / k
end
end
-- Second, set up the function "F"
function F ( n )
local i, k, result, kterm
result = factorial ( n )
for i=1,n-1 do -- outer loop is entered only if n>1
kterm=0 -- (re)set "kterm" to 0
for k=1,i do
kterm = kterm + mchoose(i-1,i-k) * mchoose(n-i,k) * 2^k
end
result = result + ((-1)^i) * factorial(n-i) * kterm
end
return result
end
\end{luacode}
\begin{document}
\[
F(n)=n!+\biggl\{\,
\underbrace{ \sum_{i=1}^{n-1} (-1)^i (n-i)! \biggl[\,
\underbrace{\sum_{k=1}^i \binom{i-1}{i-k} \binom{n-i}{k} 2^k}_%
{\text{inner or $k$ loop}}\biggr]}_%
{\text{outer or $i$ loop}}\biggr\}
\]
\bigskip
% print values of n and F(n) for n=2,...,15
\[
\begin{array}{@{}rr@{}}
\hline
n & F(n) \\
\hline
\luaexec{for n=2,15,1 do
tex.sprint(n .. "&" .. math.floor(F(n)) .. "\\\\")
end}
\hline
\end{array}
\]
\end{document}