diff options
author | Karl Berry <karl@freefriends.org> | 2018-11-21 21:59:41 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2018-11-21 21:59:41 +0000 |
commit | d547ea6945251bd98a320b6132a7c639809c966c (patch) | |
tree | 20fbfac0eef6b88b7539a68ce561dadba4f33795 /Master/texmf-dist/doc/latex/polexpr/polexpr.txt | |
parent | 228e5563a08cef3526d4f4a9b744ce328d243797 (diff) |
polexpr (21nov18)
git-svn-id: svn://tug.org/texlive/trunk@49213 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/doc/latex/polexpr/polexpr.txt')
-rw-r--r-- | Master/texmf-dist/doc/latex/polexpr/polexpr.txt | 395 |
1 files changed, 315 insertions, 80 deletions
diff --git a/Master/texmf-dist/doc/latex/polexpr/polexpr.txt b/Master/texmf-dist/doc/latex/polexpr/polexpr.txt index 7b792ed8ca0..da2cbb77790 100644 --- a/Master/texmf-dist/doc/latex/polexpr/polexpr.txt +++ b/Master/texmf-dist/doc/latex/polexpr/polexpr.txt @@ -4,8 +4,8 @@ Package polexpr documentation =============================== -0.5.1 (2018/04/22) -================== +0.6 (2018/11/20) +================ .. contents:: @@ -79,7 +79,7 @@ from its default ``x``. polynomial must have been defined via ``\PolDiff``: something like ``T'(x)^2`` will not work without a prior ``\PolDiff{T}{T'}``. -``\PolDiff{f}{f''}`` +``\PolDiff{f'}{f''}`` obtains second derivative. ``\PolDiff[3]{f}{f'''}`` @@ -144,14 +144,6 @@ the macro call ``\PolGCD{f_1}{f_2}{k}`` sets ``k`` to the (unitary) GCD of Examples of localization of roots --------------------------------- -.. attention:: - - At ``0.5``, `\\PolToSturm{P}{S} <PolToSturm_>`_ was modified to - create a chain of primitive integer coefficients polynomials. This - speeds up evaluations, hence localization of roots afterwards. Thus - ``S_1`` will not necessarily be the derivative of ``S_0``, even if - ``P`` is square-free. - - To make printed decimal numbers more enjoyable than via ``\xintSignedFrac``:: @@ -251,16 +243,78 @@ The degree nine polynomial with 0.99, 0.999, 0.9999 as triple roots :: - \PolDef{P}{(x-0.99)^3(x-0.999)^3(x-0.9999)^3} - \PolTypeset{P}\par - \PolToSturm{P}{P}% - \PolLet{Psqfree}{P_0}\PolMakeMonic{Psqfree}\PolReduceCoeffs*{Psqfree} - \par - The monic square-free radical is \PolTypeset{Psqfree}. - \PolSturmIsolateZeros{P} - \par - It has \PolSturmNbOfIsolatedZeros{P} real roots. - \PolPrintIntervals{P}% all three roots found exactly + % define a user command (xinttools is loaded automatically by polexpr) + \newcommand\showmultiplicities[1]{% #1 = "sturmname" + \xintFor* ##1 in {\xintSeq{1}{\PolSturmNbOfIsolatedZeros{#1}}}\do{% + The multiplicity is \PolSturmIsolatedZeroMultiplicity{#1}{##1} + \PolSturmIfZeroExactlyKnown{#1}{##1}% + {at the root $x=\PolSturmIsolatedZeroLeft{#1}{##1}$} + {for the root such that + $\PolSturmIsolatedZeroLeft{#1}{##1}<x<\PolSturmIsolatedZeroRight{#1}{##1}$} + \par + }}% + \PolDef{f}{(x-0.99)^3(x-0.999)^3(x-0.9999)^3} + \renewcommand\PolTypesetOne[1]{\PolDecToString{\xintREZ{#1}}} + \PolTypeset{f}\par + \PolToSturm{f}{f}% it is allowed to use "polname" as "sturmname" too + \PolSturmIsolateZerosAndGetMultiplicities{f}% use the "sturmname" here + % or \PolSturmIsolateZeros*{f} which is exactly the same, but shorter.. + + \showmultiplicities{f} + +In this example, the output will look like this (but using math mode):: + + x^9 − 8.9667x^8 + 35.73400293x^7 − 83.070418400109x^6 + 124.143648875193123x^5 + − 123.683070924326075877x^4 + 82.149260397553075617891x^3 + − 35.07602992699900159127007x^2 + 8.7364078733314648368671733x + − 0.967100824643585986488103299 + + The multiplicity is 3 at the root x = 0.99 + The multiplicity is 3 at the root x = 0.999 + The multiplicity is 3 at the root x = 0.9999 + +On first pass, these rational roots were found. But multiplicity +computation works also with (decimal) roots not yet identified or with +non-decimal or irrational roots. + +Try it out! + +It is fun to modify only a tiny bit the polynomial and see if polexpr +survives:: + + \PolDef{g}{f(x)+1e-27} + \PolTypeset{g}\par + \PolToSturm{g}{g} + \PolSturmIsolateZeros*{g} + + \showmultiplicities{g} + +This produces:: + + x^9 − 8.9667x^8 + 35.73400293x^7 − 83.070418400109x^6 + 124.143648875193123x^5 + − 123.683070924326075877x^4 + 82.149260397553075617891x^3 + − 35.07602992699900159127007x^2 + 8.7364078733314648368671733x + − 0.967100824643585986488103298 + + The multiplicity is 1 for the root such that 0.98 < x < 0.99 + The multiplicity is 1 for the root such that 0.9991 < x < 0.9992 + The multiplicity is 1 for the root such that 0.9997 < x < 0.9998 + +Which means that the multiplicity-3 roots each became a real and a pair of +complex ones. Let's see them better:: + + \PolEnsureIntervalLengths{g}{-10} + + \showmultiplicities{g} + +which produces:: + + The multiplicity is 1 for the root such that 0.9899888032 < x < 0.9899888033 + The multiplicity is 1 for the root such that 0.9991447980 < x < 0.9991447981 + The multiplicity is 1 for the root such that 0.9997663986 < x < 0.9997663987 + +Try obtaining this with your pocket calculator! (or IEEE-7554 numerics...) + A Mignotte type polynomial ~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -737,32 +791,67 @@ Non-expandable macros ``\PolToSturm{polname}{sturmname}`` ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - With, for example, ``polname`` being ``P`` and ``sturmname`` being - ``S``, the macro starts by computing polynomials ``S_0 = P``, ``S_1 - = P'``, ..., with ``S_{n+1}`` the opposite of the remainder of - euclidean division of ``S_{n-1}`` by ``S_{n}``. + With ``polname`` being for example ``P``, the macro starts by + computing polynomials ``P`` and ``P'``, then computes the (opposite + of the) remainder in euclidean division, iteratively. - .. attention:: + The last non-zero remainder ``P_N_`` (where ``N`` is obtainable as + `\\PolSturmChainLength{sturmname}`_) is up to a factor + the GCD of ``P`` and ``P'`` hence it is a constant if and only if + ``P`` is square-free. + + .. note:: + + - Since ``0.5`` all these polynomials are divided by their rational + content, so they have integer coefficients with no common factor, + and the last one if a constant is either ``1`` or ``-1``. + + - After this normalization to primitive polynomials, they are + stored internally as ``sturmname_k_``, ``k=0,1, ...``. - Since ``0.5``, it further normalizes all these polynomials by making - them primitive (see `\\PolMakePrimitive`_). + - These polynomials are used internally only. To keep them as + genuine declared polynomials also after the macro call, use the + starred variant `PolToSturm*`_. - The last non-zero remainder ``S_N`` is up to a factor the GCD of - ``P`` and ``P'`` hence it is a constant (i.e. ``1`` or ``-1`` since - ``0.5``) if and only if ``P`` is square-free. + .. note:: + + It is perfectly allowed to use the polynomial name as Sturm chain name: + ``\PolToSturm{f}(f}``. + + The macro then declares ``sturmname_0``, ``sturmname_1``, ..., which are + the (non-declared) ``sturmname_k_`` divided by the last one. Division is + not done if this last one is the constant ``1`` or ``-1``, i.e. if the + original polynomial was square-free. These polynomials are primitive + polynomials too, i.e. with integer coefficients having no common factor. + + Thus ``sturmname_0`` has exactly the same real and complex roots as + polynomial ``polname``, but with each root now of multiplicity one. - In case ``S_N`` is not a constant, the macro then goes on with - dividing all ``S_k``'s with ``S_N`` (which then becomes ``1``). + Notice that ``sturmname_1`` isn't necessarily the derivative of + ``sturmname_0`` due to the various normalizations. - Thus ``S_0`` has exactly the same real and complex roots as - polynomial ``polname``, but each root being now with multiplicity one. + These polynomials ``sturmname_k`` (contrarily to the + ``sturmname_k_`` ones) are usable after the macro execution but + their main utility is for the execution of + `\\PolSturmIsolateZeros{sturmname}`_. + + `\\PolSturmChainLength{sturmname}`_ gives the index of the last + element of the Sturm chain. .. _PolToSturm*: ``\PolToSturm*{polname}{sturmname}`` ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Does not divide the Sturm chain by its last element. + Does the same as `un-starred version <PolToSturm_>`_ and additionally it + keeps for user usage the memory of the *un-normalized* Sturm chain + polynomials ``sturmname_k_``, ``k=0,1, ..., N``, with + ``N`` being `\\PolSturmChainLength{sturmname}`_. + + .. note:: + + This behaviour was modified at ``0.6``, anyhow the macro was + broken at ``0.5``. .. _PolSetToSturmChainSignChangesAt: @@ -790,7 +879,7 @@ Non-expandable macros ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Applies the `Sturm Theorem`_ to set ``\macro`` to the exact number - of distinct roots of ``sturmname_0`` in the interval ``(value_a, + of **distinct** roots of ``sturmname_0`` in the interval ``(value_a, value_b]`` (the macro first re-orders the value for ``value_a <= value_b`` to hold). @@ -805,6 +894,20 @@ Non-expandable macros act globally. To make the scope of its macro definition local, use ``[\empty]`` as extra optional argument. + See also the expandable + `\\PolSturmNbOfRootsOf{sturmname}\\LessThanOrEqualTo{value}`_, from + which it is immediate (with ``\numexpr``) to create an expandable + variant of this macro. However the difference is that this macro + requires only `\\PolToSturm <PolToSturm_>`_ to have been executed, + whereas the expandable variant requires prior execution of + `\\PolSturmIsolateZeros <PolSturmIsolateZeros_>`_. + + See also the expandable + `\\PolSturmNbWithMultOfRootsOf{sturmname}\\LessThanOrEqualTo{value}`_ + which requires prior execution of + `\\PolSturmIsolateZeros* <PolSturmIsolateZeros*_>`_. + + .. _PolSturmIsolateZeros: ``\PolSturmIsolateZeros{sturmname}`` @@ -813,11 +916,25 @@ Non-expandable macros First, it evaluates using `Sturm theorem`_ the number of distinct real roots of ``sturmname_0``. - .. important:: + .. note:: + + The Sturm chain must have been produced by an earlier + `\\PolToSturm{polname}{sturmname}`_. - The Sturm chain **must** be of the reduced type, i.e. - as constructed via `\\PolToSturm{polname}{sturmname}`_. + Why does this macro ask for argument the name of Sturm chain, + rather than the name of a polynomial? well this is mainly for + legacy reason, and because it is accompanied by other macros for + which it is simpler to assume the argument will be the name of an + already computed Sturm chain. + Notice that ``\PolToSturm{f}{f}`` is perfectly legal (the + ``sturmname`` can be same as the ``polname``): it defines + polynomials ``f_0``, ``f_1``, ... having ``f`` has name prefix. + + Such a prior call + to ``\PolToSturm`` must have been made at any rate for + ``\PolSturmIsolateZeros`` to be usable. + Then it locates, again using `Sturm theorem`_, as many disjoint intervals as there are roots. Some intervals reduce to singleton which are roots. Non-singleton intervals get refined to make sure @@ -865,17 +982,24 @@ Non-expandable macros the package. The start of decimal expansion of a positive ``k``-th root is given - by ``\PolSturmIsolatedZeroLeft{sturmname}{k}``, and for a negative - root it is given by ``\PolSturmIsolatedZeroRight{sturmname}{k}``. - These two decimal numbers are either both zero or both of the same - sign. + by `\\PolSturmIsolatedZeroLeft{sturmname}{k} + <PolSturmIsolatedZeroLeft_>`_, and for a negative root it is given + by `\PolSturmIsolatedZeroRight{sturmname}{k} + <PolSturmIsolatedZeroRight_>`_. These two decimal + numbers are either both zero or both of the same sign. + + The number of distinct roots is obtainable expandably as + `\\PolSturmNbOfIsolatedZeros{sturmname}`_. - The number of distinct roots is obtainable as - ``\PolSturmNbOfIsolatedZeros{sturmname}``. + Furthermore + `\\PolSturmNbOfRootsOf{sturmname}\\LessThanOrEqualTo{value}`_ + and + `\\PolSturmNbOfRootsOf{sturmname}\\LessThanOrEqualToExpr{expression}`_. + will expandably act as their names indicate. .. note:: - In the current implementation the ``<sturmname>...`` variables + In the current implementation the ``<sturmname>...`` xintexpr_ variables and the ``\POL_ZeroInt...`` arrays are globally defined. On the other hand the Sturm sequence polynomials obey the current scope. @@ -898,6 +1022,45 @@ Non-expandable macros are to remain reasonable. This raises issues of its own, which are studied in numerical mathematics. +.. _PolSturmIsolateZeros*: + +``\PolSturmIsolateZeros*{sturmname}`` +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + The macro does the same as `\\PolSturmIsolateZeros{sturmname}`_ and + then in addition it does the extra work to determine all + multiplicities (of the real roots): + after executing this macro, + `\\PolSturmIsolatedZeroMultiplicity{sturmname}{index}`_ will expand + to the multiplicity of the root located in the ``index``\ -th + interval (intervals are enumerated from left to right, with index + starting at ``1``). + + Also, the + `\\PolSturmNbWithMultOfRootsOf{sturmname}\\LessThanOrEqualTo{value}`_ + will be operant. + + .. note:: + + It is **not** necessary to have executed the `PolToSturm*`_ starred + variant, as the non-starred variant keeps internally the memory of the + original GCD (and even of the full non-normalized original Sturm + chain), even though it does not make the declarations as *user-level* + genuine polynomials. + + See `The degree nine polynomial with 0.99, 0.999, 0.9999 as triple + roots`_ for an example of use. + +.. _PolSturmIsolateZerosAndGetMultiplicities: + +``\PolSturmIsolateZerosAndGetMultiplicities{sturmname}`` +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + This is another name for `\\PolSturmIsolateZeros*{sturmname}`_. + + See `The degree nine polynomial with 0.99, 0.999, 0.9999 as triple + roots`_ for an example of use. + .. _PolRefineInterval*: ``\PolRefineInterval*{sturmname}{index}`` @@ -1092,7 +1255,6 @@ and ``\PolToFloatExpr`` (and their auxiliaries) which need a It boils down to ``\xinttheexpr polname(numerical expression)\relax``. - .. _PolEvalAt: ``\PolEval{polname}\At{fraction}`` @@ -1101,17 +1263,6 @@ and ``\PolToFloatExpr`` (and their auxiliaries) which need a Evaluates the polynomial at value ``fraction`` which must be in (or expand to) a format acceptable to the xintfrac_ macros. - .. attention:: - - Meaning was changed at ``0.4``. Formerly ``\PolEval{P}\At{foo}`` - accepted for ``foo`` an expression which was handled by - ``\xintexpr``. See `\\PolEval{polname}\\AtExpr{numerical - expression}`_. - - In particular, to use an ``\xintexpr`` user-declared variable (or - e.g. the variables as defined by `\\PolSturmIsolateZeros - <PolSturmIsolateZeros>`_) one **must** use the ``\AtExpr`` syntax. - .. _PolEvalReducedAtExpr: ``\PolEvalReduced{polname}\AtExpr{numerical expression}`` @@ -1128,11 +1279,6 @@ and ``\PolToFloatExpr`` (and their auxiliaries) which need a expand to) a format acceptable to the xintfrac_ macros, and produce an irreducible fraction. - .. attention:: - - Meaning was changed at ``0.4``. Formerly the evaluation point - could be given as an expression. - .. _PolFloatEvalAtExpr: ``\PolFloatEval{polname}\AtExpr{numerical expression}`` @@ -1154,11 +1300,6 @@ and ``\PolToFloatExpr`` (and their auxiliaries) which need a getting raised to the power ``2``. Moving the ``^2`` inside, that operation would also be treated exactly. - .. attention:: - - At ``polexpr 0.3``, polynoms were automatically also prepared for - use in floating point contexts. This got dropped at ``0.4`` for - optimization purposes. See `\\PolGenFloatVariant{polname}`_. .. [#] Anyway each floating point operation starts by rounding its operands to the floating point precision. @@ -1176,11 +1317,6 @@ and ``\PolToFloatExpr`` (and their auxiliaries) which need a expand to) a format acceptable to the xintfrac_ macros, and produces a floating point number. - .. attention:: - - Meaning was changed at ``0.4``. Formerly the evaluation point - could be given as an expression. - .. _PolIfCoeffIsPlusOrMinusOne: ``\PolIfCoeffIsPlusOrMinusOne{A}{B}`` @@ -1387,7 +1523,7 @@ and ``\PolToFloatExpr`` (and their auxiliaries) which need a .. caution:: - Currently (xint_ ``1.2p``) ``\xintFloat{0}`` outputs ``0.e0`` + Currently (xint_ ``1.3c``) ``\xintFloat{0}`` outputs ``0.e0`` which is perfectly acceptable input for Python, but not for Maple. Thus, one should better leave the `\\poltoexprallfalse`_ toggle to its default ``\iffalse`` state, if one intends to use @@ -1440,7 +1576,7 @@ and ``\PolToFloatExpr`` (and their auxiliaries) which need a ``\PolSturmIfZeroExactlyKnown{sturmname}{index}{A}{B}`` ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Executes ``A`` if the ``index``\ th interval reduces to a singleton, + Executes ``A`` if the ``index``\ -th interval reduces to a singleton, i.e. the root is known exactly, else ``B``. .. note:: @@ -1459,7 +1595,7 @@ and ``\PolToFloatExpr`` (and their auxiliaries) which need a ``\PolSturmIsolatedZeroLeft{sturmname}{index}`` ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Expands to the left end-point for the ``index``\ th interval + Expands to the left end-point for the ``index``\ -th interval obtained via `\\PolSturmIsolateZeros{sturmname}`_ and possibly refined afterwards. @@ -1468,10 +1604,27 @@ and ``\PolToFloatExpr`` (and their auxiliaries) which need a ``\PolSturmIsolatedZeroRight{sturmname}{index}`` ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Expands to the right end-point for the ``index``\ th interval + Expands to the right end-point for the ``index``\ -th interval obtained via `\\PolSturmIsolateZeros{sturmname}`_ and possibly refined afterwards. +.. _PolSturmIsolatedZeroMultiplicity: + +``\PolSturmIsolatedZeroMultiplicity{sturmname}{index}`` +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + Expands to the multiplicity of the unique root contained in the + ``index``\ -th interval as determined by + `\\PolSturmIsolateZeros*{sturmname}`_ and possibly refined + afterwards. + + .. attention:: + + A prior execution of `\\PolSturmIsolateZeros*{sturmname}`_ is mandatory. + + See `The degree nine polynomial with 0.99, 0.999, 0.9999 as triple + roots`_ for an example of use. + .. _PolSturmNbOfIsolatedZeros: ``\PolSturmNbOfIsolatedZeros{sturmname}`` @@ -1482,12 +1635,67 @@ and ``\PolToFloatExpr`` (and their auxiliaries) which need a polynomial used to create the Sturm chain via `\\PolToSturm{polname}{sturmname}`_. +``\PolSturmNbOfRootsOf{sturmname}\LessThanOrEqualTo{value}`` +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + Expands to the number of distinct roots (of the polynomial used to + create the Sturm chain) less than or equal to the ``value`` (i.e. a + number of fraction recognizable by the xintfrac_ macros). + + .. attention:: + + `\\PolSturmIsolateZeros{sturmname}`_ must have been executed + beforehand. + + And the argument is a ``sturmname``, not a ``polname`` (this is + why the macro contains Sturm in its name), simply to be reminded + of the above constraint. + +``\PolSturmNbOfRootsOf{sturmname}\LessThanOrEqualToExpr{expression}`` +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + Expands to the number of distinct roots (of the polynomial + used to create the Sturm chain) which are less than or equal to the + given ``expression``. + + .. attention:: + + `\\PolSturmIsolateZeros{sturmname}`_ must have been executed + beforehand. + +``\PolSturmNbWithMultOfRootsOf{sturmname}\LessThanOrEqualTo{value}`` +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + Expands to the number counted with multiplicities of the roots (of + the polynomial used to create the Sturm chain) which are less than + or equal to the given ``value``. + + .. attention:: + + `\\PolSturmIsolateZeros*{sturmname}`_ or its alias + `\\PolSturmIsolateZerosAndGetMultiplicities{sturmname}`_ + must have been executed + beforehand. + +``\PolSturmNbWithMultOfRootsOf{sturmname}\LessThanOrEqualToExpr{expression}`` +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + Expands to the total number of roots (counted with multiplicities) + which are less than or equal to the given ``expression``. + + .. attention:: + + `\\PolSturmIsolateZeros*{sturmname}`_ or its alias + `\\PolSturmIsolateZerosAndGetMultiplicities{sturmname}`_ + must have been executed + beforehand. + .. _PolIntervalWidth: ``\PolIntervalWidth{sturmname}{index}`` ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - The ``10^E`` width of the current ``index``\ th root localization + The ``10^E`` width of the current ``index``\ -th root localization interval. Output is in xintfrac_ raw ``1/1[E]`` format (if not zero). Macros for use within execution of ``\PolPrintIntervals`` @@ -1848,6 +2056,32 @@ CHANGE LOG - the character ``'`` can be used in polynomial names. +- v0.6 (2018/11/20) + + * bugfix: + + - the starred variant `\\PolToSturm*{polname}{sturmname}`_ was + broken. On the occasion of the fix, its meaning has been modified, + see its documentation. + + - using `\\PolToSturm <PolToSturm_>`_ with a constant polynomial + caused a division by zero error. + + * new macro: + + - `\\PolSturmIsolateZeros* <PolSturmIsolateZeros*_>`_ + acts like the `non-starred variant + <PolSturmIsolateZeros_>`_ then computes all the multiplicities. + + * new expandable macros: + + - `\\PolSturmIsolatedZeroMultiplicity{sturmname}{index}`_ + - `\\PolSturmNbOfRootsOf{sturmname}\\LessThanOrEqualTo{value}`_ + - `\\PolSturmNbOfRootsOf{sturmname}\\LessThanOrEqualToExpr{expression}`_ + - `\\PolSturmNbWithMultOfRootsOf{sturmname}\\LessThanOrEqualTo{value}`_ + - `\\PolSturmNbWithMultOfRootsOf{sturmname}\\LessThanOrEqualToExpr{expression}`_ + + Acknowledgments --------------- @@ -1856,7 +2090,8 @@ differentiating polynomials was the initial trigger leading to this package, and to Jürgen Gilg and Thomas Söll for testing it on some concrete problems. -Renewed thanks on occasion of ``0.4`` release! +Renewed thanks to them on occasion of the ``0.6`` release for their +continued interest. See README.md for the License. |