使用 \pgfmathtruncatemacro 评估二项式系数

使用 \pgfmathtruncatemacro 评估二项式系数

如何评估诸如

\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 一起使用,还请注意终端上出现的笑话消息。)

相关内容