summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/doc/latex/polexpr/polexpr.txt
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/doc/latex/polexpr/polexpr.txt')
-rw-r--r--Master/texmf-dist/doc/latex/polexpr/polexpr.txt395
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.