texlive[49213] Master/texmf-dist: polexpr (21nov18)

commits+karl at tug.org commits+karl at tug.org
Wed Nov 21 22:59:41 CET 2018


Revision: 49213
          http://tug.org/svn/texlive?view=revision&revision=49213
Author:   karl
Date:     2018-11-21 22:59:41 +0100 (Wed, 21 Nov 2018)
Log Message:
-----------
polexpr (21nov18)

Modified Paths:
--------------
    trunk/Master/texmf-dist/doc/latex/polexpr/README.md
    trunk/Master/texmf-dist/doc/latex/polexpr/polexpr.html
    trunk/Master/texmf-dist/doc/latex/polexpr/polexpr.txt
    trunk/Master/texmf-dist/tex/latex/polexpr/polexpr.sty

Modified: trunk/Master/texmf-dist/doc/latex/polexpr/README.md
===================================================================
--- trunk/Master/texmf-dist/doc/latex/polexpr/README.md	2018-11-21 21:59:30 UTC (rev 49212)
+++ trunk/Master/texmf-dist/doc/latex/polexpr/README.md	2018-11-21 21:59:41 UTC (rev 49213)
@@ -71,10 +71,11 @@
       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.6 release:
 
-Files of 0.5.1 release:
-
 - README.md,
 - polexpr.sty (package file),
 - polexpr.txt (documentation),
@@ -89,5 +90,3 @@
 [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!

Modified: trunk/Master/texmf-dist/doc/latex/polexpr/polexpr.html
===================================================================
--- trunk/Master/texmf-dist/doc/latex/polexpr/polexpr.html	2018-11-21 21:59:30 UTC (rev 49212)
+++ trunk/Master/texmf-dist/doc/latex/polexpr/polexpr.html	2018-11-21 21:59:41 UTC (rev 49213)
@@ -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 at python.org)
 :Id: $Id: html4css1.css 7952 2016-07-26 18:15:59Z milde $
@@ -362,130 +362,137 @@
 <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}{<csv>}</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}{<csv>}</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 @@
 <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 @@
 </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 @@
 </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 @@
 </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 @@
 </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">
-\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}
 </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 < 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
+</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">
+\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 < 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
+</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 @@
 </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 @@
 </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 @@
 </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 @@
 </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 @@
 <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 @@
 </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 @@
 <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 @@
 </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 @@
 </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}{<csv>}</span></tt></a></h2>
+<span id="polfromcsv"></span><h2><a class="toc-backref" href="#id52"><tt class="docutils literal"><span class="pre">\PolFromCSV{polname}{<csv>}</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 @@
 </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 @@
 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 @@
 </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 @@
 </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 @@
 <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 @@
 </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 @@
 </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 @@
 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,13 +1135,13 @@
 </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
@@ -1091,19 +1148,19 @@
 <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 @@
  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>
+<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, 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>
+<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>
-<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>
+<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 @@
 </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 <=
 value_b</tt> to hold).</p>
 <div class="admonition note">
@@ -1187,17 +1277,39 @@
 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 @@
 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"><sturmname>...</span></tt> variables
+<p class="last">In the current implementation the <tt class="docutils literal"><span class="pre"><sturmname>...</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 @@
 </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,7 +1433,7 @@
 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
@@ -1290,7 +1440,7 @@
 <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<0</tt>) that the first <tt class="docutils literal"><span class="pre">-E</span></tt> digits
@@ -1297,7 +1447,7 @@
 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 @@
 </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 @@
 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 @@
 <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 @@
 </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 @@
 </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,7 +1534,7 @@
 </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
@@ -1391,8 +1541,8 @@
 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 @@
 </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,59 +1578,43 @@
 </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>
+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>
-</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>
+an irreducible fraction.</blockquote>
 </div>
-</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>
@@ -1487,23 +1621,17 @@
 <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 @@
 </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>
+a floating point number.</blockquote>
 </div>
-</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,12 +1658,12 @@
 </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
@@ -1548,13 +1670,13 @@
 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 @@
 </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 @@
 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 @@
 </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 @@
 </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 @@
 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 @@
 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 @@
 </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,13 +1830,13 @@
 </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
@@ -1721,13 +1843,13 @@
 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 @@
 </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,21 +1874,36 @@
 </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"><sturmname>_0</tt> (which is the number of distinct real roots of the
@@ -1773,18 +1910,76 @@
 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 @@
 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 @@
 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 @@
 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 @@
 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 @@
 </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 @@
 </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,13 +2056,13 @@
 </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>
@@ -1874,7 +2069,7 @@
 </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 @@
 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 @@
 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 @@
 </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 @@
 <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 @@
 <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 @@
 <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 @@
 </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>

Modified: trunk/Master/texmf-dist/doc/latex/polexpr/polexpr.txt
===================================================================
--- trunk/Master/texmf-dist/doc/latex/polexpr/polexpr.txt	2018-11-21 21:59:30 UTC (rev 49212)
+++ trunk/Master/texmf-dist/doc/latex/polexpr/polexpr.txt	2018-11-21 21:59:41 UTC (rev 49213)
@@ -4,8 +4,8 @@
  Package polexpr documentation
 ===============================
 
-0.5.1 (2018/04/22)
-==================
+0.6 (2018/11/20)
+================
 
 .. contents::
 
@@ -79,7 +79,7 @@
    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 @@
 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,17 +243,79 @@
 
 ::
 
-  \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,33 +791,68 @@
 ``\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.
 
-       Since ``0.5``, it further normalizes all these polynomials by making
-       them primitive (see `\\PolMakePrimitive`_).
+    .. note::
 
-    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.
+       - 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``.
 
-    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``).
+       - After this normalization to primitive polynomials, they are
+         stored internally as ``sturmname_k_``, ``k=0,1, ...``.
 
-    Thus ``S_0`` has exactly the same real and complex roots as
-    polynomial ``polname``, but each root being now with multiplicity one.
+       - These polynomials are used internally only. To keep them as
+         genuine declared polynomials also after the macro call, use the
+         starred variant `PolToSturm*`_.
 
+    .. 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.
+
+    Notice that ``sturmname_1`` isn't necessarily the derivative of
+    ``sturmname_0`` due to the various normalizations.
+
+    These polynomials ``sturmname_k`` (contrarily to the
+    ``sturmname_k_`` ones) are usable after the macro execution but
+    their main utility is for the execution of
+    `\\PolSturmIsolateZeros{sturmname}`_.
+
+    `\\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:
 
 ``\PolSetToSturmChainSignChangesAt{\macro}{sturmname}{fraction}``
@@ -790,7 +879,7 @@
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
     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 @@
        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 @@
     First, it evaluates using `Sturm theorem`_ the number of distinct
     real roots of ``sturmname_0``.
 
-    .. important::
+    .. note::
 
-       The Sturm chain **must** be of the reduced type, i.e.
-       as constructed via `\\PolToSturm{polname}{sturmname}`_.
+       The Sturm chain must have been produced by an earlier
+       `\\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 @@
        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 as
