diff options
author | Karl Berry <karl@freefriends.org> | 2018-12-10 22:58:44 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2018-12-10 22:58:44 +0000 |
commit | 8128a1b13f192605f1711ea4f5f7da4550d0996a (patch) | |
tree | 96bf4dc07c80082ab607d1023e59befb7f194c44 /Master/texmf-dist/tex/latex/polexpr/polexpr.sty | |
parent | e167cb1f6f6ba7c4ac582ed784d8e0a9b7d81321 (diff) |
polexpr (10dec18)
git-svn-id: svn://tug.org/texlive/trunk@49378 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/latex/polexpr/polexpr.sty')
-rw-r--r-- | Master/texmf-dist/tex/latex/polexpr/polexpr.sty | 135 |
1 files changed, 68 insertions, 67 deletions
diff --git a/Master/texmf-dist/tex/latex/polexpr/polexpr.sty b/Master/texmf-dist/tex/latex/polexpr/polexpr.sty index 601446cf671..9bc286115d8 100644 --- a/Master/texmf-dist/tex/latex/polexpr/polexpr.sty +++ b/Master/texmf-dist/tex/latex/polexpr/polexpr.sty @@ -1,7 +1,7 @@ % author: Jean-François Burnol % License: LPPL 1.3c (author-maintained) \ProvidesPackage{polexpr}% - [2018/12/08 v0.7 Polynomial expressions with rational coefficients (JFB)]% + [2018/12/09 v0.7.2 Polynomial expressions with rational coefficients (JFB)]% \RequirePackage{xintexpr}[2018/06/17]% xint 1.3c for \ifxintglobaldefs boolean \edef\POL@restorecatcodes {\catcode`\noexpand\_ \the\catcode`\_ % @@ -914,12 +914,13 @@ {\let\POL@findrat@E\POL@findrat@Dexp} % aussi ok pour 1[0] {\edef\POL@findrat@E{\the\numexpr\xintLen{\POL@findrat@Dint}% +\POL@findrat@Dexp}}% +% ATTENTION QUE LA CONVENTION DE SIGNE POUR \POL@findrat@E EST OPPOSÉE À CELLE +% POUR LE CODE PLUS ANCIEN FAISANT "REFINE" \POL@initarray\POL@IfMultIsKnown\xint_secondoftwo \let\POL@findrat@nbofirrroots\POL@isolz@NbOfRoots % find all rational roots, and their multiplicities, % factor them out in passing from original (Sturm root) polynomial \ifnum\POL@findrat@E<7 - \PolEnsureIntervalLength{\POL@sturmname}{1}{-\POL@findrat@E}% \def\POL@findrat@index{1}% \POL@findrat@loop@secondpass@direct \else @@ -928,7 +929,6 @@ \POL@findrat@loop@firstpass % and now we do the final pass finding them all \def\POL@findrat@index{1}% - \PolEnsureIntervalLength{\POL@sturmname}{1}{-\POL@findrat@E}% \POL@findrat@loop@secondpass \fi % declare the new polynomials @@ -947,7 +947,7 @@ {}% \ifnum\xintiloopindex<\POL@isolz@NbOfRoots\space \repeat }% - \begingroup\globaldefs1 + \begingroup\globaldefs\@ne % attention de ne surtout pas faire un \expandafter ici, car en cas d'un % seul item, \xintAssignArray l'unbraces... \xintAssignArray\POL@temp\to#1% @@ -956,36 +956,20 @@ \def\POL@findrat@loop@firstpass{% \PolSturmIfZeroExactlyKnown{\POL@sturmname}{\POL@findrat@index}% \POL@findrat@loop@decimal% get its multiplicity - \POL@findrat@loop@a + \POL@findrat@loop@aa % refine interval and check \edef\POL@findrat@index{\the\numexpr\POL@findrat@index+\@ne}% \ifnum\POL@findrat@index>\POL@isolz@NbOfRoots \else \expandafter\POL@findrat@loop@firstpass \fi }% -\def\POL@findrat@loop@secondpass{% +\def\POL@findrat@loop@aa{% + % we do a first pass to identify roots with denominators < 1000 + \PolEnsureIntervalLength{\POL@sturmname}{\POL@findrat@index}{-6}% + % attention that perhaps now the root is known! \PolSturmIfZeroExactlyKnown{\POL@sturmname}{\POL@findrat@index}% - {}% nothing more to be done, already stored - \POL@findrat@loop@b - \edef\POL@findrat@index{\the\numexpr\POL@findrat@index+\@ne}% - \ifnum\POL@findrat@index>\POL@isolz@NbOfRoots - \else - \PolEnsureIntervalLength - {\POL@sturmname}{\POL@findrat@index}{-\POL@findrat@E}% dynamic - \expandafter\POL@findrat@loop@secondpass - \fi -}% -\def\POL@findrat@loop@secondpass@direct{% - \PolSturmIfZeroExactlyKnown{\POL@sturmname}{\POL@findrat@index}% - \POL@findrat@loop@decimal - \POL@findrat@loop@b - \edef\POL@findrat@index{\the\numexpr\POL@findrat@index+\@ne}% - \ifnum\POL@findrat@index>\POL@isolz@NbOfRoots - \else - \PolEnsureIntervalLength - {\POL@sturmname}{\POL@findrat@index}{-\POL@findrat@E}% dynamic - \expandafter\POL@findrat@loop@secondpass@direct - \fi + \POL@findrat@loop@decimal + \POL@findrat@loop@a }% \def\POL@findrat@loop@decimal{% we have an already found decimal root % we do not go via @storeit, as it is already stored @@ -1002,6 +986,7 @@ \edef\POLuserpol@_findrat@oneterm{1.\noexpand\empty {\xintiiOpp\POL@findrat@xN/1[0]}{\POL@findrat@xD/1[0]}}% \POL@divide{\POL@sturmname\POL@sqfnorr}{_findrat@oneterm}% the one without mult. + %\expandafter\POL@split\POL@R;\POL@degR\POL@polR \POL@findrat@loop@updatequotients \POL@findrat@loop@getmultiplicity }% @@ -1018,10 +1003,7 @@ \def\POL@findrat@getE #1/1[#2]{#2}% /1 as it should be there. % so an error will arise if not but cf \POL@refine@getE where I did not put it \def\POL@findrat@loop@a{% - % we do a first pass to identify roots with denominators < 1000 - \PolEnsureIntervalLength{\POL@sturmname}{\POL@findrat@index}{-6}% % attention that the width may have been already smaller than 10^{-6} - % also attention that one of the bound may be zero \POL@get@IsoLeft@rawin \POL@get@IsoRight@rawin \edef\POL@findrat@localW @@ -1046,28 +1028,20 @@ \fi }% \def\POL@findrat@gcdloop{% - % we must be careful with sign (attention one of the bounds may be zero) - \let\POL@findrat@IfNeg\xint_secondoftwo + % we must be careful with sign + % but we are certain no extremity is a root + \let\POL@findrat@ifnegative\xint_secondoftwo \xintiiifSgn\POL@IsoLeft@Int \POL@findrat@gcdloop@n - \POL@findrat@gcdloop@zero + \POL@error@thisisimpossible \POL@findrat@gcdloop@p }% \def\POL@findrat@gcdloop@n{% - \let\POL@findrat@IfNeg\xint_firstoftwo + \let\POL@findrat@ifnegative\xint_firstoftwo \let\POL@temp\POL@IsoRight@Int \edef\POL@IsoRight@Int{\xintiiOpp{\POL@IsoLeft@Int}}% \edef\POL@IsoLeft@Int{\xintiiOpp{\POL@temp}}% - \xintiiifSgn\POL@IsoLeft@Int - \POL@error % impossible branch - \POL@findrat@gcdloop@zero - \POL@findrat@gcdloop@p -}% -\def\POL@findrat@gcdloop@zero{% - % the continued fraction would be the one of 1/2, so only 1/2 to test... - \edef\POL@findrat@x - {1/2\romannumeral\xintreplicate{\POL@findrat@localW}{0}[0]}% - \POL@findrat@gcdloop@testit + \POL@findrat@gcdloop@p }% \def\POL@findrat@gcdloop@p{% \edef\POL@findrat@gcdloop@Ap{\xintDec{\xintDouble\POL@IsoRight@Int}}% @@ -1140,7 +1114,7 @@ }% \def\POL@findrat@gcdloop@testit{% % zero should never occur here - \POL@findrat@IfNeg{\edef\POL@findrat@x{-\POL@findrat@x}}{}% + \POL@findrat@ifnegative{\edef\POL@findrat@x{-\POL@findrat@x}}{}% \POL@xintfrac@getNDE\POL@findrat@x\POL@findrat@xN\POL@findrat@xD\POL@_ \edef\POLuserpol@_findrat@oneterm{1.\noexpand\empty {\xintiiOpp{\POL@findrat@xN}/1[0]}{\POL@findrat@xD/1[0]}}% @@ -1151,10 +1125,36 @@ \POL@findrat@loop@updatequotients \POL@findrat@loop@getmultiplicity % will continue updating the mult. one \def\POL@findrat@gcdloop@done{1}% - \else \fi }% % This is second phase +\def\POL@findrat@loop@secondpass{% + \PolSturmIfZeroExactlyKnown{\POL@sturmname}{\POL@findrat@index}% + {}% nothing more to be done, already stored + \POL@findrat@loop@bb % refine interval and check + \edef\POL@findrat@index{\the\numexpr\POL@findrat@index+\@ne}% + \ifnum\POL@findrat@index>\POL@isolz@NbOfRoots + \else + \expandafter\POL@findrat@loop@secondpass + \fi +}% +\def\POL@findrat@loop@secondpass@direct{% + \PolSturmIfZeroExactlyKnown{\POL@sturmname}{\POL@findrat@index}% + \POL@findrat@loop@decimal + \POL@findrat@loop@bb + \edef\POL@findrat@index{\the\numexpr\POL@findrat@index+\@ne}% + \ifnum\POL@findrat@index>\POL@isolz@NbOfRoots + \else + \expandafter\POL@findrat@loop@secondpass@direct + \fi +}% +\def\POL@findrat@loop@bb{% + \PolEnsureIntervalLength{\POL@sturmname}{\POL@findrat@index}{-\POL@findrat@E}% + % ATTENTION THAT PERHAPS NOW THE ROOT IS KNOWN! + \PolSturmIfZeroExactlyKnown{\POL@sturmname}{\POL@findrat@index}% + \POL@findrat@loop@decimal + \POL@findrat@loop@b +}% \def\POL@findrat@loop@b{% \edef\POL@findrat@Lscaled{\xintMul{\POL@findrat@D}% {\POL@xintexprGetVar{\POL@sturmname L_\POL@findrat@index}}}% @@ -1206,11 +1206,13 @@ \let\csname POL_ZeroIsKnown\POL@sturmname\POL@findrat@index\endcsname \xint_stop_atfirstoftwo \begingroup\xintglobaldefstrue - \xintdefvar - \POL@sturmname L_\POL@findrat@index,% - \POL@sturmname R_\POL@findrat@index,% - \POL@sturmname Z_\POL@findrat@index _isknown - := qfrac(\POL@findrat@x),qfrac(\POL@findrat@x),1;% + % skip some overhead of \xintdefvar... + \XINT_expr_defvar_one{\POL@sturmname L_\POL@findrat@index}% + {\csname .=\POL@findrat@x\endcsname}% + \XINT_expr_defvar_one{\POL@sturmname R_\POL@findrat@index}% + {\csname .=\POL@findrat@x\endcsname}% + \XINT_expr_defvar_one{\POL@sturmname Z_\POL@findrat@index _isknown}% + {\csname .=1\endcsname}% \endgroup }% \def\POL@findrat@loop@updatequotients{% @@ -1320,8 +1322,9 @@ % added at 0.7 \let\x\POL@isolz@NbOfRoots \xintloop - \xintdefvar \POL@sturmname M_\x - := \csname POL_ZeroMult\POL@sturmname\x\endcsname ;% + % skip some overhead of \xintdefvar... + \XINT_expr_defvar_one{\POL@sturmname M_\x}% + {\csname .=\csname POL_ZeroMult\POL@sturmname\x\endcsname\endcsname}% \edef\x{\the\numexpr\x-\@ne}% \ifnum\x>\z@ \repeat @@ -1694,11 +1697,11 @@ \repeat }% \def\POL@isolz@check{% \POL@IsoRightSign must be ready for use here -% \ifxintverbose -% \xintMessage{polexpr}{Info}% -% {\the\numexpr\POL@IsoLeftSV-\POL@IsoRightSV\relax\space roots -% in (\POL@IsoLeft@raw,\POL@IsoRight@raw] (E = \POL@isolz@E)}% -% \fi +\ifxintverbose + \xintMessage{polexpr}{Info}% + {\the\numexpr\POL@IsoLeftSV-\POL@IsoRightSV\relax\space roots + in (\POL@IsoLeft@raw,\POL@IsoRight@raw] (E = \POL@isolz@E)}% +\fi \ifcase\numexpr\POL@IsoLeftSV-\POL@IsoRightSV\relax % no root in ]left, right] \global\POL@isolz@nextwillneedrefinefalse @@ -1896,18 +1899,16 @@ \xint_stop_atfirstoftwo \fi \begingroup\xintglobaldefstrue - \xintdefvar - \POL@sturmname L_\POL@isolz@IntervalIndex,% - \POL@sturmname R_\POL@isolz@IntervalIndex,% + % skip some overhead of \xintdefvar... + \XINT_expr_defvar_one{\POL@sturmname L_\POL@isolz@IntervalIndex}% + {\csname .=\POL@IsoLeft@rawout\endcsname}% + \XINT_expr_defvar_one{\POL@sturmname R_\POL@isolz@IntervalIndex}% + {\csname .=\POL@IsoRight@rawout\endcsname}% % added at 0.7 - \POL@sturmname Z_\POL@isolz@IntervalIndex _isknown - := qfrac(\POL@IsoLeft@rawout),% - qfrac(\POL@IsoRight@rawout),% - \ifnum\POL@IsoRightSign=\z@ 1\else 0\fi;% + \XINT_expr_defvar_one{\POL@sturmname Z_\POL@isolz@IntervalIndex _isknown}% + {\csname .=\ifnum\POL@IsoRightSign=\z@ 1\else 0\fi\endcsname}% \endgroup }% - - %% \PolRefineInterval \def\POL@xintexprGetVar#1{\expandafter\expandafter\expandafter \XINT_expr_unlock\csname XINT_expr_var_#1\endcsname}% |