You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
118 lines
2.9 KiB
118 lines
2.9 KiB
\NeedsTeXFormat{LaTeX2e}
|
|
\ProvidesPackage{fp-pas}[1994/08/29]
|
|
|
|
%version information
|
|
\def\FP@pasversion{1.0}
|
|
\message{%
|
|
`Fixed Point Pascal Triangle',%
|
|
\space\space\space%
|
|
Version \FP@pasversion\space%
|
|
\space(C) Michael Mehlich%
|
|
\space\space\space\space\space\space\space%
|
|
\space\space\space\space\space\space%
|
|
}
|
|
|
|
%resolve dependencies
|
|
\RequirePackage{fp-basic}
|
|
|
|
%%%public area (macros which may be used)%%%
|
|
|
|
\def\FPpascal#1#2{\FP@pascal{#1}{#2}}%pascal triangle for lines 0,...,63
|
|
|
|
%%%private fp-area (don't use these macros)%%%
|
|
|
|
%allocation of registers
|
|
\countdef\FP@pas=50
|
|
\countdef\FP@pasc=51
|
|
|
|
%addition of two natural numbers
|
|
\def\FP@pasadd#1#2#3{%
|
|
% #1 macro, which gets the result
|
|
% #2 1st value
|
|
% #3 2nd value
|
|
{\FP@removeleadingzeros#2\relax%
|
|
\expandafter\FP@setintcounter\FP@tmp000000000000000000\relax%
|
|
\FP@xia=\FP@rega%
|
|
\FP@xib=\FP@regb%
|
|
%
|
|
\FP@removeleadingzeros#3\relax%
|
|
\expandafter\FP@setintcounter\FP@tmp000000000000000000\relax%
|
|
\FP@yia=\FP@rega%
|
|
\FP@yib=\FP@regb%
|
|
%
|
|
\advance\FP@xia\FP@yia%
|
|
\advance\FP@xib\FP@yib%
|
|
\ifnum\FP@xib<1000000000\relax\else%
|
|
\advance\FP@xia1\relax%
|
|
\advance\FP@xib-1000000000\relax%
|
|
\fi%
|
|
\ifnum\FP@xia<1000000000\relax\else%
|
|
\FP@errmessage{Overflow}%
|
|
\fi%
|
|
%
|
|
\ifnum\FP@xia=0\relax%
|
|
\edef\FP@tmpa{\the\FP@xib}%
|
|
\else%
|
|
\advance\FP@xib1000000000%
|
|
\edef\FP@tmpa{\the\FP@xia\expandafter\FP@ignorenext\the\FP@xib}%
|
|
\fi%
|
|
%
|
|
\global\let\FP@tmpa\FP@tmpa%
|
|
}%
|
|
%
|
|
\let#1\FP@tmpa%
|
|
}
|
|
|
|
%the first two entries of the pascal-triangle
|
|
\expandafter\edef\csname FP@pas0\endcsname{[1]}
|
|
\expandafter\edef\csname FP@pas1\endcsname{[1,1]}
|
|
|
|
%which is the highest line of the pascal-triangle we have already computed?
|
|
\expandafter\edef\csname FP@pascount\endcsname{1}
|
|
|
|
%compute next line of pascal-triangle
|
|
\def\FP@pasdouble[#1]{%
|
|
% #1 previous line of pascal-triangle
|
|
\edef\FP@old{}%
|
|
\edef\FP@tmpb{}%
|
|
\@for\FP@new:=#1\do{%
|
|
\expandafter\if!\FP@old!\relax%
|
|
\edef\FP@old{\FP@new}%
|
|
\else%
|
|
\FP@pasadd{\FP@tmpa}{\FP@old}{\FP@new}%
|
|
\edef\FP@tmpb{\FP@tmpb,\FP@tmpa}%
|
|
\edef\FP@old{\FP@new}%
|
|
\fi%
|
|
}%
|
|
\global\edef\FP@tmpb{[1\FP@tmpb,1]}%
|
|
}
|
|
|
|
%compute n-th line of pascal-triangle
|
|
\def\FP@pascomp#1{%
|
|
% #1 which line to compute
|
|
\expandafter\FP@pasc\FP@pascount\relax%
|
|
\ifnum\FP@pasc<#1\relax%
|
|
\loop%
|
|
\ifnum\FP@pasc<#1\relax%
|
|
\expandafter\expandafter\expandafter\FP@pasdouble\csname FP@pas\the\FP@pasc\endcsname%
|
|
\advance\FP@pasc1\relax%
|
|
\edef\next{\noexpand\global\noexpand\let\csname FP@pas\the\FP@pasc\endcsname\noexpand\FP@tmpb}%
|
|
\next%
|
|
\repeat%
|
|
\fi%
|
|
\global\edef\FP@pascount{\the\FP@pasc}%
|
|
}
|
|
|
|
\def\FP@pascal#1#2{%
|
|
% #1 macro, which gets the result
|
|
% #2 which line of the pascal-triangle to compute
|
|
{\FP@beginmessage{PASCAL}%
|
|
%
|
|
\FP@pas#2\relax%
|
|
\FP@pascomp\FP@pas%
|
|
\global\edef\FP@tmp{\csname FP@pas\the\FP@pas\endcsname}%
|
|
%
|
|
\FP@endmessage{}%
|
|
}%
|
|
\let#1\FP@tmp%
|
|
}
|
|
|