diff options
Diffstat (limited to 'Master/texmf-dist/doc/latex/polexpr/polexpr.txt')
-rw-r--r-- | Master/texmf-dist/doc/latex/polexpr/polexpr.txt | 813 |
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 |