-    ``\PolSturmNbOfIsolatedZeros{sturmname}``.
+    The number of distinct roots is obtainable expandably 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 @@
        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 @@
     It boils down to
     ``\xinttheexpr polname(numerical expression)\relax``.
 
-
 .. _PolEvalAt:
 
 ``\PolEval{polname}\At{fraction}``
@@ -1101,17 +1263,6 @@
     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 @@
     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,12 +1300,7 @@
     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 @@
     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 @@
 
     .. 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 @@
 ``\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 @@
 ``\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 @@
 ``\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 @@
     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 @@
 
     - 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 @@
 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.
 

Modified: trunk/Master/texmf-dist/tex/latex/polexpr/polexpr.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/polexpr/polexpr.sty	2018-11-21 21:59:30 UTC (rev 49212)
+++ trunk/Master/texmf-dist/tex/latex/polexpr/polexpr.sty	2018-11-21 21:59:41 UTC (rev 49213)
@@ -1,13 +1,15 @@
 % author: Jean-François Burnol
 % License: LPPL 1.3c (author-maintained)
 \ProvidesPackage{polexpr}%
-  [2018/04/22 v0.5.1 Polynomial expressions with rational coefficients (JFB)]%
-\RequirePackage{xintexpr}[2018/03/01]% xint 1.3
+  [2018/11/20 v0.6 Polynomial expressions with rational coefficients (JFB)]%
+\RequirePackage{xintexpr}[2018/06/17]% xint 1.3c for \ifxintglobaldefs boolean
 \edef\POL at restorecatcodes
     {\catcode`\noexpand\_ \the\catcode`\_ %
      \catcode`\noexpand\! \the\catcode`\! %
      \catcode0 \the\catcode0\relax}%
 \catcode`\_ 11 \catcode0 12
+\long\def\xint_stop_atfirstoftwo  #1#2{ #1}% not yet in xint 1.3c
+\long\def\xint_stop_atsecondoftwo #1#2{ #2}%
 
 %% PATCH xintexpr TO AUTHORIZE ' IN NAMES (0.5.1)
 \catcode`\! 11
@@ -30,7 +32,7 @@
 \newif\ifPOL at pol
 \newif\ifxintveryverbose
 \newif\ifpoltypesetall
-\newif\ifPOL at sturm@normalize
+\newif\ifPOL at sturm@declareunnormalized
 \newif\ifPOL at isolz@nextwillneedrefine
 \newif\ifpoltoexprall
 %% the main exchange structure (stored in macros \POLuserpol@<name>)
