summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/doc/latex/polexpr
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2018-11-21 21:59:41 +0000
committerKarl Berry <karl@freefriends.org>2018-11-21 21:59:41 +0000
commitd547ea6945251bd98a320b6132a7c639809c966c (patch)
tree20fbfac0eef6b88b7539a68ce561dadba4f33795 /Master/texmf-dist/doc/latex/polexpr
parent228e5563a08cef3526d4f4a9b744ce328d243797 (diff)
polexpr (21nov18)
git-svn-id: svn://tug.org/texlive/trunk@49213 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/doc/latex/polexpr')
-rw-r--r--Master/texmf-dist/doc/latex/polexpr/README.md7
-rw-r--r--Master/texmf-dist/doc/latex/polexpr/polexpr.html839
-rw-r--r--Master/texmf-dist/doc/latex/polexpr/polexpr.txt395
3 files changed, 848 insertions, 393 deletions
diff --git a/Master/texmf-dist/doc/latex/polexpr/README.md b/Master/texmf-dist/doc/latex/polexpr/README.md
index be224aa4af4..405f832ae75 100644
--- a/Master/texmf-dist/doc/latex/polexpr/README.md
+++ b/Master/texmf-dist/doc/latex/polexpr/README.md
@@ -71,9 +71,10 @@ Releases
integer coefficients polynomials.
- 0.5.1 (2018/04/22)
The `'` character can be used in polynomial names.
+- 0.6 (2018/11/20)
+ New feature: multiplicity of roots.
-
-Files of 0.5.1 release:
+Files of 0.6 release:
- README.md,
- polexpr.sty (package file),
@@ -89,5 +90,3 @@ Thanks to Jürgen Gilg whose question about
[xint](http://www.ctan.org/pkg/xint) usage for 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!
diff --git a/Master/texmf-dist/doc/latex/polexpr/polexpr.html b/Master/texmf-dist/doc/latex/polexpr/polexpr.html
index ce67c863193..5408f16b65e 100644
--- a/Master/texmf-dist/doc/latex/polexpr/polexpr.html
+++ b/Master/texmf-dist/doc/latex/polexpr/polexpr.html
@@ -6,7 +6,7 @@
<meta name="generator" content="Docutils 0.14: http://docutils.sourceforge.net/" />
<title>Package polexpr documentation</title>
<style type="text/css">
-body{font-size: 13pt;}
+
/*
:Author: David Goodger (goodger@python.org)
:Id: $Id: html4css1.css 7952 2016-07-26 18:15:59Z milde $
@@ -362,130 +362,137 @@ ul.auto-toc {
<body>
<div class="document" id="package-polexpr-documentation">
<h1 class="title">Package polexpr documentation</h1>
-<h2 class="subtitle" id="id1">0.5.1 (2018/04/22)</h2>
+<h2 class="subtitle" id="id1">0.6 (2018/11/20)</h2>
<!-- comment: -*- fill-column: 72; mode: rst; -*- -->
<div class="contents topic" id="contents">
<p class="topic-title first">Contents</p>
<ul class="simple">
-<li><a class="reference internal" href="#basic-examples" id="id35">Basic Examples</a></li>
-<li><a class="reference internal" href="#examples-of-localization-of-roots" id="id36">Examples of localization of roots</a><ul>
-<li><a class="reference internal" href="#a-typical-example" id="id37">A typical example</a></li>
-<li><a class="reference internal" href="#a-degree-four-polynomial-with-nearby-roots" id="id38">A degree four polynomial with nearby roots</a></li>
-<li><a class="reference internal" href="#the-degree-nine-polynomial-with-0-99-0-999-0-9999-as-triple-roots" id="id39">The degree nine polynomial with 0.99, 0.999, 0.9999 as triple roots</a></li>
-<li><a class="reference internal" href="#a-mignotte-type-polynomial" id="id40">A Mignotte type polynomial</a></li>
-<li><a class="reference internal" href="#the-degree-41-polynomial-with-2-1-9-1-8-0-0-1-1-9-2-as-roots" id="id41">The degree 41 polynomial with -2, -1.9, -1.8, ..., 0, 0.1, ..., 1.9, 2 as roots</a></li>
-<li><a class="reference internal" href="#roots-of-chebyshev-polynomials" id="id42">Roots of Chebyshev polynomials</a></li>
+<li><a class="reference internal" href="#basic-examples" id="id36">Basic Examples</a></li>
+<li><a class="reference internal" href="#examples-of-localization-of-roots" id="id37">Examples of localization of roots</a><ul>
+<li><a class="reference internal" href="#a-typical-example" id="id38">A typical example</a></li>
+<li><a class="reference internal" href="#a-degree-four-polynomial-with-nearby-roots" id="id39">A degree four polynomial with nearby roots</a></li>
+<li><a class="reference internal" href="#the-degree-nine-polynomial-with-0-99-0-999-0-9999-as-triple-roots" id="id40">The degree nine polynomial with 0.99, 0.999, 0.9999 as triple roots</a></li>
+<li><a class="reference internal" href="#a-mignotte-type-polynomial" id="id41">A Mignotte type polynomial</a></li>
+<li><a class="reference internal" href="#the-degree-41-polynomial-with-2-1-9-1-8-0-0-1-1-9-2-as-roots" id="id42">The degree 41 polynomial with -2, -1.9, -1.8, ..., 0, 0.1, ..., 1.9, 2 as roots</a></li>
+<li><a class="reference internal" href="#roots-of-chebyshev-polynomials" id="id43">Roots of Chebyshev polynomials</a></li>
</ul>
</li>
-<li><a class="reference internal" href="#non-expandable-macros" id="id43">Non-expandable macros</a><ul>
-<li><a class="reference internal" href="#poldef-polname-letter-expression-in-letter" id="id44"><tt class="docutils literal">\poldef <span class="pre">polname(letter):=</span> expression in letter;</tt></a></li>
-<li><a class="reference internal" href="#poldef-letter-polname-expression-in-letter" id="id45"><tt class="docutils literal"><span class="pre">\PolDef[letter]{polname}{expression</span> in letter}</tt></a></li>
-<li><a class="reference internal" href="#polgenfloatvariant-polname" id="id46"><tt class="docutils literal">\PolGenFloatVariant{polname}</tt></a></li>
-<li><a class="reference internal" href="#pollet-polname-2-polname-1" id="id47"><tt class="docutils literal"><span class="pre">\PolLet{polname_2}={polname_1}</span></tt></a></li>
-<li><a class="reference internal" href="#polgloballet-polname-2-polname-1" id="id48"><tt class="docutils literal"><span class="pre">\PolGlobalLet{polname_2}={polname_1}</span></tt></a></li>
-<li><a class="reference internal" href="#polassign-polname-toarray-macro" id="id49"><tt class="docutils literal"><span class="pre">\PolAssign{polname}\toarray\macro</span></tt></a></li>
-<li><a class="reference internal" href="#polget-polname-fromarray-macro" id="id50"><tt class="docutils literal"><span class="pre">\PolGet{polname}\fromarray\macro</span></tt></a></li>
-<li><a class="reference internal" href="#polfromcsv-polname-csv" id="id51"><tt class="docutils literal"><span class="pre">\PolFromCSV{polname}{&lt;csv&gt;}</span></tt></a></li>
-<li><a class="reference internal" href="#poltypeset-polname" id="id52"><tt class="docutils literal">\PolTypeset{polname}</tt></a><ul>
-<li><a class="reference internal" href="#poltypesetcmd-raw-coeff" id="id53"><tt class="docutils literal">\PolTypesetCmd{raw_coeff}</tt></a></li>
-<li><a class="reference internal" href="#poltypesetone-raw-coeff" id="id54"><tt class="docutils literal">\PolTypesetOne{raw_coeff}</tt></a></li>
-<li><a class="reference internal" href="#id6" id="id55"><tt class="docutils literal">\PolTypesetMonomialCmd</tt></a></li>
-<li><a class="reference internal" href="#poltypesetcmdprefix-raw-coeff" id="id56"><tt class="docutils literal">\PolTypesetCmdPrefix{raw_coeff}</tt></a></li>
+<li><a class="reference internal" href="#non-expandable-macros" id="id44">Non-expandable macros</a><ul>
+<li><a class="reference internal" href="#poldef-polname-letter-expression-in-letter" id="id45"><tt class="docutils literal">\poldef <span class="pre">polname(letter):=</span> expression in letter;</tt></a></li>
+<li><a class="reference internal" href="#poldef-letter-polname-expression-in-letter" id="id46"><tt class="docutils literal"><span class="pre">\PolDef[letter]{polname}{expression</span> in letter}</tt></a></li>
+<li><a class="reference internal" href="#polgenfloatvariant-polname" id="id47"><tt class="docutils literal">\PolGenFloatVariant{polname}</tt></a></li>
+<li><a class="reference internal" href="#pollet-polname-2-polname-1" id="id48"><tt class="docutils literal"><span class="pre">\PolLet{polname_2}={polname_1}</span></tt></a></li>
+<li><a class="reference internal" href="#polgloballet-polname-2-polname-1" id="id49"><tt class="docutils literal"><span class="pre">\PolGlobalLet{polname_2}={polname_1}</span></tt></a></li>
+<li><a class="reference internal" href="#polassign-polname-toarray-macro" id="id50"><tt class="docutils literal"><span class="pre">\PolAssign{polname}\toarray\macro</span></tt></a></li>
+<li><a class="reference internal" href="#polget-polname-fromarray-macro" id="id51"><tt class="docutils literal"><span class="pre">\PolGet{polname}\fromarray\macro</span></tt></a></li>
+<li><a class="reference internal" href="#polfromcsv-polname-csv" id="id52"><tt class="docutils literal"><span class="pre">\PolFromCSV{polname}{&lt;csv&gt;}</span></tt></a></li>
+<li><a class="reference internal" href="#poltypeset-polname" id="id53"><tt class="docutils literal">\PolTypeset{polname}</tt></a><ul>
+<li><a class="reference internal" href="#poltypesetcmd-raw-coeff" id="id54"><tt class="docutils literal">\PolTypesetCmd{raw_coeff}</tt></a></li>
+<li><a class="reference internal" href="#poltypesetone-raw-coeff" id="id55"><tt class="docutils literal">\PolTypesetOne{raw_coeff}</tt></a></li>
+<li><a class="reference internal" href="#id6" id="id56"><tt class="docutils literal">\PolTypesetMonomialCmd</tt></a></li>
+<li><a class="reference internal" href="#poltypesetcmdprefix-raw-coeff" id="id57"><tt class="docutils literal">\PolTypesetCmdPrefix{raw_coeff}</tt></a></li>
</ul>
</li>
-<li><a class="reference internal" href="#id8" id="id57"><tt class="docutils literal"><span class="pre">\PolTypeset*{polname}</span></tt></a></li>
-<li><a class="reference internal" href="#poldiff-polname-1-polname-2" id="id58"><tt class="docutils literal"><span class="pre">\PolDiff{polname_1}{polname_2}</span></tt></a></li>
-<li><a class="reference internal" href="#poldiff-n-polname-1-polname-2" id="id59"><tt class="docutils literal"><span class="pre">\PolDiff[N]{polname_1}{polname_2}</span></tt></a></li>
-<li><a class="reference internal" href="#polantidiff-polname-1-polname-2" id="id60"><tt class="docutils literal"><span class="pre">\PolAntiDiff{polname_1}{polname_2}</span></tt></a></li>
-<li><a class="reference internal" href="#polantidiff-n-polname-1-polname-2" id="id61"><tt class="docutils literal"><span class="pre">\PolAntiDiff[N]{polname_1}{polname_2}</span></tt></a></li>
-<li><a class="reference internal" href="#poldivide-polname-1-polname-2-polname-q-polname-r" id="id62"><tt class="docutils literal"><span class="pre">\PolDivide{polname_1}{polname_2}{polname_Q}{polname_R}</span></tt></a></li>
-<li><a class="reference internal" href="#polquo-polname-1-polname-2-polname-q" id="id63"><tt class="docutils literal"><span class="pre">\PolQuo{polname_1}{polname_2}{polname_Q}</span></tt></a></li>
-<li><a class="reference internal" href="#polrem-polname-1-polname-2-polname-r" id="id64"><tt class="docutils literal"><span class="pre">\PolRem{polname_1}{polname_2}{polname_R}</span></tt></a></li>
-<li><a class="reference internal" href="#polgcd-polname-1-polname-2-polname-gcd" id="id65"><tt class="docutils literal"><span class="pre">\PolGCD{polname_1}{polname_2}{polname_GCD}</span></tt></a></li>
-<li><a class="reference internal" href="#poltosturm-polname-sturmname" id="id66"><tt class="docutils literal"><span class="pre">\PolToSturm{polname}{sturmname}</span></tt></a></li>
-<li><a class="reference internal" href="#id10" id="id67"><tt class="docutils literal"><span class="pre">\PolToSturm*{polname}{sturmname}</span></tt></a></li>
-<li><a class="reference internal" href="#polsettosturmchainsignchangesat-macro-sturmname-fraction" id="id68"><tt class="docutils literal"><span class="pre">\PolSetToSturmChainSignChangesAt{\macro}{sturmname}{fraction}</span></tt></a></li>
-<li><a class="reference internal" href="#polsettonbofzeroswithin-macro-sturmname-value-a-value-b" id="id69"><tt class="docutils literal"><span class="pre">\PolSetToNbOfZerosWithin{\macro}{sturmname}{value_a}{value_b}</span></tt></a></li>
-<li><a class="reference internal" href="#polsturmisolatezeros-sturmname" id="id70"><tt class="docutils literal">\PolSturmIsolateZeros{sturmname}</tt></a></li>
-<li><a class="reference internal" href="#polrefineinterval-sturmname-index" id="id71"><tt class="docutils literal"><span class="pre">\PolRefineInterval*{sturmname}{index}</span></tt></a></li>
-<li><a class="reference internal" href="#polrefineinterval-n-sturmname-index" id="id72"><tt class="docutils literal"><span class="pre">\PolRefineInterval[N]{sturmname}{index}</span></tt></a></li>
-<li><a class="reference internal" href="#polensureintervallength-sturmname-index-e" id="id73"><tt class="docutils literal"><span class="pre">\PolEnsureIntervalLength{sturmname}{index}{E}</span></tt></a></li>
-<li><a class="reference internal" href="#polensureintervallengths-sturmname-e" id="id74"><tt class="docutils literal"><span class="pre">\PolEnsureIntervalLengths{sturmname}{E}</span></tt></a></li>
-<li><a class="reference internal" href="#polprintintervals-varname-sturmname" id="id75"><tt class="docutils literal"><span class="pre">\PolPrintIntervals[varname]{sturmname}</span></tt></a><ul>
-<li><a class="reference internal" href="#id11" id="id76"><tt class="docutils literal">\PolPrintIntervalsPrintExactZero</tt></a></li>
-<li><a class="reference internal" href="#id12" id="id77"><tt class="docutils literal">\PolPrintIntervalsPrintLeftEndPoint</tt></a></li>
-<li><a class="reference internal" href="#id13" id="id78"><tt class="docutils literal">\PolPrintIntervalsPrintRightEndPoint</tt></a></li>
+<li><a class="reference internal" href="#id8" id="id58"><tt class="docutils literal"><span class="pre">\PolTypeset*{polname}</span></tt></a></li>
+<li><a class="reference internal" href="#poldiff-polname-1-polname-2" id="id59"><tt class="docutils literal"><span class="pre">\PolDiff{polname_1}{polname_2}</span></tt></a></li>
+<li><a class="reference internal" href="#poldiff-n-polname-1-polname-2" id="id60"><tt class="docutils literal"><span class="pre">\PolDiff[N]{polname_1}{polname_2}</span></tt></a></li>
+<li><a class="reference internal" href="#polantidiff-polname-1-polname-2" id="id61"><tt class="docutils literal"><span class="pre">\PolAntiDiff{polname_1}{polname_2}</span></tt></a></li>
+<li><a class="reference internal" href="#polantidiff-n-polname-1-polname-2" id="id62"><tt class="docutils literal"><span class="pre">\PolAntiDiff[N]{polname_1}{polname_2}</span></tt></a></li>
+<li><a class="reference internal" href="#poldivide-polname-1-polname-2-polname-q-polname-r" id="id63"><tt class="docutils literal"><span class="pre">\PolDivide{polname_1}{polname_2}{polname_Q}{polname_R}</span></tt></a></li>
+<li><a class="reference internal" href="#polquo-polname-1-polname-2-polname-q" id="id64"><tt class="docutils literal"><span class="pre">\PolQuo{polname_1}{polname_2}{polname_Q}</span></tt></a></li>
+<li><a class="reference internal" href="#polrem-polname-1-polname-2-polname-r" id="id65"><tt class="docutils literal"><span class="pre">\PolRem{polname_1}{polname_2}{polname_R}</span></tt></a></li>
+<li><a class="reference internal" href="#polgcd-polname-1-polname-2-polname-gcd" id="id66"><tt class="docutils literal"><span class="pre">\PolGCD{polname_1}{polname_2}{polname_GCD}</span></tt></a></li>
+<li><a class="reference internal" href="#poltosturm-polname-sturmname" id="id67"><tt class="docutils literal"><span class="pre">\PolToSturm{polname}{sturmname}</span></tt></a></li>
+<li><a class="reference internal" href="#id10" id="id68"><tt class="docutils literal"><span class="pre">\PolToSturm*{polname}{sturmname}</span></tt></a></li>
+<li><a class="reference internal" href="#polsettosturmchainsignchangesat-macro-sturmname-fraction" id="id69"><tt class="docutils literal"><span class="pre">\PolSetToSturmChainSignChangesAt{\macro}{sturmname}{fraction}</span></tt></a></li>
+<li><a class="reference internal" href="#polsettonbofzeroswithin-macro-sturmname-value-a-value-b" id="id70"><tt class="docutils literal"><span class="pre">\PolSetToNbOfZerosWithin{\macro}{sturmname}{value_a}{value_b}</span></tt></a></li>
+<li><a class="reference internal" href="#polsturmisolatezeros-sturmname" id="id71"><tt class="docutils literal">\PolSturmIsolateZeros{sturmname}</tt></a></li>
+<li><a class="reference internal" href="#id12" id="id72"><tt class="docutils literal"><span class="pre">\PolSturmIsolateZeros*{sturmname}</span></tt></a></li>
+<li><a class="reference internal" href="#polsturmisolatezerosandgetmultiplicities-sturmname" id="id73"><tt class="docutils literal">\PolSturmIsolateZerosAndGetMultiplicities{sturmname}</tt></a></li>
+<li><a class="reference internal" href="#polrefineinterval-sturmname-index" id="id74"><tt class="docutils literal"><span class="pre">\PolRefineInterval*{sturmname}{index}</span></tt></a></li>
+<li><a class="reference internal" href="#polrefineinterval-n-sturmname-index" id="id75"><tt class="docutils literal"><span class="pre">\PolRefineInterval[N]{sturmname}{index}</span></tt></a></li>
+<li><a class="reference internal" href="#polensureintervallength-sturmname-index-e" id="id76"><tt class="docutils literal"><span class="pre">\PolEnsureIntervalLength{sturmname}{index}{E}</span></tt></a></li>
+<li><a class="reference internal" href="#polensureintervallengths-sturmname-e" id="id77"><tt class="docutils literal"><span class="pre">\PolEnsureIntervalLengths{sturmname}{E}</span></tt></a></li>
+<li><a class="reference internal" href="#polprintintervals-varname-sturmname" id="id78"><tt class="docutils literal"><span class="pre">\PolPrintIntervals[varname]{sturmname}</span></tt></a><ul>
+<li><a class="reference internal" href="#id13" id="id79"><tt class="docutils literal">\PolPrintIntervalsPrintExactZero</tt></a></li>
+<li><a class="reference internal" href="#id14" id="id80"><tt class="docutils literal">\PolPrintIntervalsPrintLeftEndPoint</tt></a></li>
+<li><a class="reference internal" href="#id15" id="id81"><tt class="docutils literal">\PolPrintIntervalsPrintRightEndPoint</tt></a></li>
</ul>
</li>
-<li><a class="reference internal" href="#polmapcoeffs-macro-polname" id="id79"><tt class="docutils literal"><span class="pre">\PolMapCoeffs{\macro}{polname}</span></tt></a></li>
-<li><a class="reference internal" href="#polreducecoeffs-polname" id="id80"><tt class="docutils literal">\PolReduceCoeffs{polname}</tt></a></li>
-<li><a class="reference internal" href="#id15" id="id81"><tt class="docutils literal"><span class="pre">\PolReduceCoeffs*{polname}</span></tt></a></li>
-<li><a class="reference internal" href="#polmakemonic-polname" id="id82"><tt class="docutils literal">\PolMakeMonic{polname}</tt></a></li>
-<li><a class="reference internal" href="#polmakeprimitive-polname" id="id83"><tt class="docutils literal">\PolMakePrimitive{polname}</tt></a></li>
+<li><a class="reference internal" href="#polmapcoeffs-macro-polname" id="id82"><tt class="docutils literal"><span class="pre">\PolMapCoeffs{\macro}{polname}</span></tt></a></li>
+<li><a class="reference internal" href="#polreducecoeffs-polname" id="id83"><tt class="docutils literal">\PolReduceCoeffs{polname}</tt></a></li>
+<li><a class="reference internal" href="#id17" id="id84"><tt class="docutils literal"><span class="pre">\PolReduceCoeffs*{polname}</span></tt></a></li>
+<li><a class="reference internal" href="#polmakemonic-polname" id="id85"><tt class="docutils literal">\PolMakeMonic{polname}</tt></a></li>
+<li><a class="reference internal" href="#polmakeprimitive-polname" id="id86"><tt class="docutils literal">\PolMakePrimitive{polname}</tt></a></li>
</ul>
</li>
-<li><a class="reference internal" href="#expandable-macros" id="id84">Expandable macros</a><ul>
-<li><a class="reference internal" href="#poleval-polname-atexpr-numerical-expression" id="id85"><tt class="docutils literal"><span class="pre">\PolEval{polname}\AtExpr{numerical</span> expression}</tt></a></li>
-<li><a class="reference internal" href="#poleval-polname-at-fraction" id="id86"><tt class="docutils literal"><span class="pre">\PolEval{polname}\At{fraction}</span></tt></a></li>
-<li><a class="reference internal" href="#polevalreduced-polname-atexpr-numerical-expression" id="id87"><tt class="docutils literal"><span class="pre">\PolEvalReduced{polname}\AtExpr{numerical</span> expression}</tt></a></li>
-<li><a class="reference internal" href="#polevalreduced-polname-at-fraction" id="id88"><tt class="docutils literal"><span class="pre">\PolEvalReduced{polname}\At{fraction}</span></tt></a></li>
-<li><a class="reference internal" href="#polfloateval-polname-atexpr-numerical-expression" id="id89"><tt class="docutils literal"><span class="pre">\PolFloatEval{polname}\AtExpr{numerical</span> expression}</tt></a></li>
-<li><a class="reference internal" href="#polfloateval-polname-at-fraction" id="id90"><tt class="docutils literal"><span class="pre">\PolFloatEval{polname}\At{fraction}</span></tt></a></li>
-<li><a class="reference internal" href="#polifcoeffisplusorminusone-a-b" id="id91"><tt class="docutils literal"><span class="pre">\PolIfCoeffIsPlusOrMinusOne{A}{B}</span></tt></a></li>
-<li><a class="reference internal" href="#polleadingcoeff-polname" id="id92"><tt class="docutils literal">\PolLeadingCoeff{polname}</tt></a></li>
-<li><a class="reference internal" href="#polnthcoeff-polname-number" id="id93"><tt class="docutils literal"><span class="pre">\PolNthCoeff{polname}{number}</span></tt></a></li>
-<li><a class="reference internal" href="#poldegree-polname" id="id94"><tt class="docutils literal">\PolDegree{polname}</tt></a></li>
-<li><a class="reference internal" href="#policontent-polname" id="id95"><tt class="docutils literal">\PolIContent{polname}</tt></a></li>
-<li><a class="reference internal" href="#poltoexpr-polname" id="id96"><tt class="docutils literal">\PolToExpr{polname}</tt></a><ul>
-<li><a class="reference internal" href="#poltoexproneterm-raw-coeff-number" id="id97"><tt class="docutils literal"><span class="pre">\PolToExprOneTerm{raw_coeff}{number}</span></tt></a></li>
-<li><a class="reference internal" href="#poltoexpronetermstylea-raw-coeff-number" id="id98"><tt class="docutils literal"><span class="pre">\PolToExprOneTermStyleA{raw_coeff}{number}</span></tt></a></li>
-<li><a class="reference internal" href="#poltoexpronetermstyleb-raw-coeff-number" id="id99"><tt class="docutils literal"><span class="pre">\PolToExprOneTermStyleB{raw_coeff}{number}</span></tt></a></li>
-<li><a class="reference internal" href="#poltoexprcmd-raw-coeff" id="id100"><tt class="docutils literal">\PolToExprCmd{raw_coeff}</tt></a></li>
-<li><a class="reference internal" href="#poltoexprtermprefix-raw-coeff" id="id101"><tt class="docutils literal">\PolToExprTermPrefix{raw_coeff}</tt></a></li>
-<li><a class="reference internal" href="#id23" id="id102"><tt class="docutils literal">\PolToExprVar</tt></a></li>
-<li><a class="reference internal" href="#id24" id="id103"><tt class="docutils literal">\PolToExprTimes</tt></a></li>
+<li><a class="reference internal" href="#expandable-macros" id="id87">Expandable macros</a><ul>
+<li><a class="reference internal" href="#poleval-polname-atexpr-numerical-expression" id="id88"><tt class="docutils literal"><span class="pre">\PolEval{polname}\AtExpr{numerical</span> expression}</tt></a></li>
+<li><a class="reference internal" href="#poleval-polname-at-fraction" id="id89"><tt class="docutils literal"><span class="pre">\PolEval{polname}\At{fraction}</span></tt></a></li>
+<li><a class="reference internal" href="#polevalreduced-polname-atexpr-numerical-expression" id="id90"><tt class="docutils literal"><span class="pre">\PolEvalReduced{polname}\AtExpr{numerical</span> expression}</tt></a></li>
+<li><a class="reference internal" href="#polevalreduced-polname-at-fraction" id="id91"><tt class="docutils literal"><span class="pre">\PolEvalReduced{polname}\At{fraction}</span></tt></a></li>
+<li><a class="reference internal" href="#polfloateval-polname-atexpr-numerical-expression" id="id92"><tt class="docutils literal"><span class="pre">\PolFloatEval{polname}\AtExpr{numerical</span> expression}</tt></a></li>
+<li><a class="reference internal" href="#polfloateval-polname-at-fraction" id="id93"><tt class="docutils literal"><span class="pre">\PolFloatEval{polname}\At{fraction}</span></tt></a></li>
+<li><a class="reference internal" href="#polifcoeffisplusorminusone-a-b" id="id94"><tt class="docutils literal"><span class="pre">\PolIfCoeffIsPlusOrMinusOne{A}{B}</span></tt></a></li>
+<li><a class="reference internal" href="#polleadingcoeff-polname" id="id95"><tt class="docutils literal">\PolLeadingCoeff{polname}</tt></a></li>
+<li><a class="reference internal" href="#polnthcoeff-polname-number" id="id96"><tt class="docutils literal"><span class="pre">\PolNthCoeff{polname}{number}</span></tt></a></li>
+<li><a class="reference internal" href="#poldegree-polname" id="id97"><tt class="docutils literal">\PolDegree{polname}</tt></a></li>
+<li><a class="reference internal" href="#policontent-polname" id="id98"><tt class="docutils literal">\PolIContent{polname}</tt></a></li>
+<li><a class="reference internal" href="#poltoexpr-polname" id="id99"><tt class="docutils literal">\PolToExpr{polname}</tt></a><ul>
+<li><a class="reference internal" href="#poltoexproneterm-raw-coeff-number" id="id100"><tt class="docutils literal"><span class="pre">\PolToExprOneTerm{raw_coeff}{number}</span></tt></a></li>
+<li><a class="reference internal" href="#poltoexpronetermstylea-raw-coeff-number" id="id101"><tt class="docutils literal"><span class="pre">\PolToExprOneTermStyleA{raw_coeff}{number}</span></tt></a></li>
+<li><a class="reference internal" href="#poltoexpronetermstyleb-raw-coeff-number" id="id102"><tt class="docutils literal"><span class="pre">\PolToExprOneTermStyleB{raw_coeff}{number}</span></tt></a></li>
+<li><a class="reference internal" href="#poltoexprcmd-raw-coeff" id="id103"><tt class="docutils literal">\PolToExprCmd{raw_coeff}</tt></a></li>
+<li><a class="reference internal" href="#poltoexprtermprefix-raw-coeff" id="id104"><tt class="docutils literal">\PolToExprTermPrefix{raw_coeff}</tt></a></li>
+<li><a class="reference internal" href="#id24" id="id105"><tt class="docutils literal">\PolToExprVar</tt></a></li>
+<li><a class="reference internal" href="#id25" id="id106"><tt class="docutils literal">\PolToExprTimes</tt></a></li>
</ul>
</li>
-<li><a class="reference internal" href="#id26" id="id104"><tt class="docutils literal"><span class="pre">\PolToExpr*{polname}</span></tt></a></li>
-<li><a class="reference internal" href="#poltofloatexpr-polname" id="id105"><tt class="docutils literal">\PolToFloatExpr{polname}</tt></a><ul>
-<li><a class="reference internal" href="#poltofloatexproneterm-raw-coeff-number" id="id106"><tt class="docutils literal"><span class="pre">\PolToFloatExprOneTerm{raw_coeff}{number}</span></tt></a></li>
-<li><a class="reference internal" href="#poltofloatexprcmd-raw-coeff" id="id107"><tt class="docutils literal">\PolToFloatExprCmd{raw_coeff}</tt></a></li>
+<li><a class="reference internal" href="#id27" id="id107"><tt class="docutils literal"><span class="pre">\PolToExpr*{polname}</span></tt></a></li>
+<li><a class="reference internal" href="#poltofloatexpr-polname" id="id108"><tt class="docutils literal">\PolToFloatExpr{polname}</tt></a><ul>
+<li><a class="reference internal" href="#poltofloatexproneterm-raw-coeff-number" id="id109"><tt class="docutils literal"><span class="pre">\PolToFloatExprOneTerm{raw_coeff}{number}</span></tt></a></li>
+<li><a class="reference internal" href="#poltofloatexprcmd-raw-coeff" id="id110"><tt class="docutils literal">\PolToFloatExprCmd{raw_coeff}</tt></a></li>
</ul>
</li>
-<li><a class="reference internal" href="#id30" id="id108"><tt class="docutils literal"><span class="pre">\PolToFloatExpr*{polname}</span></tt></a></li>
-<li><a class="reference internal" href="#poltolist-polname" id="id109"><tt class="docutils literal">\PolToList{polname}</tt></a></li>
-<li><a class="reference internal" href="#poltocsv-polname" id="id110"><tt class="docutils literal">\PolToCSV{polname}</tt></a></li>
-<li><a class="reference internal" href="#polsturmchainlength-sturmname" id="id111"><tt class="docutils literal">\PolSturmChainLength{sturmname}</tt></a></li>
-<li><a class="reference internal" href="#polsturmifzeroexactlyknown-sturmname-index-a-b" id="id112"><tt class="docutils literal"><span class="pre">\PolSturmIfZeroExactlyKnown{sturmname}{index}{A}{B}</span></tt></a></li>
-<li><a class="reference internal" href="#polsturmisolatedzeroleft-sturmname-index" id="id113"><tt class="docutils literal"><span class="pre">\PolSturmIsolatedZeroLeft{sturmname}{index}</span></tt></a></li>
-<li><a class="reference internal" href="#polsturmisolatedzeroright-sturmname-index" id="id114"><tt class="docutils literal"><span class="pre">\PolSturmIsolatedZeroRight{sturmname}{index}</span></tt></a></li>
-<li><a class="reference internal" href="#polsturmnbofisolatedzeros-sturmname" id="id115"><tt class="docutils literal">\PolSturmNbOfIsolatedZeros{sturmname}</tt></a></li>
-<li><a class="reference internal" href="#polintervalwidth-sturmname-index" id="id116"><tt class="docutils literal"><span class="pre">\PolIntervalWidth{sturmname}{index}</span></tt></a></li>
-<li><a class="reference internal" href="#macros-for-use-within-execution-of-polprintintervals" id="id117">Macros for use within execution of <tt class="docutils literal">\PolPrintIntervals</tt></a><ul>
-<li><a class="reference internal" href="#id31" id="id118"><tt class="docutils literal">\PolPrintIntervalsTheEndPoint</tt></a></li>
-<li><a class="reference internal" href="#id32" id="id119"><tt class="docutils literal">\PolPrintIntervalsTheIndex</tt></a></li>
-<li><a class="reference internal" href="#polifendpointispositive-a-b" id="id120"><tt class="docutils literal"><span class="pre">\PolIfEndPointIsPositive{A}{B}</span></tt></a></li>
-<li><a class="reference internal" href="#polifendpointisnegative-a-b" id="id121"><tt class="docutils literal"><span class="pre">\PolIfEndPointIsNegative{A}{B}</span></tt></a></li>
-<li><a class="reference internal" href="#polifendpointiszero-a-b" id="id122"><tt class="docutils literal"><span class="pre">\PolIfEndPointIsZero{A}{B}</span></tt></a></li>
+<li><a class="reference internal" href="#id31" id="id111"><tt class="docutils literal"><span class="pre">\PolToFloatExpr*{polname}</span></tt></a></li>
+<li><a class="reference internal" href="#poltolist-polname" id="id112"><tt class="docutils literal">\PolToList{polname}</tt></a></li>
+<li><a class="reference internal" href="#poltocsv-polname" id="id113"><tt class="docutils literal">\PolToCSV{polname}</tt></a></li>
+<li><a class="reference internal" href="#polsturmchainlength-sturmname" id="id114"><tt class="docutils literal">\PolSturmChainLength{sturmname}</tt></a></li>
+<li><a class="reference internal" href="#polsturmifzeroexactlyknown-sturmname-index-a-b" id="id115"><tt class="docutils literal"><span class="pre">\PolSturmIfZeroExactlyKnown{sturmname}{index}{A}{B}</span></tt></a></li>
+<li><a class="reference internal" href="#polsturmisolatedzeroleft-sturmname-index" id="id116"><tt class="docutils literal"><span class="pre">\PolSturmIsolatedZeroLeft{sturmname}{index}</span></tt></a></li>
+<li><a class="reference internal" href="#polsturmisolatedzeroright-sturmname-index" id="id117"><tt class="docutils literal"><span class="pre">\PolSturmIsolatedZeroRight{sturmname}{index}</span></tt></a></li>
+<li><a class="reference internal" href="#polsturmisolatedzeromultiplicity-sturmname-index" id="id118"><tt class="docutils literal"><span class="pre">\PolSturmIsolatedZeroMultiplicity{sturmname}{index}</span></tt></a></li>
+<li><a class="reference internal" href="#polsturmnbofisolatedzeros-sturmname" id="id119"><tt class="docutils literal">\PolSturmNbOfIsolatedZeros{sturmname}</tt></a></li>
+<li><a class="reference internal" href="#polsturmnbofrootsof-sturmname-lessthanorequalto-value" id="id120"><tt class="docutils literal"><span class="pre">\PolSturmNbOfRootsOf{sturmname}\LessThanOrEqualTo{value}</span></tt></a></li>
+<li><a class="reference internal" href="#polsturmnbofrootsof-sturmname-lessthanorequaltoexpr-expression" id="id121"><tt class="docutils literal"><span class="pre">\PolSturmNbOfRootsOf{sturmname}\LessThanOrEqualToExpr{expression}</span></tt></a></li>
+<li><a class="reference internal" href="#polsturmnbwithmultofrootsof-sturmname-lessthanorequalto-value" id="id122"><tt class="docutils literal"><span class="pre">\PolSturmNbWithMultOfRootsOf{sturmname}\LessThanOrEqualTo{value}</span></tt></a></li>
+<li><a class="reference internal" href="#polsturmnbwithmultofrootsof-sturmname-lessthanorequaltoexpr-expression" id="id123"><tt class="docutils literal"><span class="pre">\PolSturmNbWithMultOfRootsOf{sturmname}\LessThanOrEqualToExpr{expression}</span></tt></a></li>
+<li><a class="reference internal" href="#polintervalwidth-sturmname-index" id="id124"><tt class="docutils literal"><span class="pre">\PolIntervalWidth{sturmname}{index}</span></tt></a></li>
+<li><a class="reference internal" href="#macros-for-use-within-execution-of-polprintintervals" id="id125">Macros for use within execution of <tt class="docutils literal">\PolPrintIntervals</tt></a><ul>
+<li><a class="reference internal" href="#id32" id="id126"><tt class="docutils literal">\PolPrintIntervalsTheEndPoint</tt></a></li>
+<li><a class="reference internal" href="#id33" id="id127"><tt class="docutils literal">\PolPrintIntervalsTheIndex</tt></a></li>
+<li><a class="reference internal" href="#polifendpointispositive-a-b" id="id128"><tt class="docutils literal"><span class="pre">\PolIfEndPointIsPositive{A}{B}</span></tt></a></li>
+<li><a class="reference internal" href="#polifendpointisnegative-a-b" id="id129"><tt class="docutils literal"><span class="pre">\PolIfEndPointIsNegative{A}{B}</span></tt></a></li>
+<li><a class="reference internal" href="#polifendpointiszero-a-b" id="id130"><tt class="docutils literal"><span class="pre">\PolIfEndPointIsZero{A}{B}</span></tt></a></li>
</ul>
</li>
-<li><a class="reference internal" href="#poldectostring-decimal-number" id="id123"><tt class="docutils literal">\PolDecToString{decimal number}</tt></a></li>
+<li><a class="reference internal" href="#poldectostring-decimal-number" id="id131"><tt class="docutils literal">\PolDecToString{decimal number}</tt></a></li>
</ul>
</li>
-<li><a class="reference internal" href="#booleans-with-default-setting-as-indicated" id="id124">Booleans (with default setting as indicated)</a><ul>
-<li><a class="reference internal" href="#xintverbosefalse" id="id125"><tt class="docutils literal">\xintverbosefalse</tt></a></li>
-<li><a class="reference internal" href="#poltypesetallfalse" id="id126"><tt class="docutils literal">\poltypesetallfalse</tt></a></li>
-<li><a class="reference internal" href="#poltoexprallfalse" id="id127"><tt class="docutils literal">\poltoexprallfalse</tt></a></li>
+<li><a class="reference internal" href="#booleans-with-default-setting-as-indicated" id="id132">Booleans (with default setting as indicated)</a><ul>
+<li><a class="reference internal" href="#xintverbosefalse" id="id133"><tt class="docutils literal">\xintverbosefalse</tt></a></li>
+<li><a class="reference internal" href="#poltypesetallfalse" id="id134"><tt class="docutils literal">\poltypesetallfalse</tt></a></li>
+<li><a class="reference internal" href="#poltoexprallfalse" id="id135"><tt class="docutils literal">\poltoexprallfalse</tt></a></li>
</ul>
</li>
-<li><a class="reference internal" href="#technicalities" id="id128">Technicalities</a></li>
-<li><a class="reference internal" href="#change-log" id="id129">CHANGE LOG</a></li>
-<li><a class="reference internal" href="#acknowledgments" id="id130">Acknowledgments</a></li>
+<li><a class="reference internal" href="#technicalities" id="id136">Technicalities</a></li>
+<li><a class="reference internal" href="#change-log" id="id137">CHANGE LOG</a></li>
+<li><a class="reference internal" href="#acknowledgments" id="id138">Acknowledgments</a></li>
</ul>
</div>
<div class="section" id="basic-examples">
-<h1><a class="toc-backref" href="#id35">Basic Examples</a></h1>
+<h1><a class="toc-backref" href="#id36">Basic Examples</a></h1>
<p>The syntax is:</p>
<pre class="literal-block">
\poldef polname(x):= expression in variable x;
@@ -547,7 +554,7 @@ polynomial must have been defined via <tt class="docutils literal">\PolDiff</tt>
<tt class="docutils literal"><span class="pre">T'(x)^2</span></tt> will not work without a prior <tt class="docutils literal"><span class="pre">\PolDiff{T}{T'}</span></tt>.</p>
</div>
<dl class="docutils">
-<dt><tt class="docutils literal"><span class="pre">\PolDiff{f}{f''}</span></tt></dt>
+<dt><tt class="docutils literal"><span class="pre">\PolDiff{f'}{f''}</span></tt></dt>
<dd>obtains second derivative.</dd>
<dt><tt class="docutils literal"><span class="pre">\PolDiff[3]{f}{f'''}</span></tt></dt>
<dd>computes the third derivative.</dd>
@@ -606,15 +613,7 @@ PSTricks-compatible; the letter used in output can be
</dl>
</div>
<div class="section" id="examples-of-localization-of-roots">
-<h1><a class="toc-backref" href="#id36">Examples of localization of roots</a></h1>
-<div class="admonition attention">
-<p class="first admonition-title">Attention!</p>
-<p class="last">At <tt class="docutils literal">0.5</tt>, <a class="reference internal" href="#poltosturm">\PolToSturm{P}{S}</a> was modified to
-create a chain of primitive integer coefficients polynomials. This
-speeds up evaluations, hence localization of roots afterwards. Thus
-<tt class="docutils literal">S_1</tt> will not necessarily be the derivative of <tt class="docutils literal">S_0</tt>, even if
-<tt class="docutils literal">P</tt> is square-free.</p>
-</div>
+<h1><a class="toc-backref" href="#id37">Examples of localization of roots</a></h1>
<ul>
<li><p class="first">To make printed decimal numbers more enjoyable than via
<tt class="docutils literal">\xintSignedFrac</tt>:</p>
@@ -638,7 +637,7 @@ of the code snippets are not included. Please try them out yourself...</p>
</li>
</ul>
<div class="section" id="a-typical-example">
-<h2><a class="toc-backref" href="#id37">A typical example</a></h2>
+<h2><a class="toc-backref" href="#id38">A typical example</a></h2>
<p>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
@@ -684,7 +683,7 @@ to give the exact value for $X_2$!
</pre>
</div>
<div class="section" id="a-degree-four-polynomial-with-nearby-roots">
-<h2><a class="toc-backref" href="#id38">A degree four polynomial with nearby roots</a></h2>
+<h2><a class="toc-backref" href="#id39">A degree four polynomial with nearby roots</a></h2>
<pre class="literal-block">
\PolDef{Q}{(x-1.050001)(x-1.105001)(x-1.110501)(x-1.111051)}
\PolTypeset{Q}
@@ -707,22 +706,80 @@ to give the exact value for $X_2$!
</pre>
</div>
<div class="section" id="the-degree-nine-polynomial-with-0-99-0-999-0-9999-as-triple-roots">
-<h2><a class="toc-backref" href="#id39">The degree nine polynomial with 0.99, 0.999, 0.9999 as triple roots</a></h2>
+<h2><a class="toc-backref" href="#id40">The degree nine polynomial with 0.99, 0.999, 0.9999 as triple roots</a></h2>
+<pre class="literal-block">
+% define a user command (xinttools is loaded automatically by polexpr)
+\newcommand\showmultiplicities[1]{% #1 = &quot;sturmname&quot;
+\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}&lt;x&lt;\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 &quot;polname&quot; as &quot;sturmname&quot; too
+\PolSturmIsolateZerosAndGetMultiplicities{f}% use the &quot;sturmname&quot; here
+% or \PolSturmIsolateZeros*{f} which is exactly the same, but shorter..
+
+\showmultiplicities{f}
+</pre>
+<p>In this example, the output will look like this (but using math mode):</p>
+<pre class="literal-block">
+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
+</pre>
+<p>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.</p>
+<p>Try it out!</p>
+<p>It is fun to modify only a tiny bit the polynomial and see if polexpr
+survives:</p>
+<pre class="literal-block">
+\PolDef{g}{f(x)+1e-27}
+\PolTypeset{g}\par
+\PolToSturm{g}{g}
+\PolSturmIsolateZeros*{g}
+
+\showmultiplicities{g}
+</pre>
+<p>This produces:</p>
+<pre class="literal-block">
+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 &lt; x &lt; 0.99
+The multiplicity is 1 for the root such that 0.9991 &lt; x &lt; 0.9992
+The multiplicity is 1 for the root such that 0.9997 &lt; x &lt; 0.9998
+</pre>
+<p>Which means that the multiplicity-3 roots each became a real and a pair of
+complex ones. Let's see them better:</p>
<pre class="literal-block">
-\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
+\PolEnsureIntervalLengths{g}{-10}
+
+\showmultiplicities{g}
+</pre>
+<p>which produces:</p>
+<pre class="literal-block">
+The multiplicity is 1 for the root such that 0.9899888032 &lt; x &lt; 0.9899888033
+The multiplicity is 1 for the root such that 0.9991447980 &lt; x &lt; 0.9991447981
+The multiplicity is 1 for the root such that 0.9997663986 &lt; x &lt; 0.9997663987
</pre>
+<p>Try obtaining this with your pocket calculator! (or IEEE-7554 numerics...)</p>
</div>
<div class="section" id="a-mignotte-type-polynomial">
-<h2><a class="toc-backref" href="#id40">A Mignotte type polynomial</a></h2>
+<h2><a class="toc-backref" href="#id41">A Mignotte type polynomial</a></h2>
<pre class="literal-block">
\PolDef{P}{x^10 - (10x-1)^2}%
\PolTypeset{P} % prints it in expanded form
@@ -749,7 +806,7 @@ Finally, we display 20 digits of the second root:
</pre>
</div>
<div class="section" id="the-degree-41-polynomial-with-2-1-9-1-8-0-0-1-1-9-2-as-roots">
-<h2><a class="toc-backref" href="#id41">The degree 41 polynomial with -2, -1.9, -1.8, ..., 0, 0.1, ..., 1.9, 2 as roots</a></h2>
+<h2><a class="toc-backref" href="#id42">The degree 41 polynomial with -2, -1.9, -1.8, ..., 0, 0.1, ..., 1.9, 2 as roots</a></h2>
<pre class="literal-block">
\PolDef{P}{mul((x-i*1e-1), i=-20..20)}% i/10 is same but less efficient
</pre>
@@ -807,7 +864,7 @@ a general interval.</p>
</div>
</div>
<div class="section" id="roots-of-chebyshev-polynomials">
-<h2><a class="toc-backref" href="#id42">Roots of Chebyshev polynomials</a></h2>
+<h2><a class="toc-backref" href="#id43">Roots of Chebyshev polynomials</a></h2>
<pre class="literal-block">
\newcount\mycount
\poldef T_0(x) := 1;
@@ -830,9 +887,9 @@ a general interval.</p>
</div>
</div>
<div class="section" id="non-expandable-macros">
-<h1><a class="toc-backref" href="#id43">Non-expandable macros</a></h1>
+<h1><a class="toc-backref" href="#id44">Non-expandable macros</a></h1>
<div class="section" id="poldef-polname-letter-expression-in-letter">
-<span id="poldef"></span><h2><a class="toc-backref" href="#id44"><tt class="docutils literal">\poldef <span class="pre">polname(letter):=</span> expression in letter;</tt></a></h2>
+<span id="poldef"></span><h2><a class="toc-backref" href="#id45"><tt class="docutils literal">\poldef <span class="pre">polname(letter):=</span> expression in letter;</tt></a></h2>
<blockquote>
<p>This evaluates the <em>polynomial expression</em> and stores the coefficients
in a private structure accessible later via other package macros,
@@ -869,7 +926,7 @@ manually, if needed.</p>
</blockquote>
</div>
<div class="section" id="poldef-letter-polname-expression-in-letter">
-<span id="id2"></span><h2><a class="toc-backref" href="#id45"><tt class="docutils literal"><span class="pre">\PolDef[letter]{polname}{expression</span> in letter}</tt></a></h2>
+<span id="id2"></span><h2><a class="toc-backref" href="#id46"><tt class="docutils literal"><span class="pre">\PolDef[letter]{polname}{expression</span> in letter}</tt></a></h2>
<blockquote>
Does the same as <a class="reference external" href="poldef;">\poldef</a> in an undelimited macro
format (thus avoiding potential problems with the catcode of the
@@ -877,7 +934,7 @@ semi-colon in presence of some packages.) In absence of the
<tt class="docutils literal">[letter]</tt> optional argument, the variable is assumed to be <tt class="docutils literal">x</tt>.</blockquote>
</div>
<div class="section" id="polgenfloatvariant-polname">
-<span id="polgenfloatvariant"></span><h2><a class="toc-backref" href="#id46"><tt class="docutils literal">\PolGenFloatVariant{polname}</tt></a></h2>
+<span id="polgenfloatvariant"></span><h2><a class="toc-backref" href="#id47"><tt class="docutils literal">\PolGenFloatVariant{polname}</tt></a></h2>
<blockquote>
<p>Makes the polynomial also usable in the <tt class="docutils literal">\xintfloatexpr</tt> parser.
It will therein evaluates via an Horner scheme with coefficients
@@ -896,7 +953,7 @@ context.</p>
</blockquote>
</div>
<div class="section" id="pollet-polname-2-polname-1">
-<span id="pollet"></span><h2><a class="toc-backref" href="#id47"><tt class="docutils literal"><span class="pre">\PolLet{polname_2}={polname_1}</span></tt></a></h2>
+<span id="pollet"></span><h2><a class="toc-backref" href="#id48"><tt class="docutils literal"><span class="pre">\PolLet{polname_2}={polname_1}</span></tt></a></h2>
<blockquote>
Makes a copy of the already defined polynomial <tt class="docutils literal">polname_1</tt> to a
new one <tt class="docutils literal">polname_2</tt>. Same effect as
@@ -904,12 +961,12 @@ new one <tt class="docutils literal">polname_2</tt>. Same effect as
<tt class="docutils literal">=</tt> is optional.</blockquote>
</div>
<div class="section" id="polgloballet-polname-2-polname-1">
-<span id="polgloballet"></span><h2><a class="toc-backref" href="#id48"><tt class="docutils literal"><span class="pre">\PolGlobalLet{polname_2}={polname_1}</span></tt></a></h2>
+<span id="polgloballet"></span><h2><a class="toc-backref" href="#id49"><tt class="docutils literal"><span class="pre">\PolGlobalLet{polname_2}={polname_1}</span></tt></a></h2>
<blockquote>
Acts globally.</blockquote>
</div>
<div class="section" id="polassign-polname-toarray-macro">
-<span id="polassign"></span><h2><a class="toc-backref" href="#id49"><tt class="docutils literal"><span class="pre">\PolAssign{polname}\toarray\macro</span></tt></a></h2>
+<span id="polassign"></span><h2><a class="toc-backref" href="#id50"><tt class="docutils literal"><span class="pre">\PolAssign{polname}\toarray\macro</span></tt></a></h2>
<blockquote>
<p>Defines a one-argument expandable macro <tt class="docutils literal"><span class="pre">\macro{#1}</span></tt> which expands
to the (raw) #1th polynomial coefficient.</p>
@@ -932,7 +989,7 @@ indices act the same in both.)</p>
</blockquote>
</div>
<div class="section" id="polget-polname-fromarray-macro">
-<span id="polget"></span><h2><a class="toc-backref" href="#id50"><tt class="docutils literal"><span class="pre">\PolGet{polname}\fromarray\macro</span></tt></a></h2>
+<span id="polget"></span><h2><a class="toc-backref" href="#id51"><tt class="docutils literal"><span class="pre">\PolGet{polname}\fromarray\macro</span></tt></a></h2>
<blockquote>
<p>Does the converse operation to
<tt class="docutils literal"><span class="pre">\PolAssign{polname}\toarray\macro</span></tt>. Each individual
@@ -953,7 +1010,7 @@ via <a class="reference external" href="http://www.ctan.org/pkg/xint">xintfrac</
</blockquote>
</div>
<div class="section" id="polfromcsv-polname-csv">
-<span id="polfromcsv"></span><h2><a class="toc-backref" href="#id51"><tt class="docutils literal"><span class="pre">\PolFromCSV{polname}{&lt;csv&gt;}</span></tt></a></h2>
+<span id="polfromcsv"></span><h2><a class="toc-backref" href="#id52"><tt class="docutils literal"><span class="pre">\PolFromCSV{polname}{&lt;csv&gt;}</span></tt></a></h2>
<blockquote>
<p>Defines a polynomial directly from the comma separated list of
values (or a macro expanding to such a list) of its coefficients,
@@ -975,7 +1032,7 @@ macro <tt class="docutils literal">\xintRaw</tt>.</p>
</blockquote>
</div>
<div class="section" id="poltypeset-polname">
-<span id="poltypeset"></span><h2><a class="toc-backref" href="#id52"><tt class="docutils literal">\PolTypeset{polname}</tt></a></h2>
+<span id="poltypeset"></span><h2><a class="toc-backref" href="#id53"><tt class="docutils literal">\PolTypeset{polname}</tt></a></h2>
<blockquote>
<p>Typesets in descending powers in math mode. It uses letter <tt class="docutils literal">x</tt> but
this can be changed via an optional argument:</p>
@@ -989,7 +1046,7 @@ can be re-defined for customization. Their default definitions are
expandable, but this is not a requirement.</p>
</blockquote>
<div class="section" id="poltypesetcmd-raw-coeff">
-<span id="poltypesetcmd"></span><h3><a class="toc-backref" href="#id53"><tt class="docutils literal">\PolTypesetCmd{raw_coeff}</tt></a></h3>
+<span id="poltypesetcmd"></span><h3><a class="toc-backref" href="#id54"><tt class="docutils literal">\PolTypesetCmd{raw_coeff}</tt></a></h3>
<blockquote>
<p>Checks if the coefficient is <tt class="docutils literal">1</tt> or <tt class="docutils literal"><span class="pre">-1</span></tt> and then skips printing
the <tt class="docutils literal">1</tt>, except for the constant term. Also it sets conditional
@@ -999,7 +1056,7 @@ minus one is handled by <a class="reference internal" href="#poltypesetone-raw-c
</blockquote>
</div>
<div class="section" id="poltypesetone-raw-coeff">
-<span id="poltypesetone"></span><h3><a class="toc-backref" href="#id54"><tt class="docutils literal">\PolTypesetOne{raw_coeff}</tt></a></h3>
+<span id="poltypesetone"></span><h3><a class="toc-backref" href="#id55"><tt class="docutils literal">\PolTypesetOne{raw_coeff}</tt></a></h3>
<blockquote>
<p>The default is <tt class="docutils literal">\xintSignedFrac</tt> but this macro is annoying as it
insists to use a power of ten, and not decimal notation.</p>
@@ -1024,7 +1081,7 @@ which uses decimal notation (at least for the numerator part).</p>
</blockquote>
</div>
<div class="section" id="id6">
-<span id="poltypesetmonomialcmd"></span><h3><a class="toc-backref" href="#id55"><tt class="docutils literal">\PolTypesetMonomialCmd</tt></a></h3>
+<span id="poltypesetmonomialcmd"></span><h3><a class="toc-backref" href="#id56"><tt class="docutils literal">\PolTypesetMonomialCmd</tt></a></h3>
<blockquote>
This decides how a monomial (in variable <tt class="docutils literal">\PolVar</tt> and with
exponent <tt class="docutils literal">\PolIndex</tt>) is to be printed. The default does nothing
@@ -1034,7 +1091,7 @@ for the constant term, <tt class="docutils literal">\PolVar</tt> for the first d
<tt class="docutils literal">\ifnum</tt> tests.</blockquote>
</div>
<div class="section" id="poltypesetcmdprefix-raw-coeff">
-<span id="poltypesetcmdprefix"></span><h3><a class="toc-backref" href="#id56"><tt class="docutils literal">\PolTypesetCmdPrefix{raw_coeff}</tt></a></h3>
+<span id="poltypesetcmdprefix"></span><h3><a class="toc-backref" href="#id57"><tt class="docutils literal">\PolTypesetCmdPrefix{raw_coeff}</tt></a></h3>
<blockquote>
Expands to a <tt class="docutils literal">+</tt> if the <tt class="docutils literal">raw_coeff</tt> is zero or positive, and to
nothing if <tt class="docutils literal">raw_coeff</tt> is negative, as in latter case the
@@ -1045,13 +1102,13 @@ for the first term.</blockquote>
</div>
</div>
<div class="section" id="id8">
-<span id="id7"></span><h2><a class="toc-backref" href="#id57"><tt class="docutils literal"><span class="pre">\PolTypeset*{polname}</span></tt></a></h2>
+<span id="id7"></span><h2><a class="toc-backref" href="#id58"><tt class="docutils literal"><span class="pre">\PolTypeset*{polname}</span></tt></a></h2>
<blockquote>
Typesets in ascending powers. Use e.g. <tt class="docutils literal">[h]</tt> optional argument
(after the <tt class="docutils literal">*</tt>) to use letter <tt class="docutils literal">h</tt> rather than <tt class="docutils literal">x</tt>.</blockquote>
</div>
<div class="section" id="poldiff-polname-1-polname-2">
-<span id="poldiff"></span><h2><a class="toc-backref" href="#id58"><tt class="docutils literal"><span class="pre">\PolDiff{polname_1}{polname_2}</span></tt></a></h2>
+<span id="poldiff"></span><h2><a class="toc-backref" href="#id59"><tt class="docutils literal"><span class="pre">\PolDiff{polname_1}{polname_2}</span></tt></a></h2>
<blockquote>
<p>This sets <tt class="docutils literal">polname_2</tt> to the first derivative of <tt class="docutils literal">polname_1</tt>. It
is allowed to issue <tt class="docutils literal"><span class="pre">\PolDiff{f}{f}</span></tt>, effectively replacing <tt class="docutils literal">f</tt>
@@ -1061,7 +1118,7 @@ by <tt class="docutils literal">f'</tt>.</p>
</blockquote>
</div>
<div class="section" id="poldiff-n-polname-1-polname-2">
-<span id="poldiff-n"></span><h2><a class="toc-backref" href="#id59"><tt class="docutils literal"><span class="pre">\PolDiff[N]{polname_1}{polname_2}</span></tt></a></h2>
+<span id="poldiff-n"></span><h2><a class="toc-backref" href="#id60"><tt class="docutils literal"><span class="pre">\PolDiff[N]{polname_1}{polname_2}</span></tt></a></h2>
<blockquote>
This sets <tt class="docutils literal">polname_2</tt> to the <tt class="docutils literal">N</tt>-th derivative of <tt class="docutils literal">polname_1</tt>.
Identical arguments is allowed. With <tt class="docutils literal">N=0</tt>, same effect as
@@ -1069,7 +1126,7 @@ Identical arguments is allowed. With <tt class="docutils literal">N=0</tt>, same
using <tt class="docutils literal">\PolAntiDiff</tt>.</blockquote>
</div>
<div class="section" id="polantidiff-polname-1-polname-2">
-<span id="polantidiff"></span><h2><a class="toc-backref" href="#id60"><tt class="docutils literal"><span class="pre">\PolAntiDiff{polname_1}{polname_2}</span></tt></a></h2>
+<span id="polantidiff"></span><h2><a class="toc-backref" href="#id61"><tt class="docutils literal"><span class="pre">\PolAntiDiff{polname_1}{polname_2}</span></tt></a></h2>
<blockquote>
<p>This sets <tt class="docutils literal">polname_2</tt> to the primitive of <tt class="docutils literal">polname_1</tt> vanishing
at zero.</p>
@@ -1078,32 +1135,32 @@ at zero.</p>
</blockquote>
</div>
<div class="section" id="polantidiff-n-polname-1-polname-2">
-<span id="polantidiff-n"></span><h2><a class="toc-backref" href="#id61"><tt class="docutils literal"><span class="pre">\PolAntiDiff[N]{polname_1}{polname_2}</span></tt></a></h2>
+<span id="polantidiff-n"></span><h2><a class="toc-backref" href="#id62"><tt class="docutils literal"><span class="pre">\PolAntiDiff[N]{polname_1}{polname_2}</span></tt></a></h2>
<blockquote>
This sets <tt class="docutils literal">polname_2</tt> to the result of <tt class="docutils literal">N</tt> successive integrations on
<tt class="docutils literal">polname_1</tt>. With negative <tt class="docutils literal">N</tt>, it switches to using <tt class="docutils literal">\PolDiff</tt>.</blockquote>
</div>
<div class="section" id="poldivide-polname-1-polname-2-polname-q-polname-r">
-<span id="poldivide"></span><h2><a class="toc-backref" href="#id62"><tt class="docutils literal"><span class="pre">\PolDivide{polname_1}{polname_2}{polname_Q}{polname_R}</span></tt></a></h2>
+<span id="poldivide"></span><h2><a class="toc-backref" href="#id63"><tt class="docutils literal"><span class="pre">\PolDivide{polname_1}{polname_2}{polname_Q}{polname_R}</span></tt></a></h2>
<blockquote>
This sets <tt class="docutils literal">polname_Q</tt> and <tt class="docutils literal">polname_R</tt> to be the quotient and
remainder in the Euclidean division of <tt class="docutils literal">polname_1</tt> by
<tt class="docutils literal">polname_2</tt>.</blockquote>
</div>
<div class="section" id="polquo-polname-1-polname-2-polname-q">
-<span id="polquo"></span><h2><a class="toc-backref" href="#id63"><tt class="docutils literal"><span class="pre">\PolQuo{polname_1}{polname_2}{polname_Q}</span></tt></a></h2>
+<span id="polquo"></span><h2><a class="toc-backref" href="#id64"><tt class="docutils literal"><span class="pre">\PolQuo{polname_1}{polname_2}{polname_Q}</span></tt></a></h2>
<blockquote>
This sets <tt class="docutils literal">polname_Q</tt> to be the quotient in the Euclidean division
of <tt class="docutils literal">polname_1</tt> by <tt class="docutils literal">polname_2</tt>.</blockquote>
</div>
<div class="section" id="polrem-polname-1-polname-2-polname-r">
-<span id="polrem"></span><h2><a class="toc-backref" href="#id64"><tt class="docutils literal"><span class="pre">\PolRem{polname_1}{polname_2}{polname_R}</span></tt></a></h2>
+<span id="polrem"></span><h2><a class="toc-backref" href="#id65"><tt class="docutils literal"><span class="pre">\PolRem{polname_1}{polname_2}{polname_R}</span></tt></a></h2>
<blockquote>
This sets <tt class="docutils literal">polname_R</tt> to be the remainder in the Euclidean division
of <tt class="docutils literal">polname_1</tt> by <tt class="docutils literal">polname_2</tt>.</blockquote>
</div>
<div class="section" id="polgcd-polname-1-polname-2-polname-gcd">
-<span id="polgcd"></span><h2><a class="toc-backref" href="#id65"><tt class="docutils literal"><span class="pre">\PolGCD{polname_1}{polname_2}{polname_GCD}</span></tt></a></h2>
+<span id="polgcd"></span><h2><a class="toc-backref" href="#id66"><tt class="docutils literal"><span class="pre">\PolGCD{polname_1}{polname_2}{polname_GCD}</span></tt></a></h2>
<blockquote>
This sets <tt class="docutils literal">polname_GCD</tt> to be the (monic) GCD of the two first
polynomials. It is a unitary polynomial except if both <tt class="docutils literal">polname_1</tt>
@@ -1129,33 +1186,66 @@ polynomial.</blockquote>
no common factor among the coefficients. -->
</div>
<div class="section" id="poltosturm-polname-sturmname">
-<span id="poltosturm"></span><h2><a class="toc-backref" href="#id66"><tt class="docutils literal"><span class="pre">\PolToSturm{polname}{sturmname}</span></tt></a></h2>
-<blockquote>
-<p>With, for example, <tt class="docutils literal">polname</tt> being <tt class="docutils literal">P</tt> and <tt class="docutils literal">sturmname</tt> being
-<tt class="docutils literal">S</tt>, the macro starts by computing polynomials <tt class="docutils literal">S_0 = P</tt>, <tt class="docutils literal">S_1
-= P'</tt>, ..., with <tt class="docutils literal">S_{n+1}</tt> the opposite of the remainder of
-euclidean division of <tt class="docutils literal"><span class="pre">S_{n-1}</span></tt> by <tt class="docutils literal">S_{n}</tt>.</p>
-<div class="admonition attention">
-<p class="first admonition-title">Attention!</p>
-<p class="last">Since <tt class="docutils literal">0.5</tt>, it further normalizes all these polynomials by making
-them primitive (see <a class="reference internal" href="#polmakeprimitive">\PolMakePrimitive</a>).</p>
-</div>
-<p>The last non-zero remainder <tt class="docutils literal">S_N</tt> is up to a factor the GCD of
-<tt class="docutils literal">P</tt> and <tt class="docutils literal">P'</tt> hence it is a constant (i.e. <tt class="docutils literal">1</tt> or <tt class="docutils literal"><span class="pre">-1</span></tt> since
-<tt class="docutils literal">0.5</tt>) if and only if <tt class="docutils literal">P</tt> is square-free.</p>
-<p>In case <tt class="docutils literal">S_N</tt> is not a constant, the macro then goes on with
-dividing all <tt class="docutils literal">S_k</tt>'s with <tt class="docutils literal">S_N</tt> (which then becomes <tt class="docutils literal">1</tt>).</p>
-<p>Thus <tt class="docutils literal">S_0</tt> has exactly the same real and complex roots as
-polynomial <tt class="docutils literal">polname</tt>, but each root being now with multiplicity one.</p>
+<span id="poltosturm"></span><h2><a class="toc-backref" href="#id67"><tt class="docutils literal"><span class="pre">\PolToSturm{polname}{sturmname}</span></tt></a></h2>
+<blockquote>
+<p>With <tt class="docutils literal">polname</tt> being for example <tt class="docutils literal">P</tt>, the macro starts by
+computing polynomials <tt class="docutils literal">P</tt> and <tt class="docutils literal">P'</tt>, then computes the (opposite
+of the) remainder in euclidean division, iteratively.</p>
+<p>The last non-zero remainder <tt class="docutils literal">P_N_</tt> (where <tt class="docutils literal">N</tt> is obtainable as
+<a class="reference internal" href="#polsturmchainlength-sturmname">\PolSturmChainLength{sturmname}</a>) is up to a factor
+the GCD of <tt class="docutils literal">P</tt> and <tt class="docutils literal">P'</tt> hence it is a constant if and only if
+<tt class="docutils literal">P</tt> is square-free.</p>
+<div class="admonition note">
+<p class="first admonition-title">Note</p>
+<ul class="last simple">
+<li>Since <tt class="docutils literal">0.5</tt> 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 <tt class="docutils literal">1</tt> or <tt class="docutils literal"><span class="pre">-1</span></tt>.</li>
+<li>After this normalization to primitive polynomials, they are
+stored internally as <tt class="docutils literal">sturmname_k_</tt>, <tt class="docutils literal">k=0,1, ...</tt>.</li>
+<li>These polynomials are used internally only. To keep them as
+genuine declared polynomials also after the macro call, use the
+starred variant <a class="reference internal" href="#id9">PolToSturm*</a>.</li>
+</ul>
+</div>
+<div class="admonition note">
+<p class="first admonition-title">Note</p>
+<p class="last">It is perfectly allowed to use the polynomial name as Sturm chain name:
+<tt class="docutils literal"><span class="pre">\PolToSturm{f}(f}</span></tt>.</p>
+</div>
+<p>The macro then declares <tt class="docutils literal">sturmname_0</tt>, <tt class="docutils literal">sturmname_1</tt>, ..., which are
+the (non-declared) <tt class="docutils literal">sturmname_k_</tt> divided by the last one. Division is
+not done if this last one is the constant <tt class="docutils literal">1</tt> or <tt class="docutils literal"><span class="pre">-1</span></tt>, i.e. if the
+original polynomial was square-free. These polynomials are primitive
+polynomials too, i.e. with integer coefficients having no common factor.</p>
+<p>Thus <tt class="docutils literal">sturmname_0</tt> has exactly the same real and complex roots as
+polynomial <tt class="docutils literal">polname</tt>, but with each root now of multiplicity one.</p>
+<p>Notice that <tt class="docutils literal">sturmname_1</tt> isn't necessarily the derivative of
+<tt class="docutils literal">sturmname_0</tt> due to the various normalizations.</p>
+<p>These polynomials <tt class="docutils literal">sturmname_k</tt> (contrarily to the
+<tt class="docutils literal">sturmname_k_</tt> ones) are usable after the macro execution but
+their main utility is for the execution of
+<a class="reference internal" href="#polsturmisolatezeros-sturmname">\PolSturmIsolateZeros{sturmname}</a>.</p>
+<p><a class="reference internal" href="#polsturmchainlength-sturmname">\PolSturmChainLength{sturmname}</a> gives the index of the last
+element of the Sturm chain.</p>
</blockquote>
</div>
<div class="section" id="id10">
-<span id="id9"></span><h2><a class="toc-backref" href="#id67"><tt class="docutils literal"><span class="pre">\PolToSturm*{polname}{sturmname}</span></tt></a></h2>
+<span id="id9"></span><h2><a class="toc-backref" href="#id68"><tt class="docutils literal"><span class="pre">\PolToSturm*{polname}{sturmname}</span></tt></a></h2>
<blockquote>
-Does not divide the Sturm chain by its last element.</blockquote>
+<p>Does the same as <a class="reference internal" href="#poltosturm">un-starred version</a> and additionally it
+keeps for user usage the memory of the <em>un-normalized</em> Sturm chain
+polynomials <tt class="docutils literal">sturmname_k_</tt>, <tt class="docutils literal">k=0,1, <span class="pre">...,</span> N</tt>, with
+<tt class="docutils literal">N</tt> being <a class="reference internal" href="#polsturmchainlength-sturmname">\PolSturmChainLength{sturmname}</a>.</p>
+<div class="admonition note">
+<p class="first admonition-title">Note</p>
+<p class="last">This behaviour was modified at <tt class="docutils literal">0.6</tt>, anyhow the macro was
+broken at <tt class="docutils literal">0.5</tt>.</p>
+</div>
+</blockquote>
</div>
<div class="section" id="polsettosturmchainsignchangesat-macro-sturmname-fraction">
-<span id="polsettosturmchainsignchangesat"></span><h2><a class="toc-backref" href="#id68"><tt class="docutils literal"><span class="pre">\PolSetToSturmChainSignChangesAt{\macro}{sturmname}{fraction}</span></tt></a></h2>
+<span id="polsettosturmchainsignchangesat"></span><h2><a class="toc-backref" href="#id69"><tt class="docutils literal"><span class="pre">\PolSetToSturmChainSignChangesAt{\macro}{sturmname}{fraction}</span></tt></a></h2>
<blockquote>
<p>Sets macro <tt class="docutils literal">\macro</tt> to the number of sign changes in the Sturm
chain with name prefix <tt class="docutils literal">sturmname</tt>, at location <tt class="docutils literal">fraction</tt>
@@ -1172,10 +1262,10 @@ use <tt class="docutils literal">[\empty]</tt> as extra optional argument.</p>
</blockquote>
</div>
<div class="section" id="polsettonbofzeroswithin-macro-sturmname-value-a-value-b">
-<span id="polsettonbofzeroswithin"></span><h2><a class="toc-backref" href="#id69"><tt class="docutils literal"><span class="pre">\PolSetToNbOfZerosWithin{\macro}{sturmname}{value_a}{value_b}</span></tt></a></h2>
+<span id="polsettonbofzeroswithin"></span><h2><a class="toc-backref" href="#id70"><tt class="docutils literal"><span class="pre">\PolSetToNbOfZerosWithin{\macro}{sturmname}{value_a}{value_b}</span></tt></a></h2>
<blockquote>
<p>Applies the <a class="reference external" href="https://en.wikipedia.org/wiki/Sturm%27s_theorem">Sturm Theorem</a> to set <tt class="docutils literal">\macro</tt> to the exact number
-of distinct roots of <tt class="docutils literal">sturmname_0</tt> in the interval <tt class="docutils literal">(value_a,
+of <strong>distinct</strong> roots of <tt class="docutils literal">sturmname_0</tt> in the interval <tt class="docutils literal">(value_a,
value_b]</tt> (the macro first re-orders the value for <tt class="docutils literal">value_a &lt;=
value_b</tt> to hold).</p>
<div class="admonition note">
@@ -1187,17 +1277,39 @@ variant, where one would do <tt class="docutils literal"><span class="pre">\edef
act globally. To make the scope of its macro definition local,
use <tt class="docutils literal">[\empty]</tt> as extra optional argument.</p>
</div>
+<p>See also the expandable
+<a class="reference internal" href="#polsturmnbofrootsof-sturmname-lessthanorequalto-value">\PolSturmNbOfRootsOf{sturmname}\LessThanOrEqualTo{value}</a>, from
+which it is immediate (with <tt class="docutils literal">\numexpr</tt>) to create an expandable
+variant of this macro. However the difference is that this macro
+requires only <a class="reference internal" href="#poltosturm">\PolToSturm</a> to have been executed,
+whereas the expandable variant requires prior execution of
+<a class="reference internal" href="#polsturmisolatezeros">\PolSturmIsolateZeros</a>.</p>
+<p>See also the expandable
+<a class="reference internal" href="#polsturmnbwithmultofrootsof-sturmname-lessthanorequalto-value">\PolSturmNbWithMultOfRootsOf{sturmname}\LessThanOrEqualTo{value}</a>
+which requires prior execution of
+<a class="reference internal" href="#id11">\PolSturmIsolateZeros*</a>.</p>
</blockquote>
</div>
<div class="section" id="polsturmisolatezeros-sturmname">
-<span id="polsturmisolatezeros"></span><h2><a class="toc-backref" href="#id70"><tt class="docutils literal">\PolSturmIsolateZeros{sturmname}</tt></a></h2>
+<span id="polsturmisolatezeros"></span><h2><a class="toc-backref" href="#id71"><tt class="docutils literal">\PolSturmIsolateZeros{sturmname}</tt></a></h2>
<blockquote>
<p>First, it evaluates using <a class="reference external" href="https://en.wikipedia.org/wiki/Sturm%27s_theorem">Sturm theorem</a> the number of distinct
real roots of <tt class="docutils literal">sturmname_0</tt>.</p>
-<div class="admonition important">
-<p class="first admonition-title">Important</p>
-<p class="last">The Sturm chain <strong>must</strong> be of the reduced type, i.e.
-as constructed via <a class="reference internal" href="#poltosturm-polname-sturmname">\PolToSturm{polname}{sturmname}</a>.</p>
+<div class="admonition note">
+<p class="first admonition-title">Note</p>
+<p>The Sturm chain must have been produced by an earlier
+<a class="reference internal" href="#poltosturm-polname-sturmname">\PolToSturm{polname}{sturmname}</a>.</p>
+<p>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.</p>
+<p>Notice that <tt class="docutils literal"><span class="pre">\PolToSturm{f}{f}</span></tt> is perfectly legal (the
+<tt class="docutils literal">sturmname</tt> can be same as the <tt class="docutils literal">polname</tt>): it defines
+polynomials <tt class="docutils literal">f_0</tt>, <tt class="docutils literal">f_1</tt>, ... having <tt class="docutils literal">f</tt> has name prefix.</p>
+<p class="last">Such a prior call
+to <tt class="docutils literal">\PolToSturm</tt> must have been made at any rate for
+<tt class="docutils literal">\PolSturmIsolateZeros</tt> to be usable.</p>
</div>
<p>Then it locates, again using <a class="reference external" href="https://en.wikipedia.org/wiki/Sturm%27s_theorem">Sturm theorem</a>, as many disjoint
intervals as there are roots. Some intervals reduce to singleton
@@ -1241,15 +1353,19 @@ non-letter character <tt class="docutils literal">_</tt> and possibly also digit
the package.</p>
</div>
<p>The start of decimal expansion of a positive <tt class="docutils literal">k</tt>-th root is given
-by <tt class="docutils literal"><span class="pre">\PolSturmIsolatedZeroLeft{sturmname}{k}</span></tt>, and for a negative
-root it is given by <tt class="docutils literal"><span class="pre">\PolSturmIsolatedZeroRight{sturmname}{k}</span></tt>.
-These two decimal numbers are either both zero or both of the same
-sign.</p>
-<p>The number of distinct roots is obtainable as
-<tt class="docutils literal">\PolSturmNbOfIsolatedZeros{sturmname}</tt>.</p>
+by <a class="reference internal" href="#polsturmisolatedzeroleft">\PolSturmIsolatedZeroLeft{sturmname}{k}</a>, and for a negative root it is given
+by <a class="reference internal" href="#polsturmisolatedzeroright">PolSturmIsolatedZeroRight{sturmname}{k}</a>. These two decimal
+numbers are either both zero or both of the same sign.</p>
+<p>The number of distinct roots is obtainable expandably as
+<a class="reference internal" href="#polsturmnbofisolatedzeros-sturmname">\PolSturmNbOfIsolatedZeros{sturmname}</a>.</p>
+<p>Furthermore
+<a class="reference internal" href="#polsturmnbofrootsof-sturmname-lessthanorequalto-value">\PolSturmNbOfRootsOf{sturmname}\LessThanOrEqualTo{value}</a>
+and
+<a class="reference internal" href="#polsturmnbofrootsof-sturmname-lessthanorequaltoexpr-expression">\PolSturmNbOfRootsOf{sturmname}\LessThanOrEqualToExpr{expression}</a>.
+will expandably act as their names indicate.</p>
<div class="admonition note">
<p class="first admonition-title">Note</p>
-<p class="last">In the current implementation the <tt class="docutils literal"><span class="pre">&lt;sturmname&gt;...</span></tt> variables
+<p class="last">In the current implementation the <tt class="docutils literal"><span class="pre">&lt;sturmname&gt;...</span></tt> <a class="reference external" href="http://www.ctan.org/pkg/xint">xintexpr</a> variables
and the <tt class="docutils literal"><span class="pre">\POL_ZeroInt...</span></tt> arrays are globally defined. On the
other hand the Sturm sequence polynomials obey the current scope.</p>
</div>
@@ -1273,8 +1389,42 @@ are studied in numerical mathematics.</p>
</div>
</blockquote>
</div>
+<div class="section" id="id12">
+<span id="id11"></span><h2><a class="toc-backref" href="#id72"><tt class="docutils literal"><span class="pre">\PolSturmIsolateZeros*{sturmname}</span></tt></a></h2>
+<blockquote>
+<p>The macro does the same as <a class="reference internal" href="#polsturmisolatezeros-sturmname">\PolSturmIsolateZeros{sturmname}</a> and
+then in addition it does the extra work to determine all
+multiplicities (of the real roots):
+after executing this macro,
+<a class="reference internal" href="#polsturmisolatedzeromultiplicity-sturmname-index">\PolSturmIsolatedZeroMultiplicity{sturmname}{index}</a> will expand
+to the multiplicity of the root located in the <tt class="docutils literal">index</tt>-th
+interval (intervals are enumerated from left to right, with index
+starting at <tt class="docutils literal">1</tt>).</p>
+<p>Also, the
+<a class="reference internal" href="#polsturmnbwithmultofrootsof-sturmname-lessthanorequalto-value">\PolSturmNbWithMultOfRootsOf{sturmname}\LessThanOrEqualTo{value}</a>
+will be operant.</p>
+<div class="admonition note">
+<p class="first admonition-title">Note</p>
+<p class="last">It is <strong>not</strong> necessary to have executed the <a class="reference internal" href="#id9">PolToSturm*</a> 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 <em>user-level</em>
+genuine polynomials.</p>
+</div>
+<p>See <a class="reference internal" href="#the-degree-nine-polynomial-with-0-99-0-999-0-9999-as-triple-roots">The degree nine polynomial with 0.99, 0.999, 0.9999 as triple
+roots</a> for an example of use.</p>
+</blockquote>
+</div>
+<div class="section" id="polsturmisolatezerosandgetmultiplicities-sturmname">
+<span id="polsturmisolatezerosandgetmultiplicities"></span><h2><a class="toc-backref" href="#id73"><tt class="docutils literal">\PolSturmIsolateZerosAndGetMultiplicities{sturmname}</tt></a></h2>
+<blockquote>
+<p>This is another name for <a class="reference internal" href="#id12">\PolSturmIsolateZeros*{sturmname}</a>.</p>
+<p>See <a class="reference internal" href="#the-degree-nine-polynomial-with-0-99-0-999-0-9999-as-triple-roots">The degree nine polynomial with 0.99, 0.999, 0.9999 as triple
+roots</a> for an example of use.</p>
+</blockquote>
+</div>
<div class="section" id="polrefineinterval-sturmname-index">
-<span id="polrefineinterval"></span><h2><a class="toc-backref" href="#id71"><tt class="docutils literal"><span class="pre">\PolRefineInterval*{sturmname}{index}</span></tt></a></h2>
+<span id="polrefineinterval"></span><h2><a class="toc-backref" href="#id74"><tt class="docutils literal"><span class="pre">\PolRefineInterval*{sturmname}{index}</span></tt></a></h2>
<blockquote>
The <tt class="docutils literal">index</tt>-th interval (starting indexing at one) is further
subdivided as many times as is necessary in order for the newer
@@ -1283,21 +1433,21 @@ the original interval. This means that the <tt class="docutils literal">k</tt>th
strictly separated from the other roots.</blockquote>
</div>
<div class="section" id="polrefineinterval-n-sturmname-index">
-<span id="polrefineinterval-n"></span><h2><a class="toc-backref" href="#id72"><tt class="docutils literal"><span class="pre">\PolRefineInterval[N]{sturmname}{index}</span></tt></a></h2>
+<span id="polrefineinterval-n"></span><h2><a class="toc-backref" href="#id75"><tt class="docutils literal"><span class="pre">\PolRefineInterval[N]{sturmname}{index}</span></tt></a></h2>
<blockquote>
The <tt class="docutils literal">index</tt>-th interval (starting count at one) is further
subdivided once, reducing its length by a factor of 10. This is done
<tt class="docutils literal">N</tt> times if the optional argument <tt class="docutils literal">[N]</tt> is present.</blockquote>
</div>
<div class="section" id="polensureintervallength-sturmname-index-e">
-<span id="polensureintervallength"></span><h2><a class="toc-backref" href="#id73"><tt class="docutils literal"><span class="pre">\PolEnsureIntervalLength{sturmname}{index}{E}</span></tt></a></h2>
+<span id="polensureintervallength"></span><h2><a class="toc-backref" href="#id76"><tt class="docutils literal"><span class="pre">\PolEnsureIntervalLength{sturmname}{index}{E}</span></tt></a></h2>
<blockquote>
The <tt class="docutils literal">index</tt>-th interval is subdivided until its length becomes at
most <tt class="docutils literal">10^E</tt>. This means (for <tt class="docutils literal">E&lt;0</tt>) that the first <tt class="docutils literal"><span class="pre">-E</span></tt> digits
after decimal mark of the <tt class="docutils literal">k</tt>th root will then be known exactly.</blockquote>
</div>
<div class="section" id="polensureintervallengths-sturmname-e">
-<span id="polensureintervallengths"></span><h2><a class="toc-backref" href="#id74"><tt class="docutils literal"><span class="pre">\PolEnsureIntervalLengths{sturmname}{E}</span></tt></a></h2>
+<span id="polensureintervallengths"></span><h2><a class="toc-backref" href="#id77"><tt class="docutils literal"><span class="pre">\PolEnsureIntervalLengths{sturmname}{E}</span></tt></a></h2>
<blockquote>
<p>The intervals as obtained from <tt class="docutils literal">\PolSturmIsolateZeros</tt> are (if
necessary) subdivided further by (base 10) dichotomy in order for
@@ -1308,7 +1458,7 @@ than <tt class="docutils literal">10^E</tt> in output only if it did not change
</blockquote>
</div>
<div class="section" id="polprintintervals-varname-sturmname">
-<span id="polprintintervals"></span><h2><a class="toc-backref" href="#id75"><tt class="docutils literal"><span class="pre">\PolPrintIntervals[varname]{sturmname}</span></tt></a></h2>
+<span id="polprintintervals"></span><h2><a class="toc-backref" href="#id78"><tt class="docutils literal"><span class="pre">\PolPrintIntervals[varname]{sturmname}</span></tt></a></h2>
<blockquote>
<p>This is a convenience macro which prints the bounds for the roots
<tt class="docutils literal">Z_1</tt>, <tt class="docutils literal">Z_2</tt>, ... (the optional argument <tt class="docutils literal">varname</tt> allows to
@@ -1329,8 +1479,8 @@ modified by user. Furthermore these auxiliaries can also use the
following conditionals: <a class="reference internal" href="#polifendpointispositive-a-b">\PolIfEndPointIsPositive{A}{B}</a>,
<a class="reference internal" href="#polifendpointisnegative-a-b">\PolIfEndPointIsNegative{A}{B}</a>, <a class="reference internal" href="#polifendpointiszero-a-b">\PolIfEndPointIsZero{A}{B}</a>.</p>
</blockquote>
-<div class="section" id="id11">
-<span id="polprintintervalsprintexactzero"></span><h3><a class="toc-backref" href="#id76"><tt class="docutils literal">\PolPrintIntervalsPrintExactZero</tt></a></h3>
+<div class="section" id="id13">
+<span id="polprintintervalsprintexactzero"></span><h3><a class="toc-backref" href="#id79"><tt class="docutils literal">\PolPrintIntervalsPrintExactZero</tt></a></h3>
<blockquote>
<p>This is provided to help customize how an exactly known root is
printed in the right most column of the array. The package
@@ -1344,8 +1494,8 @@ exactly, the macro could make a test for the value of
<a class="reference internal" href="#polprintintervalstheindex">\PolPrintIntervalsTheIndex</a> and act accordingly.</p>
</blockquote>
</div>
-<div class="section" id="id12">
-<span id="polprintintervalsprintleftendpoint"></span><h3><a class="toc-backref" href="#id77"><tt class="docutils literal">\PolPrintIntervalsPrintLeftEndPoint</tt></a></h3>
+<div class="section" id="id14">
+<span id="polprintintervalsprintleftendpoint"></span><h3><a class="toc-backref" href="#id80"><tt class="docutils literal">\PolPrintIntervalsPrintLeftEndPoint</tt></a></h3>
<blockquote>
<p>Package definition is:</p>
<pre class="literal-block">
@@ -1353,8 +1503,8 @@ exactly, the macro could make a test for the value of
</pre>
</blockquote>
</div>
-<div class="section" id="id13">
-<span id="polprintintervalsprintrightendpoint"></span><h3><a class="toc-backref" href="#id78"><tt class="docutils literal">\PolPrintIntervalsPrintRightEndPoint</tt></a></h3>
+<div class="section" id="id15">
+<span id="polprintintervalsprintrightendpoint"></span><h3><a class="toc-backref" href="#id81"><tt class="docutils literal">\PolPrintIntervalsPrintRightEndPoint</tt></a></h3>
<blockquote>
<p>Package definition is:</p>
<pre class="literal-block">
@@ -1364,7 +1514,7 @@ exactly, the macro could make a test for the value of
</div>
</div>
<div class="section" id="polmapcoeffs-macro-polname">
-<span id="polmapcoeffs"></span><h2><a class="toc-backref" href="#id79"><tt class="docutils literal"><span class="pre">\PolMapCoeffs{\macro}{polname}</span></tt></a></h2>
+<span id="polmapcoeffs"></span><h2><a class="toc-backref" href="#id82"><tt class="docutils literal"><span class="pre">\PolMapCoeffs{\macro}{polname}</span></tt></a></h2>
<blockquote>
<p>It modifies ('in-place': original coefficients get lost) each
coefficient of the defined polynomial via the <em>expandable</em> macro
@@ -1384,15 +1534,15 @@ will have to be expressed in terms of macros from <a class="reference external"
</blockquote>
</div>
<div class="section" id="polreducecoeffs-polname">
-<span id="polreducecoeffs"></span><h2><a class="toc-backref" href="#id80"><tt class="docutils literal">\PolReduceCoeffs{polname}</tt></a></h2>
+<span id="polreducecoeffs"></span><h2><a class="toc-backref" href="#id83"><tt class="docutils literal">\PolReduceCoeffs{polname}</tt></a></h2>
<blockquote>
About the same as <tt class="docutils literal"><span class="pre">\PolMapCoeffs{\xintIrr}{polname}</span></tt> (but
maintaining a <tt class="docutils literal">[0]</tt> postfix for speedier <a class="reference external" href="http://www.ctan.org/pkg/xint">xintfrac</a> parsing when
polynomial function is used for computations.) This is a
one-argument macro, working 'in-place'.</blockquote>
</div>
-<div class="section" id="id15">
-<span id="id14"></span><h2><a class="toc-backref" href="#id81"><tt class="docutils literal"><span class="pre">\PolReduceCoeffs*{polname}</span></tt></a></h2>
+<div class="section" id="id17">
+<span id="id16"></span><h2><a class="toc-backref" href="#id84"><tt class="docutils literal"><span class="pre">\PolReduceCoeffs*{polname}</span></tt></a></h2>
<blockquote>
<p>This starred variant leaves un-touched the decimal exponent in the
internal representation of the fractional coefficients, i.e. if a
@@ -1411,16 +1561,16 @@ expansion speed of the <a class="reference external" href="http://www.ctan.org/p
</blockquote>
</div>
<div class="section" id="polmakemonic-polname">
-<span id="polmakemonic"></span><h2><a class="toc-backref" href="#id82"><tt class="docutils literal">\PolMakeMonic{polname}</tt></a></h2>
+<span id="polmakemonic"></span><h2><a class="toc-backref" href="#id85"><tt class="docutils literal">\PolMakeMonic{polname}</tt></a></h2>
<blockquote>
Divides by the leading coefficient. It is recommended to execute
-<a class="reference internal" href="#id15">\PolReduceCoeffs*{polname}</a> immediately afterwards. This is not
+<a class="reference internal" href="#id17">\PolReduceCoeffs*{polname}</a> immediately afterwards. This is not
done automatically, due to the case the original polynomial had integer
coefficients and we want to keep the leading one as common
denominator.</blockquote>
</div>
<div class="section" id="polmakeprimitive-polname">
-<span id="polmakeprimitive"></span><h2><a class="toc-backref" href="#id83"><tt class="docutils literal">\PolMakePrimitive{polname}</tt></a></h2>
+<span id="polmakeprimitive"></span><h2><a class="toc-backref" href="#id86"><tt class="docutils literal">\PolMakePrimitive{polname}</tt></a></h2>
<blockquote>
Divides by the integer content see (<a class="reference internal" href="#policontent">\PolIContent</a>). This thus produces a polynomial with integer
coefficients having no common factor. The sign of the leading
@@ -1428,82 +1578,60 @@ coefficient is not modified.</blockquote>
</div>
</div>
<div class="section" id="expandable-macros">
-<h1><a class="toc-backref" href="#id84">Expandable macros</a></h1>
+<h1><a class="toc-backref" href="#id87">Expandable macros</a></h1>
<p>All these macros expand completely in two steps except <tt class="docutils literal">\PolToExpr</tt>
and <tt class="docutils literal">\PolToFloatExpr</tt> (and their auxiliaries) which need a
<tt class="docutils literal">\write</tt>, <tt class="docutils literal">\edef</tt> or a <tt class="docutils literal"><span class="pre">\csname...\endcsname</span></tt> context.</p>
<div class="section" id="poleval-polname-atexpr-numerical-expression">
-<span id="polevalatexpr"></span><h2><a class="toc-backref" href="#id85"><tt class="docutils literal"><span class="pre">\PolEval{polname}\AtExpr{numerical</span> expression}</tt></a></h2>
+<span id="polevalatexpr"></span><h2><a class="toc-backref" href="#id88"><tt class="docutils literal"><span class="pre">\PolEval{polname}\AtExpr{numerical</span> expression}</tt></a></h2>
<blockquote>
It boils down to
<tt class="docutils literal">\xinttheexpr polname(numerical <span class="pre">expression)\relax</span></tt>.</blockquote>
</div>
<div class="section" id="poleval-polname-at-fraction">
-<span id="polevalat"></span><h2><a class="toc-backref" href="#id86"><tt class="docutils literal"><span class="pre">\PolEval{polname}\At{fraction}</span></tt></a></h2>
+<span id="polevalat"></span><h2><a class="toc-backref" href="#id89"><tt class="docutils literal"><span class="pre">\PolEval{polname}\At{fraction}</span></tt></a></h2>
<blockquote>
-<p>Evaluates the polynomial at value <tt class="docutils literal">fraction</tt> which must be in (or
-expand to) a format acceptable to the <a class="reference external" href="http://www.ctan.org/pkg/xint">xintfrac</a> macros.</p>
-<div class="admonition attention">
-<p class="first admonition-title">Attention!</p>
-<p>Meaning was changed at <tt class="docutils literal">0.4</tt>. Formerly <tt class="docutils literal"><span class="pre">\PolEval{P}\At{foo}</span></tt>
-accepted for <tt class="docutils literal">foo</tt> an expression which was handled by
-<tt class="docutils literal">\xintexpr</tt>. See <a class="reference internal" href="#poleval-polname-atexpr-numerical-expression">\PolEval{polname}\AtExpr{numerical
-expression}</a>.</p>
-<p class="last">In particular, to use an <tt class="docutils literal">\xintexpr</tt> user-declared variable (or
-e.g. the variables as defined by <a class="reference external" href="PolSturmIsolateZeros">\PolSturmIsolateZeros</a>) one <strong>must</strong> use the <tt class="docutils literal">\AtExpr</tt> syntax.</p>
-</div>
-</blockquote>
+Evaluates the polynomial at value <tt class="docutils literal">fraction</tt> which must be in (or
+expand to) a format acceptable to the <a class="reference external" href="http://www.ctan.org/pkg/xint">xintfrac</a> macros.</blockquote>
</div>
<div class="section" id="polevalreduced-polname-atexpr-numerical-expression">
-<span id="polevalreducedatexpr"></span><h2><a class="toc-backref" href="#id87"><tt class="docutils literal"><span class="pre">\PolEvalReduced{polname}\AtExpr{numerical</span> expression}</tt></a></h2>
+<span id="polevalreducedatexpr"></span><h2><a class="toc-backref" href="#id90"><tt class="docutils literal"><span class="pre">\PolEvalReduced{polname}\AtExpr{numerical</span> expression}</tt></a></h2>
<blockquote>
Boils down to <tt class="docutils literal">\xinttheexpr reduce(polname(numerical <span class="pre">expression))\relax</span></tt>.</blockquote>
</div>
<div class="section" id="polevalreduced-polname-at-fraction">
-<span id="polevalreducedat"></span><h2><a class="toc-backref" href="#id88"><tt class="docutils literal"><span class="pre">\PolEvalReduced{polname}\At{fraction}</span></tt></a></h2>
+<span id="polevalreducedat"></span><h2><a class="toc-backref" href="#id91"><tt class="docutils literal"><span class="pre">\PolEvalReduced{polname}\At{fraction}</span></tt></a></h2>
<blockquote>
-<p>Evaluates the polynomial at value <tt class="docutils literal">fraction</tt> which must be in (or
+Evaluates the polynomial at value <tt class="docutils literal">fraction</tt> which must be in (or
expand to) a format acceptable to the <a class="reference external" href="http://www.ctan.org/pkg/xint">xintfrac</a> macros, and produce
-an irreducible fraction.</p>
-<div class="admonition attention">
-<p class="first admonition-title">Attention!</p>
-<p class="last">Meaning was changed at <tt class="docutils literal">0.4</tt>. Formerly the evaluation point
-could be given as an expression.</p>
-</div>
-</blockquote>
+an irreducible fraction.</blockquote>
</div>
<div class="section" id="polfloateval-polname-atexpr-numerical-expression">
-<span id="polfloatevalatexpr"></span><h2><a class="toc-backref" href="#id89"><tt class="docutils literal"><span class="pre">\PolFloatEval{polname}\AtExpr{numerical</span> expression}</tt></a></h2>
+<span id="polfloatevalatexpr"></span><h2><a class="toc-backref" href="#id92"><tt class="docutils literal"><span class="pre">\PolFloatEval{polname}\AtExpr{numerical</span> expression}</tt></a></h2>
<blockquote>
<p>Boils down to <tt class="docutils literal">\xintthefloatexpr polname(numerical <span class="pre">expression)\relax</span></tt>.</p>
<p>This is done via a Horner Scheme (see <a class="reference internal" href="#poldef">\poldef</a> and
<a class="reference internal" href="#polgenfloatvariant-polname">\PolGenFloatVariant{polname}</a>), with already rounded
-coefficients. <a class="footnote-reference" href="#id19" id="id17">[2]</a> To use the <em>exact coefficients</em> with <em>exactly
+coefficients. <a class="footnote-reference" href="#id20" id="id18">[2]</a> To use the <em>exact coefficients</em> with <em>exactly
executed</em> additions and multiplications, just insert it in the float
-expression as in this example: <a class="footnote-reference" href="#id20" id="id18">[3]</a></p>
+expression as in this example: <a class="footnote-reference" href="#id21" id="id19">[3]</a></p>
<pre class="literal-block">
\xintthefloatexpr 3.27*\xintexpr f(2.53)\relax^2\relax
</pre>
<p>The <tt class="docutils literal">f(2.53)</tt> is exactly computed then rounded at the time of
getting raised to the power <tt class="docutils literal">2</tt>. Moving the <tt class="docutils literal">^2</tt> inside, that
operation would also be treated exactly.</p>
-<div class="admonition attention">
-<p class="first admonition-title">Attention!</p>
-<p class="last">At <tt class="docutils literal">polexpr 0.3</tt>, polynoms were automatically also prepared for
-use in floating point contexts. This got dropped at <tt class="docutils literal">0.4</tt> for
-optimization purposes. See <a class="reference internal" href="#polgenfloatvariant-polname">\PolGenFloatVariant{polname}</a>.</p>
-</div>
-<table class="docutils footnote" frame="void" id="id19" rules="none">
+<table class="docutils footnote" frame="void" id="id20" rules="none">
<colgroup><col class="label" /><col /></colgroup>
<tbody valign="top">
-<tr><td class="label"><a class="fn-backref" href="#id17">[2]</a></td><td>Anyway each floating point operation starts by rounding its
+<tr><td class="label"><a class="fn-backref" href="#id18">[2]</a></td><td>Anyway each floating point operation starts by rounding its
operands to the floating point precision.</td></tr>
</tbody>
</table>
-<table class="docutils footnote" frame="void" id="id20" rules="none">
+<table class="docutils footnote" frame="void" id="id21" rules="none">
<colgroup><col class="label" /><col /></colgroup>
<tbody valign="top">
-<tr><td class="label"><a class="fn-backref" href="#id18">[3]</a></td><td>The <tt class="docutils literal">\xintexpr</tt> here could be <tt class="docutils literal">\xinttheexpr</tt> but that
+<tr><td class="label"><a class="fn-backref" href="#id19">[3]</a></td><td>The <tt class="docutils literal">\xintexpr</tt> here could be <tt class="docutils literal">\xinttheexpr</tt> but that
would be less efficient. Cf. <a class="reference external" href="http://www.ctan.org/pkg/xint">xintexpr</a> documentation about
nested expressions.</td></tr>
</tbody>
@@ -1511,20 +1639,14 @@ nested expressions.</td></tr>
</blockquote>
</div>
<div class="section" id="polfloateval-polname-at-fraction">
-<span id="polfloatevalat"></span><h2><a class="toc-backref" href="#id90"><tt class="docutils literal"><span class="pre">\PolFloatEval{polname}\At{fraction}</span></tt></a></h2>
+<span id="polfloatevalat"></span><h2><a class="toc-backref" href="#id93"><tt class="docutils literal"><span class="pre">\PolFloatEval{polname}\At{fraction}</span></tt></a></h2>
<blockquote>
-<p>Evaluates the polynomial at value <tt class="docutils literal">fraction</tt> which must be in (or
+Evaluates the polynomial at value <tt class="docutils literal">fraction</tt> which must be in (or
expand to) a format acceptable to the <a class="reference external" href="http://www.ctan.org/pkg/xint">xintfrac</a> macros, and produces
-a floating point number.</p>
-<div class="admonition attention">
-<p class="first admonition-title">Attention!</p>
-<p class="last">Meaning was changed at <tt class="docutils literal">0.4</tt>. Formerly the evaluation point
-could be given as an expression.</p>
-</div>
-</blockquote>
+a floating point number.</blockquote>
</div>
<div class="section" id="polifcoeffisplusorminusone-a-b">
-<span id="polifcoeffisplusorminusone"></span><h2><a class="toc-backref" href="#id91"><tt class="docutils literal"><span class="pre">\PolIfCoeffIsPlusOrMinusOne{A}{B}</span></tt></a></h2>
+<span id="polifcoeffisplusorminusone"></span><h2><a class="toc-backref" href="#id94"><tt class="docutils literal"><span class="pre">\PolIfCoeffIsPlusOrMinusOne{A}{B}</span></tt></a></h2>
<blockquote>
<p>This macro is a priori undefined.</p>
<p>It is defined via the default <a class="reference internal" href="#poltypesetcmd-raw-coeff">\PolTypesetCmd{raw_coeff}</a> to be
@@ -1536,25 +1658,25 @@ plus or minus one, and <tt class="docutils literal">B</tt> if not.</p>
</blockquote>
</div>
<div class="section" id="polleadingcoeff-polname">
-<span id="polleadingcoeff"></span><h2><a class="toc-backref" href="#id92"><tt class="docutils literal">\PolLeadingCoeff{polname}</tt></a></h2>
+<span id="polleadingcoeff"></span><h2><a class="toc-backref" href="#id95"><tt class="docutils literal">\PolLeadingCoeff{polname}</tt></a></h2>
<blockquote>
Expands to the leading coefficient.</blockquote>
</div>
<div class="section" id="polnthcoeff-polname-number">
-<span id="polnthcoeff"></span><h2><a class="toc-backref" href="#id93"><tt class="docutils literal"><span class="pre">\PolNthCoeff{polname}{number}</span></tt></a></h2>
+<span id="polnthcoeff"></span><h2><a class="toc-backref" href="#id96"><tt class="docutils literal"><span class="pre">\PolNthCoeff{polname}{number}</span></tt></a></h2>
<blockquote>
It expands to the raw <tt class="docutils literal">N</tt>-th coefficient (<tt class="docutils literal">0/1[0]</tt> if the index
number is out of range). With <tt class="docutils literal"><span class="pre">N=-1</span></tt>, <tt class="docutils literal"><span class="pre">-2</span></tt>, ... expands to the
leading coefficients.</blockquote>
</div>
<div class="section" id="poldegree-polname">
-<span id="poldegree"></span><h2><a class="toc-backref" href="#id94"><tt class="docutils literal">\PolDegree{polname}</tt></a></h2>
+<span id="poldegree"></span><h2><a class="toc-backref" href="#id97"><tt class="docutils literal">\PolDegree{polname}</tt></a></h2>
<blockquote>
It expands to the degree. This is <tt class="docutils literal"><span class="pre">-1</span></tt> if zero polynomial but this
may change in future. Should it then expand to <tt class="docutils literal"><span class="pre">-\infty</span></tt> ?</blockquote>
</div>
<div class="section" id="policontent-polname">
-<span id="policontent"></span><h2><a class="toc-backref" href="#id95"><tt class="docutils literal">\PolIContent{polname}</tt></a></h2>
+<span id="policontent"></span><h2><a class="toc-backref" href="#id98"><tt class="docutils literal">\PolIContent{polname}</tt></a></h2>
<blockquote>
<p>It expands to the contents of the polynomial, i.e. to the positive
fraction such that dividing by this fraction produces a polynomial
@@ -1563,13 +1685,13 @@ with integer coefficients having no common prime divisor.</p>
</blockquote>
</div>
<div class="section" id="poltoexpr-polname">
-<span id="poltoexpr"></span><h2><a class="toc-backref" href="#id96"><tt class="docutils literal">\PolToExpr{polname}</tt></a></h2>
+<span id="poltoexpr"></span><h2><a class="toc-backref" href="#id99"><tt class="docutils literal">\PolToExpr{polname}</tt></a></h2>
<blockquote>
-<p>Expands <a class="footnote-reference" href="#id22" id="id21">[4]</a> to <tt class="docutils literal"><span class="pre">coeff_N*x^N+...</span></tt> (descending powers.)</p>
-<table class="docutils footnote" frame="void" id="id22" rules="none">
+<p>Expands <a class="footnote-reference" href="#id23" id="id22">[4]</a> to <tt class="docutils literal"><span class="pre">coeff_N*x^N+...</span></tt> (descending powers.)</p>
+<table class="docutils footnote" frame="void" id="id23" rules="none">
<colgroup><col class="label" /><col /></colgroup>
<tbody valign="top">
-<tr><td class="label"><a class="fn-backref" href="#id21">[4]</a></td><td>in a <tt class="docutils literal">\write</tt>, <tt class="docutils literal">\edef</tt>, or <tt class="docutils literal"><span class="pre">\csname...\endcsname</span></tt>, but
+<tr><td class="label"><a class="fn-backref" href="#id22">[4]</a></td><td>in a <tt class="docutils literal">\write</tt>, <tt class="docutils literal">\edef</tt>, or <tt class="docutils literal"><span class="pre">\csname...\endcsname</span></tt>, but
not under <tt class="docutils literal"><span class="pre">\romannumeral-`0</span></tt>.</td></tr>
</tbody>
</table>
@@ -1588,7 +1710,7 @@ of <tt class="docutils literal">\PolToExpr{f}</tt>, but a simple <tt class="docu
the identical result.</p>
</blockquote>
<div class="section" id="poltoexproneterm-raw-coeff-number">
-<span id="poltoexproneterm"></span><h3><a class="toc-backref" href="#id97"><tt class="docutils literal"><span class="pre">\PolToExprOneTerm{raw_coeff}{number}</span></tt></a></h3>
+<span id="poltoexproneterm"></span><h3><a class="toc-backref" href="#id100"><tt class="docutils literal"><span class="pre">\PolToExprOneTerm{raw_coeff}{number}</span></tt></a></h3>
<blockquote>
<p>This two argument expandable command takes care of the monomial and
its coefficient. The default definition is done in order for
@@ -1601,13 +1723,13 @@ or a minus one. See <a class="reference internal" href="#poltoexprtimes">\PolToE
</blockquote>
</div>
<div class="section" id="poltoexpronetermstylea-raw-coeff-number">
-<span id="poltoexpronetermstylea"></span><h3><a class="toc-backref" href="#id98"><tt class="docutils literal"><span class="pre">\PolToExprOneTermStyleA{raw_coeff}{number}</span></tt></a></h3>
+<span id="poltoexpronetermstylea"></span><h3><a class="toc-backref" href="#id101"><tt class="docutils literal"><span class="pre">\PolToExprOneTermStyleA{raw_coeff}{number}</span></tt></a></h3>
<blockquote>
Holds the default package meaning of
<a class="reference internal" href="#poltoexproneterm-raw-coeff-number">\PolToExprOneTerm{raw_coeff}{number}</a>.</blockquote>
</div>
<div class="section" id="poltoexpronetermstyleb-raw-coeff-number">
-<span id="poltoexpronetermstyleb"></span><h3><a class="toc-backref" href="#id99"><tt class="docutils literal"><span class="pre">\PolToExprOneTermStyleB{raw_coeff}{number}</span></tt></a></h3>
+<span id="poltoexpronetermstyleb"></span><h3><a class="toc-backref" href="#id102"><tt class="docutils literal"><span class="pre">\PolToExprOneTermStyleB{raw_coeff}{number}</span></tt></a></h3>
<blockquote>
<p>For output in this style:</p>
<pre class="literal-block">
@@ -1621,7 +1743,7 @@ To revert to package default, issue
</blockquote>
</div>
<div class="section" id="poltoexprcmd-raw-coeff">
-<span id="poltoexprcmd"></span><h3><a class="toc-backref" href="#id100"><tt class="docutils literal">\PolToExprCmd{raw_coeff}</tt></a></h3>
+<span id="poltoexprcmd"></span><h3><a class="toc-backref" href="#id103"><tt class="docutils literal">\PolToExprCmd{raw_coeff}</tt></a></h3>
<blockquote>
It is the one-argument macro used by the package definition of
<tt class="docutils literal">\PolToExprOneTerm</tt> for the coefficients themselves (when not
@@ -1631,21 +1753,21 @@ to <tt class="docutils literal"><span class="pre">\xintIrr{#1}</span></tt> or to
output forcefully reduced coefficients.</blockquote>
</div>
<div class="section" id="poltoexprtermprefix-raw-coeff">
-<span id="poltoexprtermprefix"></span><h3><a class="toc-backref" href="#id101"><tt class="docutils literal">\PolToExprTermPrefix{raw_coeff}</tt></a></h3>
+<span id="poltoexprtermprefix"></span><h3><a class="toc-backref" href="#id104"><tt class="docutils literal">\PolToExprTermPrefix{raw_coeff}</tt></a></h3>
<blockquote>
Defined identically as <a class="reference internal" href="#poltypesetcmdprefix-raw-coeff">\PolTypesetCmdPrefix{raw_coeff}</a>. It
prefixes with a plus sign for non-negative coefficients, because
they don't carry one by themselves.</blockquote>
</div>
-<div class="section" id="id23">
-<span id="poltoexprvar"></span><h3><a class="toc-backref" href="#id102"><tt class="docutils literal">\PolToExprVar</tt></a></h3>
+<div class="section" id="id24">
+<span id="poltoexprvar"></span><h3><a class="toc-backref" href="#id105"><tt class="docutils literal">\PolToExprVar</tt></a></h3>
<blockquote>
This expands to the variable to use in output (it does not have to
be a single letter, may be an expandable macro.) Initial definition
is <tt class="docutils literal">x</tt>.</blockquote>
</div>
-<div class="section" id="id24">
-<span id="poltoexprtimes"></span><h3><a class="toc-backref" href="#id103"><tt class="docutils literal">\PolToExprTimes</tt></a></h3>
+<div class="section" id="id25">
+<span id="poltoexprtimes"></span><h3><a class="toc-backref" href="#id106"><tt class="docutils literal">\PolToExprTimes</tt></a></h3>
<blockquote>
This expands to the symbol used for multiplication of an
<tt class="docutils literal"><span class="pre">x^{number}</span></tt> by the corresponding coefficient. The default is
@@ -1654,14 +1776,14 @@ this will give output incompatible with some professional computer
algebra software).</blockquote>
</div>
</div>
-<div class="section" id="id26">
-<span id="id25"></span><h2><a class="toc-backref" href="#id104"><tt class="docutils literal"><span class="pre">\PolToExpr*{polname}</span></tt></a></h2>
+<div class="section" id="id27">
+<span id="id26"></span><h2><a class="toc-backref" href="#id107"><tt class="docutils literal"><span class="pre">\PolToExpr*{polname}</span></tt></a></h2>
<blockquote>
Expands to <tt class="docutils literal"><span class="pre">coeff_0+coeff_1*x+coeff_2*x^2+...</span></tt> (ascending powers).
Customizable like <a class="reference internal" href="#poltoexpr-polname">\PolToExpr{polname}</a> via the same macros.</blockquote>
</div>
<div class="section" id="poltofloatexpr-polname">
-<span id="poltofloatexpr"></span><h2><a class="toc-backref" href="#id105"><tt class="docutils literal">\PolToFloatExpr{polname}</tt></a></h2>
+<span id="poltofloatexpr"></span><h2><a class="toc-backref" href="#id108"><tt class="docutils literal">\PolToFloatExpr{polname}</tt></a></h2>
<blockquote>
<p>Similar to <a class="reference internal" href="#poltoexpr-polname">\PolToExpr{polname}</a> but uses <a class="reference external" href="\PolToFloatExprCmd{raw_coeff}">\PolToFloatExprCmd</a>
which by default rounds and converts the coefficients to floating
@@ -1680,19 +1802,19 @@ those output by <tt class="docutils literal">\PolToFloatExpr{polname}</tt>.</p>
</div>
</blockquote>
<div class="section" id="poltofloatexproneterm-raw-coeff-number">
-<span id="poltofloatexproneterm"></span><h3><a class="toc-backref" href="#id106"><tt class="docutils literal"><span class="pre">\PolToFloatExprOneTerm{raw_coeff}{number}</span></tt></a></h3>
+<span id="poltofloatexproneterm"></span><h3><a class="toc-backref" href="#id109"><tt class="docutils literal"><span class="pre">\PolToFloatExprOneTerm{raw_coeff}{number}</span></tt></a></h3>
<blockquote>
Similar to <a class="reference external" href="\PolToExprOneTerm{raw_coeff}{number}">\PolToExprOneTerm</a>. But does not treat
especially coefficients equal to plus or minus one.</blockquote>
</div>
<div class="section" id="poltofloatexprcmd-raw-coeff">
-<span id="id28"></span><h3><a class="toc-backref" href="#id107"><tt class="docutils literal">\PolToFloatExprCmd{raw_coeff}</tt></a></h3>
+<span id="id29"></span><h3><a class="toc-backref" href="#id110"><tt class="docutils literal">\PolToFloatExprCmd{raw_coeff}</tt></a></h3>
<blockquote>
<p>It is the one-argument macro used by <tt class="docutils literal">\PolToFloatExprOneTerm</tt>.
Its package definition is <tt class="docutils literal"><span class="pre">\xintFloat{#1}</span></tt>.</p>
<div class="admonition caution">
<p class="first admonition-title">Caution!</p>
-<p>Currently (<a class="reference external" href="http://www.ctan.org/pkg/xint">xint</a> <tt class="docutils literal">1.2p</tt>) <tt class="docutils literal">\xintFloat{0}</tt> outputs <tt class="docutils literal">0.e0</tt>
+<p>Currently (<a class="reference external" href="http://www.ctan.org/pkg/xint">xint</a> <tt class="docutils literal">1.3c</tt>) <tt class="docutils literal">\xintFloat{0}</tt> outputs <tt class="docutils literal">0.e0</tt>
which is perfectly acceptable input for Python, but not for
Maple. Thus, one should better leave the <a class="reference internal" href="#poltoexprallfalse">\poltoexprallfalse</a>
toggle to its default <tt class="docutils literal">\iffalse</tt> state, if one intends to use
@@ -1708,26 +1830,26 @@ in <tt class="docutils literal">xintfrac</tt> raw format.</p>
</blockquote>
</div>
</div>
-<div class="section" id="id30">
-<span id="id29"></span><h2><a class="toc-backref" href="#id108"><tt class="docutils literal"><span class="pre">\PolToFloatExpr*{polname}</span></tt></a></h2>
+<div class="section" id="id31">
+<span id="id30"></span><h2><a class="toc-backref" href="#id111"><tt class="docutils literal"><span class="pre">\PolToFloatExpr*{polname}</span></tt></a></h2>
<blockquote>
Typesets in ascending powers.</blockquote>
</div>
<div class="section" id="poltolist-polname">
-<span id="poltolist"></span><h2><a class="toc-backref" href="#id109"><tt class="docutils literal">\PolToList{polname}</tt></a></h2>
+<span id="poltolist"></span><h2><a class="toc-backref" href="#id112"><tt class="docutils literal">\PolToList{polname}</tt></a></h2>
<blockquote>
Expands to <tt class="docutils literal"><span class="pre">{coeff_0}{coeff_1}...{coeff_N}</span></tt> with <tt class="docutils literal">N</tt> = degree
(except zero polynomial which does give <tt class="docutils literal">{0/1[0]}</tt> and not an
empty output.)</blockquote>
</div>
<div class="section" id="poltocsv-polname">
-<span id="poltocsv"></span><h2><a class="toc-backref" href="#id110"><tt class="docutils literal">\PolToCSV{polname}</tt></a></h2>
+<span id="poltocsv"></span><h2><a class="toc-backref" href="#id113"><tt class="docutils literal">\PolToCSV{polname}</tt></a></h2>
<blockquote>
Expands to <tt class="docutils literal">coeff_0, coeff_1, coeff_2, <span class="pre">.....,</span> coeff_N</tt>. Converse
to <a class="reference internal" href="#polfromcsv-polname-csv">\PolFromCSV</a>.</blockquote>
</div>
<div class="section" id="polsturmchainlength-sturmname">
-<span id="polsturmchainlength"></span><h2><a class="toc-backref" href="#id111"><tt class="docutils literal">\PolSturmChainLength{sturmname}</tt></a></h2>
+<span id="polsturmchainlength"></span><h2><a class="toc-backref" href="#id114"><tt class="docutils literal">\PolSturmChainLength{sturmname}</tt></a></h2>
<blockquote>
<p>Returns the integer <tt class="docutils literal">N</tt> such that <tt class="docutils literal">sturmname_N</tt> is the last one
in the Sturm chain <tt class="docutils literal">sturmname_0</tt>, <tt class="docutils literal">sturmname_1</tt>, ...</p>
@@ -1735,9 +1857,9 @@ in the Sturm chain <tt class="docutils literal">sturmname_0</tt>, <tt class="doc
</blockquote>
</div>
<div class="section" id="polsturmifzeroexactlyknown-sturmname-index-a-b">
-<span id="polsturmifzeroexactlyknown"></span><h2><a class="toc-backref" href="#id112"><tt class="docutils literal"><span class="pre">\PolSturmIfZeroExactlyKnown{sturmname}{index}{A}{B}</span></tt></a></h2>
+<span id="polsturmifzeroexactlyknown"></span><h2><a class="toc-backref" href="#id115"><tt class="docutils literal"><span class="pre">\PolSturmIfZeroExactlyKnown{sturmname}{index}{A}{B}</span></tt></a></h2>
<blockquote>
-<p>Executes <tt class="docutils literal">A</tt> if the <tt class="docutils literal">index</tt>th interval reduces to a singleton,
+<p>Executes <tt class="docutils literal">A</tt> if the <tt class="docutils literal">index</tt>-th interval reduces to a singleton,
i.e. the root is known exactly, else <tt class="docutils literal">B</tt>.</p>
<div class="admonition note">
<p class="first admonition-title">Note</p>
@@ -1752,39 +1874,112 @@ error message (right before everything goes haywire).</p>
</blockquote>
</div>
<div class="section" id="polsturmisolatedzeroleft-sturmname-index">
-<span id="polsturmisolatedzeroleft"></span><h2><a class="toc-backref" href="#id113"><tt class="docutils literal"><span class="pre">\PolSturmIsolatedZeroLeft{sturmname}{index}</span></tt></a></h2>
+<span id="polsturmisolatedzeroleft"></span><h2><a class="toc-backref" href="#id116"><tt class="docutils literal"><span class="pre">\PolSturmIsolatedZeroLeft{sturmname}{index}</span></tt></a></h2>
<blockquote>
-Expands to the left end-point for the <tt class="docutils literal">index</tt>th interval
+Expands to the left end-point for the <tt class="docutils literal">index</tt>-th interval
obtained via <a class="reference internal" href="#polsturmisolatezeros-sturmname">\PolSturmIsolateZeros{sturmname}</a> and possibly
refined afterwards.</blockquote>
</div>
<div class="section" id="polsturmisolatedzeroright-sturmname-index">
-<span id="polsturmisolatedzeroright"></span><h2><a class="toc-backref" href="#id114"><tt class="docutils literal"><span class="pre">\PolSturmIsolatedZeroRight{sturmname}{index}</span></tt></a></h2>
+<span id="polsturmisolatedzeroright"></span><h2><a class="toc-backref" href="#id117"><tt class="docutils literal"><span class="pre">\PolSturmIsolatedZeroRight{sturmname}{index}</span></tt></a></h2>
<blockquote>
-Expands to the right end-point for the <tt class="docutils literal">index</tt>th interval
+Expands to the right end-point for the <tt class="docutils literal">index</tt>-th interval
obtained via <a class="reference internal" href="#polsturmisolatezeros-sturmname">\PolSturmIsolateZeros{sturmname}</a> and possibly
refined afterwards.</blockquote>
</div>
+<div class="section" id="polsturmisolatedzeromultiplicity-sturmname-index">
+<span id="polsturmisolatedzeromultiplicity"></span><h2><a class="toc-backref" href="#id118"><tt class="docutils literal"><span class="pre">\PolSturmIsolatedZeroMultiplicity{sturmname}{index}</span></tt></a></h2>
+<blockquote>
+<p>Expands to the multiplicity of the unique root contained in the
+<tt class="docutils literal">index</tt>-th interval as determined by
+<a class="reference internal" href="#id12">\PolSturmIsolateZeros*{sturmname}</a> and possibly refined
+afterwards.</p>
+<div class="admonition attention">
+<p class="first admonition-title">Attention!</p>
+<p class="last">A prior execution of <a class="reference internal" href="#id12">\PolSturmIsolateZeros*{sturmname}</a> is mandatory.</p>
+</div>
+<p>See <a class="reference internal" href="#the-degree-nine-polynomial-with-0-99-0-999-0-9999-as-triple-roots">The degree nine polynomial with 0.99, 0.999, 0.9999 as triple
+roots</a> for an example of use.</p>
+</blockquote>
+</div>
<div class="section" id="polsturmnbofisolatedzeros-sturmname">
-<span id="polsturmnbofisolatedzeros"></span><h2><a class="toc-backref" href="#id115"><tt class="docutils literal">\PolSturmNbOfIsolatedZeros{sturmname}</tt></a></h2>
+<span id="polsturmnbofisolatedzeros"></span><h2><a class="toc-backref" href="#id119"><tt class="docutils literal">\PolSturmNbOfIsolatedZeros{sturmname}</tt></a></h2>
<blockquote>
Expands to the number of real roots of the polynomial
<tt class="docutils literal">&lt;sturmname&gt;_0</tt> (which is the number of distinct real roots of the
polynomial used to create the Sturm chain via
<a class="reference internal" href="#poltosturm-polname-sturmname">\PolToSturm{polname}{sturmname}</a>.</blockquote>
</div>
+<div class="section" id="polsturmnbofrootsof-sturmname-lessthanorequalto-value">
+<h2><a class="toc-backref" href="#id120"><tt class="docutils literal"><span class="pre">\PolSturmNbOfRootsOf{sturmname}\LessThanOrEqualTo{value}</span></tt></a></h2>
+<blockquote>
+<p>Expands to the number of distinct roots (of the polynomial used to
+create the Sturm chain) less than or equal to the <tt class="docutils literal">value</tt> (i.e. a
+number of fraction recognizable by the <a class="reference external" href="http://www.ctan.org/pkg/xint">xintfrac</a> macros).</p>
+<div class="admonition attention">
+<p class="first admonition-title">Attention!</p>
+<p><a class="reference internal" href="#polsturmisolatezeros-sturmname">\PolSturmIsolateZeros{sturmname}</a> must have been executed
+beforehand.</p>
+<p class="last">And the argument is a <tt class="docutils literal">sturmname</tt>, not a <tt class="docutils literal">polname</tt> (this is
+why the macro contains Sturm in its name), simply to be reminded
+of the above constraint.</p>
+</div>
+</blockquote>
+</div>
+<div class="section" id="polsturmnbofrootsof-sturmname-lessthanorequaltoexpr-expression">
+<h2><a class="toc-backref" href="#id121"><tt class="docutils literal"><span class="pre">\PolSturmNbOfRootsOf{sturmname}\LessThanOrEqualToExpr{expression}</span></tt></a></h2>
+<blockquote>
+<p>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 <tt class="docutils literal">expression</tt>.</p>
+<div class="admonition attention">
+<p class="first admonition-title">Attention!</p>
+<p class="last"><a class="reference internal" href="#polsturmisolatezeros-sturmname">\PolSturmIsolateZeros{sturmname}</a> must have been executed
+beforehand.</p>
+</div>
+</blockquote>
+</div>
+<div class="section" id="polsturmnbwithmultofrootsof-sturmname-lessthanorequalto-value">
+<h2><a class="toc-backref" href="#id122"><tt class="docutils literal"><span class="pre">\PolSturmNbWithMultOfRootsOf{sturmname}\LessThanOrEqualTo{value}</span></tt></a></h2>
+<blockquote>
+<p>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 <tt class="docutils literal">value</tt>.</p>
+<div class="admonition attention">
+<p class="first admonition-title">Attention!</p>
+<p class="last"><a class="reference internal" href="#id12">\PolSturmIsolateZeros*{sturmname}</a> or its alias
+<a class="reference internal" href="#polsturmisolatezerosandgetmultiplicities-sturmname">\PolSturmIsolateZerosAndGetMultiplicities{sturmname}</a>
+must have been executed
+beforehand.</p>
+</div>
+</blockquote>
+</div>
+<div class="section" id="polsturmnbwithmultofrootsof-sturmname-lessthanorequaltoexpr-expression">
+<h2><a class="toc-backref" href="#id123"><tt class="docutils literal"><span class="pre">\PolSturmNbWithMultOfRootsOf{sturmname}\LessThanOrEqualToExpr{expression}</span></tt></a></h2>
+<blockquote>
+<p>Expands to the total number of roots (counted with multiplicities)
+which are less than or equal to the given <tt class="docutils literal">expression</tt>.</p>
+<div class="admonition attention">
+<p class="first admonition-title">Attention!</p>
+<p class="last"><a class="reference internal" href="#id12">\PolSturmIsolateZeros*{sturmname}</a> or its alias
+<a class="reference internal" href="#polsturmisolatezerosandgetmultiplicities-sturmname">\PolSturmIsolateZerosAndGetMultiplicities{sturmname}</a>
+must have been executed
+beforehand.</p>
+</div>
+</blockquote>
+</div>
<div class="section" id="polintervalwidth-sturmname-index">
-<span id="polintervalwidth"></span><h2><a class="toc-backref" href="#id116"><tt class="docutils literal"><span class="pre">\PolIntervalWidth{sturmname}{index}</span></tt></a></h2>
+<span id="polintervalwidth"></span><h2><a class="toc-backref" href="#id124"><tt class="docutils literal"><span class="pre">\PolIntervalWidth{sturmname}{index}</span></tt></a></h2>
<blockquote>
-The <tt class="docutils literal">10^E</tt> width of the current <tt class="docutils literal">index</tt>th root localization
+The <tt class="docutils literal">10^E</tt> width of the current <tt class="docutils literal">index</tt>-th root localization
interval. Output is in <a class="reference external" href="http://www.ctan.org/pkg/xint">xintfrac</a> raw <tt class="docutils literal">1/1[E]</tt> format (if not zero).</blockquote>
</div>
<div class="section" id="macros-for-use-within-execution-of-polprintintervals">
-<h2><a class="toc-backref" href="#id117">Macros for use within execution of <tt class="docutils literal">\PolPrintIntervals</tt></a></h2>
+<h2><a class="toc-backref" href="#id125">Macros for use within execution of <tt class="docutils literal">\PolPrintIntervals</tt></a></h2>
<p>More precisely, they can be used within the replacement texts of the
<a class="reference internal" href="#polprintintervalsprintleftendpoint">\PolPrintIntervalsPrintLeftEndPoint</a>, etc, macros.</p>
-<div class="section" id="id31">
-<span id="polprintintervalstheendpoint"></span><h3><a class="toc-backref" href="#id118"><tt class="docutils literal">\PolPrintIntervalsTheEndPoint</tt></a></h3>
+<div class="section" id="id32">
+<span id="polprintintervalstheendpoint"></span><h3><a class="toc-backref" href="#id126"><tt class="docutils literal">\PolPrintIntervalsTheEndPoint</tt></a></h3>
<blockquote>
Within a custom <a class="reference internal" href="#polprintintervalsprintleftendpoint">\PolPrintIntervalsPrintLeftEndPoint</a>, custom
<a class="reference internal" href="#polprintintervalsprintrightendpoint">\PolPrintIntervalsPrintRightEndPoint</a>, or custom
@@ -1792,8 +1987,8 @@ Within a custom <a class="reference internal" href="#polprintintervalsprintlefte
or right end point of the considered interval. Serves as default
replacement for <a class="reference internal" href="#polprintintervalsprintleftendpoint">\PolPrintIntervalsPrintLeftEndPoint</a> , etc...</blockquote>
</div>
-<div class="section" id="id32">
-<span id="polprintintervalstheindex"></span><h3><a class="toc-backref" href="#id119"><tt class="docutils literal">\PolPrintIntervalsTheIndex</tt></a></h3>
+<div class="section" id="id33">
+<span id="polprintintervalstheindex"></span><h3><a class="toc-backref" href="#id127"><tt class="docutils literal">\PolPrintIntervalsTheIndex</tt></a></h3>
<blockquote>
Within a custom <a class="reference internal" href="#polprintintervalsprintleftendpoint">\PolPrintIntervalsPrintLeftEndPoint</a>, custom
<a class="reference internal" href="#polprintintervalsprintrightendpoint">\PolPrintIntervalsPrintRightEndPoint</a>, or custom
@@ -1804,7 +1999,7 @@ in the replacement text of <a class="reference internal" href="#polprintinterval
the other two similar macros.</blockquote>
</div>
<div class="section" id="polifendpointispositive-a-b">
-<span id="polifendpointispositive"></span><h3><a class="toc-backref" href="#id120"><tt class="docutils literal"><span class="pre">\PolIfEndPointIsPositive{A}{B}</span></tt></a></h3>
+<span id="polifendpointispositive"></span><h3><a class="toc-backref" href="#id128"><tt class="docutils literal"><span class="pre">\PolIfEndPointIsPositive{A}{B}</span></tt></a></h3>
<blockquote>
Within a custom <a class="reference internal" href="#polprintintervalsprintleftendpoint">\PolPrintIntervalsPrintLeftEndPoint</a>, custom
<a class="reference internal" href="#polprintintervalsprintrightendpoint">\PolPrintIntervalsPrintRightEndPoint</a>, or custom
@@ -1812,7 +2007,7 @@ Within a custom <a class="reference internal" href="#polprintintervalsprintlefte
the considered interval end-point is positive, else <tt class="docutils literal">B</tt>.</blockquote>
</div>
<div class="section" id="polifendpointisnegative-a-b">
-<span id="polifendpointisnegative"></span><h3><a class="toc-backref" href="#id121"><tt class="docutils literal"><span class="pre">\PolIfEndPointIsNegative{A}{B}</span></tt></a></h3>
+<span id="polifendpointisnegative"></span><h3><a class="toc-backref" href="#id129"><tt class="docutils literal"><span class="pre">\PolIfEndPointIsNegative{A}{B}</span></tt></a></h3>
<blockquote>
Within a custom <a class="reference internal" href="#polprintintervalsprintleftendpoint">\PolPrintIntervalsPrintLeftEndPoint</a>, custom
<a class="reference internal" href="#polprintintervalsprintrightendpoint">\PolPrintIntervalsPrintRightEndPoint</a>, or custom
@@ -1820,7 +2015,7 @@ Within a custom <a class="reference internal" href="#polprintintervalsprintlefte
the considered interval end-point is negative, else <tt class="docutils literal">B</tt>.</blockquote>
</div>
<div class="section" id="polifendpointiszero-a-b">
-<span id="polifendpointiszero"></span><h3><a class="toc-backref" href="#id122"><tt class="docutils literal"><span class="pre">\PolIfEndPointIsZero{A}{B}</span></tt></a></h3>
+<span id="polifendpointiszero"></span><h3><a class="toc-backref" href="#id130"><tt class="docutils literal"><span class="pre">\PolIfEndPointIsZero{A}{B}</span></tt></a></h3>
<blockquote>
Within a custom <a class="reference internal" href="#polprintintervalsprintleftendpoint">\PolPrintIntervalsPrintLeftEndPoint</a>, custom
<a class="reference internal" href="#polprintintervalsprintrightendpoint">\PolPrintIntervalsPrintRightEndPoint</a>, or custom
@@ -1829,7 +2024,7 @@ the considered interval end-point is zero, else <tt class="docutils literal">B</
</div>
</div>
<div class="section" id="poldectostring-decimal-number">
-<span id="poldectostring"></span><h2><a class="toc-backref" href="#id123"><tt class="docutils literal">\PolDecToString{decimal number}</tt></a></h2>
+<span id="poldectostring"></span><h2><a class="toc-backref" href="#id131"><tt class="docutils literal">\PolDecToString{decimal number}</tt></a></h2>
<blockquote>
<p>This is a utility macro to print decimal numbers. It has been
backported to <a class="reference external" href="http://www.ctan.org/pkg/xint">xintfrac</a> (release <tt class="docutils literal">1.3</tt> of <tt class="docutils literal">2018/03/01</tt>) under
@@ -1846,9 +2041,9 @@ zeroes, one can use <tt class="docutils literal"><span class="pre">\PolDecToStri
</div>
</div>
<div class="section" id="booleans-with-default-setting-as-indicated">
-<h1><a class="toc-backref" href="#id124">Booleans (with default setting as indicated)</a></h1>
+<h1><a class="toc-backref" href="#id132">Booleans (with default setting as indicated)</a></h1>
<div class="section" id="xintverbosefalse">
-<h2><a class="toc-backref" href="#id125"><tt class="docutils literal">\xintverbosefalse</tt></a></h2>
+<h2><a class="toc-backref" href="#id133"><tt class="docutils literal">\xintverbosefalse</tt></a></h2>
<blockquote>
<p>This is actually an <a class="reference external" href="http://www.ctan.org/pkg/xint">xintexpr</a> configuration. Setting it to
<tt class="docutils literal">true</tt> triggers the writing of information to the log when new
@@ -1861,20 +2056,20 @@ unstable and undocumented internal structures.</p>
</blockquote>
</div>
<div class="section" id="poltypesetallfalse">
-<h2><a class="toc-backref" href="#id126"><tt class="docutils literal">\poltypesetallfalse</tt></a></h2>
+<h2><a class="toc-backref" href="#id134"><tt class="docutils literal">\poltypesetallfalse</tt></a></h2>
<blockquote>
If <tt class="docutils literal">true</tt>, <a class="reference internal" href="#poltypeset-polname">\PolTypeset{polname}</a> will also typeset the vanishing
coefficients.</blockquote>
</div>
<div class="section" id="poltoexprallfalse">
-<h2><a class="toc-backref" href="#id127"><tt class="docutils literal">\poltoexprallfalse</tt></a></h2>
+<h2><a class="toc-backref" href="#id135"><tt class="docutils literal">\poltoexprallfalse</tt></a></h2>
<blockquote>
If <tt class="docutils literal">true</tt>, <a class="reference internal" href="#poltoexpr-polname">\PolToExpr{polname}</a> and <a class="reference internal" href="#poltofloatexpr-polname">\PolToFloatExpr{polname}</a> will
also include the vanishing coefficients in their outputs.</blockquote>
</div>
</div>
<div class="section" id="technicalities">
-<h1><a class="toc-backref" href="#id128">Technicalities</a></h1>
+<h1><a class="toc-backref" href="#id136">Technicalities</a></h1>
<ul>
<li><p class="first">The catcode of the semi-colon is reset temporarily by <a class="reference internal" href="#poldef">\poldef</a> macro in case some other package (for example the French
babel module) may have made it active. This will fail though if the
@@ -1883,7 +2078,7 @@ can use <a class="reference internal" href="#id2">\PolDef{f}{P(x)}</a>
rather. The colon in <tt class="docutils literal">:=</tt> may be active with no consequences.</p>
</li>
<li><p class="first">As a consequence of <a class="reference external" href="http://www.ctan.org/pkg/xint">xintfrac</a> addition and subtraction always using
-least common multiples for the denominators <a class="footnote-reference" href="#id34" id="id33">[5]</a>, user-chosen common
+least common multiples for the denominators <a class="footnote-reference" href="#id35" id="id34">[5]</a>, user-chosen common
denominators survive additions and multiplications. For example, this:</p>
<pre class="literal-block">
\poldef P(x):= 1/2 + 2/2*x + 3/2*x^3 + 4/2*x^4;
@@ -1899,10 +2094,10 @@ denominators survive additions and multiplications. For example, this:</p>
default) it recognizes and filters out coefficients equal to one or
minus one (since release <tt class="docutils literal">0.3</tt>). One can use for example
<tt class="docutils literal">\PolToCSV{PQ}</tt> to see the internally stored coefficients.</p>
-<table class="docutils footnote" frame="void" id="id34" rules="none">
+<table class="docutils footnote" frame="void" id="id35" rules="none">
<colgroup><col class="label" /><col /></colgroup>
<tbody valign="top">
-<tr><td class="label"><a class="fn-backref" href="#id33">[5]</a></td><td><p class="first last">prior to <tt class="docutils literal">0.4.1</tt>, <tt class="docutils literal">polexpr</tt> used to temporarily patch
+<tr><td class="label"><a class="fn-backref" href="#id34">[5]</a></td><td><p class="first last">prior to <tt class="docutils literal">0.4.1</tt>, <tt class="docutils literal">polexpr</tt> used to temporarily patch
during the parsing of polynomials the <a class="reference external" href="http://www.ctan.org/pkg/xint">xintfrac</a> macros. This
patch was backported to <a class="reference external" href="http://www.ctan.org/pkg/xint">xint</a> at release <tt class="docutils literal">1.3</tt>.</p>
</td></tr>
@@ -1931,7 +2126,7 @@ documented and unstable. Don't use them.</p>
</ul>
</div>
<div class="section" id="change-log">
-<h1><a class="toc-backref" href="#id129">CHANGE LOG</a></h1>
+<h1><a class="toc-backref" href="#id137">CHANGE LOG</a></h1>
<ul>
<li><p class="first">v0.1 (2018/01/11): initial release. Features:</p>
<ul class="simple">
@@ -1971,7 +2166,7 @@ using expressions in the second argument.</p>
<ul class="simple">
<li><a class="reference internal" href="#poltoexpr">\PolToExpr</a> now by default uses <em>descending</em>
powers (it also treats differently coefficients equal to 1 or -1.)
-Use <a class="reference internal" href="#id25">\PolToExpr*</a> for <em>ascending</em> powers.</li>
+Use <a class="reference internal" href="#id26">\PolToExpr*</a> for <em>ascending</em> powers.</li>
<li><a class="reference internal" href="#polevalat">\PolEval</a> reduced the output to smallest terms,
but as this is costly with big fractions and not needed if e.g.
wrapped in an <tt class="docutils literal">\xintRound</tt> or <tt class="docutils literal">\xintFloat</tt>, this step has been
@@ -1988,7 +2183,7 @@ removed; the former meaning is available as <a class="reference internal" href="
<li><a class="reference internal" href="#poltoexproneterm">\PolToExprOneTerm</a></li>
<li><a class="reference internal" href="#poltofloatexproneterm">\PolToFloatExprOneTerm</a></li>
<li><a class="reference internal" href="#poltoexprcmd">\PolToExprCmd</a></li>
-<li><a class="reference internal" href="#id28">\PolToFloatExprCmd</a></li>
+<li><a class="reference internal" href="#id29">\PolToFloatExprCmd</a></li>
<li><a class="reference internal" href="#poltoexprtermprefix">\PolToExprTermPrefix</a></li>
<li><a class="reference internal" href="#poltoexprvar">\PolToExprVar</a></li>
<li><a class="reference internal" href="#poltoexprtimes">\PolToExprTimes</a></li>
@@ -2073,7 +2268,7 @@ they actually make pre-existing such variant undefined.</p>
<li><a class="reference internal" href="#polprintintervalsprintexactzero">\PolPrintIntervalsPrintExactZero</a></li>
<li><a class="reference internal" href="#polprintintervalsprintleftendpoint">\PolPrintIntervalsPrintLeftEndPoint</a></li>
<li><a class="reference internal" href="#polprintintervalsprintrightendpoint">\PolPrintIntervalsPrintRightEndPoint</a></li>
-<li><a class="reference internal" href="#id14">\PolReduceCoeffs*</a></li>
+<li><a class="reference internal" href="#id16">\PolReduceCoeffs*</a></li>
<li><a class="reference internal" href="#polmakemonic">\PolMakeMonic</a></li>
</ul>
</li>
@@ -2151,15 +2346,41 @@ an interval specification.</li>
</li>
</ul>
</li>
+<li><p class="first">v0.6 (2018/11/20)</p>
+<ul class="simple">
+<li>bugfix:<ul>
+<li>the starred variant <a class="reference internal" href="#id10">\PolToSturm*{polname}{sturmname}</a> was
+broken. On the occasion of the fix, its meaning has been modified,
+see its documentation.</li>
+<li>using <a class="reference internal" href="#poltosturm">\PolToSturm</a> with a constant polynomial
+caused a division by zero error.</li>
+</ul>
+</li>
+<li>new macro:<ul>
+<li><a class="reference internal" href="#id11">\PolSturmIsolateZeros*</a>
+acts like the <a class="reference internal" href="#polsturmisolatezeros">non-starred variant</a> then computes all the multiplicities.</li>
+</ul>
+</li>
+<li>new expandable macros:<ul>
+<li><a class="reference internal" href="#polsturmisolatedzeromultiplicity-sturmname-index">\PolSturmIsolatedZeroMultiplicity{sturmname}{index}</a></li>
+<li><a class="reference internal" href="#polsturmnbofrootsof-sturmname-lessthanorequalto-value">\PolSturmNbOfRootsOf{sturmname}\LessThanOrEqualTo{value}</a></li>
+<li><a class="reference internal" href="#polsturmnbofrootsof-sturmname-lessthanorequaltoexpr-expression">\PolSturmNbOfRootsOf{sturmname}\LessThanOrEqualToExpr{expression}</a></li>
+<li><a class="reference internal" href="#polsturmnbwithmultofrootsof-sturmname-lessthanorequalto-value">\PolSturmNbWithMultOfRootsOf{sturmname}\LessThanOrEqualTo{value}</a></li>
+<li><a class="reference internal" href="#polsturmnbwithmultofrootsof-sturmname-lessthanorequaltoexpr-expression">\PolSturmNbWithMultOfRootsOf{sturmname}\LessThanOrEqualToExpr{expression}</a></li>
+</ul>
+</li>
+</ul>
+</li>
</ul>
</div>
<div class="section" id="acknowledgments">
-<h1><a class="toc-backref" href="#id130">Acknowledgments</a></h1>
+<h1><a class="toc-backref" href="#id138">Acknowledgments</a></h1>
<p>Thanks to Jürgen Gilg whose question about <a class="reference external" href="http://www.ctan.org/pkg/xint">xint</a> usage for
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.</p>
-<p>Renewed thanks on occasion of <tt class="docutils literal">0.4</tt> release!</p>
+<p>Renewed thanks to them on occasion of the <tt class="docutils literal">0.6</tt> release for their
+continued interest.</p>
<p>See README.md for the License.</p>
</div>
</div>
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.