summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/doc/latex/polexpr/polexpr.txt
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2018-12-09 22:40:04 +0000
committerKarl Berry <karl@freefriends.org>2018-12-09 22:40:04 +0000
commite3f537173f1b15c44d8b25af46c5e3d9067d6eb1 (patch)
tree8032b8c28e27a213e64393ca1d134d008c493457 /Master/texmf-dist/doc/latex/polexpr/polexpr.txt
parent04e37c90a04324cb7d88f8c6fed9bf886c0a5e1a (diff)
polexpr (9dec18)
git-svn-id: svn://tug.org/texlive/trunk@49365 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.txt813
1 files changed, 615 insertions, 198 deletions
diff --git a/Master/texmf-dist/doc/latex/polexpr/polexpr.txt b/Master/texmf-dist/doc/latex/polexpr/polexpr.txt
index da2cbb77790..51008763dcf 100644
--- a/Master/texmf-dist/doc/latex/polexpr/polexpr.txt
+++ b/Master/texmf-dist/doc/latex/polexpr/polexpr.txt
@@ -4,13 +4,13 @@
Package polexpr documentation
===============================
-0.6 (2018/11/20)
+0.7 (2018/12/08)
================
.. contents::
-Basic Examples
---------------
+Basic syntax
+------------
The syntax is::
@@ -161,18 +161,13 @@ Examples of localization of roots
- For extra info in log file use ``\xintverbosetrue``.
-- To make producing this documentation simpler, the results from execution
- of the code snippets are not included. Please try them out yourself...
+- Only for some of these examples is the output included here.
A typical example
~~~~~~~~~~~~~~~~~
-In this example the polynomial is square-free; we can make sure of that by
-comparing the degree of the first element of the Sturm chain with the
-degree of the original polynomial. In such case the second element of
-the Sturm chain is still the polynomial first derivative, because there
-was no further reduction.
+In this example the polynomial is square-free.
::
@@ -190,11 +185,11 @@ was no further reduction.
\PolEnsureIntervalLength{f}{1}{-20}
\[\PolSturmIsolatedZeroLeft{f}{1}<Z_1<\PolSturmIsolatedZeroRight{f}{1}\]
The first element of the Sturm chain has degree $\PolDegree{f_0}$. As
- this same as $\PolDegree{f}$ we know that the latter was square free.
- So the derivative is up to a constant \PolTypeset{f_1} (in fact here
+ this is the original degreee $\PolDegree{f}$ we know that $f$ is square free.
+ Its derivative is up to a constant \PolTypeset{f_1} (in this example
it is identical with it).
\PolToSturm{f_1}{f_1}\PolSturmIsolateZeros{f_1}%
- It has \PolSturmNbOfIsolatedZeros{f_1} distinct real
+ The derivative has \PolSturmNbOfIsolatedZeros{f_1} distinct real
roots:
\PolPrintIntervals[W]{f_1}
\PolEnsureIntervalLengths{f_1}{-10}%
@@ -216,6 +211,13 @@ was no further reduction.
A degree four polynomial with nearby roots
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+Notice that this example is a bit outdated as ``0.7`` release has
+added ``\PolSturmIsolateZeros**{sturmname}`` which would find exactly
+the roots. The steps here retain their interest when one is interested
+in finding isolating intervals for example to prepare some demonstration
+of dichotomy method.
+
+
::
\PolDef{Q}{(x-1.050001)(x-1.105001)(x-1.110501)(x-1.111051)}
@@ -273,11 +275,10 @@ In this example, the output will look like this (but using math mode)::
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!
+On first pass, these rational roots were found (due to their relative
+magnitudes, using ``\PolSturmIsolateZeros**`` was not needed here). But
+multiplicity computation works also with (decimal) roots not yet
+identified or with non-decimal or irrational roots.
It is fun to modify only a tiny bit the polynomial and see if polexpr
survives::
@@ -313,7 +314,46 @@ which produces::
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 degree five polynomial with three rational roots
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+::
+
+ \poldef Q(x) := 1581755751184441 x^5
+ -14907697165025339 x^4
+ +48415668972339336 x^3
+ -63952057791306264 x^2
+ +46833913221154895 x
+ -49044360626280925;
+
+ \PolToSturm{Q}{Q}
+ %\begin{flushleft}
+ \renewcommand\PolTypesetCmdPrefix[1]{\allowbreak\xintiiifSgn{#1}{}{+}{+}}%
+ $Q_0(x) = \PolTypeset{Q_0}$
+ %\end{flushleft}
+ \PolSturmIsolateZeros**{Q}
+ \PolPrintIntervals{Q}
+
+ $Q_norr(x) = \PolTypeset{Q_norr}$
+
+Here, all real roots are rational::
+
+ Z_1 = 833719/265381
+ Z_2 = 165707065/52746197
+ Z_3 = 355/113
+
+ Q_norr(x) = x^2 + 1
+
+And let's get their decimal expansion too::
+
+ % print decimal expansion of the found roots
+ \renewcommand\PolPrintIntervalsPrintExactZero
+ {\xintTrunc{20}{\PolPrintIntervalsTheLeftEndPoint}\dots}
+ \PolPrintIntervals{Q}
+
+ Z_1 = 3.14159265358107777120...
+ Z_2 = 3.14159265358979340254...
+ Z_3 = 3.14159292035398230088...
A Mignotte type polynomial
@@ -344,6 +384,93 @@ The last line produces::
0.09999900004999650028 < Z_2 < 0.09999900004999650029
+
+The Wilkinson polynomial
+~~~~~~~~~~~~~~~~~~~~~~~~
+
+See `Wilkinson polynomial`_.
+
+::
+
+ \documentclass{article}
+ \usepackage{polexpr}
+ \begin{document}
+ %\xintverbosetrue % for the curious...
+
+ \poldef f(x) := mul((x - i), i = 1..20);
+
+ \renewcommand\PolTypesetCmdPrefix[1]{\allowbreak\xintiiifSgn{#1}{}{+}{+}}%
+ \renewcommand\PolTypesetOne[1]{\xintDecToString{#1}}%
+
+ \noindent\PolTypeset{f}
+
+ \PolToSturm{f}{f}
+ \PolSturmIsolateZeros{f}
+ \PolPrintIntervals{f}
+
+ \clearpage
+
+ \poldef g(x) := f(x) - 2**{-23} x**19;
+
+ % be patient!
+ \PolToSturm{g}{g}
+ \noindent\PolTypeset{g_0}% integer coefficient primitive polynomial
+
+ \PolSturmIsolateZeros{g}
+ \PolEnsureIntervalLengths{g}{-10}
+
+ \renewcommand\PolPrintIntervalsPrintMultiplicity{}
+ \PolPrintIntervals*{g}
+
+ \end{document}
+
+
+The first polynomial::
+
+ f(x) = x**20
+ - 210 x**19
+ + 20615 x**18
+ - 1256850 x**17
+ + 53327946 x**16
+ - 1672280820 x**15
+ + 40171771630 x**14
+ - 756111184500 x**13
+ + 11310276995381 x**12
+ - 135585182899530 x**11
+ + 1307535010540395 x**10
+ - 10142299865511450 x**9
+ + 63030812099294896 x**8
+ - 311333643161390640 x**7
+ + 1206647803780373360 x**6
+ - 3599979517947607200 x**5
+ + 8037811822645051776 x**4
+ - 12870931245150988800 x**3
+ + 13803759753640704000 x**2
+ - 8752948036761600000 x
+ + 2432902008176640000
+
+is handled fast enough (a few seconds), but the modified one ``f(x) -
+2**-23 x**19`` takes about 20x longer (the Sturm chain polynomials
+have integer coefficients with up to 321 digits, whereas (surprisingly
+perhaps) those of the Sturm chain polynomials derived from ``f`` never
+have more than 21 digits ...).
+
+Once the Sturm chain is computed and the zeros isolated, obtaining their
+decimal digits is relatively faster. Here is for the ten real roots of
+``f(x) - 2**-23 x**19`` as computed by the code above::
+
+ Z_1 = 0.9999999999...
+ Z_2 = 2.0000000000...
+ Z_3 = 2.9999999999...
+ Z_4 = 4.0000000002...
+ Z_5 = 4.9999999275...
+ Z_6 = 6.0000069439...
+ Z_7 = 6.9996972339...
+ Z_8 = 8.0072676034...
+ Z_9 = 8.9172502485...
+ Z_10 = 20.8469081014...
+
+
The degree 41 polynomial with -2, -1.9, -1.8, ..., 0, 0.1, ..., 1.9, 2 as roots
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -391,23 +518,23 @@ Stress test: not a hard challenge to ``xint + polexpr``, but be a bit patient!
\PolDef{P}{mul((x-i*1e-1), i=-20..20)}%
\PolToSturm{P}{S} % dutifully computes S_0, ..., S_{41}
+ % the [1] optional argument limits the search to interval (-10,10)
\PolSturmIsolateZeros[1]{S} % finds *exactly* (but a bit slowly) all 41 roots!
\PolPrintIntervals{S} % nice, isn't it?
.. note::
- Release ``0.5`` has experimental addition of optional argument
+ Release ``0.5`` has *experimental* addition of optional argument
``E`` to ``\PolSturmIsolateZeros``. It instructs to search roots only
- in interval ``(-10^E, 10^E)``, extremities assumed to not be roots.
- Thus here::
-
- \PolSturmIsolateZeros[1]{S}
-
- gives some speed gain; without it, it turns out in this case that
- ``polexpr`` would have started with ``(-10^6, 10^6)`` interval.
+ in interval ``(-10^E, 10^E)``. Important: the extremities are
+ *assumed to not be roots*. In this example, the ``[1]`` in
+ ``\PolSturmIsolateZeros[1]{S}`` gives some speed gain; without it, it
+ turns out in this case that ``polexpr`` would have started with
+ ``(-10^6, 10^6)`` interval.
- This will probably get replaced in future by the specification of
- a general interval.
+ Please note that this will probably get replaced in future by the
+ specification of a general interval. Do not rely on meaning of this
+ optional argument keeping the same.
Roots of Chebyshev polynomials
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -584,18 +711,18 @@ Non-expandable macros
``\PolFromCSV{polname}{<csv>}``
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- Defines a polynomial directly from the comma separated list of
- values (or a macro expanding to such a list) of its coefficients,
- the constant term being the first item. No validity checks. Spaces
- from the list argument are trimmed. List items are each expanded in
- an ``\edef`` and then put into normalized form via xintfrac_\ 's
- macro ``\xintRaw``.
+ Defines a polynomial directly from the comma separated list of values
+ (or a macro expanding to such a list) of its coefficients, the *first
+ item* gives the constant term, the *last item* gives the leading
+ coefficient, except if zero, then it is dropped (iteratively). List
+ items are each expanded in an ``\edef`` and then put into normalized
+ form via xintfrac_\ 's macro ``\xintRaw``.
- Leading zero coefficients are removed::
+ As leading zero coefficients are removed::
\PolFromCSV{f}{0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
- defines the zero polynomial, which has only one (zero) coefficient.
+ defines the zero polynomial, which holds only one coefficient.
See also expandable macro `\\PolToCSV <\\PolToCSV{polname}_>`_.
@@ -825,15 +952,18 @@ Non-expandable macros
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.
+ polynomial ``polname``, but with each root now of multiplicity one:
+ i.e. it is the "square-free part" of original polynomial ``polname``.
Notice that ``sturmname_1`` isn't necessarily the derivative of
``sturmname_0`` due to the various normalizations.
- 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}`_.
+ The polynomials ``sturmname_k`` main utility is for the execution of
+ `\\PolSturmIsolateZeros{sturmname}`_. Be careful not to use these
+ names ``sturmname_0``, ``sturmname_1``, etc... for defining other
+ polynomials after having done ``\PolToSturm{polname}{sturmname} and
+ before executing ``\PolSturmIsolateZeros{sturmname}`` else the
+ latter will behave erroneously.
`\\PolSturmChainLength{sturmname}`_ gives the index of the last
element of the Sturm chain.
@@ -853,6 +983,16 @@ Non-expandable macros
This behaviour was modified at ``0.6``, anyhow the macro was
broken at ``0.5``.
+ .. hint::
+
+ The square-free part of ``polname`` is ``sturmname_0``, and their
+ quotient is the polynomial with name
+ ``sturname_\PolSturmChainLength{sturmname}_``. It thus easy to
+ set-up a loop iteratively computing the latter until the last one
+ is a constant, thus obtaining the decomposition of an ``f`` as
+ a product ``c f_1 f_2 f_3 ...`` of a constant and square-free (primitive)
+ polynomials, where each ``f_i`` divides its predecessor.
+
.. _PolSetToSturmChainSignChangesAt:
``\PolSetToSturmChainSignChangesAt{\macro}{sturmname}{fraction}``
@@ -913,10 +1053,10 @@ Non-expandable macros
``\PolSturmIsolateZeros{sturmname}``
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- First, it evaluates using `Sturm theorem`_ the number of distinct
- real roots of ``sturmname_0``.
+ The macros locates, using `Sturm theorem`_, as many disjoint
+ intervals as there are (real) roots.
- .. note::
+ .. important::
The Sturm chain must have been produced by an earlier
`\\PolToSturm{polname}{sturmname}`_.
@@ -935,23 +1075,42 @@ Non-expandable macros
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
- none of their two limit points is a root: they contain each a single
- root, in their respective interiors.
+ After its execution they are two types of such intervals (stored in
+ memory and accessible via macros or xintexpr_ variables, see below):
- .. This procedure is covariant
- with the independent variable ``x`` becoming ``-x``.
- Hmm, pas sûr et trop fatigué
+ - singleton ``{a}``: then ``a`` is a root, (necessarily a decimal
+ number, but not all such decimal numbers are exactly identified yet).
+
+ - open intervals ``(a,b)``: then there is exactly one root ``z``
+ such that ``a < z < b``, and the end points are guaranteed to not
+ be roots.
The interval boundaries are decimal numbers, originating
in iterated decimal subdivision from initial intervals
- ``(-10^E, 0)`` and ``(0, 10^E)``; if zero is a root it is always
- identified individually. The non-singleton intervals are of the
+ ``(-10^E, 0)`` and ``(0, 10^E)`` with ``E`` chosen initially large
+ enough so that all roots are enclosed; if zero is a root it is always
+ identified as such. The non-singleton intervals are of the
type ``(a/10^f, (a+1)/10^f)`` with ``a`` an integer, which is
- neither ``0`` nor ``-1``. Hence ``a`` and ``a+1`` are both positive
- or both negative.
+ neither ``0`` nor ``-1``. Hence either ``a`` and ``a+1`` are both positive
+ or they are both negative.
+
+ One does not *a priori* know what will be the lengths of these
+ intervals (except that they are always powers of ten), they
+ vary depending on how many digits two successive roots have in
+ common in their respective decimal expansions.
+
+ .. important::
+
+ If some two consecutive intervals share an end-point, no
+ information is yet gained about the separation between the two
+ roots which could at this stage be arbitrarily small.
+
+ See `\\PolRefineInterval*{sturmname}{index}`_ which addresses
+ this issue.
+
+ .. This procedure is covariant
+ with the independent variable ``x`` becoming ``-x``.
+ Hmm, pas sûr et trop fatigué
The interval boundaries (and exactly found roots) are made available
for future computations in ``\xintexpr``-essions or polynomial
@@ -960,26 +1119,27 @@ Non-expandable macros
``<sturmname>R_1``, ``<sturmname>R_2``, ..., for the right
end-points.
- Also two macro arrays (in the sense of
- xinttools_'s ``\xintAssignArray``) are created for holding the
- interval end-points written out in standard decimal notation
- (see `\\PolDecToString{decimal number}`_).
- To access these values, macros
- `\\PolSturmIsolatedZeroLeft{sturmname}{index}`_ and
- `\\PolSturmIsolatedZeroRight{sturmname}{index}`_ are provided.
+ Thus for example, if ``sturmname`` is ``f``, one can use the
+ xintexpr_ variables ``fL_1``, ``fL_2``, ... to refer in expressions
+ to the left end-points (or to the exact root, if left and right end
+ points coincide). Additionally, xintexpr_ variable ``fZ_1_isknown``
+ will have value ``1`` if the root in the first interval is known,
+ and ``0`` otherwise. And similarly for the other intervals.
- .. important::
+ Also, macros `\\PolSturmIsolatedZeroLeft{sturmname}{index}`_ and
+ `\\PolSturmIsolatedZeroRight{sturmname}{index}`_ are provided which
+ expand to these same values, written in decimal notation (i.e.
+ pre-processed by `\\PolDecToString <PolDecToString_>`_.) And there
+ is also `\\PolSturmIfZeroExactlyKnown{sturmname}{index}{A}{B}`_.
- Trailing zeroes in these stored decimal numbers are significant:
- they are also present in the decimal expansion of the exact root.
+ .. important::
- .. note::
+ Trailing zeroes in the stored decimal numbers accessible via the
+ macros are significant: they are also present in the decimal
+ expansion of the exact root.
- The actual array macros are ``\POL_ZeroInt<sturmname>L`` and
- ``\POL_ZeroInt<sturmname>R`` but as these names use the
- non-letter character ``_`` and possibly also digits from
- ``sturmname``, the accessor macros above have been made part of
- the package.
+ These variables and macros are automatically updated when one next
+ uses macros such as `\\PolRefineInterval*{sturmname}{index}`_.
The start of decimal expansion of a positive ``k``-th root is given
by `\\PolSturmIsolatedZeroLeft{sturmname}{k}
@@ -992,25 +1152,20 @@ Non-expandable macros
`\\PolSturmNbOfIsolatedZeros{sturmname}`_.
Furthermore
- `\\PolSturmNbOfRootsOf{sturmname}\\LessThanOrEqualTo{value}`_
- and
+ `\\PolSturmNbOfRootsOf{sturmname}\\LessThanOrEqualTo{value}`_ and
`\\PolSturmNbOfRootsOf{sturmname}\\LessThanOrEqualToExpr{expression}`_.
- will expandably act as their names indicate.
+ will expandably compute respectively the number of real roots at
+ most equal to ``value`` or ``expression``, and the same but with
+ multiplicities.
.. note::
- In the current implementation the ``<sturmname>...`` xintexpr_ variables
- and the ``\POL_ZeroInt...`` arrays are globally defined. On the
+ In the current implementation the xintexpr_ variables
+ and xinttools_ arrays are globally defined. On the
other hand the Sturm sequence polynomials obey the current scope.
.. note::
- When two successive roots are located in adjacent intervals, the
- separation between them is not lower bounded. See
- `\\PolRefineInterval*{sturmname}{index}`_.
-
- .. note::
-
As all computations are done *exactly* there can be no errors...
apart those due to bad coding by author. The results are exact
bounds for the mathematically exact real roots.
@@ -1036,9 +1191,9 @@ Non-expandable macros
interval (intervals are enumerated from left to right, with index
starting at ``1``).
- Also, the
- `\\PolSturmNbWithMultOfRootsOf{sturmname}\\LessThanOrEqualTo{value}`_
- will be operant.
+ Furthermore, if for example the ``sturmname`` is ``f``, xintexpr_
+ variables ``fM_1``, ``fM_2``... hold the multiplicities thus
+ computed.
.. note::
@@ -1049,7 +1204,36 @@ Non-expandable macros
genuine polynomials.
See `The degree nine polynomial with 0.99, 0.999, 0.9999 as triple
- roots`_ for an example of use.
+ roots`_ for an example.
+
+.. _PolSturmIsolateZeros**:
+
+``\PolSturmIsolateZeros**{sturmname}``
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ The macro does the same as `\\PolSturmIsolateZeros*{sturmname}`_ and
+ in addition it does the extra work to determine all the *rational*
+ roots.
+
+ .. note::
+
+ After execution of this macro, a root is "known" if and only if
+ it is rational.
+
+ Furthermore, primitive polynomial ``sturmname_sqf_norr`` is created
+ to match the (square-free) ``sturmname_0`` from which all rational
+ roots have been removed (see `\\polexprsetup`_ for customizing this
+ name). The number of distinct rational roots is thus the difference
+ between the degrees of these two polynomials (see also
+ `\\PolSturmNbOfRationalRoots{sturmname}`_).
+
+ And ``sturmname_norr`` is ``sturmname_0_`` from which all rational
+ roots have been removed (see `\\polexprsetup`_), i.e. it contains
+ the irrational roots of the original polynomial, with the same
+ multiplicities.
+
+ See `A degree five polynomial with three rational
+ roots`_ for an example.
.. _PolSturmIsolateZerosAndGetMultiplicities:
@@ -1058,8 +1242,44 @@ Non-expandable macros
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.
+.. _PolSturmIsolateZerosGetMultiplicitiesAndRationalRoots:
+
+``\PolSturmIsolateZerosGetMultiplicitiesAndRationalRoots{sturmname}``
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ This is another name for `\\PolSturmIsolateZeros**{sturmname}`_.
+
+
+``\PolSturmIsolateZerosAndFindRationalRoots{sturmname}``
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ This works exactly like `\\PolSturmIsolateZeros**{sturmname}`_
+ (inclusive of declaring the polynomials ``sturmname_sqf_norr`` and
+ ``sturmname_norr`` with no rational roots) except that it does *not*
+ compute the multiplicities of the *non-rational* roots.
+
+ .. note::
+
+ There is no macro to find the rational roots but not compute
+ their multiplicities at the same time.
+
+ .. attention::
+
+ This macro does *not* define xintexpr_ variables
+ ``sturmnameM_1``, ``sturmnameM_2``, ... holding the
+ multiplicities and it leaves the multiplicity array (whose accessor
+ is `\\PolSturmIsolatedZeroMultiplicity{sturmname}{index}`_) into
+ a broken state, as all non-rational roots will supposedly have
+ multiplicity one. This means that the output of
+ `\\PolPrintIntervals* <PolPrintIntervals*_>`_ for example will be
+ erroneous for the intervals with irrational roots.
+
+ I decided to document it because finding multiplicities of the
+ non rational roots is somewhat costly, and one may be interested
+ only into finding the rational roots (of course random
+ polynomials with integer coefficients will not have *any*
+ rational root anyhow).
+
.. _PolRefineInterval*:
@@ -1110,40 +1330,73 @@ Non-expandable macros
This is a convenience macro which prints the bounds for the roots
``Z_1``, ``Z_2``, ... (the optional argument ``varname`` allows to
- specify a replacement for the default ``Z``). This will be done in a
+ specify a replacement for the default ``Z``). This will be done (by
+ default) in a
math mode ``array``, one interval per row, and pattern ``rcccl``,
where the second and fourth column hold the ``<`` sign, except when
the interval reduces to a singleton, which means the root is known
- exactly. The user is invited to renewcommand the macro if some other
- type of tabular environment for example is wanted.
+ exactly.
- In each array cell the corresponding interval end-point (which may
- be an exactly known root) is available as macro
- `\\PolPrintIntervalsTheEndPoint`_ (in decimal notation). And the
- corresponding interval index is available as
- `\\PolPrintIntervalsTheIndex`_.
+ .. attention::
+
+ This macro was refactored at 0.7, its default output remained
+ identical but the ways to customize it got completely
+ modified.
+
+ See next macros which govern its output.
+
+``\PolPrintIntervalsNoRealRoots``
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+ Executed in place of an ``array`` environment, when there are no
+ real roots. Default definition::
+
+ \newcommand\PolPrintIntervalsNoRealRoots{}
+
+``\PolPrintIntervalsBeginEnv``
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+ Default definition::
+
+ \newcommand\PolPrintIntervalsBeginEnv{\[\begin{array}{rcccl}}
+
+``\PolPrintIntervalsEndEnv``
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+ Default definition::
+
+ \newcommand\PolPrintIntervalsEndEnv{\end{array}\]}
+
+``\PolPrintIntervalsKnownRoot``
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+ Default definition::
+
+ \newcommand\PolPrintIntervalsKnownRoot{%
+ &&\PolPrintIntervalsTheVar_{\PolPrintIntervalsTheIndex}%
+ &=&\PolPrintIntervalsPrintExactZero
+ }
+
+``\PolPrintIntervalsUnknownRoot``
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+ Default definition::
+
+ \newcommand\PolPrintIntervalsUnknownRoot{%
+ \PolPrintIntervalsPrintLeftEndPoint&<&%
+ \PolPrintIntervalsTheVar_{\PolPrintIntervalsTheIndex}&<&%
+ \PolPrintIntervalsPrintRightEndPoint
+ }
- These values may be tested to decide some on-the-fly customization
- (color for example), via the following auxiliaries which can be
- modified by user. Furthermore these auxiliaries can also use the
- following conditionals: `\\PolIfEndPointIsPositive{A}{B}`_,
- `\\PolIfEndPointIsNegative{A}{B}`_, `\\PolIfEndPointIsZero{A}{B}`_.
.. _PolPrintIntervalsPrintExactZero:
``\PolPrintIntervalsPrintExactZero``
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
- This is provided to help customize how an exactly known root is
- printed in the right most column of the array. The package
- definition is::
- \newcommand\PolPrintIntervalsPrintExactZero{\PolPrintIntervalsTheEndPoint}%
+ Default definition::
- Recall that this is expanded in an array cell.
-
- If for example you want to print in red the third root, known
- exactly, the macro could make a test for the value of
- `\\PolPrintIntervalsTheIndex`_ and act accordingly.
+ \newcommand\PolPrintIntervalsPrintExactZero{\PolPrintIntervalsTheLeftEndPoint}
.. _PolPrintIntervalsPrintLeftEndPoint:
@@ -1151,18 +1404,48 @@ Non-expandable macros
``\PolPrintIntervalsPrintLeftEndPoint``
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
- Package definition is::
+ Default definition::
- \newcommand\PolPrintIntervalsPrintLeftEndPoint{\PolPrintIntervalsTheEndPoint}%
+ \newcommand\PolPrintIntervalsPrintLeftEndPoint{\PolPrintIntervalsTheLeftEndPoint}
.. _PolPrintIntervalsPrintRightEndPoint:
``\PolPrintIntervalsPrintRightEndPoint``
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
- Package definition is::
+ Default definition is::
+
+ \newcommand\PolPrintIntervalsPrintRightEndPoint{\PolPrintIntervalsTheRightEndPoint}
+
+.. _PolPrintIntervals*:
+
+``\PolPrintIntervals*[varname]{sturmname}``
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ This starred variant produces an alternative output (which
+ displays the root multiplicity), and is provided as an
+ example of customization.
+
+ As replacement for `\\PolPrintIntervalsKnownRoot`_,
+ `\\PolPrintIntervalsPrintExactZero`_,
+ `\\PolPrintIntervalsUnknownRoot`_ it uses its own
+ ``\POL@@PrintIntervals...`` macros. We only reproduce here one
+ definition::
+
+ \newcommand\POL@@PrintIntervalsPrintExactZero{%
+ \displaystyle
+ \xintSignedFrac{\PolPrintIntervalsTheLeftEndPoint}%
+ }%
+
+ Multiplicities are printed using this auxiliary macro:
+
+``\PolPrintIntervalsPrintMultiplicity``
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+ whose default definition is::
+
+ \newcommand\PolPrintIntervalsPrintMultiplicity{(\mbox{mult. }\PolPrintIntervalsTheMultiplicity)}
- \newcommand\PolPrintIntervalsPrintRightEndPoint{\PolPrintIntervalsTheEndPoint}%
.. _PolMapCoeffs:
@@ -1549,8 +1832,9 @@ and ``\PolToFloatExpr`` (and their auxiliaries) which need a
``\PolToList{polname}``
~~~~~~~~~~~~~~~~~~~~~~~
- Expands to ``{coeff_0}{coeff_1}...{coeff_N}`` with ``N`` = degree
- (except zero polynomial which does give ``{0/1[0]}`` and not an
+ Expands to ``{coeff_0}{coeff_1}...{coeff_N}`` with ``N`` = degree, and
+ ``coeff_N`` the leading coefficient
+ (the zero polynomial does give ``{0/1[0]}`` and not an
empty output.)
.. _PolToCSV:
@@ -1558,7 +1842,8 @@ and ``\PolToFloatExpr`` (and their auxiliaries) which need a
``\PolToCSV{polname}``
~~~~~~~~~~~~~~~~~~~~~~
- Expands to ``coeff_0, coeff_1, coeff_2, ....., coeff_N``. Converse
+ Expands to ``coeff_0, coeff_1, coeff_2, ....., coeff_N``, starting
+ with constant term and ending with leading coefficient. Converse
to `\\PolFromCSV <\\PolFromCSV{polname}{\<csv\>}_>`_.
.. _PolSturmChainLength:
@@ -1581,32 +1866,36 @@ and ``\PolToFloatExpr`` (and their auxiliaries) which need a
.. note::
- ``index`` may be a TeX count, or a ``\value{latexcounter}``, or a
- numerical expression as parsable by ``\numexpr``: it does not
- have to be given via explicit digits.
-
- This remark applies also to the other package macros with
- ``index`` being the name of the argument in this documentation.
- There is also an out-of-range check done for some reasonable
- error message (right before everything goes haywire).
+ ``index`` is allowed to be something like ``1+2*3`` as it is fed
+ to ``\the\numexpr...\relax``.
.. _PolSturmIsolatedZeroLeft:
``\PolSturmIsolatedZeroLeft{sturmname}{index}``
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- Expands to the left end-point for the ``index``\ -th interval
- obtained via `\\PolSturmIsolateZeros{sturmname}`_ and possibly
- refined afterwards.
+ Expands to the left end-point for the ``index``\ -th interval, as
+ computed by some earlier `\\PolSturmIsolateZeros{sturmname}`_.
+
+ .. note::
+
+ Of course, this is kept updated by macros such as
+ `\\PolRefineInterval{sturmname}{index} <PolRefineInterval[N]_>`_.
+
+ The value is pre-formatted using `\\PolDecTostring
+ <PolDecToString_>`_.
.. _PolSturmIsolatedZeroRight:
``\PolSturmIsolatedZeroRight{sturmname}{index}``
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- Expands to the right end-point for the ``index``\ -th interval
- obtained via `\\PolSturmIsolateZeros{sturmname}`_ and possibly
- refined afterwards.
+ Expands to the right end-point for the ``index``\ -th interval as
+ computed by some earlier `\\PolSturmIsolateZeros{sturmname}`_ and
+ possibly refined afterwards.
+
+ The value is pre-formatted using `\\PolDecTostring
+ <PolDecToString_>`_.
.. _PolSturmIsolatedZeroMultiplicity:
@@ -1614,9 +1903,7 @@ and ``\PolToFloatExpr`` (and their auxiliaries) which need a
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Expands to the multiplicity of the unique root contained in the
- ``index``\ -th interval as determined by
- `\\PolSturmIsolateZeros*{sturmname}`_ and possibly refined
- afterwards.
+ ``index``\ -th interval.
.. attention::
@@ -1631,12 +1918,20 @@ and ``\PolToFloatExpr`` (and their auxiliaries) which need a
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Expands to the number of real roots of the polynomial
- ``<sturmname>_0`` (which is the number of distinct real roots of the
- polynomial used to create the Sturm chain via
+ ``<sturmname>_0``, i.e. the number of distinct real roots of the
+ polynomial originally used to create the Sturm chain via
`\\PolToSturm{polname}{sturmname}`_.
+.. warning::
+
+ The next few macros counting roots, with or without multiplicities,
+ less than or equal to some value, are under evaluation and may be
+ removed from the package if their utility is judged to be not high
+ enough. They can be re-coded at user level on the basis of the other
+ documented package macros anyway.
+
``\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
@@ -1652,7 +1947,7 @@ and ``\PolToFloatExpr`` (and their auxiliaries) which need a
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
@@ -1664,7 +1959,7 @@ and ``\PolToFloatExpr`` (and their auxiliaries) which need a
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
@@ -1672,22 +1967,74 @@ and ``\PolToFloatExpr`` (and their auxiliaries) which need a
.. attention::
- `\\PolSturmIsolateZeros*{sturmname}`_ or its alias
- `\\PolSturmIsolateZerosAndGetMultiplicities{sturmname}`_
- must have been executed
- beforehand.
+ `\\PolSturmIsolateZeros*{sturmname}`_ (or the double starred
+ variant) 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
+ `\\PolSturmIsolateZeros*{sturmname}`_ (or the double starred
+ variant) must have been executed beforehand.
+
+``\PolSturmNbOfRationalRoots{sturmname}``
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ Expands to the number of rational roots (without multiplicities).
+
+ .. attention::
+
+ `\\PolSturmIsolateZeros**{sturmname}`_ must have been executed
+ beforehand.
+
+``\PolSturmNbOfRationalRootsWithMultiplicities{sturmname}``
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ Expands to the number of rational roots (counted with multiplicities).
+
+ .. attention::
+
+ `\\PolSturmIsolateZeros**{sturmname}`_ must have been executed
+ beforehand.
+
+``\PolSturmRationalRoot{sturmname}{k}``
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ Expands to the ``k``\ th rational root (they are ordered and indexed
+ starting at 1 for the most negative).
+
+ .. attention::
+
+ `\\PolSturmIsolateZeros**{sturmname}`_ must have been executed
+ beforehand.
+
+``\PolSturmRationalRootIndex{sturmname}{k}``
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ Expands to ``index`` of the ``k``\ th rational root as part of the
+ ordered real roots (without multiplicities). I.e., above macro
+ `\\PolSturmRationalRoot{sturmname}{k}`_ is equivalent to this
+ nested call::
+
+ \PolSturmIsolatedZeroLeft{sturmname}{\PolSturmRationalRootIndex{sturmname}{k}}
+
+ .. attention::
+
+ `\\PolSturmIsolateZeros**{sturmname}`_ must have been executed
+ beforehand.
+
+``\PolSturmRationalRootMultiplicity{sturmname}{k}``
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ Expands to the multiplicity of the ``k``\ th rational root.
+
+ .. attention::
+
+ `\\PolSturmIsolateZeros**{sturmname}`_ must have been executed
beforehand.
.. _PolIntervalWidth:
@@ -1698,66 +2045,66 @@ and ``\PolToFloatExpr`` (and their auxiliaries) which need a
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``
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-More precisely, they can be used within the replacement texts of the
-`\\PolPrintIntervalsPrintLeftEndPoint`_, etc, macros.
+Expandable macros for use within execution of ``\PolPrintIntervals``
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+These macros are for usage within custom user redefinitions of
+`\\PolPrintIntervalsKnownRoot`_, `\\PolPrintIntervalsUnknownRoot`_, or
+in redefinitions of `\PolPrintIntervalsPrintExactZero`_ (used in the
+default for the former) and of `\\PolPrintIntervalsPrintLeftEndPoint`_,
+`\\PolPrintIntervalsPrintRightEndPoint`_ (used in the default for the
+latter).
-.. _PolPrintIntervalsTheEndPoint:
+.. attention::
-``\PolPrintIntervalsTheEndPoint``
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ Some macros formerly mentioned here got removed at 0.7:
+ ``\PolPrintIntervalsTheEndPoint``,
+ ``\PolIfEndPointIsPositive{A}{B}``,
+ ``\PolIfEndPointIsNegative{A}{B}``,
+ ``\PolIfEndPointIsZero{A}{B}``.
- Within a custom `\\PolPrintIntervalsPrintLeftEndPoint`_, custom
- `\\PolPrintIntervalsPrintRightEndPoint`_, or custom
- `\\PolPrintIntervalsPrintExactZero`_ this macro expands to the left
- or right end point of the considered interval. Serves as default
- replacement for `\\PolPrintIntervalsPrintLeftEndPoint`_ , etc...
+``\PolPrintIntervalsTheVar``
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-.. _PolPrintIntervalsTheIndex:
+ Expands to the name (default ``Z``) used for representing the roots,
+ which was passed as optional argument ``varname`` to
+ `\\PolPrintIntervals[varname]{sturmname}`_.
``\PolPrintIntervalsTheIndex``
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
- Within a custom `\\PolPrintIntervalsPrintLeftEndPoint`_, custom
- `\\PolPrintIntervalsPrintRightEndPoint`_, or custom
- `\\PolPrintIntervalsPrintExactZero`_ this macro expands to the index
- of the considered interval. For example if user wants to print the
- corresponding end points in red, the index value can thus be tested
- in the replacement text of `\\PolPrintIntervalsPrintLeftEndPoint`_ and
- the other two similar macros.
-
-.. _PolIfEndPointIsPositive:
+ Expands to the index of the considered interval (indexing starting
+ at 1 for the leftmost interval).
-``\PolIfEndPointIsPositive{A}{B}``
+``\PolPrintIntervalsTheSturmName``
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
- Within a custom `\\PolPrintIntervalsPrintLeftEndPoint`_, custom
- `\\PolPrintIntervalsPrintRightEndPoint`_, or custom
- `\\PolPrintIntervalsPrintExactZero`_ this macro executes ``A`` if
- the considered interval end-point is positive, else ``B``.
+ Expands to the argument which was passed as ``sturmname`` to
+ `\\PolPrintIntervals[varname]{sturmname}`_.
-.. _PolIfEndPointIsNegative:
+``\PolPrintIntervalsTheLeftEndPoint``
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-``\PolIfEndPointIsNegative{A}{B}``
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ The left end point of the interval, as would be produced by
+ `\\PolSturmIsolatedZeroLeft <PolSturmIsolatedZeroLeft_>`_ if it was
+ used with arguments the Sturm chain name and interval index returned
+ by `\\PolPrintIntervalsTheSturmName`_ and
+ `\\PolPrintIntervalsTheIndex`_.
- Within a custom `\\PolPrintIntervalsPrintLeftEndPoint`_, custom
- `\\PolPrintIntervalsPrintRightEndPoint`_, or custom
- `\\PolPrintIntervalsPrintExactZero`_ this macro executes ``A`` if
- the considered interval end-point is negative, else ``B``.
+``\PolPrintIntervalsTheRightEndPoint``
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-.. _PolIfEndPointIsZero:
+ The right end point of the interval, as would be produced by
+ `\\\PolSturmIsolatedZeroRight <PolSturmIsolatedZeroRight_>`_ for
+ this Sturm chain name and index.
-``\PolIfEndPointIsZero{A}{B}``
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+``\PolPrintIntervalsTheMultiplicity``
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
- Within a custom `\\PolPrintIntervalsPrintLeftEndPoint`_, custom
- `\\PolPrintIntervalsPrintRightEndPoint`_, or custom
- `\\PolPrintIntervalsPrintExactZero`_ this macro executes ``A`` if
- the considered interval end-point is zero, else ``B``.
+ The multiplicity of the unique root within the interval of index
+ `\\PolPrintIntervalsTheIndex`_. Makes sense only if the starred (or
+ double-starred) variant of `\\PolSturmIsolateZeros
+ <PolSturmIsolateZeros_>`_ was used earlier.
.. _PolDecToString:
@@ -1775,7 +2122,7 @@ More precisely, they can be used within the replacement texts of the
illustrates that trailing zeros are not trimmed. To trim trailing
zeroes, one can use ``\PolDecToString{\xintREZ{#1}}``.
- The exact behaviour of this macro may evolve in future releases of
+ The precise behaviour of this macro may evolve in future releases of
xint_.
Booleans (with default setting as indicated)
@@ -1806,6 +2153,26 @@ Booleans (with default setting as indicated)
If ``true``, `\\PolToExpr{polname}`_ and `\\PolToFloatExpr{polname}`_ will
also include the vanishing coefficients in their outputs.
+``\polexprsetup``
+-----------------
+
+ Serves to customize the package. Currently only two keys are
+ recognized:
+
+ - ``norr``: the postfix that `\\PolSturmIsolateZeros**{sturmname}`_
+ should append to ``sturmname`` to declare the primitive polynomial
+ obtained from original one after removal of all rational roots.
+ The default value is ``_norr`` (standing for “no rational roots”).
+
+ - ``sqfnorr``: the postfix that `\\PolSturmIsolateZeros**{sturmname}`_
+ should append to ``sturmname`` to declare the primitive polynomial
+ obtained from original one after removal of all rational roots and
+ suppression of all multiplicities.
+ The default value is ``_sqf_norr`` (standing for “square-free with
+ no rational roots”).
+
+ The package executes ``\polexprsetup{norr=_norr,
+ sqfnorr=_sqf_norr}`` as default.
Technicalities
--------------
@@ -2001,11 +2368,11 @@ CHANGE LOG
- `\\PolSturmIfZeroExactlyKnown <PolSturmIfZeroExactlyKnown_>`_
- `\\PolSturmIsolatedZeroLeft <PolSturmIsolatedZeroLeft_>`_
- `\\PolSturmIsolatedZeroRight <PolSturmIsolatedZeroRight_>`_
- - `\\PolPrintIntervalsTheEndPoint <PolPrintIntervalsTheEndPoint_>`_
- - `\\PolPrintIntervalsTheIndex <PolPrintIntervalsTheIndex_>`_
- - `\\PolIfEndPointIsPositive <PolIfEndPointIsPositive_>`_
- - `\\PolIfEndPointIsNegative <PolIfEndPointIsNegative_>`_
- - `\\PolIfEndPointIsZero <PolIfEndPointIsZero_>`_
+ - ``\PolPrintIntervalsTheEndPoint`` (removed at 0.7)
+ - `\\PolPrintIntervalsTheIndex`_
+ - ``\PolIfEndPointIsPositive`` (removed at 0.7)
+ - ``\PolIfEndPointIsNegative`` (removed at 0.7)
+ - ``\PolIfEndPointIsZero`` (removed at 0.7)
- `\\PolIntervalWidth <PolIntervalWidth_>`_
- `\\PolDecToString <PolDecToString_>`_
* improvements:
@@ -2081,6 +2448,54 @@ CHANGE LOG
- `\\PolSturmNbWithMultOfRootsOf{sturmname}\\LessThanOrEqualTo{value}`_
- `\\PolSturmNbWithMultOfRootsOf{sturmname}\\LessThanOrEqualToExpr{expression}`_
+- v0.7 (2018/12/08)
+
+ * breaking changes:
+
+ - although `\\PolPrintIntervals[varname]{sturmname}`_ default output
+ remains the same, some auxiliary macros for user-customization
+ have been removed: ``\PolPrintIntervalsTheEndPoint``,
+ ``\PolIfEndPointIsPositive{A}{B}``,
+ ``\PolIfEndPointIsNegative{A}{B}``, and
+ ``\PolIfEndPointIsZero{A}{B}``.
+
+ * bugfix:
+
+ - it could happen that, contrarily to documentation, an interval
+ computed by `\\PolSturmIsolateZeros{sturmname}`_ had zero as an
+ endpoint,
+ - `\\PolEnsureIntervalLength{sturmname}{index}{E}`_ could under
+ certain circumstances erroneously replace a non-zero root by
+ zero,
+ - `\\PolEnsureIntervalLengths{sturmname}{E}`_ crashed when used with
+ a polynomial with no real roots, hence for which no isolation intervals
+ existed (thanks to Thomas Söll for report).
+
+ * new macros:
+
+ - `\\PolSturmIsolateZeros**{sturmname}`_
+ - `\\PolSturmIsolateZerosGetMultiplicitiesAndRationalRoots{sturmname}`_
+ - `\\PolSturmIsolateZerosAndFindRationalRoots{sturmname}`_
+ - `\\polexprsetup`_
+ - `\\PolPrintIntervals* <PolPrintIntervals*_>`_
+ - `\\PolPrintIntervalsNoRealRoots`_
+ - `\\PolPrintIntervalsBeginEnv`_
+ - `\\PolPrintIntervalsEndEnv`_
+ - `\\PolPrintIntervalsKnownRoot`_
+ - `\\PolPrintIntervalsUnknownRoot`_
+ - `\\PolPrintIntervalsPrintMultiplicity`_
+
+ * new expandable macros:
+
+ - `\\PolSturmNbOfRationalRoots{sturmname}`_
+ - `\\PolSturmNbOfRationalRootsWithMultiplicities{sturmname}`_
+ - `\\PolSturmRationalRoot{sturmname}{k}`_
+ - `\\PolSturmRationalRootIndex{sturmname}{k}`_
+ - `\\PolSturmRationalRootMultiplicity{sturmname}{k}`_
+ - `\\PolPrintIntervalsTheVar`_
+ - `\\PolPrintIntervalsTheSturmName`_
+ - `\\PolPrintIntervalsTheMultiplicity`_
+
Acknowledgments
---------------
@@ -2090,7 +2505,7 @@ 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 to them on occasion of the ``0.6`` release for their
+Renewed thanks to them on occasion of the ``0.6`` and ``0.7`` releases for their
continued interest.
See README.md for the License.
@@ -2100,6 +2515,8 @@ See README.md for the License.
.. _xintexpr:
.. _xint: http://www.ctan.org/pkg/xint
+.. _Wilkinson polynomial: https://en.wikipedia.org/wiki/Wilkinson%27s_polynomial
+
.. _Sturm algorithm:
.. _Sturm Theorem: https://en.wikipedia.org/wiki/Sturm%27s_theorem