如何评估诸如
\binom{2^{4}-3}{2^3}
和
\pgfmathtruncatemacro
? 我希望它的值为 1287。
已经起作用了:
\begin{tikzpicture}
\foreach \l in {2,4,8} {
\pgfmathtruncatemacro{\jn}{(2^\l)*\l}
\node[] at (\l,0) {$\jn$};
}
\end{tikzpicture}
计算结果为 8、64 和 2048
编辑:替代方案也适合我。
答案1
您可以使用bigintcalc
:
\documentclass{article}
\usepackage{bigintcalc}
\newcommand{\bigintcalcBinomial}[2]{%
\bigintcalcDiv
{\bigintcalcFac{#1}}
{%
\bigintcalcMul
{\bigintcalcFac{#2}}
{\bigintcalcFac{\bigintcalcSub{#1}{#2}}}%
}%
}
\begin{document}
\bigintcalcBinomial{\bigintcalcSub{\bigintcalcPow{2}{4}}{3}}{\bigintcalcPow{2}{3}}
\end{document}
这将打印
1287
答案2
xint
应该有一个二项式函数,但我忘了在上一个版本中将其包括在内。
目前有一种方法:
这更新已经改变了呈现的顺序,因为测试证明,除了较小的情况外,使用内置阶乘的更简单方法要快得多#2
。
\documentclass{article}
\usepackage{xintexpr}% at least version 1.1 from 10/2014
% I used \binom but it is defined for typesetting by amsmath
\newcommand*\MyBinom[2]
{\xinttheexpr subs(subs(x!//y!//(x-y)!,y=#2), x=#1)\relax }
% the "subs" are there to evaluate only once the #1 and #2 which might
% be themselves expressions.
\begin{document}
\MyBinom{2^{4}-3}{2^3}
\xintFor* #1 in {\xintSeq {0}{50}}\do {\MyBinom{50}{#1}\xintifForLast{\par}{, }}
\end{document}
如果#1
很大并且#2
相对较小(或接近#1
),则计算可能非常大的阶乘是浪费的。
有关仅使用\numexpr
(如果可以避免溢出)的相关答案,请参阅该问题的答案
这是一个使用 允许的语法的定义,在 较小(或接近)xintexpr
的情况下,它将进行更少的计算。但是,它需要较大的 (例如)才能更快地证明这些替代方案。它们使用了好的方法,但必须直接编码这种方法才能与已经内置的阶乘相媲美。#2
#2
#1
#1
#1=200, #2=10
我已将输入范围检查纳入其中。但它们并未检查输入是否为整数(上面的宏使用阶乘,在继续执行之前将其参数截断为整数)。
\newcommand*\MyBinom[2]
{\xinttheexpr subs(subs(subs(
(0 <= y && y <= x)?{(z=0)?{1}{iter(1; (@*(x-k+1))//k, k=1..z)}}{0},
z=(2y<=x)?{y}{x-y}), y=#2), x=#1)\relax }
这是另一种选择。该k++
构造使用较少的内存。但我的测试表明使用它的宏速度较慢(我猜是因为所有k>z
测试都不知道我们只使用小整数)。
\newcommand*\MyBinom[2]
{\xinttheexpr subs(subs(subs(
(0 <= y && y <= x)?{(z=0)?{1}{iter(1; (k>z)?{abort}{@*(x-k+1)//k}, k=1++)}}{0},
z=(2y<=x)?{y}{x-y}), y=#2), x=#1)\relax }
将来,该包肯定会有一个binomial
函数,也可能有一个\xintBinomial
宏。它们肯定会像上面的替代方案一样,避免计算较大的阶乘,然后再进行除法。
我忘了说,所有这些东西都是纯粹可扩展的宏。
当然,正如在这两种情况下我们都使用的表达式一样,\binom{2^{4}-3}{2^3}
它可以开箱即用\binom{3*37}{2^5-3^2}
。
答案3
您可以使用强大的apnum
宏。
\documentclass{article}
\input apnum
\def\binom#1#2{{\evaldef\n {#1} \evaldef\k {#2}%
\evaldef\X {\FAC{\n}/(\FAC{\k}*\FAC{\n-\k})}\X}}
\begin{document}
\binom{2^4-3}{2^3}
\end{document}
请注意,apnum
也可以在纯 TeX 中使用,因为它只使用 TeX 原语。(如果您将其与 LaTeX 一起使用,还请注意终端上出现的笑话消息。)