diff options
Diffstat (limited to 'macros/latex/contrib/polynomial/polynomial.dtx')
-rw-r--r-- | macros/latex/contrib/polynomial/polynomial.dtx | 374 |
1 files changed, 374 insertions, 0 deletions
diff --git a/macros/latex/contrib/polynomial/polynomial.dtx b/macros/latex/contrib/polynomial/polynomial.dtx new file mode 100644 index 0000000000..041759449e --- /dev/null +++ b/macros/latex/contrib/polynomial/polynomial.dtx @@ -0,0 +1,374 @@ +% \iffalse meta-comment +% +% by Stefan Höst 2007 +% +% This file may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either +% version 1.2 of this license or (at your option) any later +% version. The latest version of this license is in: +% +% http://www.latex-project.org/lppl.txt +% +% and version 1.2 or later is part of all distributions of +% LaTeX version 1999/12/01 or later. +% +% \fi +% +% \iffalse +%<package>\NeedsTeXFormat{LaTeX2e} +%<package>\ProvidesPackage{polynomial} +%<*driver> +\documentclass{ltxdoc} +\usepackage{polynomial} +\usepackage{amsmath} +\usepackage{t1enc} +\usepackage[a4paper,body={150mm,230mm}]{geometry} +\def\labelitemi{$\blacktriangleright$} +\def\labelitemii{$\triangleright$} +\newdimen\tabsepadd +\tabsepadd=2mm +\EnableCrossrefs +\CodelineIndex +\RecordChanges +\OnlyDescription +\begin{document} +\DocInput{polynomial.dtx} +\end{document} +%</driver> +% \fi +% \CheckSum{0} +% \changes{v1.0}{2007/02/04}{Initial version} +% \changes{v1.1}{2007/03/17}{Test} +% \DoNotIndex{\#,\$,\%,\&,\@,\\,\{,\},\^,\_,\~,\ } +% \title{The \textsf{polynomial.sty} package\thanks{Version 1.1, 2007/03/17}} +% \author{Stefan Höst} +% \date{} +% \maketitle +% \noindent +% The package \texttt{polynomial.sty} offers an easy way to write +% (univariate) polynomials and rational functions. It defines two commands, +% one for polynomials \verb|\polynomial{coeffs}| and one for rational functions +% \verb|\polynomialfrac{Numerator}{Denominator}|. The first of them, +% \verb|\polynomial|, prints a polynomial with the coefficients in the +% comma separated list of the argument. The second, \verb|\polynomialfrac|, +% prints a fraction of two polynomials. There is also an optional +% argument to the commands that changees the properties of the +% polynomials. The default values can be changed +% by the command \verb|\polynomialstyle|. In the following the commands +% are described by a set of explained examples. + +% The coefficients of the polynomials are given as a comma separated +% lists. If a coefficient is a zero it is not printed, and if it is 1 +% only the monomial is printed. By default there is a plus in +% between two terms, but if the first character of the coefficient is +% minus it is changed to minus. +% \par\strut\par +% \noindent +% \textbf{Examples:} +% \newline\strut +% \begin{tabular}{@{}p{0.6\linewidth}p{0.4\linewidth}} +% \verb|\polynomial{1,2,3,4,5}| +% & $\polynomial{1,2,3,4,5}$\\[\tabsepadd] +% \verb|\polynomial{3,35,0,0,45}| +% & $\polynomial{3,35,0,0,45}$\\[\tabsepadd] +% \verb|\polynomial{c_0,-c_1,c_2,-c_3,c_4}| +% & $\polynomial{c_0,-c_1,c_2,-c_3,c_4}$\\[\tabsepadd] +% \verb|\polynomial{0,0,0,1,-1,1,0,1,0,0,1,0,0}| +% & $\polynomial{0,0,0,1,-1,1,0,1,0,0,1,0,0}$\\[\tabsepadd] +% \verb|\polynomial{-3,A\sin(\alpha t), e^{j\phi},|\newline +% \verb| \left(\sum_{k=0}^{\infty}a^k\right)}| +% & $\displaystyle\polynomial{-3,A\sin(\alpha t),e^{j\phi}, +% \left(\sum_{k=0}^{\infty}a^k\right)}$\\[\tabsepadd] +% \verb|\polynomialfrac{a,b,c,-d,e}{f,g,h,i}| +% & $\displaystyle\polynomialfrac{a,b,c,-d,e}{f,g,h,i}$ +% \end{tabular} +% \par\strut\par +% There is a set of variables that can be used in an optional +% argument, using the keyval-style. By default the the exponents +% increases from left to right. There are two Boolean variables, +% \verb|falling| and \verb|reciprocal|, that change this. Both are used +% as \verb|falling=true| or \verb|falling=false|. The default is +% \verb|true| for both variables, meaning, e.g., that \verb|falling| is +% the same as the first variant. The difference between the commands +% is that the first uses decreasing exponents from left to right instead +% of increasing, while the second uses increasing exponents from right +% to left (hence giving the reciprocal polynomial). If both are true the +% polynomial will be written with decreasing exponents from right to +% left. +% \par\strut\par +% \noindent +% \textbf{Examples:} +% \newline\strut +% \begin{tabular}{@{}p{0.6\linewidth}p{0.4\linewidth}} +% \verb|\polynomial[falling]{a,b,c,-d,e}| +% & $\polynomial[falling]{a,b,c,-d,e}$\\[\tabsepadd] +% \verb|\polynomial[reciprocal]{a,b,c,-d,e}| +% & $\polynomial[reciprocal]{a,b,c,-d,e}$\\[\tabsepadd] +% \verb|\polynomial[reciprocal,falling]{a,b,c,-d,e}| +% & $\polynomial[reciprocal,falling]{a,b,c,-d,e}$\\[\tabsepadd] +% \verb|\polynomialfrac[falling]{a,b,c,-d,e}{f,g,h,i}| +% & $\displaystyle\polynomialfrac[falling]{a,b,c,-d,e}{f,g,h,i}$\\[\tabsepadd] +% \verb|\polynomialfrac[reciprocal]{a,b,c,-d,e}{f,g,h,i}| +% & $\displaystyle\polynomialfrac[reciprocal]{a,b,c,-d,e}{f,g,h,i}$ +% \end{tabular} +% \par\strut\par +% It is also possible to change the polynomial variable through the +% optional argument \verb|var=<nbr>|. The starting value of the +% exponents can be changed through \verb|start=<nbr>|. There is also a +% variable \verb|step=<nbr>| that changes the incrementation steps of the +% exponents. +% \par\strut\par +% \noindent +% \textbf{Examples:} +% \newline\strut +% \begin{tabular}{@{}p{0.6\linewidth}p{0.4\linewidth}} +% \verb|\polynomial[var=t]{a,b,c,-d,e}| +% & $\polynomial[var=t]{a,b,c,-d,e}$\\[\tabsepadd] +% \verb|\polynomial[var=\Phi,start=2]{a,b,c,-d,e}| +% & $\polynomial[var=\Phi,start=2]{a,b,c,-d,e}$\\[\tabsepadd] +% \verb|\polynomial[var=z,falling]{a,b,c,-d,e}| +% & $\polynomial[var=z,falling]{a,b,c,-d,e}$\\[\tabsepadd] +% \verb|\polynomialfrac[var=\varphi,reciprocal,start=-3]|\newline +% \verb| {a,b,c,-d,e}{f,g,h,i}| +% & $\displaystyle\polynomialfrac[var=\varphi,reciprocal,start=-3] +% {a,b,c,-d,e}{f,g,h,i}$\\[\tabsepadd] +% \verb|\polynomial[step=3,var=\pi]{a,b,c,-d,e}| +% & $\polynomial[step=3,var=\pi]{a,b,c,-d,e}$\\[\tabsepadd] +% \verb|\polynomial[step=2,reciprocal,falling,start=3]|\newline +% \verb| {a,b,c,-d,e}| +% & $\polynomial[step=2,reciprocal,falling,start=3]{a,b,c,-d,e}$\\[\tabsepadd] +% \verb|\polynomial[step=-3,start=2]{a,b,c,-d,e}| +% & $\polynomial[step=-3,start=2]{a,b,c,-d,e}$\\[\tabsepadd] +% \end{tabular} +% \par\strut\par +% Sometimes, it is desirable to use other addition and subtraction +% symbols than the default. This is done by the variables \verb|add| and +% \verb|sub|. If the first coefficient is negative this will also have +% the subtraction sign specified in \verb|sub|. In some cases the +% additive inverse is denoted by a normal minus, while the +% subtraction (if defined) something else, e.g., $\ominus$. For this +% purpose there is a third variable \verb|firstsub|. +% \par\strut\par +% \noindent +% \textbf{Examples:} +% \newline\strut +% \begin{tabular}{@{}p{0.6\linewidth}p{0.4\linewidth}} +% \verb|\polynomial[add=\oplus,sub=\ominus]|\newline +% \verb| {a,-b,c,-d,e}| +% & $\polynomial[add=\oplus,sub=\ominus]{a,-b,c,-d,e}$\\[\tabsepadd] +% \verb|\polynomial[add=\oplus,sub=\ominus]|\newline +% \verb| {-a,b,-c,d,-e}| +% & $\polynomial[add=\oplus,sub=\ominus]{-a,b,-c,d,-e}$\\[\tabsepadd] +% \verb|\polynomial[add=\oplus,sub=\ominus,firstsub=-]|\newline +% \verb| {-a,b,-c,d,-e}| +% & $\polynomial[add=\oplus,sub=\ominus,firstsub=-]{-a,b,-c,d,-e}$ +% \end{tabular} +% \par\strut\par +% All of the above variables can be set either for individual +% commands, as shown, or for the rest of the document with the command +% \verb|\polynomialstyle|. In this case there is also an option that +% resets all values to the starting values, called \verb|default|. +% \par\strut\par +% \noindent +% \textbf{Examples:} +% \newline\strut +% \begin{tabular}{@{}p{0.6\linewidth}p{0.4\linewidth}} +% \verb|\polynomial{a,b,c,-d,e}| +% & $\polynomial{a,b,c,-d,e}$ +% \end{tabular}\vspace*{\tabsepadd}\newline +% \verb|\polynomialstyle{var=z,falling}| +% \polynomialstyle{var=z,falling}\vspace*{\tabsepadd}\newline +% \begin{tabular}{@{}p{0.6\linewidth}p{0.4\linewidth}} +% \verb|\polynomial{a,b,c,-d,e}| +% & $\polynomial{a,b,c,-d,e}$\\[\tabsepadd] +% \verb|\polynomial[reciprocal]{a,b,c,-d,e}| +% & $\polynomial[reciprocal]{a,b,c,-d,e}$\\[\tabsepadd] +% \verb|\polynomial[start=3,falling=false]{a,b,c,-d,e}| +% & $\polynomial[start=3,falling=false]{a,b,c,-d,e}$\\[\tabsepadd] +% \verb|\polynomialfrac{a,b,c,-d,e}{f,g,h,i}| +% & $\displaystyle\polynomialfrac{a,b,c,-d,e}{f,g,h,i}$ +% \end{tabular}\vspace*{\tabsepadd}\newline +% \verb|\polynomialstyle{add=\oplus,sub=\ominus}| +% \polynomialstyle{add=\oplus,sub=\ominus}\vspace*{\tabsepadd}\newline +% \begin{tabular}{@{}p{0.6\linewidth}p{0.4\linewidth}} +% \verb|\polynomial{a,b,c,-d,e}| +% & $\polynomial{a,b,c,-d,e}$ +% \end{tabular}\vspace*{\tabsepadd}\newline +% \verb|\polynomialstyle{default}| +% \polynomialstyle{default}\vspace*{\tabsepadd}\newline +% \begin{tabular}{@{}p{0.6\linewidth}p{0.4\linewidth}} +% \verb|\polynomial{a,b,c,-d,e}| +% & $\polynomial{a,b,c,-d,e}$ +% \end{tabular} + +% \StopEventually{} +%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% +%% polynomial.sty +%% +%% v1.1 +%% 2007-03-17 +%% +%% Stefan Höst +%% (stefan.host@it.lth.se) +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% +%% Problems: +%% * Very long numbers in coefficient result in overflow. +%% +%% Fixes +%% 2007-03-17: Removed allocation of counter for each call of \polynomial. +%% 2007-03-17: Replaced some other counters with \def. +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Counters +\newcount\shpol@numcoeff% Number of coeffs parsed +\newcount\shpol@coeffnum% loop var for coeffs +\newcount\shpol@exponent% loop var for exponents (not same as coeffnum) +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% ifs +\newif\if@shpol@firstterm% If first term no '+' +\newif\if@shpol@falling% If exponents falling +\newif\if@shpol@reciprocal% If reciprocal +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% variables +\def\shpol@var{x}% keyval: poly var +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% keyval +\RequirePackage{keyval} +%% in function +\define@key{shpol}{start}[0]{\def\shpol@start{#1}}%{\shpol@start=#1} +\define@key{shpol}{var}[x]{\def\shpol@tmpvar{#1}} +\define@key{shpol}{step}[1]{\def\shpol@expstep{#1}}%{\shpol@expstep=#1} +\define@key{shpol}{falling}[true]{\csname @shpol@falling#1\endcsname} +\define@key{shpol}{reciprocal}[true]{\csname @shpol@reciprocal#1\endcsname} +\define@key{shpol}{add}[+]{\def\shpol@add{#1}} +\define@key{shpol}{sub}[-]{\def\shpol@sub{#1}\def\shpol@firstsub{#1}} +\define@key{shpol}{firstsub}[-]{\def\shpol@firstsub{#1}} +%% default values +\define@key{shpoldefault}{start}[0]{\def\shpol@start{#1}}%{\shpol@start=#1} +\define@key{shpoldefault}{var}[x]{\def\shpol@var{#1}} +\define@key{shpoldefault}{step}[1]{\def\shpol@expstep{#1}}%{\shpol@expstep=#1} +\define@key{shpoldefault}{falling}[true]{\csname @shpol@falling#1\endcsname} +\define@key{shpoldefault}{reciprocal}[true]{\csname @shpol@reciprocal#1\endcsname} +\define@key{shpoldefault}{add}[+]{\def\shpol@add@default{#1}} +\define@key{shpoldefault}{sub}[-]{% + \def\shpol@sub@default{#1}\def\shpol@firstsub@default{#1}} +\define@key{shpoldefault}{firstsub}[-]{\def\shpol@firstsub@default{#1}} +%% +\define@key{shpoldefault}{default}[true]{% + \setkeys{shpoldefault}{start,var,step,falling=false,reciprocal=false,add,sub,firstsub}} +\setkeys{shpoldefault}{default} +\def\polynomialstyle#1{\setkeys{shpoldefault}{#1}} +%%%%%%%%%%%%%%%%%%%%%%%% +%% help defs +\def\shpol@splitcoeff#1{\shpol@@splitcoeff#1\@nil} +\def\shpol@@splitcoeff#1#2\@nil{% + \def\shpol@firstofcoeff{#1}% + \def\shpol@restofcoeff{#2} +} +\def\shpol@minus{-} +%% If #1 is a number that is =1 then #2 else #3 +%% see www.tex.ac.uk/cgi-bin/texfaq2html?label=isitanum +\def\if@@one#1#2#3{% + \ifcat_\ifnum1=0#1 _\else A\fi #2\else #3\fi} +%% If #1 a number that is =0 then #2 else #3 +\def\if@@zero#1#2#3{% + \ifcat_\ifnum0=0#1 _\else A\fi #2\else #3\fi} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% set one term in polynomial +\def\shpol@setterm[#1]#2#3{% [variable]{koefficient}{exponent} + \def\@shpol@koeff{#2} %% To make it more clear + \ifnum#3=0 %% x^0 + \@shpol@koeff + \else + \if@@one{#2}{}{\@shpol@koeff} + #1 + \ifnum#3=1\else + ^{#3} + \fi + \fi} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\def\shpol@getcoeff#1{% Pars the coeffs and store in #1-vars + \shpol@numcoeff=0% + \@for\shpol@coeff:=#1\do{% + \advance\shpol@numcoeff by 1\relax% + \expandafter\let\csname shpol@coeff\romannumeral\shpol@numcoeff\endcsname\shpol@coeff% + }% +} +\def\shpol@writepoly{% Write the #1-vars as polynomial + \shpol@coeffnum=1 + \shpol@exponent=0 + \if@shpol@reciprocal + \if@shpol@falling + \advance\shpol@exponent by -\shpol@numcoeff + \advance\shpol@exponent by 1 + \else + \advance\shpol@exponent by \shpol@numcoeff + \advance\shpol@exponent by -1 + \fi + \multiply\shpol@exponent by \shpol@expstep + \fi + \advance\shpol@exponent by \shpol@start + \loop% + \expandafter\let\expandafter\shpol@coeff% + \csname shpol@coeff\romannumeral\shpol@coeffnum\endcsname + \if@@zero{\shpol@coeff}{}{% coeff not zero + %% Check if first char is '-'. Then remove it and replace + with -. + \expandafter\shpol@splitcoeff\expandafter{\shpol@coeff} + \ifx\shpol@firstofcoeff\shpol@minus + \if@shpol@firstterm\shpol@firstsub\else\shpol@sub\fi + \let\shpol@coeff\shpol@restofcoeff + \else + \if@shpol@firstterm\else\shpol@add\fi + \fi + %%\fi + \@shpol@firsttermfalse + \shpol@setterm[\shpol@tmpvar]% + {\shpol@coeff}% + {\the\shpol@exponent}% + } + \ifnum\shpol@coeffnum<\shpol@numcoeff + \advance\shpol@coeffnum by 1\relax% + \advance\shpol@exponent by + \if@shpol@falling + \if@shpol@reciprocal \shpol@expstep \else -\shpol@expstep \fi + \else + \if@shpol@reciprocal -\shpol@expstep \else \shpol@expstep \fi + \fi\relax% + \repeat +} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\def\shpol@defaultvalues{% Set default values for keyval + \let\shpol@tmpvar\shpol@var + \let\shpol@add\shpol@add@default + \let\shpol@sub\shpol@sub@default + \let\shpol@firstsub\shpol@firstsub@default + \@shpol@firsttermtrue +} +\def\polynomial{% + \shpol@defaultvalues + \@ifnextchar[%] + {\opt@shpol@polynomial}{\shpol@polynomial}} +\def\opt@shpol@polynomial[#1]{% + \setkeys{shpol}{#1} + \shpol@polynomial} +\def\shpol@polynomial#1{% + \shpol@getcoeff{#1} + \shpol@writepoly +} +\def\polynomialfrac{% + \@ifnextchar[%] + {\opt@shpol@rational}{\@shpol@rational}} +\def\@shpol@rational#1#2{% + \frac{\polynomial{#1}}{\polynomial{#2}}} +\def\opt@shpol@rational[#1]#2#3{% + \frac{\polynomial[#1]{#2}}{\polynomial[#1]{#3}}} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\endinput +% \Finale + + |