动机
我正在尝试“自动”计算不同的概率,仅给出一些变量,例如样本中的卡片数量和抽出的卡片数量。
代码
以下代码由以下代码组合而成:使用 LaTeX3 自动简化分数“ 和 ”整数乘法命令“。
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\cs_new:Nn \svend_gcd:nn
{
\int_compare:nNnTF {#2} = { 0 } {#1}
{ \svend_gcd:ff {#2} { \int_mod:nn {#1} {#2} } }
}
\cs_generate_variant:Nn \svend_gcd:nn { ff }
\int_new:N \l__svend_tmp_int
\cs_new:Nn \svend_reduced:nn
{
\int_set:Nn \l__svend_tmp_int { \svend_gcd:nn {#1} {#2} }
\frac { \svend_reduced_wrap:n { \int_eval:n { #1 / \l__svend_tmp_int } } }
{ \svend_reduced_wrap:n { \int_eval:n { #2 / \l__svend_tmp_int } } }
}
\cs_new:Nn \svend_reduced_use_wrapper:N
{ \cs_set_eq:NN \svend_reduced_wrap:n #1 }
\svend_reduced_use_wrapper:N \use:n
\msg_new:nnn { svend } { malformed-fraction }
{
The~input~you~have~provided~is~malformed.~
Please~provide~input~in~the~form~of~`p/q'.
}
\NewDocumentCommand \ReducedFractionWrapper { m }
{ \svend_reduced_use_wrapper:N #1 }
\NewDocumentCommand \ReducedFraction { o > { \SplitList { / } } m }
{
\group_begin:
\IfValueT{#1}{\ReducedFractionWrapper{#1}}
\int_compare:nTF { \tl_count:n {#2} = 2 }
{ \svend_reduced:nn #2 }
{ \msg_error:nn { svend } { malformed-fraction } }
\group_end:
}
\NewExpandableDocumentCommand \produkt { m m }
{ \svend_multiply:nn {#1} {#2} }
\cs_new:Npn \svend_multiply:nn #1#2
{
\int_eval:n
{ 1 \int_step_function:nnN {#1} {#2} \__svend_multiply:n }
}
\cs_new:Npn \__svend_multiply:n #1 { * #1 }
\ExplSyntaxOff
\usepackage{siunitx}
\begin{document}
\def\roed{5}
\def\sort{9}
\newcommand*\kortTotal{\fpeval{\roed+\sort}}
\def\udtraek{10}
\begin{equation}
\ReducedFraction[\num]
{(\produkt{\kortTotal-\udtraek+1}{\kortTotal}-\produkt{1}{\udtraek})
/\produkt{\kortTotal-\udtraek+1}{\kortTotal}}
\end{equation}
\end{document}
错误
我得到了错误
! Arithmetic overflow.
<recently read> \__int_eval_end:
l.66 ...\produkt{\kortTotal-\udtraek+1}{\kortTotal}}
当我将其改为 时\def\udtraek{10}
,\def\udtraek{9}
编译就好了。数字显然太大了( 也表明了这一点Arithmetic overflow
),但我不知道如何调整代码以便使用更大的数字。
问题
我如何更改代码以便可以使用更大的输入整数?
答案1
目前,你最好的选择可能是xint
's \xintiieval
,可以处理大整数和解析表达式。(有一些未发布的expl3
该区域的代码,但需要一些整理;bigintcalc
不做表情。)
采用这种方式并简化以突出关键点:
\documentclass{article}
\usepackage{xintexpr}
\makeatletter
\newcommand\svend@saved@gcd{}
\NewDocumentCommand\ReducedFraction{O{\@firstofone}mm}
{%
\edef\svend@saved@gcd{gcd(#2,#3)}%
\expanded{%
\noexpand\frac
{%
\noexpand#1%
{\xintiieval{#2/\svend@saved@gcd}}%
}%
{%
\noexpand#1%
{\xintiieval{#3/\svend@saved@gcd}}%
}%
}%
}
\makeatother
\NewExpandableDocumentCommand\produkt{mm}
{\xintiieval{pfactorial(#1,#2)}}
\usepackage{siunitx}
\begin{document}
\def\roed{5}
\def\sort{9}
\newcommand*\kortTotal{}
\edef\kortTotal{\xintiieval{\roed+\sort}}
\def\udtraek{9}
\begin{equation}
\ReducedFraction[\num]
{(\produkt{\kortTotal-\udtraek+1}{\kortTotal}-\produkt{1}{\udtraek})}
{\produkt{\kortTotal-\udtraek+1}{\kortTotal}}
\end{equation}
\end{document}