diff options
author | Karl Berry <karl@freefriends.org> | 2006-01-13 00:03:01 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2006-01-13 00:03:01 +0000 |
commit | 200979914dfe39c752b8228aaa628c1425311155 (patch) | |
tree | 240ab3709aa994bb17c006fd4713ffc52f77aaf0 /Master/texmf-dist | |
parent | a22c2562845b4ba32acd63d5a8ca954c94d33d21 (diff) |
polynom
git-svn-id: svn://tug.org/texlive/trunk@1207 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist')
-rw-r--r-- | Master/texmf-dist/tex/latex/polynom/polynom.sty | 1703 |
1 files changed, 1703 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/latex/polynom/polynom.sty b/Master/texmf-dist/tex/latex/polynom/polynom.sty new file mode 100644 index 00000000000..2d58d7a601c --- /dev/null +++ b/Master/texmf-dist/tex/latex/polynom/polynom.sty @@ -0,0 +1,1703 @@ +%% +%% This is file `polynom.sty', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% polynom.dtx (with options: `package') +%% +%% The files polynom.dtx and polynom.ins and all files generated +%% from these two files are referred to as `this work'. +%% +%% This work is copyright 2000-2004 Carsten Heinz. +%% +%% This work may be distributed and/or modified under the conditions +%% of the LaTeX Project Public License, either version 1.3 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.3 or later is part of all distributions of LaTeX +%% version 2003/12/01 or later. +%% +%% This work has the LPPL maintenance status "maintained". +%% +%% The Current Maintainer of this work is Carsten Heinz <cheinz@gmx.de>. +%% +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{polynom}[2004/08/12 0.16 (Carsten Heinz)] +\def\pld@AddTo#1#2{\expandafter\def\expandafter#1\expandafter{#1#2}} +\def\pld@Extend#1#2{% + \expandafter\pld@AddTo\expandafter#1\expandafter{#2}} +\def\pld@ExpandTwo#1#2#3{% + \expandafter\def\expandafter\pld@temp\expandafter{#2}% + \pld@Extend\pld@temp{#3}% + \expandafter#1\pld@temp} +\def\pld@true{\let\pld@if\iftrue} +\def\pld@false{\let\pld@if\iffalse} +\pld@false +\RequirePackage{keyval}[1997/11/10] +\newcommand\polyset[1]{\ifx\@empty#1\@empty\else \setkeys{pld}{#1}\fi} +\def\pld@IfVar#1{% + \def\pld@temp##1,#1,##2##3\relax{% + \ifx\@empty##3\@empty \expandafter\@secondoftwo + \else \expandafter\@firstoftwo \fi}% + \expandafter\pld@temp\pld@variables,#1,\@empty\relax} +\define@key{pld}{vars} + {\let\pld@variables\@empty + \@tfor\pld@temp:=#1\do + {\pld@Extend\pld@variables{\expandafter,\pld@temp}}} +\polyset{vars=Xx} +\define@key{pld}{style} + {\@ifundefined{pld@style#1}% + {\PackageError{polynom}{Unknown style `#1'}% + {Arguments can be `A' or `B' or `C'.}}% + {\let\pld@style=#1% + \@nameuse{pld@style#1}}} +\def\pld@styleA{\let\pld@iftopresult\iftrue} +\def\pld@styleB{\let\pld@iftopresult\iffalse} +\let\pld@styleC\pld@styleB +\polyset{style=A} +\define@key{pld}{delims} + {\@ifnextchar[\pld@delims + {\pld@delims[{}{}]}#1{}{}} +\def\pld@delims[#1#2]#3#4{% + \def\pld@leftxdelim{#1}\def\pld@rightxdelim{#2}% + \def\pld@leftdelim{#3}\def\pld@rightdelim{#4}} +\polyset{delims=[{\left.}{\right.}]{\left(}{\right)}} +\define@key{pld}{div}{\def\pld@div{#1}} +\polyset{div=\div} +\define@key{pld}{stage}{% + \@tempcnta#1\relax \ifnum\@tempcnta<\@ne \@tempcnta\@ne \fi + \edef\pld@stage{\the\@tempcnta}} +\newcount\pld@currstage +\newcommand*\polymul[1]{% + \pld@GetPoly{\pld@polya\pld@polyb}% + {\pld@MultiplyPoly#1\pld@polya\pld@polyb + \ignorespaces}} +\newcommand*\polydiv[1]{% + \begingroup + \let\pld@stage\maxdimen + \pld@GetPoly{\pld@polya\pld@polyb}% + {\pld@DividePoly\pld@polya\pld@polyb + \let#1\pld@quotient + \let\polyremainder\pld@remainder + \pld@RestoreAftergroup#1\polyremainder\relax + \endgroup\ignorespaces}} +\newcommand*\polylongdiv[1][]{% + \begingroup + \let\pld@stage\maxdimen \polyset{#1}% + \pld@GetPoly{\pld@polya\pld@polyb}% + {\pld@LongDividePoly\pld@polya\pld@polyb + \pld@PrintLongDiv + \endgroup \ignorespaces}} +\newcommand*\polylonggcd[1][]{% + \begingroup + \let\pld@stage\maxdimen \polyset{#1}% + \pld@GetPoly{\pld@polya\pld@polyb}% + {\pld@LongEuclideanPoly\pld@polya\pld@polyb + \pld@PrintLongEuclidean + \endgroup \ignorespaces}} +\newcommand*\polygcd[1]{% + \begingroup + \let\pld@stage\maxdimen + \pld@GetPoly{\pld@polya\pld@polyb}% + {\pld@LongEuclideanPoly\pld@polya\pld@polyb + \global\let\@gtempa\pld@vb + \endgroup \let#1\@gtempa \ignorespaces}} +\newcommand*\polyfactorize{% + \pld@GetPoly\pld@current + {\pld@Factorize\pld@current \ensuremath{\pld@allines}}} +\newcommand*\polyprint{% + \pld@GetPoly{\pld@polya}% + {\ensuremath{\pld@PrintPoly\pld@polya}}} +\newcommand*\polyadd[1]{% + \pld@GetPoly{\pld@polya\pld@polyb}% + {\let#1\pld@polya \pld@ExtendPoly#1\pld@polyb + \pld@Simplify#1% + \ignorespaces}} +\newcommand*\polysub[1]{% + \pld@GetPoly{\pld@polya\pld@polyb}% + {\def\pld@tempoly{\pld@R{-1}1}% + \pld@MultiplyPoly\pld@polyb\pld@polyb\pld@tempoly + \let#1\pld@polya \pld@ExtendPoly#1\pld@polyb + \pld@Simplify#1% + \ignorespaces}} +\def\pld@RestoreAftergroup{% + \global\let\@gtempa\@empty + \pld@RestoreAfter@} +\def\pld@RestoreAfter@#1{% + \ifx\relax#1% + \aftergroup\@gtempa + \else + \global\pld@Extend\@gtempa{\expandafter\def\expandafter#1% + \expandafter{#1}}% + \expandafter\pld@RestoreAfter@ + \fi} +\def\pld@SplitMonom#1#2{% + \pld@SplitMonom@#2\pld@V\relax {\pld@SplitMonom@V#1#2\relax}% + {#1{#2}{}}} +\def\pld@SplitMonom@#1\pld@V#2\relax{% + \ifx\@empty#2\@empty \expandafter\@secondoftwo + \else \expandafter\@firstoftwo \fi} +\def\pld@SplitMonom@V#1#2\pld@V#3\relax{#1{#2}{\pld@V#3}} +\def\pld@SplitMonomS#1#2{% + \pld@SplitMonomS@#2\pld@S\relax {\pld@SplitMonomS@S#1#2\relax}% + {#1{#2}{}}} +\def\pld@SplitMonomS@#1\pld@S#2\relax{% + \ifx\@empty#2\@empty \expandafter\@secondoftwo + \else \expandafter\@firstoftwo \fi} +\def\pld@SplitMonomS@S#1#2\pld@S#3\relax{#1{#2}{\pld@S#3}} +\def\pld@IfSum#1{\pld@IfSum@#1+\@empty+\relax+} +\def\pld@IfSum@#1+#2+\relax+{% + \ifx\@empty#2\@empty \expandafter\@secondoftwo + \else \expandafter\@firstoftwo \fi} +\def\pld@DefNegative#1#2{\pld@DefNegative@#1#2\@empty} +\def\pld@DefNegative@#1#2#3#4#5\@empty{% + \ifx #2\pld@R\def#1{\pld@R{-#3}{#4}#5}% + \else \def#1{\pld@R{-1}1#2{#3}{#4}#5}\fi} +\def\pld@DefInverse#1#2{% + \let#1\@empty + \pld@DefInverse@#1#2\relax\@empty\@empty} +\def\pld@DefInverse@#1#2#3#4{% + \ifx\relax#2\relax \expandafter\@gobbletwo \else + \ifx #2\pld@R \pld@AddTo#1{\pld@R{#4}{#3}}\else + \ifx #2\pld@F \pld@AddTo#1{\pld@F{#4}{#3}}\else + \ifx #2\pld@S \pld@AddTo#1{\pld@S{#3}{-#4}}\else + \ifx #2\pld@V \pld@AddTo#1{\pld@V{#3}{-#4}}\else + \pld@DIError + \fi \fi \fi \fi + \fi + \pld@DefInverse@#1} +\def\pld@AddToPoly#1#2{% + \ifx #1\@empty \def#1{#2}\else + \pld@AddTo#1{+#2}\fi} +\def\pld@ExtendPoly#1#2{% + \ifx #1\@empty \pld@Extend#1{#2}\else + \ifx #2\@empty + \else \pld@Extend#1{\expandafter+#2}\fi \fi} +\def\pld@R{r} +\def\pld@F{f} +\def\pld@S{s} +\def\pld@V{v} +\def\pld@GetPoly#1#2{% + \def\pld@pool{#1}\def\pld@aftermacro{#2}% + \pld@GetPoly@} +\def\pld@GetPoly@{% + \@ifnextchar\bgroup \pld@GetPolyArg\pld@GetPolyLet} +\def\pld@GetPolyArg#1{% + \pld@Scan{#1}% + \pld@GetPolyLet\pld@tempoly} +\def\pld@GetPolyLet{\expandafter\pld@GetPolyLet@\pld@pool\relax} +\def\pld@GetPolyLet@#1#2\relax#3{% + \let#1#3\def\pld@pool{#2}% + \pld@Simplify#1% + \ifx\pld@pool\@empty \expandafter\pld@aftermacro + \else \expandafter\pld@GetPoly@ \fi} +\def\pld@ScanBegingroup{\begingroup \let\pld@tempoly\@empty} +\def\pld@ScanEndgroup{\pld@ScanSetA \endgroup} +\def\pld@ScanSetA{\global\let\@gtempa\pld@tempoly} +\def\pld@ScanSetB{\let\pld@tempoly\@gtempa} +\def\pld@Scan#1{% + \let\pld@tempoly\@empty + \pld@ScanOpen(#1\relax + \pld@ScanEndgroup \pld@ScanEndgroup} +\def\pld@ScanIt#1{% + \ifx \relax#1\let\pld@next\@gobble \else + \ifx +#1\let\pld@next\pld@ScanAdd\else + \ifx -#1\let\pld@next\pld@ScanSubtract\else + \ifx *#1\let\pld@next\pld@ScanMultiply\else + \ifx \cdot#1\let\pld@next\pld@ScanMultiply\else + \ifx /#1\let\pld@next\pld@ScanDivide\else + \ifx )#1\let\pld@next\pld@ScanClose\else + \ifx ^#1\let\pld@next\pld@ScanPower\else + \ifx \frac#1\let\pld@next\pld@ScanFrac\else + \ifx (#1\let\pld@next\pld@ScanOpen\else + \pld@IfNumber{#1}% + {\let\pld@next\pld@ScanNumeric}% + {\pld@IfVar{#1}{\let\pld@next\pld@ScanVar}% + {\let\pld@next\pld@ScanSymbol}}% + \fi \fi + \fi \fi \fi \fi \fi \fi \fi \fi + \pld@next #1} +\def\pld@IfNumber#1{% + \def\pld@temp##1#1##2##3\relax{% + \ifx\@empty##2\@empty \expandafter\@secondoftwo + \else \expandafter\@firstoftwo \fi}% + \pld@temp 0123456789#1\@empty\relax} +\def\pld@ScanOpen({% + \ifx\@empty\pld@tempoly\else + \pld@ScanMultiplyBase\pld@ScanBbyA + \fi + \pld@ScanBegingroup \aftergroup\pld@ScanSetB + \pld@ScanBegingroup \aftergroup\pld@ScanSetB + \pld@ScanIt} +\def\pld@ScanClose){% + \pld@ScanEndgroup \pld@ScanEndgroup \pld@ScanSetA + \pld@ScanIt} +\def\pld@ScanAdd+{\pld@ScanAddBase\pld@ScanAtoB} +\def\pld@ScanSubtract-{\pld@ScanAddBase\pld@ScanAfromB} +\def\pld@ScanAddBase#1{% + \pld@ScanEndgroup \pld@ScanEndgroup + \pld@ScanBegingroup \aftergroup#1% + \pld@ScanBegingroup \aftergroup\pld@ScanSetB + \pld@ScanIt} +\def\pld@ScanAtoB{\pld@ExtendPoly\pld@tempoly\@gtempa} +\def\pld@ScanAfromB{\pld@ExtendPoly\pld@tempoly{\@gtempa\pld@R{-1}1}} +\def\pld@ScanMultiply#1{\pld@ScanMultiplyBase\pld@ScanBbyA \pld@ScanIt} +\def\pld@ScanDivide/{\pld@ScanMultiplyBase\pld@ScanDivBbyA \pld@ScanIt} +\def\pld@ScanMultiplyBase{% + \pld@ScanEndgroup \pld@ScanBegingroup \aftergroup} +\def\pld@ScanBbyA{\pld@MultiplyPoly\pld@tempoly\pld@tempoly\@gtempa} +\def\pld@ScanDivBbyA{% + \def\pld@temp{\pld@F{}}% + \pld@Extend\pld@temp{\expandafter{\@gtempa}}% + \pld@Extend\pld@tempoly\pld@temp} +\def\pld@ScanPower^#1{% + \let\pld@polya\pld@tempoly + \@multicnt#1\relax + \loop \ifnum\@multicnt>\@ne + \advance\@multicnt\m@ne + \pld@MultiplyPoly\pld@tempoly\pld@tempoly\pld@polya + \repeat + \pld@ScanIt} +\def\pld@ScanImplicitMultiply{% + \expandafter\pld@IfSum\expandafter{\pld@tempoly}% + {\pld@ScanMultiplyBase\pld@ScanBbyA}% + {}} +\def\pld@ScanNumeric{% + \pld@ScanImplicitMultiply + \let\pld@temp\frac \let\frac\relax + \afterassignment\pld@ScanNumeric@ \@tempcnta} +\def\pld@ScanNumeric@#1{% + \let\frac\pld@temp + \ifx #1.% + \PackageError{polynom}{noninteger constants not supported}% + {Constants must be integers in TeX's word range.\MessageBreak + The fractional part will be lost.}% + \def\pld@next##1{\afterassignment\pld@ScanIt\@tempcnta}% + \else + \let\pld@next\pld@ScanIt + \fi + \pld@Extend\pld@tempoly + {\expandafter\pld@R\expandafter{\the\@tempcnta}1}% + \pld@next #1} +\def\pld@ScanVar{\pld@ScanImplicitMultiply \pld@ScanVS\pld@V} +\def\pld@ScanSymbol{\pld@ScanImplicitMultiply \pld@ScanVS\pld@S} +\def\pld@ScanVS#1#2{% + \@ifnextchar^{\pld@ScanVS@u#1{#2}}% + {\@ifnextchar_{\pld@ScanVar@l#1{#2}}% + {\pld@AddTo\pld@tempoly{#1{#2}1}% + \pld@ScanIt}}} +\def\pld@ScanVS@u#1#2^#3{% + \@ifnextchar_{\pld@ScanVS@ul#1{#2}{#3}}% + {\pld@AddTo\pld@tempoly{#1{#2}{#3}}\pld@ScanIt}} +\def\pld@ScanVS@l#1#2_#3{% + \@ifnextchar^{\pld@ScanVS@lu#1{#2}{#3}}% + {\pld@AddTo\pld@tempoly{#1{#2_{#3}}1}\pld@ScanIt}} +\def\pld@ScanVS@ul#1#2#3_#4{% + \pld@AddTo\pld@tempoly{#1{#2_{#4}}{#3}}\pld@ScanIt} +\def\pld@ScanVS@lu#1#2#3^#4{% + \pld@AddTo\pld@tempoly{#1{#2_{#3}}{#4}}\pld@ScanIt} +\def\pld@ScanFrac#1#2#3{% + \pld@ScanImplicitMultiply + \begingroup + \pld@Scan{#2}\pld@AddTo\pld@tempoly\relax + \global\let\@gtempa\pld@tempoly + \endgroup + \pld@Extend\pld@tempoly{\expandafter\pld@F\expandafter{\@gtempa}}% + \begingroup + \pld@Scan{#3}\pld@AddTo\pld@tempoly\relax + \global\let\@gtempa\pld@tempoly + \endgroup + \pld@Extend\pld@tempoly{\expandafter{\@gtempa}}% + \pld@ScanIt} +\def\pld@PrintPolyArg#1{% + \def\pld@temp{#1}\pld@PrintPoly\pld@temp} +\def\pld@PrintPoly#1{% + \ifx\@empty#1\@empty 0\else + \pld@firsttrue \expandafter\pld@PrintMonoms#1+\relax+% + \fi} +\def\pld@PrintPolyWithDelimsArg#1{% + \def\pld@temp{#1}\pld@PrintPolyWithDelims\pld@temp} +\def\pld@PrintPolyWithDelims#1{% + \ifx\@empty#1\@empty 0\else + \pld@firsttrue + \expandafter\pld@IfSum\expandafter{#1}\pld@true\pld@false + \pld@if \pld@leftdelim + \expandafter\pld@PrintMonoms#1+\relax+% + \pld@rightdelim + \else \expandafter\pld@PrintMonoms#1+\relax+\fi + \fi} +\def\pld@PrintInit{% + \let\pld@R\pld@PrintRational \strut + \pld@AccuIfNegative + {\pld@AccuNegate \pld@iffirst\pld@minustrue\else{}\fi -}% + {\pld@iffirst\pld@minusfalse\else{}+\fi}% + \pld@firstfalse + \pld@AccuIfAbsOne{}{\pld@AccuPrint \pld@true}% + \let\pld@PrintInit\@empty} +\def\pld@minustrue{\global\let\pld@ifminus\iftrue} +\def\pld@minusfalse{\global\let\pld@ifminus\iffalse} +\def\pld@firsttrue{\global\let\pld@iffirst\iftrue} +\def\pld@firstfalse{\global\let\pld@iffirst\iffalse} +\pld@firstfalse +\def\pld@PrintMonoms#1+{% + \ifx\relax#1\else + \begingroup + \pld@AccuSetX11% + \let\pld@R\pld@AccuMul + \let\pld@F\pld@PrintFrac + \let\pld@S\pld@PrintSymbol + \let\pld@V\pld@PrintSymbol + \pld@false + #1% + \pld@PrintInit + \pld@if\else \pld@AccuPrint \fi + \endgroup + \expandafter\pld@PrintMonoms + \fi} +\def\pld@PrintRational#1#2{% + \pld@true \pld@AccuSetX{#1}{#2}\pld@AccuPrint} +\def\pld@PrintSymbol#1#2{% + \pld@PrintInit \pld@true #1\ifnum#2=\@ne\else^{#2}\fi} +\def\pld@PrintFrac#1#2{% + \pld@PrintInit \pld@true + \ifx\@empty#2\@empty + \begingroup + \pld@IfSum{#1}\pld@true\pld@false + \pld@if\pld@leftdelim #1\pld@rightdelim\else #1\fi + \endgroup + \expandafter\@gobbletwo + \else + \expandafter\pld@PrintFrac@ + \fi + {#1}{#2}} +\def\pld@PrintFrac@#1#2{% + \ifx\@empty#1\@empty \frac1{#2}\else \frac{#1}{#2}\fi} +\def\pld@CondenseFactors#1{% + \ifx\@empty#1\else + \begingroup + \let\pld@R\pld@AccuMul + \let\pld@F\pld@CondenseFrac + \let\pld@S\pld@CFSymbol + \let\pld@V\pld@CFVar + \let\pld@temp#1\let\pld@tempoly\@empty + \expandafter\pld@CF@loop\pld@temp+\relax+% + \global\let\@gtempa\pld@tempoly + \endgroup + \let#1\@gtempa + \fi} +\def\pld@CF@loop#1+{% + \ifx\relax#1\else + \begingroup + \pld@AccuSetX11% + \def\pld@frac{{}{}}\let\pld@symbols\@empty\let\pld@vars\@empty + \pld@false + #1% + \let\pld@temp\@empty + \pld@AccuIfZero{}% + {\pld@AccuIfOne{}{\pld@AccuGet\pld@temp + \edef\pld@temp{\noexpand\pld@R\pld@temp}}% + \pld@if \pld@Extend\pld@temp{\expandafter\pld@F\pld@frac}\fi + \expandafter\pld@CF@loop@\pld@symbols\relax\@empty + \expandafter\pld@CF@loop@\pld@vars\relax\@empty + \ifx\@empty\pld@temp + \def\pld@temp{\pld@R11}% + \fi}% + \global\let\@gtempa\pld@temp + \endgroup + \ifx\@empty\@gtempa\else + \pld@ExtendPoly\pld@tempoly\@gtempa + \fi + \expandafter\pld@CF@loop + \fi} +\def\pld@CF@loop@#1#2{% + \ifx\relax#1\else + \xdef\@gtempa{\csname pld@@\string#2\endcsname}% + \ifnum \@gtempa=\z@ \else + \pld@AddTo\pld@temp{#1{#2}}% + \pld@Extend\pld@temp{\expandafter{\@gtempa}}% + \fi + \expandafter\pld@CF@loop@ + \fi} +\def\pld@CFSymbol{\pld@CFSV\pld@symbols\pld@S} +\def\pld@CFVar{\pld@CFSV\pld@vars\pld@V} +\def\pld@CFSV#1#2#3#4{% + \@ifundefined{pld@@\string#3}% + {\@namedef{pld@@\string#3}{#4}% + \pld@AddTo#1{#2{#3}}}% + {\@tempcnta\csname pld@@\string#3\endcsname\relax + \advance\@tempcnta#4\relax + \expandafter\edef\csname pld@@\string#3\endcsname{\the\@tempcnta}}} +\def\pld@CondenseFrac#1#2{% + \pld@IfSum{#1}{\pld@CFFracAdd{\pld@F{#1}{}}{}}% + {#1}% + \pld@IfSum{#2}{\pld@CFFracAdd{}{\pld@F{}{#2}}}% + {\begingroup + \pld@DefInverse\pld@temp{#2}% + \global\let\@gtempa\pld@temp + \endgroup + \@gtempa}} +\def\pld@CFFracAdd{\pld@true \expandafter\pld@CFFracAdd@\pld@frac} +\def\pld@CFFracAdd@#1#2#3#4{\def\pld@frac{{#1#3}{#2#4}}} +\def\pld@CondenseMonomials#1#2{% + \ifx\@empty#2\else + \begingroup + #1% + \pld@if\else + \let\pld@SortVars@V\pld@SortVars@S + \let\pld@SplitMonom\pld@SplitMonomS + \pld@SortMonomials#2% + \fi + \let\pld@R\pld@CMRational + \let\pld@F\pld@CMFrac + \let\pld@S\pld@CMSymbol + \let\pld@V\pld@CMError + \let\pld@temp#2\let\pld@tempoly\@empty + \pld@AccuSetX01\let\pld@symbols\@empty \let\pld@monom\relax + \expandafter\pld@CM@\pld@temp+\relax+% + \global\let\@gtempa\pld@tempoly + \endgroup + \let#2\@gtempa + \fi} +\def\pld@CM@#1+{% + \ifx\relax#1\relax + \pld@CMAddToTempoly + \else + \pld@SplitMonom\pld@CM@do{#1}% + \expandafter\pld@CM@ + \fi} +\def\pld@CM@do#1#2{% + \ifx\pld@monom\relax \else + \def\pld@temp{#2}% + \ifx\pld@temp\pld@monom \else + \pld@CMAddToTempoly + \pld@AccuSetX01\let\pld@symbols\@empty \let\pld@monom\relax + \fi + \fi + \let\pld@op+% + \ifx\@empty#1\@empty \pld@R11\relax \else #1\relax \fi + \def\pld@monom{#2}} +\def\pld@CMAddToTempoly{% + \pld@AccuIfZero{\let\pld@temp\@empty}% + {\pld@AccuGet\pld@temp + \edef\pld@temp{\noexpand\pld@R\pld@temp}}% + \pld@CondenseMonomials\pld@false\pld@symbols + \ifx\pld@symbols\@empty \else + \pld@ExtendPoly\pld@temp\pld@symbols + \fi + \ifx\pld@temp\@empty \else + \pld@if + \expandafter\pld@IfSum\expandafter{\pld@temp}% + {\expandafter\def\expandafter\pld@temp\expandafter + {\expandafter\pld@F\expandafter{\pld@temp}{}}}% + {}% + \fi + \pld@ExtendPoly\pld@tempoly\pld@temp + \pld@Extend\pld@tempoly{\pld@monom}% + \fi} +\def\pld@CMFracAdd{% + \ifx +\pld@op \let\pld@op\@empty + \expandafter\pld@AddToPoly + \else \expandafter\pld@AddTo \fi + \pld@symbols} +\def\pld@CMRational#1#2#3{% + \ifx\relax#3% + \pld@AccuAdd{#1}{#2}% + \else + \pld@CMFracAdd{\pld@R{#1}{#2}}% + \expandafter#3% + \fi} +\def\pld@CMSymbol#1#2{\pld@CMFracAdd{\pld@S{#1}{#2}}}% +\def\pld@CMFrac#1#2{% + \ifx\@empty#2\@empty + \pld@CMFrac@nom#1+\relax+% + \else + \pld@CMFrac@{#1}{#2}% + \fi} +\def\pld@CMFrac@#1#2{% + \pld@IfSum{#1}{\pld@CMFracAdd{\pld@F{#1}{}}}% + {#1}% + \pld@IfSum{#2}{\pld@CMFracAdd{\pld@F{}{#2}}}% + {\begingroup + \pld@DefInverse\pld@temp{#2}% + \global\let\@gtempa\pld@temp + \endgroup + \@gtempa}} +\def\pld@CMFrac@nom#1+{% + \ifx\relax#1\else + #1\relax + \expandafter\pld@CMFrac@nom + \fi} +\def\pld@SortMonomials#1{% + \ifx #1\@empty \else + \begingroup + \let\pld@temp#1\let\pld@tempoly\@empty + \expandafter\pld@SortVars\pld@temp+\relax+% + \let\pld@temp\pld@tempoly \let\pld@tempoly\@empty + \expandafter\pld@SortSummands\pld@temp+\relax+% + \global\let\@gtempa\pld@tempoly + \endgroup + \let#1\@gtempa + \fi} +\def\pld@SortVars#1+{% + \ifx\relax#1\relax\else + \pld@SplitMonom\pld@SortVars@{#1}% + \expandafter\pld@SortVars + \fi} +\def\pld@SortVars@#1#2{% + \begingroup + \def\pld@monom{#2}% + \ifx\@empty\pld@monom\else + \let\pld@V\pld@SVVar + \let\pld@S\pld@SVSymbol + \pld@SortVars@V + \fi + \global\let\@gtempa\pld@monom + \endgroup + \def\pld@factor{#1}% + \pld@Extend\pld@factor\@gtempa + \pld@ExtendPoly\pld@tempoly\pld@factor} +\def\pld@SortVars@V{% + \pld@false \let\pld@temp\pld@monom \let\pld@monom\@empty + \pld@temp\pld@V\relax\relax + \pld@if \expandafter\pld@SortVars@V \fi} +\def\pld@SVVar#1#2\pld@V#3#4{% + \ifx\relax#3\relax + \pld@AddTo\pld@monom{\pld@V{#1}{#2}}% + \else + \pld@IfVarL{#1}{#3}{\pld@AddTo\pld@monom{\pld@V{#1}{#2}}% + \def\pld@next{\pld@V{#3}{#4}}}% + {\pld@true + \pld@AddTo\pld@monom{\pld@V{#3}{#4}}% + \def\pld@next{\pld@V{#1}{#2}}}% + \expandafter\pld@next + \fi} +\def\pld@SortVars@S{% + \pld@false \let\pld@temp\pld@monom \let\pld@monom\@empty + \pld@temp\pld@S\relax\relax + \pld@if \expandafter\pld@SortVars@S \fi} +\def\pld@SVSymbol#1#2\pld@S#3#4{% + \ifx\relax#3\relax + \pld@AddTo\pld@monom{\pld@S{#1}{#2}}% + \else + \pld@IfVarL{#1}{#3}{\pld@AddTo\pld@monom{\pld@S{#1}{#2}}% + \def\pld@next{\pld@S{#3}{#4}}}% + {\pld@true + \pld@AddTo\pld@monom{\pld@S{#3}{#4}}% + \def\pld@next{\pld@S{#1}{#2}}}% + \expandafter\pld@next + \fi} +\def\pld@SortSummands#1+{% + \ifx\relax#1\relax\else + \ifx\@empty\pld@tempoly + \def\pld@tempoly{#1}% + \else + \def\pld@monom{#1}% + \let\pld@temp\pld@tempoly \let\pld@tempoly\@empty + \expandafter\pld@SortSummands@i\pld@temp+\relax+% + \fi + \expandafter\pld@SortSummands + \fi} +\def\pld@SortSummands@i#1+{% + \ifx\relax#1\relax + \pld@ExtendPoly\pld@tempoly\pld@monom + \expandafter\@gobble + \else + \expandafter\pld@SortSummands@j + \fi + {#1}} +\def\pld@SortSummands@j#1{% + \expandafter\pld@IfMonomL\expandafter{\pld@monom}{#1}% + {\pld@AddToPoly\pld@tempoly{#1}% + \pld@SortSummands@i}% + {\pld@SortSummands@k\pld@monom+#1+}} +\def\pld@SortSummands@k#1+\relax+{\pld@ExtendPoly\pld@tempoly{#1}} +\def\pld@IfVarL#1#2{% + \begingroup + \def\pld@va{#1}\def\pld@vb{#2}% + \ifx\pld@va\pld@vb + \aftergroup\@secondoftwo + \else + \edef\pld@next{\expandafter\strip@prefix\meaning\pld@va + \relax\noexpand\@empty + \expandafter\strip@prefix\meaning\pld@vb + \relax\noexpand\@empty}% + \expandafter\pld@IfVarL@\pld@next + \fi + \endgroup} +\def\pld@IfVarL@#1#2\@empty#3#4\@empty{% + \let\pld@next\@empty + \ifx #3\relax \aftergroup\@secondoftwo + \else \ifx #1\relax \aftergroup\@firstoftwo + \else + \ifx#1#3% + \def\pld@next{\pld@IfVarL#2\@empty#4\@empty}% + \else + \ifnum`#1<`#3\relax \aftergroup\@firstoftwo + \else \aftergroup\@secondoftwo \fi + \fi + \fi \fi + \pld@next} +\def\pld@IfMonomL#1#2{% + \begingroup + \pld@IfMonomL@#1\pld@V\relax\relax\@empty + #2\pld@V\relax\relax\@empty + \endgroup} +\def\pld@IfMonomL@#1\pld@V#2#3#4\@empty#5\pld@V#6#7#8\@empty{% + \let\pld@next\@empty + \ifx #6\relax \aftergroup\@secondoftwo + \else \ifx #2\relax \aftergroup\@firstoftwo + \else + \def\pld@va{#2}\def\pld@vb{#6}% + \ifx\pld@va\pld@vb + \ifnum#3=#7\relax + \def\pld@next{\pld@IfMonomL@#4\@empty#8\@empty}% + \else + \ifnum#3<#7\relax \aftergroup\@firstoftwo + \else \aftergroup\@secondoftwo \fi + \fi + \else + \pld@IfVarL#2\relax\@empty#6\relax\@empty + {\aftergroup\@firstoftwo}% + {\aftergroup\@secondoftwo}% + \fi + \fi \fi + \pld@next} +\def\pld@IfMonomE#1#2{\pld@IfMonomE@#1\pld@V\@empty#2\pld@V\@empty} +\def\pld@IfMonomE@#1\pld@V#2\@empty#3\pld@V#4\@empty{% + \begingroup + \def\pld@va{#2}\def\pld@vb{#4}% + \ifx\pld@va\pld@vb \aftergroup\@firstoftwo + \else \aftergroup\@secondoftwo \fi + \endgroup} +\def\pld@Simplify#1{% + \pld@CondenseFactors#1% + \pld@SortMonomials#1% + \pld@CondenseMonomials\pld@true#1} +\def\pld@MultiplyPoly{\begingroup\pld@true \pld@MultiplyPoly@} +\def\pld@NMultiplyPoly{\begingroup\pld@false \pld@MultiplyPoly@} +\def\pld@MultiplyPoly@#1#2#3{% + \let\pld@temp\@empty + \ifx\@empty#2\@empty\else \ifx\@empty#3\@empty\else + \expandafter\pld@MultiplyPoly@a\expandafter#2#3+\relax+% + \fi \fi + \global\let\@gtempa\pld@temp + \endgroup + \let#1\@gtempa \pld@CondenseFactors#1} +\def\pld@MultiplyPoly@a#1#2+{% + \ifx\relax#2\else + \pld@if \def\pld@va{#2}\else \def\pld@va{#2\pld@R{-1}1}\fi + \expandafter\pld@MultiplyPoly@b#1+\relax+% + \expandafter\pld@MultiplyPoly@a\expandafter#1% + \fi} +\def\pld@MultiplyPoly@b#1+{% + \ifx\relax#1\else + \pld@ExtendPoly\pld@temp{\pld@va#1}% + \expandafter\pld@MultiplyPoly@b + \fi} +\def\pld@DividePoly{\pld@false \pld@DivPoly} +\def\pld@LongDividePoly#1#2{% + \let\pld@pattern\@empty \let\pld@lastline\@empty + \let\pld@subline\@empty \let\pld@currentline\@empty + \let\pld@allines\@empty \let\pld@maxcol\z@ + \pld@true \pld@DivPoly#1#2% + \pld@ArrangeResult#1} +\def\pld@DivPoly#1#2{% + \pld@currstage\pld@stage\relax + \let\pld@remainder#1\let\pld@divisor#2\let\pld@quotient\@empty + \pld@DivPoly@l} +\def\pld@DivPoly@l{% + \ifx\pld@remainder\@empty\else + \pld@IfNeedsDivision\pld@remainder\pld@divisor + {\pld@ExtendPoly\pld@quotient\pld@factor + \pld@NMultiplyPoly\pld@sub\pld@divisor\pld@factor + \pld@SubtractPoly\pld@remainder\pld@sub + \expandafter\pld@DivPoly@l}% + {}% + \fi} +\def\pld@IfNeedsDivision#1#2{% + \pld@ExpandTwo\pld@IfND{#1+\@empty}{#2+\@empty}} +\def\pld@IfND#1+#2\@empty#3+#4\@empty{% + \pld@DefInverse\pld@factor{#3}% + \pld@AddTo\pld@factor{#1}% + \pld@CondenseFactors\pld@factor + \begingroup + \pld@true + \expandafter\pld@IfND@\pld@factor\pld@V\relax\z@ + \pld@if \aftergroup\@firstoftwo + \else \aftergroup\@secondoftwo \fi + \endgroup} +\def\pld@IfND@#1\pld@V#2#3{% + \ifx\relax#2\@empty \expandafter\@gobble + \else \ifnum#3<\z@ \pld@false \fi + \fi \pld@IfND@} +\def\pld@SubtractPoly#1#2{% + \ifx#2\@empty\else + \pld@if + \let\pld@firstcol\maxdimen \let\pld@lastcol\z@ + \fi + \let\pld@tempoly\@empty + \pld@ExpandTwo\pld@SubtractPoly@ + {#1+\relax+\@empty}{#2+\relax+\@empty}% + \let#1\pld@tempoly + \pld@if + \ifnum\pld@currstage>\z@ + \pld@Extend\pld@allines{\pld@lastline\cr}% + \else + \pld@InsertFake\pld@lastline + \fi + \advance\pld@currstage-\tw@ + \ifnum\pld@currstage>\z@ + \pld@Extend\pld@allines{\pld@subline\cr}% + \edef\pld@subline{% + \noexpand\cline{\pld@firstcol-\pld@lastcol} + \noalign{\vskip\jot}}% + \pld@Extend\pld@allines\pld@subline + \else + \pld@InsertFake\pld@subline + \fi + \advance\pld@currstage\m@ne + \let\pld@lastline\pld@currentline + \let\pld@subline\@empty + \let\pld@currentline\@empty + \fi + \fi} +\def\pld@SubtractPoly@#1+#2\@empty#3+{% + \pld@if + \pld@DefNegative\pld@monom{#1}% + \expandafter\pld@InsertItems\expandafter\@empty + \expandafter{\pld@monom}{#1}% + \fi + \pld@SubtractPoly@l#2\@empty} +\def\pld@SubtractPoly@l#1+#2\@empty#3+#4\@empty{% + \ifx\relax#1\relax + \ifx\relax#3\relax \let\pld@next\@empty \else + \pld@AddToPoly\pld@tempoly{#3}% + \pld@if \pld@InsertItems{#3}{#3}{}\fi + \def\pld@next{\pld@SubtractPoly@l\relax+\@empty#4\@empty}% + \fi + \else + \ifx\relax#3\relax + \pld@SubtractPoly@r#1+#2\@empty + \let\pld@next\@empty + \else + \pld@IfMonomE{#1}{#3}% + {\def\pld@temp{#1+#3}% + \pld@CondenseMonomials\pld@true\pld@temp + \ifx\pld@temp\@empty\else + \pld@ExtendPoly\pld@tempoly\pld@temp + \fi + \pld@if \expandafter\pld@InsertItems\expandafter + {\pld@temp}{#3}{#1}\fi + \def\pld@next{\pld@SubtractPoly@l#2\@empty#4\@empty}}% + {\pld@IfMonomL{#1}{#3}% + {\pld@AddToPoly\pld@tempoly{#3}% + \pld@if \pld@InsertItems{#3}{#3}{}\fi + \def\pld@next{\pld@SubtractPoly@l#1+#2\@empty#4\@empty}}% + {\pld@AddToPoly\pld@tempoly{#1}% + \pld@if \pld@InsertItems{#1}{}{#1}\fi + \def\pld@next{\pld@SubtractPoly@l#2\@empty#3+#4\@empty}}% + }% + \fi \fi + \pld@next} +\def\pld@SubtractPoly@r#1+\relax+\@empty{\pld@AddToPoly\pld@tempoly{#1}} +\def\pld@InsertFake#1{% + \let\pld@temp\@empty + \expandafter\pld@InsertFake@l#1&\relax&} +\def\pld@InsertFake@l#1&{% + \ifx\relax#1\@empty + \pld@Extend\pld@temp{\expandafter&\pld@fakeline}% + \let\pld@fakeline\pld@temp + \else + \expandafter\pld@InsertFake@do\pld@fakeline\relax{#1}% + \expandafter\pld@InsertFake@l + \fi} +\def\pld@InsertFake@do#1\relax#3{% + \ifx\@empty#2\@empty \def\pld@fakeline{0pt&}% + \else \def\pld@fakeline{#2}\fi + \@tempdima#1\relax + \setbox\z@=\hbox{\ensuremath{#3}}% + \ifdim\@tempdima<\wd\z@ \@tempdima=\wd\z@ \fi + \ifx\pld@temp\@empty + \edef\pld@temp{\the\@tempdima}% + \else + \pld@Extend\pld@temp{\expandafter&\the\@tempdima}% + \fi} +\def\pld@fakeline{0pt&}% init +\def\pld@ConvertFake#1&{% + \ifx\relax#1\@empty\else + \ifx\@empty#1\@empty + &% + \else + \noexpand\vrule\noexpand\@height\z@\noexpand\@depth\z@ + \noexpand\@width#1\relax&% + \fi + \expandafter\pld@ConvertFake + \fi} +\def\pld@SplitQuotient{% + \let\pld@real\@empty \let\pld@shadow\empty + \pld@currstage\pld@stage\relax + \expandafter\pld@SplitQuotient@\pld@quotient+\relax+} +\def\pld@SplitQuotient@#1+{% + \ifx\relax#1\@empty + \advance\pld@currstage-\tw@ + \ifnum\pld@currstage<\z@ + \let\pld@PrintRemain\pld@XPLD + \else + \let\pld@PrintRemain\pld@PLD + \fi + \else + \ifx\@empty#1\@empty\else + \advance\pld@currstage-\tw@ + \ifnum\pld@currstage<\z@ + \pld@AddToPoly\pld@shadow{#1}% + \else + \pld@AddToPoly\pld@real{#1}% + \fi + \advance\pld@currstage\m@ne + \fi + \expandafter\pld@SplitQuotient@ + \fi} +\def\pld@PrintPolyShadow{% + \pld@firsttrue + \ifx\pld@real\@empty\else + \expandafter\pld@PrintMonoms\pld@real+\relax+% + \fi + \ifx\pld@shadow\@empty\else + \setbox\z@\hbox{$\expandafter\pld@PrintMonoms\pld@shadow + +\relax+$}% + \phantom{\copy\z@}% + \fi} +\def\pld@PrintLongDiv{% + \ensuremath{\hbox{\vtop{\begingroup + \offinterlineskip \tabskip=\z@ + \edef\pld@fakeline{\expandafter\pld@ConvertFake\pld@fakeline&\relax&}% + \halign{\strut\pld@firsttrue\hfil$##$% + &\pld@firsttrue\hfil$##$% + &&\hfil$##$\cr + \pld@fakeline\cr \noalign{\vskip-\normalbaselineskip}% + \pld@allines}% + \endgroup}}}} +\def\pld@InsertItems#1#2#3{% + \ifx\@empty#1\@empty + \ifx\@empty#2\@empty \def\pld@monom{#3}% + \else \def\pld@monom{#2}\fi + \else \def\pld@monom{#1}\fi + \@tempcnta\@ne \let\pld@recentmonom\@empty + \expandafter\pld@InsertItems@find\pld@pattern\relax&% + \ifnum\pld@firstcol>\@tempcnta \edef\pld@firstcol{\the\@tempcnta}\fi + \ifnum\pld@lastcol<\@tempcnta \edef\pld@lastcol{\the\@tempcnta}\fi + \ifnum\pld@maxcol<\@tempcnta \edef\pld@maxcol{\the\@tempcnta}\fi + \pld@InsertItems@do\pld@lastline{\pld@PLD{#3}}% + \pld@InsertItems@do\pld@subline{\pld@PLD{#2}}% + \pld@InsertItems@do\pld@currentline{\pld@PLD{#1}}} +\def\pld@InsertItems@do#1#2{% + \let\pld@temp\@empty \@tempcntb\@tempcnta + \expandafter\pld@InsertItems@do@a#1&&&&&\relax{#2}% + \let#1\pld@temp} +\def\pld@InsertItems@do@a#1\relax{% + \ifcase\@tempcntb \or + \or \pld@AddTo\pld@temp{#1&}% + \or \pld@AddTo\pld@temp{#1&}% + \or \pld@AddTo\pld@temp{#1&}% + \or \pld@AddTo\pld@temp{#1&}% + \else + \pld@AddTo\pld@temp{#1&}% + \advance\@tempcntb-5\relax + \def\pld@next{\pld@InsertItems@do@a#6&&&&&\relax}% + \expandafter\@firstoftwo\expandafter\pld@next + \fi + \pld@InsertItems@do@b} +\def\pld@InsertItems@do@b#1{\pld@AddTo\pld@temp{#1}} +\def\pld@InsertItems@find#1&{% + \ifx\relax#1\relax + \expandafter\pld@InsertItems@find@fill\pld@recentmonom\pld@V{}0\@empty + \else + \def\pld@recentmonom{#1}% + \expandafter\pld@IfMonomE\expandafter{\pld@monom}{#1}% + {\expandafter\pld@InsertItems@find@\expandafter&}% + {\advance\@tempcnta\@ne \expandafter\pld@InsertItems@find}% + \fi} +\def\pld@InsertItems@find@#1&\relax&{} +\def\pld@InsertItems@find@fill#1\pld@V#2#3#4\@empty{% + \expandafter\pld@InsertItems@find@fill@\pld@monom\pld@V{}0\@empty{#3}} +\def\pld@InsertItems@find@fill@#1\pld@V#2#3#4\@empty#5{% + \ifx\pld@pattern\@empty + \def\pld@pattern{\pld@V&\pld@V{#2}{#3}&}% + \@tempcnta\tw@ + \else + \@tempcntb#5\relax + \loop \ifnum #3<\@tempcntb + \advance\@tempcnta\@ne + \advance\@tempcntb\m@ne + \ifnum\@tempcntb=\z@ + \def\pld@temp{#1}% + \else + \edef\pld@temp{\noexpand\pld@V{#2}{\the\@tempcntb}}% + \fi + \pld@Extend\pld@pattern{\pld@temp&}% + \repeat + \advance\@tempcnta\m@ne + \fi} +\def\pld@ArrangeResult#1{% + \ifx\pld@remainder\@empty + \@tempcnta\pld@maxcol\relax + \pld@InsertItems@do\pld@lastline + {\pld@firsttrue\pld@PLD{\pld@R{0}{1}}}% + \fi + \ifnum\pld@currstage>\z@ + \pld@Extend\pld@allines{\pld@lastline\cr}% + \else + \pld@InsertFake\pld@lastline + \fi + \pld@iftopresult + \def\pld@lastline{\pld@PrintPoly\pld@divisor\bigr)&}% + \else + \let\pld@lastline\@empty + \ifx B\pld@style\else + \def\pld@lastline{\pld@leftdelim\strut\pld@rightxdelim&}% + \fi + \fi + \expandafter\pld@AR@col\expandafter\pld@PLD + \expandafter\pld@lastline#1+\relax+% + \pld@SplitQuotient + \pld@iftopresult + \let\pld@currentline\@empty + \expandafter\pld@AR@col\expandafter\pld@PLD + \expandafter\pld@currentline + \pld@quotient+\relax+% + \expandafter\pld@AR@col\expandafter\pld@XPLD + \expandafter\pld@currentline + \pld@shadow+\relax+% + \edef\pld@subline{% + \noexpand\cline{\tw@-\pld@maxcol}% + \noalign{\vskip\jot}}% + \pld@Extend\pld@currentline{\expandafter\cr\pld@subline}% + \else + \@tempcnta-\@tempcnta + \advance\@tempcnta\pld@maxcol\relax \advance\@tempcnta\@ne + \edef\pld@span{\the\@tempcnta}% + \ifx B\pld@style + \pld@AddTo\pld@lastline{% + &\multispan\pld@span${}=% + \pld@PrintPolyWithDelims\pld@divisor + \expandafter\pld@IfSum\expandafter{\pld@divisor}{}{\cdot}% + \expandafter\pld@IfSum\expandafter{\pld@quotient}\pld@true + \pld@false + \pld@if \pld@leftdelim + \pld@PrintPolyShadow + \pld@rightdelim + \else \pld@PrintPolyShadow \fi + \pld@firstfalse + \expandafter\pld@PrintRemain\expandafter{\pld@remainder}$}% + \else + \pld@AddTo\pld@lastline{% + &\multispan\pld@span$\pld@leftxdelim\strut\pld@rightdelim + \pld@div + \pld@PrintPolyWithDelims\pld@divisor= + \pld@PrintPolyShadow + \ifx\pld@remainder\@empty\else + +{}% + \setbox\z@=\hbox{$\displaystyle + \frac{\let\strut\@empty\pld@firsttrue \expandafter + \pld@PrintRemain\expandafter{\pld@remainder}}% + {\let\strut\@empty\pld@PrintPoly\pld@divisor}$}% + \dp\z@=\z@\box\z@ + \fi + $}% + \fi + \fi + \expandafter\pld@AR@\pld@allines\relax} +\def\pld@AR@#1\cr#2\relax{% + \pld@iftopresult + \let\pld@allines\pld@currentline + \pld@AddTo\pld@allines{\pld@lastline\cr #2}% + \else + \let\pld@allines\pld@lastline + \pld@AddTo\pld@allines{\cr #2}% + \fi} +\def\pld@AR@col#1#2#3+{% + \ifx\relax#3\@empty\else + \ifx\@empty#3\@empty\else + \def\pld@monom{#3}\@tempcnta\@ne + \expandafter\pld@InsertItems@find\pld@pattern\relax&% + \pld@InsertItems@do#2{#1{#3}}% + \fi + \expandafter\pld@AR@col\expandafter#1\expandafter#2% + \fi} +\def\pld@PLD#1{\ifx\@empty#1\@empty\else\pld@PrintMonoms#1+\relax+\fi} +\def\pld@XPLD#1{\phantom{\pld@PLD{#1}}} +\def\pld@LongEuclideanPoly#1#2{% + \pld@false \let\pld@allines\@empty + \pld@DivPoly#1#2% + \ifx\pld@quotient\@empty + \pld@DivPoly#2#1% + \pld@InsertEuclidean#2#1% + \let\pld@vb#1% + \else + \pld@InsertEuclidean#1#2% + \let\pld@vb#2% + \fi + \pld@LongEuclideanPoly@l} +\def\pld@LongEuclideanPoly@l{% + \ifx\pld@remainder\@empty \else + \let\pld@va\pld@divisor + \let\pld@vb\pld@remainder + \pld@DivPoly\pld@va\pld@vb + \pld@Simplify\pld@quotient \pld@Simplify\pld@remainder + \pld@InsertEuclidean\pld@va\pld@vb + \expandafter\pld@LongEuclideanPoly@l + \fi} +\def\pld@InsertEuclidean#1#2{% + \ifx \pld@allines\@empty \else + \pld@AddTo\pld@allines{\noalign{\vskip\jot}}% + \fi + \pld@Extend\pld@allines{\expandafter\pld@PrintPolyArg + \expandafter{#1}&}% + \pld@Extend\pld@allines{\expandafter\pld@PrintPolyWithDelimsArg + \expandafter{#2}\hfil\cdot\hfil}% + \pld@Extend\pld@allines{\expandafter\pld@PrintPolyWithDelimsArg + \expandafter{\pld@quotient}&}% + \pld@Extend\pld@allines{\expandafter\pld@PrintPolyWithDelimsArg + \expandafter{\pld@remainder}\cr}} +\def\pld@PrintLongEuclidean{ + \ensuremath{\hbox{\vtop{\begingroup + \offinterlineskip \tabskip=\z@ + \halign{\strut\pld@firsttrue\hfil$##$% + &${}={}$\hfil$##$\hfil + &${}+##$\hfil\cr \pld@allines}% + \endgroup}}}} +\def\pld@NextDivisorPair#1#2{% + \pld@NextDivisor\@tempcnta{#1}% + \pld@if\else + \pld@NextDivisor\@tempcntb{#2}% + \fi} +\def\pld@NextDivisor#1#2{% + \advance#1\@ne + \ifnum #1>#2\relax + #1\@ne \pld@false + \expandafter\@gobbletwo + \else + \@multicnt #2\relax + \divide\@multicnt#1\multiply\@multicnt#1% + \advance\@multicnt-#2\relax + \ifnum \@multicnt=\z@ + \pld@true + \expandafter\expandafter\expandafter\@gobbletwo + \else + \expandafter\expandafter\expandafter\pld@NextDivisor + \fi + \fi + #1{#2}} +\def\pld@FindZeros#1#2{% + \pld@NextDivisorPair{#1}{#2}% + \pld@if + \pld@CheckZeros + \def\pld@next{\pld@FindZeros{#1}{#2}}% + \expandafter\pld@next + \fi} +\def\pld@CheckZeros{% + \pld@true \@multicnt\z@ + \loop \pld@if + \pld@CheckZero{\the\@tempcnta}{\the\@tempcntb}% + \repeat + \pld@AddRationalZero{\the\@tempcnta}{\the\@tempcntb}% + \pld@true \@multicnt\z@ + \loop \pld@if + \pld@CheckZero{-\the\@tempcnta}{\the\@tempcntb}% + \repeat + \pld@AddRationalZero{-\the\@tempcnta}{\the\@tempcntb}} +\def\pld@CheckZero#1#2{% + \begingroup + \edef\pld@temp{{-#2}{#1}}% + \pld@Extend\pld@tempoly{\expandafter+\expandafter\pld@R\pld@temp}% + \let\pld@stage\maxdimen \pld@DividePoly\pld@current\pld@tempoly + \ifx\pld@remainder\@empty + \global\let\@gtempa\pld@quotient + \aftergroup\pld@true + \else + \aftergroup\pld@false + \fi + \endgroup + \pld@if + \advance\@multicnt\@ne + \let\pld@current\@gtempa + \fi} +\def\pld@AddRationalZero#1#2{% + \ifnum\@multicnt=\z@\else + \pld@AccuSetX{#2}{-#1}% + \pld@AccuGet\pld@temp + \edef\pld@temp{\noexpand\pld@R\pld@temp}% + \expandafter\pld@AddZero\expandafter{\pld@temp}% + \ifnum\@multicnt=\@ne\else + \edef\pld@temp{^{\the\@multicnt}}% + \pld@Extend\pld@allines\pld@temp + \fi + \fi} +\def\pld@AddZero#1{% + \pld@Extend\pld@allines{\expandafter\pld@leftdelim + \expandafter\pld@firsttrue + \expandafter\pld@PLD + \expandafter{\pld@tempoly+#1}% + \pld@rightdelim}} +\def\pld@FactorizeInit#1{% + \begingroup + \pld@firsttrue \let\pld@sub\@empty + \pld@AccuSetX11% + \let\pld@R\pld@FRational + \let\pld@F\@gobbletwo + \let\pld@S\@gobbletwo + \let\pld@V\pld@FVar + \expandafter\pld@FactorizeInit@\pld@current+\relax+% + \pld@if + \pld@AccuGet\pld@temp + \expandafter\pld@AccuMul\@gtempa + \pld@AccuIfNegative{\pld@AccuNegate}{}% + \pld@AccuGet\pld@va + \expandafter\pld@AccuSetX\pld@temp + \expandafter\pld@AccuMul\pld@lastline + \pld@AccuIfNegative{\pld@AccuNegate}{}% + \pld@AccuGet\pld@vb + \else + \let\pld@va\@gtempa + \let\pld@vb\pld@lastline + \fi + \ifx\pld@sub\@empty \def\pld@sub{01}\fi + \edef\pld@temp{\noexpand#1\pld@va\pld@vb{\the\@multicnt}\pld@sub}% + \pld@Extend\pld@tempoly{\pld@temp}% + \global\let\@gtempa\pld@tempoly + \endgroup + \@gtempa} +\def\pld@FactorizeInit@#1+{% + \ifx\relax#1\else + \def\pld@lastline{11}% + #1% + \expandafter\pld@FactorizeInit@ + \fi} +\def\pld@FRational#1#2{% + \def\pld@lastline{{#1}{#2}}% + \pld@iffirst + \global\let\@gtempa\pld@lastline + \def\pld@tempoly{\@multicnt\z@}% + \fi + \pld@LCM{#2}% + \@multicnt\z@} +\def\pld@FVar#1#2{% + \pld@iffirst + \pld@firstfalse + \global\let\@gtempa\pld@lastline + \def\pld@tempoly{\def\pld@tempoly{\pld@V{#1}}% + \@multicnt#2\relax}% + \fi + \@multicnt#2\relax + \ifnum\@multicnt=\@ne + \let\pld@sub\pld@lastline + \fi} +\def\pld@Factorize#1{% + \ifx\@empty#1\@empty + \def\pld@allines{\pld@PrintPolyWithDelims\@empty}% + \else + \let\pld@allines\@empty + \let\pld@current#1% + \pld@true \pld@FactorizeInit + \pld@Factorize@ + \fi} +\def\pld@Factorize@#1#2#3#4#5#6#7{% + \ifnum #5=\z@\else + \pld@Extend\pld@allines{\expandafter\pld@firsttrue + \expandafter\pld@PLD + \expandafter{\pld@tempoly{#5}}}% + \let\pld@va\pld@tempoly + \pld@AddTo\pld@va{{-#5}}% + \pld@MultiplyPoly\pld@current\pld@current\pld@va + \fi + \pld@AddTo\pld@tempoly{1}% + \@tempcnta\z@ \@tempcntb\@ne + \pld@FindZeros{#1}{#3}% + \pld@false \pld@FactorizeInit + \pld@FactorizeFinal} +\def\pld@FactorizeFinal#1#2#3#4#5#6#7{% + \ifnum\@multicnt=\tw@ + \pld@AddTo\pld@tempoly{1}% + \pld@AccuSetX{#6}{#7}% + \pld@AccuIfZero{\let\pld@va\@empty}% + {\pld@AccuMul12% + \pld@AccuMul{#2}{#1}% + \pld@AccuGet\pld@sub + \edef\pld@va{\noexpand\pld@R\pld@sub+}% + \expandafter\pld@AccuMul\pld@sub}% + \begingroup + \pld@AccuSetX{#3}{#4}% + \pld@AccuMul{-#2}{#1}% + \pld@AccuGet\pld@temp + \global\let\@gtempa\pld@temp + \endgroup + \expandafter\pld@AccuAdd\@gtempa + \pld@AccuIfNegative + {\@multicnt\tw@}% + {\pld@AccuGet\pld@temp + \expandafter\pld@FDefSqrt\pld@temp + \let\pld@vb\pld@va + \pld@AddTo\pld@vb{\pld@R{-1}1}% + \pld@Extend\pld@va{\pld@temp}% + \pld@Extend\pld@vb{\pld@temp}% + \expandafter\pld@AddZero\expandafter{\pld@va}% + \expandafter\pld@AddZero\expandafter{\pld@vb}% + \@multicnt\z@ + }% + \fi + \ifnum\@multicnt=\z@ + \pld@AccuSetX{#1}{#2}% + \pld@AccuIfOne{\let\pld@current\@empty}% + {\def\pld@current{\pld@R{#1}{#2}}}% + \fi + \ifx\pld@current\@empty\else + \let\pld@temp\pld@allines + \def\pld@allines{\pld@PrintPolyWithDelims\pld@current}% + \pld@Extend\pld@allines{\pld@temp}% + \fi} +\def\pld@FDefSqrt#1#2{% + \pld@IfSquare{#1}% + {\pld@FDefSqrt@{\pld@R{\pld@temp}1}% + {\sqrt{\noexpand\pld@R{#2}1}}}% + {\pld@IfSquare{#2}% + {\ifnum\pld@temp=\@ne + \pld@FDefSqrt@{\sqrt{\noexpand\pld@R{#1}1}}{}% + \else + \pld@FDefSqrt@{\sqrt{\noexpand\pld@R{#1}1}}% + {\pld@R{\pld@temp}1}% + \fi}% + {\def\pld@temp{\pld@F{\sqrt{\pld@R{#1}{#2}}}{}}}% + }} +\def\pld@FDefSqrt@#1#2{% + \edef\pld@temp{\noexpand\pld@F + {\noexpand#1}% + {\ifx\@empty#2\@empty\else \noexpand#2\fi}}} +\def\pld@IfSquare#1{% + \@tempcnta=#1\relax + \@multicnt\@tempcnta \@tempcntb\@tempcnta + \divide\@tempcntb\tw@ \advance\@tempcntb\@ne + \loop \ifnum\@tempcntb<\@multicnt + \@multicnt\@tempcntb + \@tempcntb\@tempcnta + \divide\@tempcntb\@multicnt + \advance\@tempcntb\@multicnt + \divide\@tempcntb\tw@ + \repeat + \edef\pld@temp{\the\@multicnt}% + \multiply\@multicnt\@multicnt + \ifnum \@multicnt=\@tempcnta + \expandafter\@firstoftwo + \else + \expandafter\@secondoftwo + \fi} +\def\pld@XEuclidean#1#2#3{\pld@Euclidean#1{#2}{#3}% + \edef#1{#1{\the\@tempcntb}}} +\def\pld@Euclidean#1#2#3{% + \@tempcnta#2\relax \divide\@tempcnta#3\relax + \ifnum\@tempcnta=\z@ \@tempcnta#2\relax \@tempcntb#3\relax + \else \@tempcnta#3\relax \@tempcntb#2\relax \fi + \ifnum\@tempcnta<\z@ \@tempcnta -\@tempcnta \fi + \ifnum\@tempcntb<\z@ \@tempcntb -\@tempcntb \fi + \pld@Euclidean@l + \@tempcnta#3\relax \divide\@tempcnta\@tempcntb + \edef#1{{\the\@tempcnta}}% + \@tempcnta#2\relax \divide\@tempcnta\@tempcntb + \edef#1{{\the\@tempcnta}#1}} +\def\pld@Euclidean@l{% + \ifnum\@tempcnta=\z@\else + \@multicnt\@tempcntb + \divide\@tempcntb\@tempcnta + \multiply\@tempcntb\@tempcnta + \advance\@multicnt -\@tempcntb + \@tempcntb\@tempcnta + \@tempcnta\@multicnt + \expandafter\pld@Euclidean@l + \fi} +\def\pld@AccuGet{\expandafter\pld@AccuGet@\pld@accu} +\def\pld@AccuGet@#1#2#3{% + \ifnum #2<\z@ \edef#3{{-#1}{-#2}}\else\edef#3{{#1}{#2}}\fi} +\def\pld@AccuSet#1#2{% + \def\pld@accu{{#1}{#2}}% + \expandafter\pld@Euclidean\expandafter\pld@accu\pld@accu + \expandafter\pld@AccuGet@\pld@accu\pld@accu} +\def\pld@AccuSetX#1#2{\pld@AccuGet@{#1}{#2}\pld@accu} +\def\pld@AccuPrint{\expandafter\pld@AccuPrint@\pld@accu} +\def\pld@AccuPrint@#1#2{% + \ifnum #2=\@ne \number#1\else \frac{\number#1}{\number#2}\fi} +\def\pld@AccuNegate{\expandafter\pld@AccuNegate@\pld@accu} +\def\pld@AccuNegate@#1#2{\def\pld@accu{{-#1}{#2}}} +\def\pld@AccuIfZero{\expandafter\pld@AccuIfZero@\pld@accu} +\def\pld@AccuIfZero@#1#2{% + \ifnum #1=\z@ \expandafter\@firstoftwo + \else \expandafter\@secondoftwo \fi} +\def\pld@AccuIfOne{\expandafter\pld@AccuIfOne@\pld@accu} +\def\pld@AccuIfOne@#1#2{% + \ifnum #1=#2\relax \expandafter\@firstoftwo + \else \expandafter\@secondoftwo \fi} +\def\pld@AccuIfAbsOne{\expandafter\pld@AccuIfAbsOne@\pld@accu} +\def\pld@AccuIfAbsOne@#1#2{% + \ifnum #1=#2\relax \expandafter\@firstoftwo \else + \ifnum -#1=#2\relax + \expandafter\expandafter\expandafter\@firstoftwo + \else + \expandafter\expandafter\expandafter\@secondoftwo + \fi + \fi} +\def\pld@AccuIfNegative{\expandafter\pld@AccuIfNegative@\pld@accu} +\def\pld@AccuIfNegative@#1#2{% + \ifnum #1<\z@ \@tempcnta\m@ne \else \@tempcnta\@ne \fi + \ifnum #2<\z@ \@tempcnta -\@tempcnta \fi + \ifnum \@tempcnta<\z@ \expandafter\@firstoftwo + \else \expandafter\@secondoftwo \fi} +\def\pld@LCM{\expandafter\pld@LCM@\pld@accu} +\def\pld@LCM@#1#2#3{% + \pld@Euclidean\pld@accu{#1}{#3}% + \@tempcnta\expandafter\@firstoftwo\pld@accu\relax + \multiply\@tempcnta#3\relax + \edef\pld@accu{{\the\@tempcnta}1}} +\def\pld@AccuMul{\expandafter\pld@AccuMul@\pld@accu} +\def\pld@AccuMul@#1#2#3#4{% + \begingroup + \pld@Euclidean\pld@va{#1}{#4}% + \pld@Euclidean\pld@vb{#3}{#2}% + \pld@ExpandTwo\pld@AccuMul@m\pld@va\pld@vb + \xdef\@gtempa{{\the\@tempcnta}{\the\@tempcntb}}% + \endgroup + \let\pld@accu\@gtempa} +\def\pld@AccuMul@m#1#2#3#4{% + \@tempcnta#1\relax \multiply\@tempcnta#3\relax + \@tempcntb#2\relax \multiply\@tempcntb#4\relax} +\def\pld@AccuAdd{\expandafter\pld@AccuAdd@a\pld@accu} +\def\pld@AccuAdd@a#1#2#3#4{% + \ifnum#3=\z@\else + \pld@AccuAdd@c{#1}{#2}{#3}{#4}% + \fi} +\def\pld@AccuAdd@c#1#2#3#4{% + \begingroup + \pld@XEuclidean\pld@va{#1}{#3}% + \pld@XEuclidean\pld@vb{#2}{#4}% + \edef\pld@va{\pld@va\pld@vb}% + \expandafter\pld@AccuAdd@b\pld@va{#2}{#4}} +\def\pld@AccuAdd@b#1#2#3#4#5#6#7#8{% + \endgroup + \@tempcnta#1\relax \multiply\@tempcnta#5\relax + \@tempcntb#2\relax \multiply\@tempcntb#4\relax + \advance\@tempcnta\@tempcntb + \expandafter\pld@Euclidean\expandafter\pld@accu\expandafter + {\the\@tempcnta}{#7}% + \pld@AccuMul{#3}{#5}} +\renewcommand\polyset[1]{% + \ifx\@empty#1\@empty\else + \let\pld@KVsplit@saved\KV@split + \let\KV@split\pld@KVsplit + \setkeys{pld}{#1}% + \let\KV@split\pld@KVsplit@saved + \fi} +\def\pld@KVsplit#1=#2=#3\relax{% + \KV@@sp@def\@tempa{#1}% + \ifx\@tempa\@empty\else + \expandafter\let\expandafter\@tempc + \csname\KV@prefix\@tempa\endcsname + \ifx\@tempc\relax + \expandafter\pld@IfVar\expandafter{\@tempa}% + {\pld@GetPoly{\pld@polya}{}{#2}% + \ifx\pld@polya\@empty \def\pld@polya{\pld@R 01}\fi + \expandafter\let\csname pld@value@\@tempa\endcsname\pld@polya}% + {\KV@errx{\@tempa\space undefined}}% + \else + \ifx\@empty#3\@empty + \KV@default + \else + \KV@@sp@def\@tempb{#2}% + \expandafter\@tempc\expandafter{\@tempb}\relax + \fi + \fi + \fi} +\def\pld@KVCases#1#2#3{% + \@ifundefined{pld@#1@#2}% + {\PackageError{Polynom}{Unknown value #2}{Try #3.}}% + {\csname pld@#1@#2\endcsname}} +\def\pld@KVIf#1#2{% + \@ifundefined{if#2}% + {\PackageError{Polynom}{Unknown value #2}{Try `true' or `false'.}}% + {\expandafter\let\expandafter#1\csname if#2\endcsname}} +\define@key{pld}{showbase}[middle]{\pld@KVCases{showbase}{#1}{`false', `top', `middle', or `bottom'}}% +\def\pld@showbase@false{\let\pld@basepos=f} +\def\pld@showbase@top{\let\pld@basepos=t} +\def\pld@showbase@middle{\let\pld@basepos=m} +\def\pld@showbase@bottom{\let\pld@basepos=b} +\define@key{pld}{showvar}[true]{\pld@KVIf\pld@ifshowvar{#1}} +\define@key{pld}{showbasesep}[true]{\pld@KVIf\pld@ifshowbasesep{#1}} +\define@key{pld}{showmiddlerow}[true]{\pld@KVIf\pld@ifshowmiddlerow{#1}} + +\define@key{pld}{resultstyle}{\def\pld@resultstyle{#1}} +\define@key{pld}{resultleftrule}[true]{\pld@KVIf\pld@ifhornerresultleftrule{#1}} +\define@key{pld}{resultrightrule}[true]{\pld@KVIf\pld@ifhornerresultrightrule{#1}} +\define@key{pld}{resultbottomrule}[true]{\pld@KVIf\pld@ifhornerresultbottomrule{#1}} + +\define@key{pld}{tutor}[true]{\pld@KVCases{tutor}{#1}{`true', or `false'}}% +\def\pld@tutor@true{\let\pld@iftutor\iftrue} +\def\pld@tutor@false{\let\pld@iftutor\iffalse} +\define@key{pld}{tutorstyle}{\def\pld@tutorstyle{#1}} +\define@key{pld}{tutorlimit}{\@tempcnta#1\relax \advance\@tempcnta\@ne + \edef\pld@tutorlimit{\the\@tempcnta}} + +\define@key{pld}{equalcolwidths}[true]{\pld@KVIf\pld@ifhornerequalcolwidths{#1}} +\define@key{pld}{arraycolsep}{\def\pld@hornerarraycolsep{#1\relax}} +\define@key{pld}{arrayrowsep}{\def\pld@hornerarrayrowsep{#1\relax}} + +\polyset{showbase, + showvar=false, + showbasesep=true, + showmiddlerow=true, + tutor=false, + tutorlimit=1, + tutorstyle=\scriptscriptstyle, + resultstyle=, + resultleftrule=false, + resultrightrule=false, + resultbottomrule=false, + equalcolwidths=true, + arraycolsep=\arraycolsep, + arrayrowsep=.5\arraycolsep} + +\define@key{pld}{mul}{\def\pld@mul{#1}}% +\define@key{pld}{plusface}{\pld@KVCases{hornerplusface}{#1}{`left' or 'right'}}% +\define@key{pld}{plusyoffset}{\@tempdima#1\relax \edef\pld@hornerplusyoffset{\the\@tempdima}} +\define@key{pld}{downarrowxoffset}{\@tempdima#1\relax \edef\pld@hornerdownarrowxoffset{\the\@tempdima}} +\define@key{pld}{diagarrowxoffset}{\@tempdima#1\relax \edef\pld@hornerdiagarrowxoffset{\the\@tempdima}} +\define@key{pld}{downarrow}{\def\pld@hornerdownarrow{#1}} +\define@key{pld}{diagarrow}{\def\pld@hornerdiagarrow{#1}} +\def\pld@hornerplusface@left{\let\pld@hornerplusface\llap} +\def\pld@hornerplusface@right{\let\pld@hornerplusface\rlap} +\polyset{mul=\cdot, + plusface=right, + plusyoffset=\z@, + downarrowxoffset=\z@, + diagarrowxoffset=\z@, + downarrow={\vector(0,-1){2.5}}, + diagarrow={\vector(2,1){1.6}}} +\newcommand*\polyhornerscheme[1][]{% + \begingroup + \let\pld@stage\maxdimen \polyset{#1}% + \pld@GetPoly{\pld@polya}% + {\expandafter\pld@Horner\expandafter{\pld@polya}% + \endgroup \ignorespaces}} + +\def\pld@Horner#1{% + \pld@GetTotalDegree\pld@degree{#1}% + \pld@Horner@#1++% + \pld@ArrangeHorner} + +\def\pld@Horner@#1+{% + \pld@SplitMonom\pld@HornerInit{#1}% + \pld@HornerIterate} + +\def\pld@HornerIterate#1+{% + \advance\@tempcnta\m@ne + \ifx\@empty#1\@empty + \ifnum \@tempcnta<\z@ + \let\pld@next\@empty + \else + \pld@HornerStep{\pld@R01}{}% + \def\pld@next{\pld@HornerIterate+}% + \fi + \else + \pld@GetTotalDegree\pld@degree{#1}% + \ifnum \pld@degree=\@tempcnta + \pld@SplitMonom\pld@HornerStep{#1}% + \let\pld@next\pld@HornerIterate + \else + \pld@HornerStep{\pld@R01}{}% + \def\pld@next{\pld@HornerIterate#1+}% + \fi + \fi + \pld@next} + +\def\pld@HornerStep#1#2{% + \pld@AddTo\pld@lastline{&\pld@PrintPolyArg{#1}}% + \pld@MultiplyPoly\pld@lastsum\pld@lastsum\pld@value + \pld@Simplify\pld@lastsum + \ifx\pld@lastsum\@empty \def\pld@lastsum{\pld@R 01}\fi + \pld@AddTo\pld@subline{&}% + \pld@HornerExtendLine\pld@subline + \pld@AddTo\pld@lastsum{+#1}% + \pld@Simplify\pld@lastsum + \pld@AddTo\pld@currentline{&}% + \pld@iftutor + \pld@HornerExtendCurrentLine + \advance\@multicnt\@ne + \pld@HornerIfTutorStage{\pld@HornerExtendTutor\pld@HornerOtherDown}% + \advance\@multicnt\m@ne + \ifnum\@tempcnta>\z@ + \pld@HornerIfTutorStage{\pld@HornerExtendTutor\pld@HornerDiag}% + \fi + \else + \pld@HornerExtendCurrentLine + \fi} + +\def\pld@HornerExtendTutor#1{% + \ifnum\@tempcnta=\z@ \pld@AddTo\pld@hornerresult#1% + \else \pld@AddTo\pld@currentline#1\fi} +\def\pld@HornerExtendCurrentLine{% + \ifnum\@tempcnta=\z@ + \let\pld@hornerresult\@empty + \pld@Extend\pld@hornerresult{\expandafter{\expandafter\pld@resultstyle\expandafter{% + \expandafter\pld@PrintPolyArg\expandafter{\pld@lastsum}}}}% + \pld@HornerIfStage{}% + {\let\pld@lastsum\@empty + \pld@Extend\pld@lastsum{\expandafter\phantom\expandafter{\pld@hornerresult}}% + \let\pld@hornerresult\pld@lastsum}% + \expandafter\@gobbletwo + \fi + \pld@HornerExtendLine\pld@currentline} +\def\pld@HornerExtendLine#1{% + \pld@HornerIfStage{\pld@Extend#1{\expandafter\pld@PrintPolyArg\expandafter{\pld@lastsum}}}% + {\pld@Extend#1{\expandafter\phantom\expandafter{% + \expandafter\pld@PrintPolyArg\expandafter{\pld@lastsum}}}}% +} + +\def\pld@HornerFirstDown{% + \rlap{\kern\pld@hornerdownarrowxoffset\relax + \unitlength\ht\@arstrutbox + \begin{picture}(0,0)% + \setbox\z@\hbox{$\pld@tutorstyle{\pld@hornerdownarrow}$}% + \put(0,.5){\raise\ht\z@\hbox{\raise\dp\z@\copy\z@}}% + \end{picture}}} +\def\pld@HornerOtherDown{% + \pld@HornerFirstDown + \pld@hornerplusface{\kern\pld@hornerdownarrowxoffset\relax + \smash{\raise\pld@hornerplusyoffset + \hbox{\raise.5\ht\@arstrutbox + \vbox to 2.5\ht\@arstrutbox + {\vss$\pld@tutorstyle{+}$\vss}}}}} +\def\pld@HornerDiag{% + \rlap{\kern\pld@hornerdiagarrowxoffset\relax + \unitlength\ht\@arstrutbox + \begin{picture}(0,0)% + \setbox\z@\hbox{$\pld@tutorstyle{\pld@hornerdiagarrow}$}% + \put(0,.5){\box\z@}% + \put(0,.5){\kern.55\ht\@arstrutbox + $\pld@tutorstyle{\pld@mul \pld@hornerleftdelim + \pld@PrintPolyWithDelims\pld@value + \pld@hornerrightdelim}$}% + \end{picture}}} + +\def\pld@HornerIfStage{% + \advance\@multicnt\m@ne + \ifnum\@multicnt>\z@ \expandafter\@firstoftwo + \else \expandafter\@secondoftwo \fi} +\def\pld@HornerIfTutorStage{% + \ifnum\@multicnt>\@ne + \ifnum\@multicnt>\pld@tutorlimit + \expandafter\expandafter\expandafter\@gobble + \else + \expandafter\expandafter\expandafter\@firstofone + \fi + \else + \expandafter\@gobble + \fi} + +\def\pld@HornerInit#1#2{% + \let\pld@V\@firstoftwo + \ifx\@empty#2\@empty\else + \edef\pld@var{#2}% + \@ifundefined{pld@value@\pld@var}% + {\PackageError{Polynom}{Missing value for variable \pld@var}{}% + \@namedef{pld@value@\pld@var}{\pld@R01}}% + {}% + \expandafter\let\expandafter\pld@value\csname pld@value@\pld@var\endcsname + \fi + \setbox\@tempboxa\hbox{$\pld@PrintPoly\pld@value$}% + \pld@ifminus + \let\pld@hornerleftdelim(% + \let\pld@hornerrightdelim)% + \else + \let\pld@hornerleftdelim\@empty + \let\pld@hornerrightdelim\@empty + \fi + \@multicnt\pld@stage\relax + \@tempcnta\pld@degree\relax + \def\pld@lastline{\pld@PrintPolyArg{#1}}% + \let\pld@subline\@empty + \let\pld@currentline\@empty + \def\pld@lastsum{#1}% + \pld@iftutor + \pld@HornerExtendCurrentLine + \advance\@multicnt\@ne + \pld@HornerIfTutorStage{\pld@AddTo\pld@currentline\pld@HornerFirstDown}% + \advance\@multicnt\m@ne + \ifnum\@tempcnta>\z@ + \pld@HornerIfTutorStage{\pld@AddTo\pld@currentline\pld@HornerDiag}% + \fi + \else + \pld@HornerExtendCurrentLine + \fi + \def\pld@lastsum{#1}% + \@tempcnta\pld@degree\relax % init moved up, delete this? + \advance\@tempcnta\thr@@ + \edef\pld@hornermaxcol{\the\@tempcnta}% + \@tempcnta\pld@degree\relax} +\def\pld@ArrangeHorner{% + \begingroup + \@tempdima\z@ + \pld@MeasureCells\pld@lastline + \pld@MeasureCells\pld@subline + \pld@MeasureCells\pld@currentline + \pld@MeasureCells\pld@hornerresult + \everycr{}\tabskip\z@skip + \@tempdimb\ht\strutbox \advance\@tempdimb\pld@hornerarrayrowsep + \@tempdimc\dp\strutbox \advance\@tempdimc\pld@hornerarrayrowsep + \setbox\@arstrutbox\hbox{\vrule \@height\@tempdimb + \@depth\@tempdimc + \@width\z@}% + \pld@ifhornerequalcolwidths\else + \def\@startpbox##1{\hfil\vtop\bgroup \hbox\bgroup \@arrayparboxrestore}% + \def\@endpbox{\@finalstrut\@arstrutbox \egroup\par\egroup}% + \fi + \def\pld@leftdelim{(}\def\pld@rightdelim{)}% + \leavevmode + \hbox{$\vcenter{\offinterlineskip \arraycolsep\pld@hornerarraycolsep + \halign{\@arstrut + \hskip\arraycolsep \hfill\ensuremath{##}\hskip\arraycolsep + &##&&% + \hskip\arraycolsep \@startpbox\@tempdima\hfill\ensuremath{##}\@endpbox \hskip\arraycolsep\cr + \pld@ShowBase t&\pld@ifshowbasesep\vrule\fi&\pld@lastline\cr + \pld@ifshowmiddlerow \pld@ShowBase m&\pld@ifshowbasesep\vrule\fi&\pld@subline\cr \fi \cline{2-\pld@hornermaxcol}% + \pld@ShowBase b&&\pld@currentline\omit + \pld@ifhornerresultleftrule \vrule \fi + \hskip\arraycolsep \@startpbox\@tempdima\relax\hfill\ensuremath{\pld@hornerresult}\@endpbox \hskip\arraycolsep + \pld@ifhornerresultrightrule \vrule \fi \cr + \pld@ifhornerresultbottomrule \cline{\pld@hornermaxcol-\pld@hornermaxcol} \fi + }% + }$}% + \endgroup} +\def\pld@ShowBase#1{% + \ifx#1\pld@basepos + \pld@ifshowvar x=\fi\pld@PrintPoly\pld@value + \fi} +\def\pld@MeasureCells#1{\expandafter\pld@MeasureCells@#1&\@nil&} +\def\pld@MeasureCells@#1&{% + \ifx\@nil#1\relax\else + \setbox\@tempboxa\hbox{\ensuremath{#1}}% + \ifdim\wd\@tempboxa>\@tempdima + \@tempdima\wd\@tempboxa + \fi + \expandafter\pld@MeasureCells@ + \fi} +\def\pld@GetTotalDegree#1#2{% + \begingroup + \let\pld@R\@gobbletwo \let\pld@F\@gobbletwo \let\pld@S\@gobbletwo + \def\pld@V##1##2{\advance\@tempcnta##2\relax}% + \def#1##1+##2\@nil{##1}% + \edef#1{\@tempcnta\z@#1#2+\@nil}% + #1\xdef\@gtempa{\the\@tempcnta}% + \endgroup + \let#1\@gtempa} +%% +%% +\endinput +%% +%% End of file `polynom.sty'. |