@@ -362,7 +364,7 @@
        \def\POL at mapcoeffs@macro{#1}%
        \expandafter\expandafter\expandafter\POL at split
          \csname POLuserpol@#2\endcsname;\POL at mapcoeffs@deg\POL at mapcoeffs@coeffs
-% attention à ne pas faire un \expandafter ici, car brace removal si 1 item
+% ATTENTION à ne pas faire un \expandafter ici, car brace removal si 1 item
        \xintAssignArray\POL at mapcoeffs@coeffs\to\POL at arrayA
        \def\index{0}%
        \count@\z@
@@ -686,58 +688,100 @@
 
 %% Sturm Algorithm (polexpr 0.4)
 %% 0.5 uses primitive polynomials for faster evaluations afterwards
-\newcommand\PolToSturm{%
-    \@ifstar{\POL at sturm@normalizefalse}{\POL at sturm@normalizetrue}%
-    \POL at ToSturm
+%% 0.6 corrects misuse of \@ifstar! (mumble). \PolToSturm* was broken.
+%% 0.6's \PolToSturm* defines both normalized and unnormalized, the
+%%       unnormalized using two underscores, so both are available
+%%       Sole difference is that \PolToSturm* also declares them as 
+%%       user polynomials, whereas the non-starred only keeps the macros
+%%       holding the coefficients in memory
+%% 0.6 fixes the case of a constant polynomial P which caused division
+%%     by zero error from P'.
+\newcommand\PolToSturm{\@ifstar
+   {\POL at sturm@declareunnormalizedtrue\POL at ToSturm}%
+   {\POL at sturm@declareunnormalizedfalse\POL at ToSturm}%
 }%
-\def\POL at aux@toint#1{\xintREZ{\xintNum{#1}}}%
+\def\POL at aux@toint#1{\xintREZ{\xintNum{#1}}}% for polynomials with int. coeffs!
 \def\POL at ToSturm#1#2{%
   \edef\POL at sturmname{#2}%
-  \POL at let{\POL at sturmname _0}{#1}%
-  \PolMakePrimitive{\POL at sturmname _0}%
-  \POL at Diff@@one{\POL at sturmname _0}{\POL at sturmname _1}%
+  % 0.6 uses 2 underscores (one before index, one after) to keep in memory
+  % the unnormalized chain
+  \POL at let{\POL at sturmname _0_}{#1}%
+  \ifnum\PolDegree{#1}=\z@
+     \def\POL at sturm@N{0}%
+     \POL at count\z@
+     % if I applied the same as for positive degree, I should make it -1
+     % if constant is negative. I also don't worry if polynomial is zero.
+     \@namedef{POLuserpol@\POL at sturmname _0}{0.\empty{1/1[0]}}%
+  \else
+     \POL at ToSturm@DoSturm
+  \fi
+  \expandafter
+  \let\csname PolSturmChainLength_\POL at sturmname\endcsname\POL at sturm@N
+  % declare the normalized ones as full-fledged polynomials
+  % \POL at count\z@
+  \xintloop
+    \POL at newpol{\POL at sturmname _\the\POL at count}%
+  \unless\ifnum\POL at sturm@N=\POL at count
+    \advance\POL at count\@ne
+  \repeat
+  % optionally declare also the unnormalized ones
+  \POL at count\z@
+  \ifPOL at sturm@declareunnormalized
+    \POL at count\z@
+    \xintloop
+        \POL at newpol{\POL at sturmname _\the\POL at count _}%
+    \unless\ifnum\POL at sturm@N=\POL at count
+        \advance\POL at count\@ne
+    \repeat
+  \fi
+}%
+\def\POL at ToSturm@DoSturm{%
+  \PolMakePrimitive{\POL at sturmname _0_}%
+  \POL at Diff@@one{\POL at sturmname _0_}{\POL at sturmname _1_}%
   % re-utiliser \POL at varcoeffs directement?
-  \PolMakePrimitive{\POL at sturmname _1}%
+  \PolMakePrimitive{\POL at sturmname _1_}%
   \POL at count\@ne
   \xintloop
-    \POL at divide{\POL at sturmname _\the\numexpr\POL at count-\@ne}%
-               {\POL at sturmname _\the\POL at count}%
+    \POL at divide{\POL at sturmname _\the\numexpr\POL at count-\@ne\relax _}%
+               {\POL at sturmname _\the\POL at count _}%
     \expandafter\POL at split\POL at R;\POL at degR\POL at polR
   \unless\ifnum\POL at degR=\m at ne
     \advance\POL at count\@ne
     \expandafter\let
-    \csname POLuserpol@\POL at sturmname _\the\POL at count\endcsname\POL at R
+    \csname POLuserpol@\POL at sturmname _\the\POL at count _\endcsname\POL at R
     \edef\POL at makeprim@icontent{-\POL at icontent\POL at polR}%
-    \POL at mapcoeffs\POL at makeprim@macro{\POL at sturmname _\the\POL at count}%
+    \POL at mapcoeffs\POL at makeprim@macro{\POL at sturmname _\the\POL at count _}%
   \repeat
   \edef\POL at sturm@N{\the\POL at count}%
-  \ifPOL at sturm@normalize
-   \ifnum\PolDegree{\POL at sturmname _\POL at sturm@N}>\z@
-     \xintloop
-       \advance\POL at count\m at ne
-       \POL at divide{\POL at sturmname _\the\POL at count}%
-                  {\POL at sturmname _\POL at sturm@N}%
-       \expandafter\let
-       \csname POLuserpol@\POL at sturmname _\the\POL at count\endcsname\POL at Q
-       % quotient actually belongs to Z[X]
-       \POL at mapcoeffs{\POL at aux@toint}{\POL at sturmname _\the\POL at count}%    
-     \ifnum\POL at count>\z@
-     \repeat
-     \@namedef{POLuserpol@\POL at sturmname _\POL at sturm@N}{0.\empty{1/1[0]}}%
-   \fi
+  % normalize (now always done even by starred variant)
+  \ifnum\PolDegree{\POL at sturmname _\POL at sturm@N _}>\z@
+    % \POL at count\POL at sturm@N\relax
+    \xintloop
+      \advance\POL at count\m at ne
+      \POL at divide{\POL at sturmname _\the\POL at count _}%
+                 {\POL at sturmname _\POL at sturm@N _}%
+      \expandafter
+       \let\csname POLuserpol@\POL at sturmname _\the\POL at count\endcsname\POL at Q
+      % quotient actually belongs to Z[X] and is primitive
+      \POL at mapcoeffs{\POL at aux@toint}{\POL at sturmname _\the\POL at count}%    
+    \ifnum\POL at count>\z@
+    \repeat
+    \@namedef{POLuserpol@\POL at sturmname _\POL at sturm@N}{0.\empty{1/1[0]}}%
+  \else % they are already normalized
+      \advance\POL at count\@ne % attention to include last one also
+      \xintloop
+      \advance\POL at count\m at ne
+      \expandafter\let
+       \csname POLuserpol@\POL at sturmname _\the\POL at count\expandafter\endcsname
+       \csname POLuserpol@\POL at sturmname _\the\POL at count _\endcsname
+    \ifnum\POL at count>\z@
+    \repeat
   \fi
-  \POL at count\z@
-  \xintloop
-    \POL at newpol{\POL at sturmname _\the\POL at count}%
-  \unless\ifnum\POL at sturm@N=\POL at count
-    \advance\POL at count\@ne
-  \repeat
-  \expandafter\let
-  \csname PolSturmChainLength_\POL at sturmname \endcsname\POL at sturm@N
+  % Back to \POL at ToSturm
 }%
-
 \newcommand\PolSturmChainLength[1]
     {\romannumeral`^^@\csname PolSturmChainLength_#1\endcsname}%
+
 \newcommand\PolSetToSturmChainSignChangesAt[4][\global]{%
   \edef\POL at sturmchain@X{\xintREZ{#4}}%
   \edef\POL at sturmname{#3}%
@@ -747,12 +791,12 @@
 }%
 \def\POL at sturmchain@getSV at at#1{% ATTENTION USES \POL at count
   \def\POL at sturmchain@SV{0}%
-  \edef\POL at sturmchain@sign{\xintiiSgn{\PolEval{\POL at sturmname _0}\At{#1}}}%
+  \edef\POL at sturmchain@sign{\xintiiSgn{\Pol at Eval{\POL at sturmname _0}{#1}}}%
   \let\POL at isolz@lastsign\POL at sturmchain@sign
   \POL at count \z@
   \ifnum\POL at isolz@lastsign=\z@
     \edef\POL at isolz@lastsign
-        {\xintiiSgn{\PolEval{\POL at sturmname _1}\At{#1}}}%
+        {\xintiiSgn{\Pol at Eval{\POL at sturmname _1}{#1}}}%
     \POL at count \@ne
   \fi
   \xintloop
@@ -759,7 +803,7 @@
   \unless\ifnum\POL at sturmlength=\POL at count
   \advance\POL at count \@ne
     \edef\POL at isolz@newsign
-      {\xintiiSgn{\PolEval{\POL at sturmname _\the\POL at count}\At{#1}}}%
+      {\xintiiSgn{\Pol at Eval{\POL at sturmname _\the\POL at count}{#1}}}%
     \ifnum\POL at isolz@newsign=\numexpr-\POL at isolz@lastsign\relax
       \edef\POL at sturmchain@SV{\the\numexpr\POL at sturmchain@SV+\@ne}%
       \let\POL at isolz@lastsign=\POL at isolz@newsign
@@ -783,16 +827,129 @@
 }%
 
 
-\newcommand\PolSturmIsolateZeros[2][\empty]{%
+\newcommand\PolSturmIsolateZeros{\@ifstar
+      {\PolSturmIsolateZerosAndGetMultiplicities}%
+      {\PolSturmIsolateZeros@}%
+}%
+\newcommand\PolSturmIsolateZerosAndGetMultiplicities[2][\empty]{%
   % #1 optional E such that roots are searched in -10^E < x < 10^E
   % both -10^E and +10^E must not be roots!
+  % #2 name of Sturm chain (already pre-computed)
+  \edef\POL at sturmname{#2}%
+  \edef\POL at sturm@N{\@nameuse{PolSturmChainLength_\POL at sturmname}}%
+  % isolate the roots (detects case of constant polynomial)
+  \PolSturmIsolateZeros@{\POL at sturmname}%
+  \ifnum\POL at isolz@NbOfRoots=\z@
+  % no roots, define empty array nevertheless
+     \begingroup\globaldefs\@ne
+     \expandafter\xintAssignArray\expandafter\to\csname POL_ZeroMult\POL at sturmname\endcsname
+     \endgroup
+  \else
+     % store Sturm chain name for usage in the main loop
+     \let\POL at originalsturmname\POL at sturmname
+     \edef\POL at isolzmult@indices{\xintSeq{1}{\POL at isolz@NbOfRoots}}%
+     % all we currently know is that multiplicities are at least one
+     \begingroup\globaldefs\@ne
+     \expandafter\POL at initarray\csname POL_ZeroMult\POL at sturmname\endcsname{1}%
+     \endgroup
+     % check if GCD had positive degree (hence some roots, maybe complex, have
+     % multiplicity)
+     \ifnum\PolDegree{\POL at sturmname _\POL at sturm@N _}>\z@
+         % scratch array of flags to signal known multiplicities
+         \POL at initarray\POL at IfMultIsKnown\xint_secondoftwo
+         \let\POL at isolz@NbOfRoots at with_unknown_mult\POL at isolz@NbOfRoots
+         \expandafter\expandafter\expandafter\POL at isolzmult@loop
+     \fi
+  \fi
+}%
+\def\POL at isolzmult@loop{%
+   % we are here only if last iteration gave a new PGCD still of degree > 0
+   % As 0.6 \PolToSturm keeps memory of unnormalized Sturm chain, we use the
+   % PGCD from last iteration and generate a new Sturm chain.
+   % ATTENTION: first argument of \PolToSturm MUST NOT CONTAIN \POL at sturmname
+   \let\POL@@sturmname\POL at sturmname
+   % ATTENTION: we could use an underscore prefix to the name, but attention
+   % to tacit multiplication if used in an expression; however \PolEvalAt
+   % does not use expression parsing as \PolEvalAtExpr so this would be
+   % relatively safe. We must also not overwrite privately used names
+   % by polexpr or xint... Using prefix @_1 appears safe. They will accumulate.
+   % As the loop may break at any moment, depending on original P, not only
+   % on current polynomial which is examined to see if it has zeros, it does
+   % not seem to make sense to think about interface to keep memory of all
+   % the defined polynomials.
+   % \POL at sturm@N supposedly the one from last iteration
+   \PolToSturm{\POL@@sturmname _\POL at sturm@N _}{@_1\POL@@sturmname}%
+   % now both \POL at sturmname and \POL at sturm@N have changed
+   % if GCD is now a constant, we will not come back here
+   \edef\POL at sturmfinaldeg{\PolDegree{\POL at sturmname _\POL at sturm@N _}}%
+   \xintFor* ##1 in {\POL at isolzmult@indices}\do
+     {%
+      \csname POL at IfMultIsKnown##1\endcsname
+          {}% nothing to do
+          {\def\POL at isolzmult@index{##1}%
+           \POL at SturmIfZeroExactlyKnown{\POL at originalsturmname}{##1}%
+              \POL at isolzmult@loop at zero_isknown
+              \POL at isolzmult@loop at zero_isnotknown
+           \POL at isolzmult@loop at sharedbody
+          }%
+     }%
+   \ifnum\POL at sturmfinaldeg>\z@
+     \expandafter\POL at isolzmult@loop
+   \fi
+}%
+\def\POL at isolzmult@loop at zero_isknown{%
+   \xintifZero
+     {\Pol at Eval{\POL at sturmname _0_}%
+               {\POL at xintexprGetVar{\POL at originalsturmname L_\POL at isolzmult@index}}}%
+   {\let\POL at isolzmult@haszero\@ne}%
+   {\let\POL at isolzmult@haszero\z@}%
+}%
+\def\POL at isolzmult@loop at zero_isnotknown{%
+   \edef\POL at isolzmult@loop at A 
+        {\POL at xintexprGetVar{\POL at originalsturmname L_\POL at isolzmult@index}}
+   \edef\POL at isolzmult@loop at B
+        {\POL at xintexprGetVar{\POL at originalsturmname R_\POL at isolzmult@index}}
+   \PolSetToNbOfZerosWithin
+      \POL at isolzmult@haszero  % nb of zeros A < x <= B, here 0 or 1
+      \POL at sturmname
+      \POL at isolzmult@loop at A
+      \POL at isolzmult@loop at B
+}%
+\def\POL at isolzmult@loop at sharedbody{%
+   \ifnum\POL at isolzmult@haszero>\z@
+     \expandafter
+     \xdef
+     \csname POL_ZeroMult\POL at originalsturmname\POL at isolzmult@index\endcsname
+       {\the\numexpr
+        \csname POL_ZeroMult\POL at originalsturmname
+                            \POL at isolzmult@index\endcsname+\@ne}%
+   \else
+     % multiplicity now known, no need to check this index in future
+     \@namedef{POL at IfMultIsKnown\POL at isolzmult@index}{\xint_firstoftwo}%
+     \edef\POL at isolz@NbOfRoots at with_unknown_mult
+       {\the\numexpr\POL at isolz@NbOfRoots at with_unknown_mult-\@ne}%
+     \ifnum\POL at isolz@NbOfRoots at with_unknown_mult=\z@
+        \def\POL at sturmfinaldeg{0}% flag to force termination
+        \expandafter\expandafter\expandafter\xintBreakFor
+     \fi
+   \fi
+}%
+
+
+\newcommand\PolSturmIsolateZeros@[2][\empty]{%
+  % #1 optional E such that roots are searched in -10^E < x < 10^E
+  % both -10^E and +10^E must not be roots!
   % #2 name of Sturm chain (already pre-computed from a given polynomial)
+  % For reasons I have forgotten (no time now) this code **must** be used
+  % with a *normalized* Sturm chain.
   \edef\POL at sturmname{#2}%
   \edef\POL at sturmlength{\PolSturmChainLength{#2}}%
-  \ifx\empty#1\relax
+  % attention to constant polynomial, we must redefine the arrays then
+  \ifnum\POL at sturmlength>\z@
+   \ifx\empty#1\relax
     \POL at isolz@getsignchanges at plusinf
     \POL at isolz@getsignchanges at minusinf
-  \else
+   \else
     \edef\POL at isolz@E{\the\numexpr\xint_zapspaces #1 \xint_gobble_i\relax}%
     \POL at sturmchain@getSV at at{1[\POL at isolz@E]}%
     \let\POL at isolz@plusinf at SV  \POL at sturmchain@SV
@@ -810,26 +967,35 @@
 {The polynomial #2 vanishes at set lower bound -10^\POL at isolz@E}%
 {Compile again with a bigger exponent in source. (X to abort).}%
     \fi
+   \fi
+   \edef\POL at isolz@NbOfRoots
+      {\the\numexpr\POL at isolz@minusinf at SV-\POL at isolz@plusinf at SV}%
+  \else
+    % constant polynomial
+   \def\POL at isolz@NbOfRoots{0}%
   \fi
-  \edef\POL at isolz@NbOfRoots
-      {\the\numexpr\POL at isolz@minusinf at SV-\POL at isolz@plusinf at SV}%
   \ifnum\POL at isolz@NbOfRoots=\z@
      \begingroup\globaldefs\@ne
      \expandafter\xintAssignArray\expandafter\to\csname POL_ZeroInt#2L\endcsname
      \expandafter\xintAssignArray\expandafter\to\csname POL_ZeroInt#2R\endcsname
+     \expandafter\xintAssignArray\expandafter\to\csname POL_ZeroIsKnown#2\endcsname
      \endgroup
   \else
      \begingroup\globaldefs\@ne
-     \expandafter\POL at isolz@initarray\csname POL_ZeroInt#2L\endcsname
-     \expandafter\POL at isolz@initarray\csname POL_ZeroInt#2R\endcsname
+     \expandafter\POL at initarray\csname POL_ZeroInt#2L\endcsname{0}%
+     \expandafter\POL at initarray\csname POL_ZeroInt#2R\endcsname{0}%
+     \expandafter\POL at initarray\csname POL_ZeroIsKnown#2\endcsname
+                 \xint_stop_atsecondoftwo
      \endgroup
      \ifx\empty#1\relax\expandafter\POL at isolz@getaprioribound\fi
      \expandafter\POL at isolz@main
   \fi
 }%
-\def\POL at isolz@initarray#1{%
-  \expandafter\xintAssignArray
-    \romannumeral\xintreplicate{\POL at isolz@NbOfRoots}{{0}}\to#1%
+\def\POL at initarray#1#2{%
+% ATTENTION, if only one item, \xintAssignArray UNBRACES IT
+% so we use an \empty trick to avoid that. Maybe considered a bug of xinttools?
+  \expandafter\xintAssignArray\expandafter\empty
+    \romannumeral\xintreplicate{\POL at isolz@NbOfRoots}{{#2}}\to#1%
 }%
 \def\POL at isolz@getsignchanges at plusinf{%
   % Count number of sign changes at plus infinity in Sturm sequence
@@ -920,11 +1086,11 @@
   \ifnum\POL at IsoAtZeroSign=\z@
     \xdef\POL at isolz@IntervalIndex
       {\the\numexpr\POL at isolz@minusinf at SV-\POL at IsoRightSV}%
-    \POL at refine@storeleftandright % store zero root
+    \POL at refine@storeleftandright % store zero root, \POL at IsoRightSign is zero
     \edef\POL at IsoRightSV{\the\numexpr\POL at IsoRightSV+\@ne}%
 % subtlety here if original polynomial had multiplicities, but ok. I checked!
     \edef\POL at IsoRightSign % evaluated twice, but that's not so bad
-      {\xintiiOpp{\xintiiSgn{\PolEval{\POL at sturmname _1}\At{0/1[0]}}}}%
+      {\xintiiOpp{\xintiiSgn{\Pol at Eval{\POL at sturmname _1}{0/1[0]}}}}%
   \fi
   \def\POL at IsoLeft@Int{-1}% -10^E isn't a root!
   \let\POL at IsoLeftSV  \POL at isolz@minusinf at SV
@@ -1054,6 +1220,7 @@
      \ifPOL at isolz@nextwillneedrefine
        \expandafter\expandafter\expandafter\POL at isolz@refine
      \else
+       % \POL at IsoRightSign is zero iff root now exactly know
        \POL at refine@storeleftandright
        \ifnum\POL at IsoRightSign=\z@
         \global\POL at isolz@nextwillneedrefinetrue
@@ -1108,7 +1275,7 @@
     \edef\POL at IsoLeft@Int {\xintDSL{\POL at IsoLeft@Int}}%
     \edef\POL at IsoRight@Int{\xintInc{\POL at IsoLeft@Int}}%
     \edef\POL at IsoRightSign
-        {\xintiiSgn{\PolEval{\POL at sturmname _0}\At{\POL at IsoRight@raw}}}%
+        {\xintiiSgn{\Pol at Eval{\POL at sturmname _0}{\POL at IsoRight@raw}}}%
   \ifnum\POL at IsoRightSign=\POL@@IsoRightSign\space
   \repeat
   % now second root has been separated from the one at left end point
@@ -1127,7 +1294,7 @@
   \else
     \edef\POL at IsoRight@Int{\xintDec{\POL@@IsoRight at Int}}%
     \edef\POL at IsoRightSign
-      {\xintiiSgn{\PolEval{\POL at sturmname _0}\At{\POL at IsoRight@raw}}}%
+      {\xintiiSgn{\Pol at Eval{\POL at sturmname _0}{\POL at IsoRight@raw}}}%
     \ifnum\POL at IsoRightSign=\POL@@IsoRightSign\space
       \POL at refine@doonce % we need to locate in interval (1, 9) in local scale
     \else
@@ -1152,17 +1319,17 @@
   \let\POL@@IsoRightSign\POL at IsoRightSign
   \edef\POL at IsoRight@Int{\xintiiAdd{4}{\POL at IsoLeft@Int}}% 5
   \edef\POL at IsoRightSign
-      {\xintiiSgn{\PolEval{\POL at sturmname _0}\At{\POL at IsoRight@raw}}}%
+      {\xintiiSgn{\Pol at Eval{\POL at sturmname _0}{\POL at IsoRight@raw}}}%
   \ifnum\POL at IsoRightSign=\POL at IsoLeftSign\space
     \let\POL at IsoLeft@Int\POL at IsoRight@Int % 5
     \edef\POL at IsoRight@Int{\xintiiAdd{2}{\POL at IsoLeft@Int}}%
     \edef\POL at IsoRightSign
-        {\xintiiSgn{\PolEval{\POL at sturmname _0}\At{\POL at IsoRight@raw}}}%
+        {\xintiiSgn{\Pol at Eval{\POL at sturmname _0}{\POL at IsoRight@raw}}}%
     \ifnum\POL at IsoRightSign=\POL at IsoLeftSign\space
       \let\POL at IsoLeft@Int\POL at IsoRight@Int % 7
       \edef\POL at IsoRight@Int{\xintInc{\POL at IsoLeft@Int}}%
       \edef\POL at IsoRightSign
-          {\xintiiSgn{\PolEval{\POL at sturmname _0}\At{\POL at IsoRight@raw}}}%
+          {\xintiiSgn{\Pol at Eval{\POL at sturmname _0}{\POL at IsoRight@raw}}}%
       \ifnum\POL at IsoRightSign=\POL at IsoLeftSign\space
         \let\POL at IsoLeft@Int\POL at IsoRight@Int % 8
         \let\POL at IsoRight@Int\POL@@IsoRight at Int % 9
@@ -1176,7 +1343,7 @@
       \let\POL@@IsoRight at Int\POL at IsoRight@Int % 7
       \edef\POL at IsoRight@Int{\xintInc{\POL at IsoLeft@Int}}% 6
       \edef\POL at IsoRightSign
-          {\xintiiSgn{\PolEval{\POL at sturmname _0}\At{\POL at IsoRight@raw}}}%
+          {\xintiiSgn{\Pol at Eval{\POL at sturmname _0}{\POL at IsoRight@raw}}}%
       \ifnum\POL at IsoRightSign=\POL at IsoLeftSign\space
           \let\POL at IsoLeft@Int\POL at IsoRight@Int   % 6
           \let\POL at IsoRight@Int\POL@@IsoRight at Int % 7
@@ -1191,12 +1358,12 @@
     \let\POL@@IsoRight at Int\POL at IsoRight@Int % 5
     \edef\POL at IsoRight@Int{\xintiiAdd{2}{\POL at IsoLeft@Int}}%
     \edef\POL at IsoRightSign
-        {\xintiiSgn{\PolEval{\POL at sturmname _0}\At{\POL at IsoRight@raw}}}%
+        {\xintiiSgn{\Pol at Eval{\POL at sturmname _0}{\POL at IsoRight@raw}}}%
     \ifnum\POL at IsoRightSign=\POL at IsoLeftSign\space
       \let\POL at IsoLeft@Int\POL at IsoRight@Int % 3
       \edef\POL at IsoRight@Int{\xintInc{\POL at IsoLeft@Int}}% 4
       \edef\POL at IsoRightSign
-          {\xintiiSgn{\PolEval{\POL at sturmname _0}\At{\POL at IsoRight@raw}}}%
+          {\xintiiSgn{\Pol at Eval{\POL at sturmname _0}{\POL at IsoRight@raw}}}%
       \ifnum\POL at IsoRightSign=\POL at IsoLeftSign\space
           \let\POL at IsoLeft@Int\POL at IsoRight@Int   % 4
           \let\POL at IsoRight@Int\POL@@IsoRight at Int % 5
@@ -1210,7 +1377,7 @@
       \let\POL@@IsoRight at Int\POL at IsoRight@Int % 3
       \edef\POL at IsoRight@Int{\xintInc{\POL at IsoLeft@Int}}% 2
       \edef\POL at IsoRightSign
-          {\xintiiSgn{\PolEval{\POL at sturmname _0}\At{\POL at IsoRight@raw}}}%
+          {\xintiiSgn{\Pol at Eval{\POL at sturmname _0}{\POL at IsoRight@raw}}}%
       \ifnum\POL at IsoRightSign=\POL at IsoLeftSign\space
           \let\POL at IsoLeft@Int\POL at IsoRight@Int   % 2
           \let\POL at IsoRight@Int\POL@@IsoRight at Int % 3
@@ -1228,12 +1395,19 @@
     \xdef\csname POL_ZeroInt\POL at sturmname
                  R\POL at isolz@IntervalIndex\endcsname
          {\PolDecToString{\POL at IsoRight@rawout}}%
-    \begingroup\globaldefs\@ne
+    \begingroup\xintglobaldefstrue
     \xintdefvar\POL at sturmname
                L_\POL at isolz@IntervalIndex:=qfrac(\POL at IsoLeft@rawout);%
     \xintdefvar\POL at sturmname
                R_\POL at isolz@IntervalIndex:=qfrac(\POL at IsoRight@rawout);%
     \endgroup
+    % added at 0.6+
+    \ifnum\POL at IsoRightSign=\z@
+      \global
+      \expandafter
+      \let\csname POL_ZeroIsKnown\POL at sturmname\POL at isolz@IntervalIndex\endcsname
+          \xint_stop_atfirstoftwo
+    \fi
 }%
 
 
@@ -1269,7 +1443,7 @@
 \def\POL at refine@sharedbody#1{%
   \POL at set@IsoLeft at rawin
   \edef\POL at IsoLeftSign
-      {\xintiiSgn{\PolEval{\POL at sturmname _0}\At{\POL at IsoLeft@rawin}}}%
+      {\xintiiSgn{\Pol at Eval{\POL at sturmname _0}{\POL at IsoLeft@rawin}}}%
   \ifnum\POL at IsoLeftSign=\z@
   % do nothing if that interval was already a singleton
   \else
@@ -1282,7 +1456,7 @@
     \expandafter\POL at set@IsoLeft at Int\POL at IsoLeft@rawin
     \edef\POL at IsoRight@Int{\xintInc{\POL at IsoLeft@Int}}%
     #1%
-    \POL at refine@storeleftandright
+    \POL at refine@storeleftandright % \POL at IsoRightSign not zero
   \fi
 }%
 \def\POL at refine@loop#1{%
@@ -1304,7 +1478,7 @@
   \let\POL@@IsoRightSign\POL at IsoRightSign
   \edef\POL at IsoRight@Int{\xintInc{\POL at IsoLeft@Int}}%
   \edef\POL at IsoRightSign
-      {\xintiiSgn{\PolEval{\POL at sturmname _0}\At{\POL at IsoRight@raw}}}%
+      {\xintiiSgn{\Pol at Eval{\POL at sturmname _0}{\POL at IsoRight@raw}}}%
   \ifnum\POL at IsoRightSign=\z@
    \let\POL at IsoLeft@Int\POL at IsoRight@Int % root at 1
    \def\POL at IsoLeftSign{0}%
@@ -1317,7 +1491,7 @@
     \let\POL at IsoLeft@Int\POL at IsoRight@Int
     \edef\POL at IsoRight@Int{\xintDec{\POL@@IsoRight at Int}}%
     \edef\POL at IsoRightSign
-      {\xintiiSgn{\PolEval{\POL at sturmname _0}\At{\POL at IsoRight@raw}}}%
+      {\xintiiSgn{\Pol at Eval{\POL at sturmname _0}{\POL at IsoRight@raw}}}%
     \ifnum\POL at IsoRightSign=\z@
      \let\POL at IsoLeft@Int\POL at IsoRight@Int % root at 9
      \def\POL at IsoLeftSign{0}%
@@ -1382,7 +1556,7 @@
        \edef\POL at IsoRight@Int{\xintInc{\POL at IsoLeft@Int}}%
        \ifnum\POL at isolz@E>\POL at ensure@targetE\space
          \edef\POL at IsoLeftSign
-          {\xintiiSgn{\PolEval{\POL at sturmname _0}\At{\POL at IsoLeft@raw}}}%
+          {\xintiiSgn{\Pol at Eval{\POL at sturmname _0}{\POL at IsoLeft@raw}}}%
           % at start left and right are not roots, and values of opposite signs
          % \edef\POL at IsoRightSign{\the\numexpr-\POL at IsoLeftSign}%
          \xintloop
@@ -1390,7 +1564,7 @@
           % if separation level is still too coarse we recurse at deeper level
          \ifnum\POL at isolz@E>\POL at ensure@targetE\space
          \repeat
-         % will check if right is at a zero, needs \POL at IsoRightSign set up
+         % will check if right is at a zero, it needs \POL at IsoRightSign set up
          \POL at refine@storeleftandright
        \fi
       }%
@@ -1402,7 +1576,7 @@
     \xintloop
       \edef\POL at IsoRight@Int{\xintInc{\POL at IsoLeft@Int}}%
       \edef\POL at IsoRightSign
-          {\xintiiSgn{\PolEval{\POL at sturmname _0}\At{\POL at IsoRight@raw}}}%
+          {\xintiiSgn{\Pol at Eval{\POL at sturmname _0}{\POL at IsoRight@raw}}}%
           % if we have found a zero at right boundary the \ifnum test will fail
           % and we exit the loop
           % else we exit the loop if sign at right boundary is opposite of
@@ -1470,17 +1644,17 @@
         \let\PolIfEndPointIsNegative\xint_secondoftwo
         \let\PolIfEndPointIsZero\xint_secondoftwo}%
 }%
-\newcommand\POL at SturmIfZeroExactlyKnown[2]{% faster than public one,
-    % but does not check if #2 is in range
-    \romannumeral0\xintifeq{\POL at xintexprGetVar{#1L_\the\numexpr#2\relax}}%
-                           {\POL at xintexprGetVar{#1R_\the\numexpr#2\relax}}%
-}%
 
 
-\newcommand\PolSturmIfZeroExactlyKnown[2]{%
-    \romannumeral0\xintifeq{\PolSturmIsolatedZeroLeft{#1}{#2}}%
-                           {\PolSturmIsolatedZeroRight{#1}{#2}}%
+\newcommand\PolSturmIfZeroExactlyKnown[2]{% #1 = sturmname, #2=index
+    \romannumeral0\csname POL_ZeroIsKnown#1\endcsname{#2}%
 }%
+\newcommand\POL at SturmIfZeroExactlyKnown[2]{% #1 = sturmname, #2=index
+    \romannumeral0\csname POL_ZeroIsKnown#1\the\numexpr#2\relax\endcsname
+}%
+\newcommand\PolSturmIsolatedZeroMultiplicity[2]{%
+    \romannumeral`^^@\csname POL_ZeroMult#1\endcsname{#2}%
+}%
 \newcommand\PolSturmIsolatedZeroLeft[2]{%
     \romannumeral`^^@\csname POL_ZeroInt#1L\endcsname{#2}}%
 \newcommand\PolSturmIsolatedZeroRight[2]{%
@@ -1856,6 +2030,8 @@
 }%
 \newcommand\PolEvalAt[2]
     {\xintpraw{\csname XINT_expr_userfunc_#1\endcsname{#2}}}%
+\newcommand\Pol at Eval[2]
+    {\csname XINT_expr_userfunc_#1\endcsname{#2}}%
 \newcommand\PolEvalAtExpr[2]{\xinttheexpr #1(#2)\relax}%
 %
 \newcommand\PolEvalReduced[3]{\romannumeral`^^@\Pol at Eval@fork
@@ -1878,7 +2054,141 @@
 \newcommand\PolFloatEvalAt[2]
     {\xintpfloat{\csname XINT_flexpr_userfunc_#1\endcsname{#2}}}%
 \newcommand\PolFloatEvalAtExpr[2]{\xintthefloatexpr #1(#2)\relax}%
-%
+
+
+\newcommand\PolSturmMultiplicity[3]{\romannumeral`^^@\Pol at Eval@fork
+     #2\PolSturmMultiplicityAt
+     \At\PolSturmMultiplicityAtExpr\krof {#1}{#3}%
+}%
+\newcommand\PolSturmMultiplicityAtExpr[2]
+    {\PolSturmMultiplicityAt{#1}{\xinttheexpr#2\relax}}%
+\newcommand\PolSturmMultiplicityAt[2]
+    {\expandafter\POL at sturm@mult at at\romannumeral`^^@#2!{#1}}%
+\def\POL at sturm@mult at at#1!#2%
+{%
+    \xintifZero{\Pol at Eval{#2_0}{#1}}%
+    {\POL at sturm@mult at at@iloop 1!{#2}{#1}}% we have a zero
+    0% not a zero
+}%
+\def\POL at sturm@mult at at@iloop #1!#2#3%
+{% #1 = index, #2 = sturmname, #3 value
+    \PolSturmIfZeroExactlyKnown{#2}{#1}%
+    {\xintifEq{\POL at xintexprGetVar{#2L_#1}}{#3}%
+     {\PolSturmIsolatedZeroMultiplicity{#2}{#1}}%
+% catcode of ! is 11 in polexpr.sty
+     {\expandafter\POL at sturm@mult at at@iloop\the\numexpr#1+\@ne !{#2}{#3}}%
+    }%
+    {\xintifLt{#3}{\POL at xintexprGetVar{#2R_#1}}%
+     {\PolSturmIsolatedZeroMultiplicity{#2}{#1}}%
+     {\expandafter\POL at sturm@mult at at@iloop\the\numexpr#1+\@ne !{#2}{#3}}%
+    }%
+}%
+
+
+\def\Pol at LessThanOrEqualTo@fork#1\LessThanOrEqualTo#2#3\krof{#2}%
+\newcommand\PolSturmNbOfRootsOf[3]{\romannumeral`^^@\Pol at LessThanOrEqualTo@fork
+     #2\PolNbOfRootsLessThanOrEqualTo
+     \LessThanOrEqualTo\PolNbOfRootsLessThanOrEqualToExpr\krof {#1}{#3}%
+}%
+\newcommand\PolNbOfRootsLessThanOrEqualToExpr[2]
+    {\PolNbOfRootsLessThanOrEqualTo{#1}{\xinttheexpr#2\relax}}%
+\newcommand\PolNbOfRootsLessThanOrEqualTo[1]{%
+    \ifnum\PolSturmNbOfIsolatedZeros{#1}=\z@
+      \expandafter\xint_firstofthree\expandafter0%
+    \else
+      \expandafter\PolNbOfRootsLessThanOrEqualTo@%
+    \fi {#1}%
+}%
+\def\PolNbOfRootsLessThanOrEqualTo@ #1#2%
+{%
+    \expandafter\POL at nbofrootsleq@prep\romannumeral`^^@#2!{#1}%
+}%
+\def\POL at nbofrootsleq@prep#1!#2%
+{%
+    \expandafter\POL at nbofrootsleq@iloop\expandafter 1\expandafter !%
+    \romannumeral0\xintsgn{\Pol at Eval{#2_0}{#1}}!%
+    #1!{#2}%
+}%
+\def\POL at nbofrootsleq@iloop#1!#2!#3!#4%
+{% #1 = index, #2 = sign of evaluation at value, #3 = value, #4 = sturmname
+    \xintifCmp{#3}{\POL at xintexprGetVar{#4L_#1}}%
+      {\POL at nbofrootsleq@return #1-\@ne !}%
+      {\POL at nbofrootsleq@return
+       \PolSturmIfZeroExactlyKnown{#4}{#1}{#1}{#1-\@ne}!%
+      }%
+      % in third branch we are sure that if root is exactly known
+      % the test \xintifLt will be negative
+      {\xintifLt{#3}{\POL at xintexprGetVar{#4R_#1}}%
+         {\POL at nbofrootsleq@return
+            #1\ifnum#2=\xintSgn{\Pol at Eval{#4_0}{\POL at xintexprGetVar{#4L_#1}}}
+              -\@ne\fi !%
+         }%
+         {\ifnum#1=\PolSturmNbOfIsolatedZeros{#4}
+            \expandafter\POL at nbofrootsleq@rightmost
+          \fi \expandafter\POL at nbofrootsleq@iloop \the\numexpr\@ne+%
+         }%
+       }%
+    #1!#2!#3!{#4}%
+}%
+\def\POL at nbofrootsleq@return #1!#2!#3!#4!#5{\the\numexpr #1\relax}%
+\def\POL at nbofrootsleq@rightmost\expandafter\POL at nbofrootsleq@iloop 
+    \the\numexpr\@ne+#1!#2!#3!#4{#1}%
+
+
+\def\Pol at LessThanOrEqualTo@fork#1\LessThanOrEqualTo#2#3\krof{#2}%
+\newcommand\PolSturmNbWithMultOfRootsOf[3]
+{\the\numexpr0\Pol at LessThanOrEqualTo@fork
+     #2\PolNbWithMultOfRootsLessThanOrEqualTo
+     \LessThanOrEqualTo\PolNbWithMultOfRootsLessThanOrEqualToExpr\krof {#1}{#3}%
+}%
+\newcommand\PolNbWithMultOfRootsLessThanOrEqualToExpr[2]
+    {\PolNbWithMultOfRootsLessThanOrEqualTo{#1}{\xinttheexpr#2\relax}}%
+\newcommand\PolNbWithMultOfRootsLessThanOrEqualTo[1]{%
+    \ifnum\PolSturmNbOfIsolatedZeros{#1}=\z@
+      \expandafter\POL at nbwmofroots@noroots
+    \else
+      \expandafter\PolNbWithMultOfRootsLessThanOrEqualTo@%
+    \fi {#1}%
+}%
+\def\POL at nbwmofroots@noroots#1#2{\relax}%
+\def\PolNbWithMultOfRootsLessThanOrEqualTo@ #1#2%
+{%
+    \expandafter\POL at nbwmofrootsleq@prep\romannumeral`^^@#2!{#1}%
+}%
+\def\POL at nbwmofrootsleq@prep#1!#2%
+{%
+    \expandafter\POL at nbwmofrootsleq@iloop\expandafter 1\expandafter !%
+    \romannumeral0\xintsgn{\Pol at Eval{#2_0}{#1}}!%
+    #1!{#2}%
+}%
+\def\POL at nbwmofrootsleq@iloop#1!#2!#3!#4%
+{% #1 = index, #2 = sign of evaluation at value, #3 = value, #4 = sturmname
+    \xintifCmp{#3}{\POL at xintexprGetVar{#4L_#1}}%
+      {\POL at nbwmofrootsleq@return !}%
+      {\POL at nbwmofrootsleq@return
+       \PolSturmIfZeroExactlyKnown{#4}{#1}%
+        {+\PolSturmIsolatedZeroMultiplicity{#4}{#1}}{}!%
+      }%
+      % in third branch we are sure that if root is exactly known
+      % the test \xintifLt will be negative
+      {\xintifLt{#3}{\POL at xintexprGetVar{#4R_#1}}%
+         {\POL at nbwmofrootsleq@return
+            \unless
+            \ifnum#2=\xintSgn{\Pol at Eval{#4_0}{\POL at xintexprGetVar{#4L_#1}}}
+            +\PolSturmIsolatedZeroMultiplicity{#4}{#1}\fi !%
+         }%
+         {+\PolSturmIsolatedZeroMultiplicity{#4}{#1}%
+          \ifnum#1=\PolSturmNbOfIsolatedZeros{#4}
+             \expandafter\POL at nbwmofrootsleq@return\expandafter !%
+          \fi
+          \expandafter\POL at nbwmofrootsleq@iloop \the\numexpr\@ne+%
+         }%
+       }%
+    #1!#2!#3!{#4}%
+}%
+\def\POL at nbwmofrootsleq@return #1!#2!#3!#4!#5{#1\relax}%
+
+
 \newcommand\PolLeadingCoeff[1]{%
     \romannumeral`^^@\expandafter\expandafter\expandafter\xintlastitem
                      \expandafter\expandafter\expandafter



More information about the tex-live-commits mailing list