diff options
Diffstat (limited to 'Master/texmf-dist/doc/latex/polexpr/polexpr.html')
-rw-r--r-- | Master/texmf-dist/doc/latex/polexpr/polexpr.html | 1271 |
1 files changed, 859 insertions, 412 deletions
diff --git a/Master/texmf-dist/doc/latex/polexpr/polexpr.html b/Master/texmf-dist/doc/latex/polexpr/polexpr.html index 5408f16b65e..71e7ef3d019 100644 --- a/Master/texmf-dist/doc/latex/polexpr/polexpr.html +++ b/Master/texmf-dist/doc/latex/polexpr/polexpr.html @@ -362,137 +362,160 @@ ul.auto-toc { <body> <div class="document" id="package-polexpr-documentation"> <h1 class="title">Package polexpr documentation</h1> -<h2 class="subtitle" id="id1">0.6 (2018/11/20)</h2> +<h2 class="subtitle" id="id1">0.7 (2018/12/08)</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="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> +<li><a class="reference internal" href="#basic-syntax" id="id38">Basic syntax</a></li> +<li><a class="reference internal" href="#examples-of-localization-of-roots" id="id39">Examples of localization of roots</a><ul> +<li><a class="reference internal" href="#a-typical-example" id="id40">A typical example</a></li> +<li><a class="reference internal" href="#a-degree-four-polynomial-with-nearby-roots" id="id41">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="id42">The degree nine polynomial with 0.99, 0.999, 0.9999 as triple roots</a></li> +<li><a class="reference internal" href="#a-degree-five-polynomial-with-three-rational-roots" id="id43">A degree five polynomial with three rational roots</a></li> +<li><a class="reference internal" href="#a-mignotte-type-polynomial" id="id44">A Mignotte type polynomial</a></li> +<li><a class="reference internal" href="#the-wilkinson-polynomial" id="id45">The Wilkinson 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="id46">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="id47">Roots of Chebyshev polynomials</a></li> </ul> </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> +<li><a class="reference internal" href="#non-expandable-macros" id="id48">Non-expandable macros</a><ul> +<li><a class="reference internal" href="#poldef-polname-letter-expression-in-letter" id="id49"><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="id50"><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="id51"><tt class="docutils literal">\PolGenFloatVariant{polname}</tt></a></li> +<li><a class="reference internal" href="#pollet-polname-2-polname-1" id="id52"><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="id53"><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="id54"><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="id55"><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="id56"><tt class="docutils literal"><span class="pre">\PolFromCSV{polname}{<csv>}</span></tt></a></li> +<li><a class="reference internal" href="#poltypeset-polname" id="id57"><tt class="docutils literal">\PolTypeset{polname}</tt></a><ul> +<li><a class="reference internal" href="#poltypesetcmd-raw-coeff" id="id58"><tt class="docutils literal">\PolTypesetCmd{raw_coeff}</tt></a></li> +<li><a class="reference internal" href="#poltypesetone-raw-coeff" id="id59"><tt class="docutils literal">\PolTypesetOne{raw_coeff}</tt></a></li> +<li><a class="reference internal" href="#id6" id="id60"><tt class="docutils literal">\PolTypesetMonomialCmd</tt></a></li> +<li><a class="reference internal" href="#poltypesetcmdprefix-raw-coeff" id="id61"><tt class="docutils literal">\PolTypesetCmdPrefix{raw_coeff}</tt></a></li> </ul> </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> +<li><a class="reference internal" href="#id8" id="id62"><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="id63"><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="id64"><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="id65"><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="id66"><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="id67"><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="id68"><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="id69"><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="id70"><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="id71"><tt class="docutils literal"><span class="pre">\PolToSturm{polname}{sturmname}</span></tt></a></li> +<li><a class="reference internal" href="#id10" id="id72"><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="id73"><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="id74"><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="id75"><tt class="docutils literal">\PolSturmIsolateZeros{sturmname}</tt></a></li> +<li><a class="reference internal" href="#id12" id="id76"><tt class="docutils literal"><span class="pre">\PolSturmIsolateZeros*{sturmname}</span></tt></a></li> +<li><a class="reference internal" href="#id14" id="id77"><tt class="docutils literal"><span class="pre">\PolSturmIsolateZeros**{sturmname}</span></tt></a></li> +<li><a class="reference internal" href="#polsturmisolatezerosandgetmultiplicities-sturmname" id="id78"><tt class="docutils literal">\PolSturmIsolateZerosAndGetMultiplicities{sturmname}</tt></a></li> +<li><a class="reference internal" href="#polsturmisolatezerosgetmultiplicitiesandrationalroots-sturmname" id="id79"><tt class="docutils literal">\PolSturmIsolateZerosGetMultiplicitiesAndRationalRoots{sturmname}</tt></a></li> +<li><a class="reference internal" href="#polsturmisolatezerosandfindrationalroots-sturmname" id="id80"><tt class="docutils literal">\PolSturmIsolateZerosAndFindRationalRoots{sturmname}</tt></a></li> +<li><a class="reference internal" href="#polrefineinterval-sturmname-index" id="id81"><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="id82"><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="id83"><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="id84"><tt class="docutils literal"><span class="pre">\PolEnsureIntervalLengths{sturmname}{E}</span></tt></a></li> +<li><a class="reference internal" href="#polprintintervals-varname-sturmname" id="id85"><tt class="docutils literal"><span class="pre">\PolPrintIntervals[varname]{sturmname}</span></tt></a><ul> +<li><a class="reference internal" href="#polprintintervalsnorealroots" id="id86"><tt class="docutils literal">\PolPrintIntervalsNoRealRoots</tt></a></li> +<li><a class="reference internal" href="#polprintintervalsbeginenv" id="id87"><tt class="docutils literal">\PolPrintIntervalsBeginEnv</tt></a></li> +<li><a class="reference internal" href="#polprintintervalsendenv" id="id88"><tt class="docutils literal">\PolPrintIntervalsEndEnv</tt></a></li> +<li><a class="reference internal" href="#polprintintervalsknownroot" id="id89"><tt class="docutils literal">\PolPrintIntervalsKnownRoot</tt></a></li> +<li><a class="reference internal" href="#polprintintervalsunknownroot" id="id90"><tt class="docutils literal">\PolPrintIntervalsUnknownRoot</tt></a></li> +<li><a class="reference internal" href="#id15" id="id91"><tt class="docutils literal">\PolPrintIntervalsPrintExactZero</tt></a></li> +<li><a class="reference internal" href="#id16" id="id92"><tt class="docutils literal">\PolPrintIntervalsPrintLeftEndPoint</tt></a></li> +<li><a class="reference internal" href="#id17" id="id93"><tt class="docutils literal">\PolPrintIntervalsPrintRightEndPoint</tt></a></li> </ul> </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> +<li><a class="reference internal" href="#id19" id="id94"><tt class="docutils literal"><span class="pre">\PolPrintIntervals*[varname]{sturmname}</span></tt></a><ul> +<li><a class="reference internal" href="#polprintintervalsprintmultiplicity" id="id95"><tt class="docutils literal">\PolPrintIntervalsPrintMultiplicity</tt></a></li> </ul> </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> +<li><a class="reference internal" href="#polmapcoeffs-macro-polname" id="id96"><tt class="docutils literal"><span class="pre">\PolMapCoeffs{\macro}{polname}</span></tt></a></li> +<li><a class="reference internal" href="#polreducecoeffs-polname" id="id97"><tt class="docutils literal">\PolReduceCoeffs{polname}</tt></a></li> +<li><a class="reference internal" href="#id21" id="id98"><tt class="docutils literal"><span class="pre">\PolReduceCoeffs*{polname}</span></tt></a></li> +<li><a class="reference internal" href="#polmakemonic-polname" id="id99"><tt class="docutils literal">\PolMakeMonic{polname}</tt></a></li> +<li><a class="reference internal" href="#polmakeprimitive-polname" id="id100"><tt class="docutils literal">\PolMakePrimitive{polname}</tt></a></li> </ul> </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> +<li><a class="reference internal" href="#expandable-macros" id="id101">Expandable macros</a><ul> +<li><a class="reference internal" href="#poleval-polname-atexpr-numerical-expression" id="id102"><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="id103"><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="id104"><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="id105"><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="id106"><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="id107"><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="id108"><tt class="docutils literal"><span class="pre">\PolIfCoeffIsPlusOrMinusOne{A}{B}</span></tt></a></li> +<li><a class="reference internal" href="#polleadingcoeff-polname" id="id109"><tt class="docutils literal">\PolLeadingCoeff{polname}</tt></a></li> +<li><a class="reference internal" href="#polnthcoeff-polname-number" id="id110"><tt class="docutils literal"><span class="pre">\PolNthCoeff{polname}{number}</span></tt></a></li> +<li><a class="reference internal" href="#poldegree-polname" id="id111"><tt class="docutils literal">\PolDegree{polname}</tt></a></li> +<li><a class="reference internal" href="#policontent-polname" id="id112"><tt class="docutils literal">\PolIContent{polname}</tt></a></li> +<li><a class="reference internal" href="#poltoexpr-polname" id="id113"><tt class="docutils literal">\PolToExpr{polname}</tt></a><ul> +<li><a class="reference internal" href="#poltoexproneterm-raw-coeff-number" id="id114"><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="id115"><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="id116"><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="id117"><tt class="docutils literal">\PolToExprCmd{raw_coeff}</tt></a></li> +<li><a class="reference internal" href="#poltoexprtermprefix-raw-coeff" id="id118"><tt class="docutils literal">\PolToExprTermPrefix{raw_coeff}</tt></a></li> +<li><a class="reference internal" href="#id28" id="id119"><tt class="docutils literal">\PolToExprVar</tt></a></li> +<li><a class="reference internal" href="#id29" id="id120"><tt class="docutils literal">\PolToExprTimes</tt></a></li> </ul> </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> +<li><a class="reference internal" href="#id31" id="id121"><tt class="docutils literal"><span class="pre">\PolToExpr*{polname}</span></tt></a></li> +<li><a class="reference internal" href="#poltofloatexpr-polname" id="id122"><tt class="docutils literal">\PolToFloatExpr{polname}</tt></a><ul> +<li><a class="reference internal" href="#poltofloatexproneterm-raw-coeff-number" id="id123"><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="id124"><tt class="docutils literal">\PolToFloatExprCmd{raw_coeff}</tt></a></li> </ul> </li> -<li><a class="reference internal" href="#poldectostring-decimal-number" id="id131"><tt class="docutils literal">\PolDecToString{decimal number}</tt></a></li> +<li><a class="reference internal" href="#id35" id="id125"><tt class="docutils literal"><span class="pre">\PolToFloatExpr*{polname}</span></tt></a></li> +<li><a class="reference internal" href="#poltolist-polname" id="id126"><tt class="docutils literal">\PolToList{polname}</tt></a></li> +<li><a class="reference internal" href="#poltocsv-polname" id="id127"><tt class="docutils literal">\PolToCSV{polname}</tt></a></li> +<li><a class="reference internal" href="#polsturmchainlength-sturmname" id="id128"><tt class="docutils literal">\PolSturmChainLength{sturmname}</tt></a></li> +<li><a class="reference internal" href="#polsturmifzeroexactlyknown-sturmname-index-a-b" id="id129"><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="id130"><tt class="docutils literal"><span class="pre">\PolSturmIsolatedZeroLeft{sturmname}{index}</span></tt></a></li> +<li><a class="reference internal" href="#polsturmisolatedzeroright-sturmname-index" id="id131"><tt class="docutils literal"><span class="pre">\PolSturmIsolatedZeroRight{sturmname}{index}</span></tt></a></li> +<li><a class="reference internal" href="#polsturmisolatedzeromultiplicity-sturmname-index" id="id132"><tt class="docutils literal"><span class="pre">\PolSturmIsolatedZeroMultiplicity{sturmname}{index}</span></tt></a></li> +<li><a class="reference internal" href="#polsturmnbofisolatedzeros-sturmname" id="id133"><tt class="docutils literal">\PolSturmNbOfIsolatedZeros{sturmname}</tt></a><ul> +<li><a class="reference internal" href="#polsturmnbofrootsof-sturmname-lessthanorequalto-value" id="id134"><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="id135"><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="id136"><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="id137"><tt class="docutils literal"><span class="pre">\PolSturmNbWithMultOfRootsOf{sturmname}\LessThanOrEqualToExpr{expression}</span></tt></a></li> </ul> </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> +<li><a class="reference internal" href="#polsturmnbofrationalroots-sturmname" id="id138"><tt class="docutils literal">\PolSturmNbOfRationalRoots{sturmname}</tt></a></li> +<li><a class="reference internal" href="#polsturmnbofrationalrootswithmultiplicities-sturmname" id="id139"><tt class="docutils literal">\PolSturmNbOfRationalRootsWithMultiplicities{sturmname}</tt></a></li> +<li><a class="reference internal" href="#polsturmrationalroot-sturmname-k" id="id140"><tt class="docutils literal"><span class="pre">\PolSturmRationalRoot{sturmname}{k}</span></tt></a></li> +<li><a class="reference internal" href="#polsturmrationalrootindex-sturmname-k" id="id141"><tt class="docutils literal"><span class="pre">\PolSturmRationalRootIndex{sturmname}{k}</span></tt></a></li> +<li><a class="reference internal" href="#polsturmrationalrootmultiplicity-sturmname-k" id="id142"><tt class="docutils literal"><span class="pre">\PolSturmRationalRootMultiplicity{sturmname}{k}</span></tt></a></li> +<li><a class="reference internal" href="#polintervalwidth-sturmname-index" id="id143"><tt class="docutils literal"><span class="pre">\PolIntervalWidth{sturmname}{index}</span></tt></a></li> +<li><a class="reference internal" href="#expandable-macros-for-use-within-execution-of-polprintintervals" id="id144">Expandable macros for use within execution of <tt class="docutils literal">\PolPrintIntervals</tt></a><ul> +<li><a class="reference internal" href="#polprintintervalsthevar" id="id145"><tt class="docutils literal">\PolPrintIntervalsTheVar</tt></a></li> +<li><a class="reference internal" href="#polprintintervalstheindex" id="id146"><tt class="docutils literal">\PolPrintIntervalsTheIndex</tt></a></li> +<li><a class="reference internal" href="#polprintintervalsthesturmname" id="id147"><tt class="docutils literal">\PolPrintIntervalsTheSturmName</tt></a></li> +<li><a class="reference internal" href="#polprintintervalstheleftendpoint" id="id148"><tt class="docutils literal">\PolPrintIntervalsTheLeftEndPoint</tt></a></li> +<li><a class="reference internal" href="#polprintintervalstherightendpoint" id="id149"><tt class="docutils literal">\PolPrintIntervalsTheRightEndPoint</tt></a></li> +<li><a class="reference internal" href="#polprintintervalsthemultiplicity" id="id150"><tt class="docutils literal">\PolPrintIntervalsTheMultiplicity</tt></a></li> </ul> </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> +<li><a class="reference internal" href="#poldectostring-decimal-number" id="id151"><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="id152">Booleans (with default setting as indicated)</a><ul> +<li><a class="reference internal" href="#xintverbosefalse" id="id153"><tt class="docutils literal">\xintverbosefalse</tt></a></li> +<li><a class="reference internal" href="#poltypesetallfalse" id="id154"><tt class="docutils literal">\poltypesetallfalse</tt></a></li> +<li><a class="reference internal" href="#poltoexprallfalse" id="id155"><tt class="docutils literal">\poltoexprallfalse</tt></a></li> +</ul> +</li> +<li><a class="reference internal" href="#polexprsetup" id="id156"><tt class="docutils literal">\polexprsetup</tt></a></li> +<li><a class="reference internal" href="#technicalities" id="id157">Technicalities</a></li> +<li><a class="reference internal" href="#change-log" id="id158">CHANGE LOG</a></li> +<li><a class="reference internal" href="#acknowledgments" id="id159">Acknowledgments</a></li> </ul> </div> -<div class="section" id="basic-examples"> -<h1><a class="toc-backref" href="#id36">Basic Examples</a></h1> +<div class="section" id="basic-syntax"> +<h1><a class="toc-backref" href="#id38">Basic syntax</a></h1> <p>The syntax is:</p> <pre class="literal-block"> \poldef polname(x):= expression in variable x; @@ -613,7 +636,7 @@ PSTricks-compatible; the letter used in output can be </dl> </div> <div class="section" id="examples-of-localization-of-roots"> -<h1><a class="toc-backref" href="#id37">Examples of localization of roots</a></h1> +<h1><a class="toc-backref" href="#id39">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> @@ -632,17 +655,12 @@ that one can also do:</p> </li> <li><p class="first">For extra info in log file use <tt class="docutils literal">\xintverbosetrue</tt>.</p> </li> -<li><p class="first">To make producing this documentation simpler, the results from execution -of the code snippets are not included. Please try them out yourself...</p> +<li><p class="first">Only for some of these examples is the output included here.</p> </li> </ul> <div class="section" id="a-typical-example"> -<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 -the Sturm chain is still the polynomial first derivative, because there -was no further reduction.</p> +<h2><a class="toc-backref" href="#id40">A typical example</a></h2> +<p>In this example the polynomial is square-free.</p> <pre class="literal-block"> \poldef f(x) := x^7 - x^6 - 2x + 1; @@ -658,11 +676,11 @@ And here is the first root with twenty digits after decimal mark: \PolEnsureIntervalLength{f}{1}{-20} \[\PolSturmIsolatedZeroLeft{f}{1}<Z_1<\PolSturmIsolatedZeroRight{f}{1}\] The first element of the Sturm chain has degree $\PolDegree{f_0}$. As -this same as $\PolDegree{f}$ we know that the latter was square free. -So the derivative is up to a constant \PolTypeset{f_1} (in fact here +this is the original degreee $\PolDegree{f}$ we know that $f$ is square free. +Its derivative is up to a constant \PolTypeset{f_1} (in this example it is identical with it). \PolToSturm{f_1}{f_1}\PolSturmIsolateZeros{f_1}% -It has \PolSturmNbOfIsolatedZeros{f_1} distinct real +The derivative has \PolSturmNbOfIsolatedZeros{f_1} distinct real roots: \PolPrintIntervals[W]{f_1} \PolEnsureIntervalLengths{f_1}{-10}% @@ -683,7 +701,12 @@ to give the exact value for $X_2$! </pre> </div> <div class="section" id="a-degree-four-polynomial-with-nearby-roots"> -<h2><a class="toc-backref" href="#id39">A degree four polynomial with nearby roots</a></h2> +<h2><a class="toc-backref" href="#id41">A degree four polynomial with nearby roots</a></h2> +<p>Notice that this example is a bit outdated as <tt class="docutils literal">0.7</tt> release has +added <tt class="docutils literal"><span class="pre">\PolSturmIsolateZeros**{sturmname}</span></tt> which would find exactly +the roots. The steps here retain their interest when one is interested +in finding isolating intervals for example to prepare some demonstration +of dichotomy method.</p> <pre class="literal-block"> \PolDef{Q}{(x-1.050001)(x-1.105001)(x-1.110501)(x-1.111051)} \PolTypeset{Q} @@ -706,7 +729,7 @@ to give the exact value for $X_2$! </pre> </div> <div class="section" id="the-degree-nine-polynomial-with-0-99-0-999-0-9999-as-triple-roots"> -<h2><a class="toc-backref" href="#id40">The degree nine polynomial with 0.99, 0.999, 0.9999 as triple roots</a></h2> +<h2><a class="toc-backref" href="#id42">The degree nine polynomial with 0.99, 0.999, 0.9999 as triple roots</a></h2> <pre class="literal-block"> % define a user command (xinttools is loaded automatically by polexpr) \newcommand\showmultiplicities[1]{% #1 = "sturmname" @@ -738,10 +761,10 @@ 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>On first pass, these rational roots were found (due to their relative +magnitudes, using <tt class="docutils literal">\PolSturmIsolateZeros**</tt> was not needed here). But +multiplicity computation works also with (decimal) roots not yet +identified or with non-decimal or irrational roots.</p> <p>It is fun to modify only a tiny bit the polynomial and see if polexpr survives:</p> <pre class="literal-block"> @@ -776,10 +799,49 @@ The multiplicity is 1 for the root such that 0.9899888032 < x < 0.98998880 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-degree-five-polynomial-with-three-rational-roots"> +<h2><a class="toc-backref" href="#id43">A degree five polynomial with three rational roots</a></h2> +<pre class="literal-block"> +\poldef Q(x) := 1581755751184441 x^5 + -14907697165025339 x^4 + +48415668972339336 x^3 + -63952057791306264 x^2 + +46833913221154895 x + -49044360626280925; + +\PolToSturm{Q}{Q} +%\begin{flushleft} + \renewcommand\PolTypesetCmdPrefix[1]{\allowbreak\xintiiifSgn{#1}{}{+}{+}}% + $Q_0(x) = \PolTypeset{Q_0}$ +%\end{flushleft} +\PolSturmIsolateZeros**{Q} +\PolPrintIntervals{Q} + +$Q_norr(x) = \PolTypeset{Q_norr}$ +</pre> +<p>Here, all real roots are rational:</p> +<pre class="literal-block"> +Z_1 = 833719/265381 +Z_2 = 165707065/52746197 +Z_3 = 355/113 + +Q_norr(x) = x^2 + 1 +</pre> +<p>And let's get their decimal expansion too:</p> +<pre class="literal-block"> +% print decimal expansion of the found roots +\renewcommand\PolPrintIntervalsPrintExactZero + {\xintTrunc{20}{\PolPrintIntervalsTheLeftEndPoint}\dots} +\PolPrintIntervals{Q} + +Z_1 = 3.14159265358107777120... +Z_2 = 3.14159265358979340254... +Z_3 = 3.14159292035398230088... +</pre> </div> <div class="section" id="a-mignotte-type-polynomial"> -<h2><a class="toc-backref" href="#id41">A Mignotte type polynomial</a></h2> +<h2><a class="toc-backref" href="#id44">A Mignotte type polynomial</a></h2> <pre class="literal-block"> \PolDef{P}{x^10 - (10x-1)^2}% \PolTypeset{P} % prints it in expanded form @@ -805,8 +867,89 @@ Finally, we display 20 digits of the second root: 0.09999900004999650028 < Z_2 < 0.09999900004999650029 </pre> </div> +<div class="section" id="the-wilkinson-polynomial"> +<h2><a class="toc-backref" href="#id45">The Wilkinson polynomial</a></h2> +<p>See <a class="reference external" href="https://en.wikipedia.org/wiki/Wilkinson%27s_polynomial">Wilkinson polynomial</a>.</p> +<pre class="literal-block"> +\documentclass{article} +\usepackage{polexpr} +\begin{document} +%\xintverbosetrue % for the curious... + +\poldef f(x) := mul((x - i), i = 1..20); + +\renewcommand\PolTypesetCmdPrefix[1]{\allowbreak\xintiiifSgn{#1}{}{+}{+}}% +\renewcommand\PolTypesetOne[1]{\xintDecToString{#1}}% + +\noindent\PolTypeset{f} + +\PolToSturm{f}{f} +\PolSturmIsolateZeros{f} +\PolPrintIntervals{f} + +\clearpage + +\poldef g(x) := f(x) - 2**{-23} x**19; + +% be patient! +\PolToSturm{g}{g} +\noindent\PolTypeset{g_0}% integer coefficient primitive polynomial + +\PolSturmIsolateZeros{g} +\PolEnsureIntervalLengths{g}{-10} + +\renewcommand\PolPrintIntervalsPrintMultiplicity{} +\PolPrintIntervals*{g} + +\end{document} +</pre> +<p>The first polynomial:</p> +<pre class="literal-block"> +f(x) = x**20 +- 210 x**19 ++ 20615 x**18 +- 1256850 x**17 ++ 53327946 x**16 +- 1672280820 x**15 ++ 40171771630 x**14 +- 756111184500 x**13 ++ 11310276995381 x**12 +- 135585182899530 x**11 ++ 1307535010540395 x**10 +- 10142299865511450 x**9 ++ 63030812099294896 x**8 +- 311333643161390640 x**7 ++ 1206647803780373360 x**6 +- 3599979517947607200 x**5 ++ 8037811822645051776 x**4 +- 12870931245150988800 x**3 ++ 13803759753640704000 x**2 +- 8752948036761600000 x ++ 2432902008176640000 +</pre> +<p>is handled fast enough (a few seconds), but the modified one <tt class="docutils literal">f(x) - +<span class="pre">2**-23</span> <span class="pre">x**19</span></tt> takes about 20x longer (the Sturm chain polynomials +have integer coefficients with up to 321 digits, whereas (surprisingly +perhaps) those of the Sturm chain polynomials derived from <tt class="docutils literal">f</tt> never +have more than 21 digits ...).</p> +<p>Once the Sturm chain is computed and the zeros isolated, obtaining their +decimal digits is relatively faster. Here is for the ten real roots of +<tt class="docutils literal">f(x) - <span class="pre">2**-23</span> <span class="pre">x**19</span></tt> as computed by the code above:</p> +<pre class="literal-block"> +Z_1 = 0.9999999999... +Z_2 = 2.0000000000... +Z_3 = 2.9999999999... +Z_4 = 4.0000000002... +Z_5 = 4.9999999275... +Z_6 = 6.0000069439... +Z_7 = 6.9996972339... +Z_8 = 8.0072676034... +Z_9 = 8.9172502485... +Z_10 = 20.8469081014... +</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="#id42">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="#id46">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> @@ -845,26 +988,26 @@ x^41 <pre class="literal-block"> \PolDef{P}{mul((x-i*1e-1), i=-20..20)}% \PolToSturm{P}{S} % dutifully computes S_0, ..., S_{41} +% the [1] optional argument limits the search to interval (-10,10) \PolSturmIsolateZeros[1]{S} % finds *exactly* (but a bit slowly) all 41 roots! \PolPrintIntervals{S} % nice, isn't it? </pre> <div class="admonition note"> <p class="first admonition-title">Note</p> -<p>Release <tt class="docutils literal">0.5</tt> has experimental addition of optional argument +<p>Release <tt class="docutils literal">0.5</tt> has <em>experimental</em> addition of optional argument <tt class="docutils literal">E</tt> to <tt class="docutils literal">\PolSturmIsolateZeros</tt>. It instructs to search roots only -in interval <tt class="docutils literal"><span class="pre">(-10^E,</span> 10^E)</tt>, extremities assumed to not be roots. -Thus here:</p> -<pre class="literal-block"> -\PolSturmIsolateZeros[1]{S} -</pre> -<p>gives some speed gain; without it, it turns out in this case that -<tt class="docutils literal">polexpr</tt> would have started with <tt class="docutils literal"><span class="pre">(-10^6,</span> 10^6)</tt> interval.</p> -<p class="last">This will probably get replaced in future by the specification of -a general interval.</p> +in interval <tt class="docutils literal"><span class="pre">(-10^E,</span> 10^E)</tt>. Important: the extremities are +<em>assumed to not be roots</em>. In this example, the <tt class="docutils literal">[1]</tt> in +<tt class="docutils literal"><span class="pre">\PolSturmIsolateZeros[1]{S}</span></tt> gives some speed gain; without it, it +turns out in this case that <tt class="docutils literal">polexpr</tt> would have started with +<tt class="docutils literal"><span class="pre">(-10^6,</span> 10^6)</tt> interval.</p> +<p class="last">Please note that this will probably get replaced in future by the +specification of a general interval. Do not rely on meaning of this +optional argument keeping the same.</p> </div> </div> <div class="section" id="roots-of-chebyshev-polynomials"> -<h2><a class="toc-backref" href="#id43">Roots of Chebyshev polynomials</a></h2> +<h2><a class="toc-backref" href="#id47">Roots of Chebyshev polynomials</a></h2> <pre class="literal-block"> \newcount\mycount \poldef T_0(x) := 1; @@ -887,9 +1030,9 @@ a general interval.</p> </div> </div> <div class="section" id="non-expandable-macros"> -<h1><a class="toc-backref" href="#id44">Non-expandable macros</a></h1> +<h1><a class="toc-backref" href="#id48">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="#id45"><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="#id49"><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, @@ -926,7 +1069,7 @@ manually, if needed.</p> </blockquote> </div> <div class="section" id="poldef-letter-polname-expression-in-letter"> -<span id="id2"></span><h2><a class="toc-backref" href="#id46"><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="#id50"><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 @@ -934,7 +1077,7 @@ semi-colon in presence of some packages.) In absence of the <tt class="docutils literal">[letter]</tt> optional argument, the variable is assumed to be <tt class="docutils literal">x</tt>.</blockquote> </div> <div class="section" id="polgenfloatvariant-polname"> -<span id="polgenfloatvariant"></span><h2><a class="toc-backref" href="#id47"><tt class="docutils literal">\PolGenFloatVariant{polname}</tt></a></h2> +<span id="polgenfloatvariant"></span><h2><a class="toc-backref" href="#id51"><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 @@ -953,7 +1096,7 @@ context.</p> </blockquote> </div> <div class="section" id="pollet-polname-2-polname-1"> -<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> +<span id="pollet"></span><h2><a class="toc-backref" href="#id52"><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 @@ -961,12 +1104,12 @@ new one <tt class="docutils literal">polname_2</tt>. Same effect as <tt class="docutils literal">=</tt> is optional.</blockquote> </div> <div class="section" id="polgloballet-polname-2-polname-1"> -<span id="polgloballet"></span><h2><a class="toc-backref" href="#id49"><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="#id53"><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="#id50"><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="#id54"><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> @@ -989,7 +1132,7 @@ indices act the same in both.)</p> </blockquote> </div> <div class="section" id="polget-polname-fromarray-macro"> -<span id="polget"></span><h2><a class="toc-backref" href="#id51"><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="#id55"><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 @@ -1010,19 +1153,19 @@ via <a class="reference external" href="http://www.ctan.org/pkg/xint">xintfrac</ </blockquote> </div> <div class="section" id="polfromcsv-polname-csv"> -<span id="polfromcsv"></span><h2><a class="toc-backref" href="#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, -the constant term being the first item. No validity checks. Spaces -from the list argument are trimmed. List items are each expanded in -an <tt class="docutils literal">\edef</tt> and then put into normalized form via <a class="reference external" href="http://www.ctan.org/pkg/xint">xintfrac</a>'s -macro <tt class="docutils literal">\xintRaw</tt>.</p> -<p>Leading zero coefficients are removed:</p> +<span id="polfromcsv"></span><h2><a class="toc-backref" href="#id56"><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, the <em>first +item</em> gives the constant term, the <em>last item</em> gives the leading +coefficient, except if zero, then it is dropped (iteratively). List +items are each expanded in an <tt class="docutils literal">\edef</tt> and then put into normalized +form via <a class="reference external" href="http://www.ctan.org/pkg/xint">xintfrac</a>'s macro <tt class="docutils literal">\xintRaw</tt>.</p> +<p>As leading zero coefficients are removed:</p> <pre class="literal-block"> \PolFromCSV{f}{0, 0, 0, 0, 0, 0, 0, 0, 0, 0} </pre> -<p>defines the zero polynomial, which has only one (zero) coefficient.</p> +<p>defines the zero polynomial, which holds only one coefficient.</p> <p>See also expandable macro <a class="reference internal" href="#poltocsv-polname">\PolToCSV</a>.</p> <div class="admonition note"> <p class="first admonition-title">Note</p> @@ -1032,7 +1175,7 @@ macro <tt class="docutils literal">\xintRaw</tt>.</p> </blockquote> </div> <div class="section" id="poltypeset-polname"> -<span id="poltypeset"></span><h2><a class="toc-backref" href="#id53"><tt class="docutils literal">\PolTypeset{polname}</tt></a></h2> +<span id="poltypeset"></span><h2><a class="toc-backref" href="#id57"><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> @@ -1046,7 +1189,7 @@ can be re-defined for customization. Their default definitions are expandable, but this is not a requirement.</p> </blockquote> <div class="section" id="poltypesetcmd-raw-coeff"> -<span id="poltypesetcmd"></span><h3><a class="toc-backref" href="#id54"><tt class="docutils literal">\PolTypesetCmd{raw_coeff}</tt></a></h3> +<span id="poltypesetcmd"></span><h3><a class="toc-backref" href="#id58"><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 @@ -1056,7 +1199,7 @@ minus one is handled by <a class="reference internal" href="#poltypesetone-raw-c </blockquote> </div> <div class="section" id="poltypesetone-raw-coeff"> -<span id="poltypesetone"></span><h3><a class="toc-backref" href="#id55"><tt class="docutils literal">\PolTypesetOne{raw_coeff}</tt></a></h3> +<span id="poltypesetone"></span><h3><a class="toc-backref" href="#id59"><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> @@ -1081,7 +1224,7 @@ which uses decimal notation (at least for the numerator part).</p> </blockquote> </div> <div class="section" id="id6"> -<span id="poltypesetmonomialcmd"></span><h3><a class="toc-backref" href="#id56"><tt class="docutils literal">\PolTypesetMonomialCmd</tt></a></h3> +<span id="poltypesetmonomialcmd"></span><h3><a class="toc-backref" href="#id60"><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 @@ -1091,7 +1234,7 @@ for the constant term, <tt class="docutils literal">\PolVar</tt> for the first d <tt class="docutils literal">\ifnum</tt> tests.</blockquote> </div> <div class="section" id="poltypesetcmdprefix-raw-coeff"> -<span id="poltypesetcmdprefix"></span><h3><a class="toc-backref" href="#id57"><tt class="docutils literal">\PolTypesetCmdPrefix{raw_coeff}</tt></a></h3> +<span id="poltypesetcmdprefix"></span><h3><a class="toc-backref" href="#id61"><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 @@ -1102,13 +1245,13 @@ for the first term.</blockquote> </div> </div> <div class="section" id="id8"> -<span id="id7"></span><h2><a class="toc-backref" href="#id58"><tt class="docutils literal"><span class="pre">\PolTypeset*{polname}</span></tt></a></h2> +<span id="id7"></span><h2><a class="toc-backref" href="#id62"><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="#id59"><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="#id63"><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> @@ -1118,7 +1261,7 @@ by <tt class="docutils literal">f'</tt>.</p> </blockquote> </div> <div class="section" id="poldiff-n-polname-1-polname-2"> -<span id="poldiff-n"></span><h2><a class="toc-backref" href="#id60"><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="#id64"><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 @@ -1126,7 +1269,7 @@ Identical arguments is allowed. With <tt class="docutils literal">N=0</tt>, same using <tt class="docutils literal">\PolAntiDiff</tt>.</blockquote> </div> <div class="section" id="polantidiff-polname-1-polname-2"> -<span id="polantidiff"></span><h2><a class="toc-backref" href="#id61"><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="#id65"><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> @@ -1135,32 +1278,32 @@ at zero.</p> </blockquote> </div> <div class="section" id="polantidiff-n-polname-1-polname-2"> -<span id="polantidiff-n"></span><h2><a class="toc-backref" href="#id62"><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="#id66"><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="#id63"><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="#id67"><tt class="docutils literal"><span class="pre">\PolDivide{polname_1}{polname_2}{polname_Q}{polname_R}</span></tt></a></h2> <blockquote> This sets <tt class="docutils literal">polname_Q</tt> and <tt class="docutils literal">polname_R</tt> to be the quotient and remainder in the Euclidean division of <tt class="docutils literal">polname_1</tt> by <tt class="docutils literal">polname_2</tt>.</blockquote> </div> <div class="section" id="polquo-polname-1-polname-2-polname-q"> -<span id="polquo"></span><h2><a class="toc-backref" href="#id64"><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="#id68"><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="#id65"><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="#id69"><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="#id66"><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="#id70"><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> @@ -1186,7 +1329,7 @@ polynomial.</blockquote> no common factor among the coefficients. --> </div> <div class="section" id="poltosturm-polname-sturmname"> -<span id="poltosturm"></span><h2><a class="toc-backref" href="#id67"><tt class="docutils literal"><span class="pre">\PolToSturm{polname}{sturmname}</span></tt></a></h2> +<span id="poltosturm"></span><h2><a class="toc-backref" href="#id71"><tt class="docutils literal"><span class="pre">\PolToSturm{polname}{sturmname}</span></tt></a></h2> <blockquote> <p>With <tt class="docutils literal">polname</tt> being for example <tt class="docutils literal">P</tt>, the macro starts by computing polynomials <tt class="docutils literal">P</tt> and <tt class="docutils literal">P'</tt>, then computes the (opposite @@ -1219,19 +1362,22 @@ not done if this last one is the constant <tt class="docutils literal">1</tt> or 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> +polynomial <tt class="docutils literal">polname</tt>, but with each root now of multiplicity one: +i.e. it is the "square-free part" of original polynomial <tt class="docutils literal">polname</tt>.</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>The polynomials <tt class="docutils literal">sturmname_k</tt> main utility is for the execution of +<a class="reference internal" href="#polsturmisolatezeros-sturmname">\PolSturmIsolateZeros{sturmname}</a>. Be careful not to use these +names <tt class="docutils literal">sturmname_0</tt>, <tt class="docutils literal">sturmname_1</tt>, etc... for defining other +polynomials after having done <tt class="docutils literal"><span class="pre">\PolToSturm{polname}{sturmname}</span> and +before executing <span class="pre">``\PolSturmIsolateZeros{sturmname}</span></tt> else the +latter will behave erroneously.</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="#id68"><tt class="docutils literal"><span class="pre">\PolToSturm*{polname}{sturmname}</span></tt></a></h2> +<span id="id9"></span><h2><a class="toc-backref" href="#id72"><tt class="docutils literal"><span class="pre">\PolToSturm*{polname}{sturmname}</span></tt></a></h2> <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 @@ -1242,10 +1388,20 @@ polynomials <tt class="docutils literal">sturmname_k_</tt>, <tt class="docutils <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> +<div class="admonition hint"> +<p class="first admonition-title">Hint</p> +<p class="last">The square-free part of <tt class="docutils literal">polname</tt> is <tt class="docutils literal">sturmname_0</tt>, and their +quotient is the polynomial with name +<tt class="docutils literal">sturname_\PolSturmChainLength{sturmname}_</tt>. It thus easy to +set-up a loop iteratively computing the latter until the last one +is a constant, thus obtaining the decomposition of an <tt class="docutils literal">f</tt> as +a product <tt class="docutils literal">c f_1 f_2 f_3 ...</tt> of a constant and square-free (primitive) +polynomials, where each <tt class="docutils literal">f_i</tt> divides its predecessor.</p> +</div> </blockquote> </div> <div class="section" id="polsettosturmchainsignchangesat-macro-sturmname-fraction"> -<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> +<span id="polsettosturmchainsignchangesat"></span><h2><a class="toc-backref" href="#id73"><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> @@ -1262,7 +1418,7 @@ use <tt class="docutils literal">[\empty]</tt> as extra optional argument.</p> </blockquote> </div> <div class="section" id="polsettonbofzeroswithin-macro-sturmname-value-a-value-b"> -<span id="polsettonbofzeroswithin"></span><h2><a class="toc-backref" href="#id70"><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="#id74"><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 <strong>distinct</strong> roots of <tt class="docutils literal">sturmname_0</tt> in the interval <tt class="docutils literal">(value_a, @@ -1291,12 +1447,12 @@ which requires prior execution of </blockquote> </div> <div class="section" id="polsturmisolatezeros-sturmname"> -<span id="polsturmisolatezeros"></span><h2><a class="toc-backref" href="#id71"><tt class="docutils literal">\PolSturmIsolateZeros{sturmname}</tt></a></h2> +<span id="polsturmisolatezeros"></span><h2><a class="toc-backref" href="#id75"><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 note"> -<p class="first admonition-title">Note</p> +<p>The macros locates, using <a class="reference external" href="https://en.wikipedia.org/wiki/Sturm%27s_theorem">Sturm theorem</a>, as many disjoint +intervals as there are (real) roots.</p> +<div class="admonition important"> +<p class="first admonition-title">Important</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, @@ -1311,47 +1467,63 @@ polynomials <tt class="docutils literal">f_0</tt>, <tt class="docutils literal"> 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 -which are roots. Non-singleton intervals get refined to make sure -none of their two limit points is a root: they contain each a single -root, in their respective interiors.</p> -<!-- This procedure is covariant -with the independent variable ``x`` becoming ``-x``. -Hmm, pas sûr et trop fatigué --> +<p>After its execution they are two types of such intervals (stored in +memory and accessible via macros or <a class="reference external" href="http://www.ctan.org/pkg/xint">xintexpr</a> variables, see below):</p> +<ul class="simple"> +<li>singleton <tt class="docutils literal">{a}</tt>: then <tt class="docutils literal">a</tt> is a root, (necessarily a decimal +number, but not all such decimal numbers are exactly identified yet).</li> +<li>open intervals <tt class="docutils literal">(a,b)</tt>: then there is exactly one root <tt class="docutils literal">z</tt> +such that <tt class="docutils literal">a < z < b</tt>, and the end points are guaranteed to not +be roots.</li> +</ul> <p>The interval boundaries are decimal numbers, originating in iterated decimal subdivision from initial intervals -<tt class="docutils literal"><span class="pre">(-10^E,</span> 0)</tt> and <tt class="docutils literal">(0, 10^E)</tt>; if zero is a root it is always -identified individually. The non-singleton intervals are of the +<tt class="docutils literal"><span class="pre">(-10^E,</span> 0)</tt> and <tt class="docutils literal">(0, 10^E)</tt> with <tt class="docutils literal">E</tt> chosen initially large +enough so that all roots are enclosed; if zero is a root it is always +identified as such. The non-singleton intervals are of the type <tt class="docutils literal">(a/10^f, <span class="pre">(a+1)/10^f)</span></tt> with <tt class="docutils literal">a</tt> an integer, which is -neither <tt class="docutils literal">0</tt> nor <tt class="docutils literal"><span class="pre">-1</span></tt>. Hence <tt class="docutils literal">a</tt> and <tt class="docutils literal">a+1</tt> are both positive -or both negative.</p> +neither <tt class="docutils literal">0</tt> nor <tt class="docutils literal"><span class="pre">-1</span></tt>. Hence either <tt class="docutils literal">a</tt> and <tt class="docutils literal">a+1</tt> are both positive +or they are both negative.</p> +<p>One does not <em>a priori</em> know what will be the lengths of these +intervals (except that they are always powers of ten), they +vary depending on how many digits two successive roots have in +common in their respective decimal expansions.</p> +<div class="admonition important"> +<p class="first admonition-title">Important</p> +<p>If some two consecutive intervals share an end-point, no +information is yet gained about the separation between the two +roots which could at this stage be arbitrarily small.</p> +<p class="last">See <a class="reference internal" href="#polrefineinterval-sturmname-index">\PolRefineInterval*{sturmname}{index}</a> which addresses +this issue.</p> +</div> +<!-- This procedure is covariant +with the independent variable ``x`` becoming ``-x``. +Hmm, pas sûr et trop fatigué --> <p>The interval boundaries (and exactly found roots) are made available for future computations in <tt class="docutils literal">\xintexpr</tt>-essions or polynomial definitions as variables <tt class="docutils literal"><sturmname>L_1</tt>, <tt class="docutils literal"><sturmname>L_2</tt>, etc..., for the left end-points and <tt class="docutils literal"><sturmname>R_1</tt>, <tt class="docutils literal"><sturmname>R_2</tt>, ..., for the right end-points.</p> -<p>Also two macro arrays (in the sense of -<a class="reference external" href="http://www.ctan.org/pkg/xint">xinttools</a>'s <tt class="docutils literal">\xintAssignArray</tt>) are created for holding the -interval end-points written out in standard decimal notation -(see <a class="reference internal" href="#poldectostring-decimal-number">\PolDecToString{decimal number}</a>). -To access these values, macros -<a class="reference internal" href="#polsturmisolatedzeroleft-sturmname-index">\PolSturmIsolatedZeroLeft{sturmname}{index}</a> and -<a class="reference internal" href="#polsturmisolatedzeroright-sturmname-index">\PolSturmIsolatedZeroRight{sturmname}{index}</a> are provided.</p> +<p>Thus for example, if <tt class="docutils literal">sturmname</tt> is <tt class="docutils literal">f</tt>, one can use the +<a class="reference external" href="http://www.ctan.org/pkg/xint">xintexpr</a> variables <tt class="docutils literal">fL_1</tt>, <tt class="docutils literal">fL_2</tt>, ... to refer in expressions +to the left end-points (or to the exact root, if left and right end +points coincide). Additionally, <a class="reference external" href="http://www.ctan.org/pkg/xint">xintexpr</a> variable <tt class="docutils literal">fZ_1_isknown</tt> +will have value <tt class="docutils literal">1</tt> if the root in the first interval is known, +and <tt class="docutils literal">0</tt> otherwise. And similarly for the other intervals.</p> +<p>Also, macros <a class="reference internal" href="#polsturmisolatedzeroleft-sturmname-index">\PolSturmIsolatedZeroLeft{sturmname}{index}</a> and +<a class="reference internal" href="#polsturmisolatedzeroright-sturmname-index">\PolSturmIsolatedZeroRight{sturmname}{index}</a> are provided which +expand to these same values, written in decimal notation (i.e. +pre-processed by <a class="reference internal" href="#poldectostring">\PolDecToString</a>.) And there +is also <a class="reference internal" href="#polsturmifzeroexactlyknown-sturmname-index-a-b">\PolSturmIfZeroExactlyKnown{sturmname}{index}{A}{B}</a>.</p> <div class="admonition important"> <p class="first admonition-title">Important</p> -<p class="last">Trailing zeroes in these stored decimal numbers are significant: -they are also present in the decimal expansion of the exact root.</p> -</div> -<div class="admonition note"> -<p class="first admonition-title">Note</p> -<p class="last">The actual array macros are <tt class="docutils literal">\POL_ZeroInt<sturmname>L</tt> and -<tt class="docutils literal">\POL_ZeroInt<sturmname>R</tt> but as these names use the -non-letter character <tt class="docutils literal">_</tt> and possibly also digits from -<tt class="docutils literal">sturmname</tt>, the accessor macros above have been made part of -the package.</p> +<p class="last">Trailing zeroes in the stored decimal numbers accessible via the +macros are significant: they are also present in the decimal +expansion of the exact root.</p> </div> +<p>These variables and macros are automatically updated when one next +uses macros such as <a class="reference internal" href="#polrefineinterval-sturmname-index">\PolRefineInterval*{sturmname}{index}</a>.</p> <p>The start of decimal expansion of a positive <tt class="docutils literal">k</tt>-th root is given 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 @@ -1359,24 +1531,19 @@ 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-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> +will expandably compute respectively the number of real roots at +most equal to <tt class="docutils literal">value</tt> or <tt class="docutils literal">expression</tt>, and the same but with +multiplicities.</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> <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 +<p class="last">In the current implementation the <a class="reference external" href="http://www.ctan.org/pkg/xint">xintexpr</a> variables +and <a class="reference external" href="http://www.ctan.org/pkg/xint">xinttools</a> arrays are globally defined. On the other hand the Sturm sequence polynomials obey the current scope.</p> </div> <div class="admonition note"> <p class="first admonition-title">Note</p> -<p class="last">When two successive roots are located in adjacent intervals, the -separation between them is not lower bounded. See -<a class="reference internal" href="#polrefineinterval-sturmname-index">\PolRefineInterval*{sturmname}{index}</a>.</p> -</div> -<div class="admonition note"> -<p class="first admonition-title">Note</p> <p>As all computations are done <em>exactly</em> there can be no errors... apart those due to bad coding by author. The results are exact bounds for the mathematically exact real roots.</p> @@ -1390,7 +1557,7 @@ are studied in numerical mathematics.</p> </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> +<span id="id11"></span><h2><a class="toc-backref" href="#id76"><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 @@ -1400,9 +1567,9 @@ after executing this macro, 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> +<p>Furthermore, if for example the <tt class="docutils literal">sturmname</tt> is <tt class="docutils literal">f</tt>, <a class="reference external" href="http://www.ctan.org/pkg/xint">xintexpr</a> +variables <tt class="docutils literal">fM_1</tt>, <tt class="docutils literal">fM_2</tt>... hold the multiplicities thus +computed.</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 @@ -1412,19 +1579,76 @@ 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> +roots</a> for an example.</p> +</blockquote> +</div> +<div class="section" id="id14"> +<span id="id13"></span><h2><a class="toc-backref" href="#id77"><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="#id12">\PolSturmIsolateZeros*{sturmname}</a> and +in addition it does the extra work to determine all the <em>rational</em> +roots.</p> +<div class="admonition note"> +<p class="first admonition-title">Note</p> +<p class="last">After execution of this macro, a root is "known" if and only if +it is rational.</p> +</div> +<p>Furthermore, primitive polynomial <tt class="docutils literal">sturmname_sqf_norr</tt> is created +to match the (square-free) <tt class="docutils literal">sturmname_0</tt> from which all rational +roots have been removed (see <a class="reference internal" href="#polexprsetup">\polexprsetup</a> for customizing this +name). The number of distinct rational roots is thus the difference +between the degrees of these two polynomials (see also +<a class="reference internal" href="#polsturmnbofrationalroots-sturmname">\PolSturmNbOfRationalRoots{sturmname}</a>).</p> +<p>And <tt class="docutils literal">sturmname_norr</tt> is <tt class="docutils literal">sturmname_0_</tt> from which all rational +roots have been removed (see <a class="reference internal" href="#polexprsetup">\polexprsetup</a>), i.e. it contains +the irrational roots of the original polynomial, with the same +multiplicities.</p> +<p>See <a class="reference internal" href="#a-degree-five-polynomial-with-three-rational-roots">A degree five polynomial with three rational +roots</a> for an example.</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> +<span id="polsturmisolatezerosandgetmultiplicities"></span><h2><a class="toc-backref" href="#id78"><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> +This is another name for <a class="reference internal" href="#id12">\PolSturmIsolateZeros*{sturmname}</a>.</blockquote> +</div> +<div class="section" id="polsturmisolatezerosgetmultiplicitiesandrationalroots-sturmname"> +<span id="polsturmisolatezerosgetmultiplicitiesandrationalroots"></span><h2><a class="toc-backref" href="#id79"><tt class="docutils literal">\PolSturmIsolateZerosGetMultiplicitiesAndRationalRoots{sturmname}</tt></a></h2> +<blockquote> +This is another name for <a class="reference internal" href="#id14">\PolSturmIsolateZeros**{sturmname}</a>.</blockquote> +</div> +<div class="section" id="polsturmisolatezerosandfindrationalroots-sturmname"> +<h2><a class="toc-backref" href="#id80"><tt class="docutils literal">\PolSturmIsolateZerosAndFindRationalRoots{sturmname}</tt></a></h2> +<blockquote> +<p>This works exactly like <a class="reference internal" href="#id14">\PolSturmIsolateZeros**{sturmname}</a> +(inclusive of declaring the polynomials <tt class="docutils literal">sturmname_sqf_norr</tt> and +<tt class="docutils literal">sturmname_norr</tt> with no rational roots) except that it does <em>not</em> +compute the multiplicities of the <em>non-rational</em> roots.</p> +<div class="admonition note"> +<p class="first admonition-title">Note</p> +<p class="last">There is no macro to find the rational roots but not compute +their multiplicities at the same time.</p> +</div> +<div class="admonition attention"> +<p class="first admonition-title">Attention!</p> +<p>This macro does <em>not</em> define <a class="reference external" href="http://www.ctan.org/pkg/xint">xintexpr</a> variables +<tt class="docutils literal">sturmnameM_1</tt>, <tt class="docutils literal">sturmnameM_2</tt>, ... holding the +multiplicities and it leaves the multiplicity array (whose accessor +is <a class="reference internal" href="#polsturmisolatedzeromultiplicity-sturmname-index">\PolSturmIsolatedZeroMultiplicity{sturmname}{index}</a>) into +a broken state, as all non-rational roots will supposedly have +multiplicity one. This means that the output of +<a class="reference internal" href="#id18">\PolPrintIntervals*</a> for example will be +erroneous for the intervals with irrational roots.</p> +<p class="last">I decided to document it because finding multiplicities of the +non rational roots is somewhat costly, and one may be interested +only into finding the rational roots (of course random +polynomials with integer coefficients will not have <em>any</em> +rational root anyhow).</p> +</div> </blockquote> </div> <div class="section" id="polrefineinterval-sturmname-index"> -<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> +<span id="polrefineinterval"></span><h2><a class="toc-backref" href="#id81"><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 @@ -1433,21 +1657,21 @@ the original interval. This means that the <tt class="docutils literal">k</tt>th strictly separated from the other roots.</blockquote> </div> <div class="section" id="polrefineinterval-n-sturmname-index"> -<span id="polrefineinterval-n"></span><h2><a class="toc-backref" href="#id75"><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="#id82"><tt class="docutils literal"><span class="pre">\PolRefineInterval[N]{sturmname}{index}</span></tt></a></h2> <blockquote> The <tt class="docutils literal">index</tt>-th interval (starting count at one) is further subdivided once, reducing its length by a factor of 10. This is done <tt class="docutils literal">N</tt> times if the optional argument <tt class="docutils literal">[N]</tt> is present.</blockquote> </div> <div class="section" id="polensureintervallength-sturmname-index-e"> -<span id="polensureintervallength"></span><h2><a class="toc-backref" href="#id76"><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="#id83"><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 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="#id77"><tt class="docutils literal"><span class="pre">\PolEnsureIntervalLengths{sturmname}{E}</span></tt></a></h2> +<span id="polensureintervallengths"></span><h2><a class="toc-backref" href="#id84"><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 @@ -1458,63 +1682,136 @@ than <tt class="docutils literal">10^E</tt> in output only if it did not change </blockquote> </div> <div class="section" id="polprintintervals-varname-sturmname"> -<span id="polprintintervals"></span><h2><a class="toc-backref" href="#id78"><tt class="docutils literal"><span class="pre">\PolPrintIntervals[varname]{sturmname}</span></tt></a></h2> +<span id="polprintintervals"></span><h2><a class="toc-backref" href="#id85"><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 -specify a replacement for the default <tt class="docutils literal">Z</tt>). This will be done in a +specify a replacement for the default <tt class="docutils literal">Z</tt>). This will be done (by +default) in a math mode <tt class="docutils literal">array</tt>, one interval per row, and pattern <tt class="docutils literal">rcccl</tt>, where the second and fourth column hold the <tt class="docutils literal"><</tt> sign, except when the interval reduces to a singleton, which means the root is known -exactly. The user is invited to renewcommand the macro if some other -type of tabular environment for example is wanted.</p> -<p>In each array cell the corresponding interval end-point (which may -be an exactly known root) is available as macro -<a class="reference internal" href="#polprintintervalstheendpoint">\PolPrintIntervalsTheEndPoint</a> (in decimal notation). And the -corresponding interval index is available as -<a class="reference internal" href="#polprintintervalstheindex">\PolPrintIntervalsTheIndex</a>.</p> -<p>These values may be tested to decide some on-the-fly customization -(color for example), via the following auxiliaries which can be -modified by user. Furthermore these auxiliaries can also use the -following conditionals: <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> +exactly.</p> +<div class="admonition attention"> +<p class="first admonition-title">Attention!</p> +<p class="last">This macro was refactored at 0.7, its default output remained +identical but the ways to customize it got completely +modified.</p> +</div> +<p>See next macros which govern its output.</p> </blockquote> -<div class="section" id="id13"> -<span id="polprintintervalsprintexactzero"></span><h3><a class="toc-backref" href="#id79"><tt class="docutils literal">\PolPrintIntervalsPrintExactZero</tt></a></h3> +<div class="section" id="polprintintervalsnorealroots"> +<h3><a class="toc-backref" href="#id86"><tt class="docutils literal">\PolPrintIntervalsNoRealRoots</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 -definition is:</p> +<p>Executed in place of an <tt class="docutils literal">array</tt> environment, when there are no +real roots. Default definition:</p> <pre class="literal-block"> -\newcommand\PolPrintIntervalsPrintExactZero{\PolPrintIntervalsTheEndPoint}% +\newcommand\PolPrintIntervalsNoRealRoots{} </pre> -<p>Recall that this is expanded in an array cell.</p> -<p>If for example you want to print in red the third root, known -exactly, the macro could make a test for the value of -<a class="reference internal" href="#polprintintervalstheindex">\PolPrintIntervalsTheIndex</a> and act accordingly.</p> </blockquote> </div> -<div class="section" id="id14"> -<span id="polprintintervalsprintleftendpoint"></span><h3><a class="toc-backref" href="#id80"><tt class="docutils literal">\PolPrintIntervalsPrintLeftEndPoint</tt></a></h3> +<div class="section" id="polprintintervalsbeginenv"> +<h3><a class="toc-backref" href="#id87"><tt class="docutils literal">\PolPrintIntervalsBeginEnv</tt></a></h3> +<blockquote> +<p>Default definition:</p> +<pre class="literal-block"> +\newcommand\PolPrintIntervalsBeginEnv{\[\begin{array}{rcccl}} +</pre> +</blockquote> +</div> +<div class="section" id="polprintintervalsendenv"> +<h3><a class="toc-backref" href="#id88"><tt class="docutils literal">\PolPrintIntervalsEndEnv</tt></a></h3> +<blockquote> +<p>Default definition:</p> +<pre class="literal-block"> +\newcommand\PolPrintIntervalsEndEnv{\end{array}\]} +</pre> +</blockquote> +</div> +<div class="section" id="polprintintervalsknownroot"> +<h3><a class="toc-backref" href="#id89"><tt class="docutils literal">\PolPrintIntervalsKnownRoot</tt></a></h3> +<blockquote> +<p>Default definition:</p> +<pre class="literal-block"> +\newcommand\PolPrintIntervalsKnownRoot{% + &&\PolPrintIntervalsTheVar_{\PolPrintIntervalsTheIndex}% + &=&\PolPrintIntervalsPrintExactZero +} +</pre> +</blockquote> +</div> +<div class="section" id="polprintintervalsunknownroot"> +<h3><a class="toc-backref" href="#id90"><tt class="docutils literal">\PolPrintIntervalsUnknownRoot</tt></a></h3> <blockquote> -<p>Package definition is:</p> +<p>Default definition:</p> <pre class="literal-block"> -\newcommand\PolPrintIntervalsPrintLeftEndPoint{\PolPrintIntervalsTheEndPoint}% +\newcommand\PolPrintIntervalsUnknownRoot{% + \PolPrintIntervalsPrintLeftEndPoint&<&% + \PolPrintIntervalsTheVar_{\PolPrintIntervalsTheIndex}&<&% + \PolPrintIntervalsPrintRightEndPoint +} </pre> </blockquote> </div> <div class="section" id="id15"> -<span id="polprintintervalsprintrightendpoint"></span><h3><a class="toc-backref" href="#id81"><tt class="docutils literal">\PolPrintIntervalsPrintRightEndPoint</tt></a></h3> +<span id="polprintintervalsprintexactzero"></span><h3><a class="toc-backref" href="#id91"><tt class="docutils literal">\PolPrintIntervalsPrintExactZero</tt></a></h3> <blockquote> -<p>Package definition is:</p> +<p>Default definition:</p> <pre class="literal-block"> -\newcommand\PolPrintIntervalsPrintRightEndPoint{\PolPrintIntervalsTheEndPoint}% +\newcommand\PolPrintIntervalsPrintExactZero{\PolPrintIntervalsTheLeftEndPoint} +</pre> +</blockquote> +</div> +<div class="section" id="id16"> +<span id="polprintintervalsprintleftendpoint"></span><h3><a class="toc-backref" href="#id92"><tt class="docutils literal">\PolPrintIntervalsPrintLeftEndPoint</tt></a></h3> +<blockquote> +<p>Default definition:</p> +<pre class="literal-block"> +\newcommand\PolPrintIntervalsPrintLeftEndPoint{\PolPrintIntervalsTheLeftEndPoint} +</pre> +</blockquote> +</div> +<div class="section" id="id17"> +<span id="polprintintervalsprintrightendpoint"></span><h3><a class="toc-backref" href="#id93"><tt class="docutils literal">\PolPrintIntervalsPrintRightEndPoint</tt></a></h3> +<blockquote> +<p>Default definition is:</p> +<pre class="literal-block"> +\newcommand\PolPrintIntervalsPrintRightEndPoint{\PolPrintIntervalsTheRightEndPoint} +</pre> +</blockquote> +</div> +</div> +<div class="section" id="id19"> +<span id="id18"></span><h2><a class="toc-backref" href="#id94"><tt class="docutils literal"><span class="pre">\PolPrintIntervals*[varname]{sturmname}</span></tt></a></h2> +<blockquote> +<p>This starred variant produces an alternative output (which +displays the root multiplicity), and is provided as an +example of customization.</p> +<p>As replacement for <a class="reference internal" href="#polprintintervalsknownroot">\PolPrintIntervalsKnownRoot</a>, +<a class="reference internal" href="#polprintintervalsprintexactzero">\PolPrintIntervalsPrintExactZero</a>, +<a class="reference internal" href="#polprintintervalsunknownroot">\PolPrintIntervalsUnknownRoot</a> it uses its own +<tt class="docutils literal"><span class="pre">\POL@@PrintIntervals...</span></tt> macros. We only reproduce here one +definition:</p> +<pre class="literal-block"> +\newcommand\POL@@PrintIntervalsPrintExactZero{% + \displaystyle + \xintSignedFrac{\PolPrintIntervalsTheLeftEndPoint}% +}% +</pre> +<p>Multiplicities are printed using this auxiliary macro:</p> +</blockquote> +<div class="section" id="polprintintervalsprintmultiplicity"> +<h3><a class="toc-backref" href="#id95"><tt class="docutils literal">\PolPrintIntervalsPrintMultiplicity</tt></a></h3> +<blockquote> +<p>whose default definition is:</p> +<pre class="literal-block"> +\newcommand\PolPrintIntervalsPrintMultiplicity{(\mbox{mult. }\PolPrintIntervalsTheMultiplicity)} </pre> </blockquote> </div> </div> <div class="section" id="polmapcoeffs-macro-polname"> -<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> +<span id="polmapcoeffs"></span><h2><a class="toc-backref" href="#id96"><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 @@ -1534,15 +1831,15 @@ will have to be expressed in terms of macros from <a class="reference external" </blockquote> </div> <div class="section" id="polreducecoeffs-polname"> -<span id="polreducecoeffs"></span><h2><a class="toc-backref" href="#id83"><tt class="docutils literal">\PolReduceCoeffs{polname}</tt></a></h2> +<span id="polreducecoeffs"></span><h2><a class="toc-backref" href="#id97"><tt class="docutils literal">\PolReduceCoeffs{polname}</tt></a></h2> <blockquote> About the same as <tt class="docutils literal"><span class="pre">\PolMapCoeffs{\xintIrr}{polname}</span></tt> (but maintaining a <tt class="docutils literal">[0]</tt> postfix for speedier <a class="reference external" href="http://www.ctan.org/pkg/xint">xintfrac</a> parsing when polynomial function is used for computations.) This is a one-argument macro, working 'in-place'.</blockquote> </div> -<div class="section" id="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> +<div class="section" id="id21"> +<span id="id20"></span><h2><a class="toc-backref" href="#id98"><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 @@ -1561,16 +1858,16 @@ expansion speed of the <a class="reference external" href="http://www.ctan.org/p </blockquote> </div> <div class="section" id="polmakemonic-polname"> -<span id="polmakemonic"></span><h2><a class="toc-backref" href="#id85"><tt class="docutils literal">\PolMakeMonic{polname}</tt></a></h2> +<span id="polmakemonic"></span><h2><a class="toc-backref" href="#id99"><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="#id17">\PolReduceCoeffs*{polname}</a> immediately afterwards. This is not +<a class="reference internal" href="#id21">\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="#id86"><tt class="docutils literal">\PolMakePrimitive{polname}</tt></a></h2> +<span id="polmakeprimitive"></span><h2><a class="toc-backref" href="#id100"><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 @@ -1578,60 +1875,60 @@ coefficient is not modified.</blockquote> </div> </div> <div class="section" id="expandable-macros"> -<h1><a class="toc-backref" href="#id87">Expandable macros</a></h1> +<h1><a class="toc-backref" href="#id101">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="#id88"><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="#id102"><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="#id89"><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="#id103"><tt class="docutils literal"><span class="pre">\PolEval{polname}\At{fraction}</span></tt></a></h2> <blockquote> Evaluates the polynomial at value <tt class="docutils literal">fraction</tt> which must be in (or expand to) a format acceptable to the <a class="reference external" href="http://www.ctan.org/pkg/xint">xintfrac</a> macros.</blockquote> </div> <div class="section" id="polevalreduced-polname-atexpr-numerical-expression"> -<span id="polevalreducedatexpr"></span><h2><a class="toc-backref" href="#id90"><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="#id104"><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="#id91"><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="#id105"><tt class="docutils literal"><span class="pre">\PolEvalReduced{polname}\At{fraction}</span></tt></a></h2> <blockquote> Evaluates the polynomial at value <tt class="docutils literal">fraction</tt> which must be in (or expand to) a format acceptable to the <a class="reference external" href="http://www.ctan.org/pkg/xint">xintfrac</a> macros, and produce an irreducible fraction.</blockquote> </div> <div class="section" id="polfloateval-polname-atexpr-numerical-expression"> -<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> +<span id="polfloatevalatexpr"></span><h2><a class="toc-backref" href="#id106"><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="#id20" id="id18">[2]</a> To use the <em>exact coefficients</em> with <em>exactly +coefficients. <a class="footnote-reference" href="#id24" id="id22">[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="#id21" id="id19">[3]</a></p> +expression as in this example: <a class="footnote-reference" href="#id25" id="id23">[3]</a></p> <pre class="literal-block"> \xintthefloatexpr 3.27*\xintexpr f(2.53)\relax^2\relax </pre> <p>The <tt class="docutils literal">f(2.53)</tt> is exactly computed then rounded at the time of getting raised to the power <tt class="docutils literal">2</tt>. Moving the <tt class="docutils literal">^2</tt> inside, that operation would also be treated exactly.</p> -<table class="docutils footnote" frame="void" id="id20" rules="none"> +<table class="docutils footnote" frame="void" id="id24" rules="none"> <colgroup><col class="label" /><col /></colgroup> <tbody valign="top"> -<tr><td class="label"><a class="fn-backref" href="#id18">[2]</a></td><td>Anyway each floating point operation starts by rounding its +<tr><td class="label"><a class="fn-backref" href="#id22">[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="id21" rules="none"> +<table class="docutils footnote" frame="void" id="id25" rules="none"> <colgroup><col class="label" /><col /></colgroup> <tbody valign="top"> -<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 +<tr><td class="label"><a class="fn-backref" href="#id23">[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> @@ -1639,14 +1936,14 @@ nested expressions.</td></tr> </blockquote> </div> <div class="section" id="polfloateval-polname-at-fraction"> -<span id="polfloatevalat"></span><h2><a class="toc-backref" href="#id93"><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="#id107"><tt class="docutils literal"><span class="pre">\PolFloatEval{polname}\At{fraction}</span></tt></a></h2> <blockquote> Evaluates the polynomial at value <tt class="docutils literal">fraction</tt> which must be in (or expand to) a format acceptable to the <a class="reference external" href="http://www.ctan.org/pkg/xint">xintfrac</a> macros, and produces a floating point number.</blockquote> </div> <div class="section" id="polifcoeffisplusorminusone-a-b"> -<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> +<span id="polifcoeffisplusorminusone"></span><h2><a class="toc-backref" href="#id108"><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 @@ -1658,25 +1955,25 @@ plus or minus one, and <tt class="docutils literal">B</tt> if not.</p> </blockquote> </div> <div class="section" id="polleadingcoeff-polname"> -<span id="polleadingcoeff"></span><h2><a class="toc-backref" href="#id95"><tt class="docutils literal">\PolLeadingCoeff{polname}</tt></a></h2> +<span id="polleadingcoeff"></span><h2><a class="toc-backref" href="#id109"><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="#id96"><tt class="docutils literal"><span class="pre">\PolNthCoeff{polname}{number}</span></tt></a></h2> +<span id="polnthcoeff"></span><h2><a class="toc-backref" href="#id110"><tt class="docutils literal"><span class="pre">\PolNthCoeff{polname}{number}</span></tt></a></h2> <blockquote> It expands to the raw <tt class="docutils literal">N</tt>-th coefficient (<tt class="docutils literal">0/1[0]</tt> if the index number is out of range). With <tt class="docutils literal"><span class="pre">N=-1</span></tt>, <tt class="docutils literal"><span class="pre">-2</span></tt>, ... expands to the leading coefficients.</blockquote> </div> <div class="section" id="poldegree-polname"> -<span id="poldegree"></span><h2><a class="toc-backref" href="#id97"><tt class="docutils literal">\PolDegree{polname}</tt></a></h2> +<span id="poldegree"></span><h2><a class="toc-backref" href="#id111"><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="#id98"><tt class="docutils literal">\PolIContent{polname}</tt></a></h2> +<span id="policontent"></span><h2><a class="toc-backref" href="#id112"><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 @@ -1685,13 +1982,13 @@ with integer coefficients having no common prime divisor.</p> </blockquote> </div> <div class="section" id="poltoexpr-polname"> -<span id="poltoexpr"></span><h2><a class="toc-backref" href="#id99"><tt class="docutils literal">\PolToExpr{polname}</tt></a></h2> +<span id="poltoexpr"></span><h2><a class="toc-backref" href="#id113"><tt class="docutils literal">\PolToExpr{polname}</tt></a></h2> <blockquote> -<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"> +<p>Expands <a class="footnote-reference" href="#id27" id="id26">[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="id27" rules="none"> <colgroup><col class="label" /><col /></colgroup> <tbody valign="top"> -<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 +<tr><td class="label"><a class="fn-backref" href="#id26">[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> @@ -1710,7 +2007,7 @@ of <tt class="docutils literal">\PolToExpr{f}</tt>, but a simple <tt class="docu the identical result.</p> </blockquote> <div class="section" id="poltoexproneterm-raw-coeff-number"> -<span id="poltoexproneterm"></span><h3><a class="toc-backref" href="#id100"><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="#id114"><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 @@ -1723,13 +2020,13 @@ or a minus one. See <a class="reference internal" href="#poltoexprtimes">\PolToE </blockquote> </div> <div class="section" id="poltoexpronetermstylea-raw-coeff-number"> -<span id="poltoexpronetermstylea"></span><h3><a class="toc-backref" href="#id101"><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="#id115"><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="#id102"><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="#id116"><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"> @@ -1743,7 +2040,7 @@ To revert to package default, issue </blockquote> </div> <div class="section" id="poltoexprcmd-raw-coeff"> -<span id="poltoexprcmd"></span><h3><a class="toc-backref" href="#id103"><tt class="docutils literal">\PolToExprCmd{raw_coeff}</tt></a></h3> +<span id="poltoexprcmd"></span><h3><a class="toc-backref" href="#id117"><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 @@ -1753,21 +2050,21 @@ to <tt class="docutils literal"><span class="pre">\xintIrr{#1}</span></tt> or to output forcefully reduced coefficients.</blockquote> </div> <div class="section" id="poltoexprtermprefix-raw-coeff"> -<span id="poltoexprtermprefix"></span><h3><a class="toc-backref" href="#id104"><tt class="docutils literal">\PolToExprTermPrefix{raw_coeff}</tt></a></h3> +<span id="poltoexprtermprefix"></span><h3><a class="toc-backref" href="#id118"><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="id24"> -<span id="poltoexprvar"></span><h3><a class="toc-backref" href="#id105"><tt class="docutils literal">\PolToExprVar</tt></a></h3> +<div class="section" id="id28"> +<span id="poltoexprvar"></span><h3><a class="toc-backref" href="#id119"><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="id25"> -<span id="poltoexprtimes"></span><h3><a class="toc-backref" href="#id106"><tt class="docutils literal">\PolToExprTimes</tt></a></h3> +<div class="section" id="id29"> +<span id="poltoexprtimes"></span><h3><a class="toc-backref" href="#id120"><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 @@ -1776,14 +2073,14 @@ this will give output incompatible with some professional computer algebra software).</blockquote> </div> </div> -<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> +<div class="section" id="id31"> +<span id="id30"></span><h2><a class="toc-backref" href="#id121"><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="#id108"><tt class="docutils literal">\PolToFloatExpr{polname}</tt></a></h2> +<span id="poltofloatexpr"></span><h2><a class="toc-backref" href="#id122"><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 @@ -1802,13 +2099,13 @@ those output by <tt class="docutils literal">\PolToFloatExpr{polname}</tt>.</p> </div> </blockquote> <div class="section" id="poltofloatexproneterm-raw-coeff-number"> -<span id="poltofloatexproneterm"></span><h3><a class="toc-backref" href="#id109"><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="#id123"><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="id29"></span><h3><a class="toc-backref" href="#id110"><tt class="docutils literal">\PolToFloatExprCmd{raw_coeff}</tt></a></h3> +<span id="id33"></span><h3><a class="toc-backref" href="#id124"><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> @@ -1830,26 +2127,28 @@ in <tt class="docutils literal">xintfrac</tt> raw format.</p> </blockquote> </div> </div> -<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> +<div class="section" id="id35"> +<span id="id34"></span><h2><a class="toc-backref" href="#id125"><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="#id112"><tt class="docutils literal">\PolToList{polname}</tt></a></h2> +<span id="poltolist"></span><h2><a class="toc-backref" href="#id126"><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 +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, and +<tt class="docutils literal">coeff_N</tt> the leading coefficient +(the zero polynomial does give <tt class="docutils literal">{0/1[0]}</tt> and not an empty output.)</blockquote> </div> <div class="section" id="poltocsv-polname"> -<span id="poltocsv"></span><h2><a class="toc-backref" href="#id113"><tt class="docutils literal">\PolToCSV{polname}</tt></a></h2> +<span id="poltocsv"></span><h2><a class="toc-backref" href="#id127"><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 +Expands to <tt class="docutils literal">coeff_0, coeff_1, coeff_2, <span class="pre">.....,</span> coeff_N</tt>, starting +with constant term and ending with leading coefficient. 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="#id114"><tt class="docutils literal">\PolSturmChainLength{sturmname}</tt></a></h2> +<span id="polsturmchainlength"></span><h2><a class="toc-backref" href="#id128"><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> @@ -1857,43 +2156,44 @@ in the Sturm chain <tt class="docutils literal">sturmname_0</tt>, <tt class="doc </blockquote> </div> <div class="section" id="polsturmifzeroexactlyknown-sturmname-index-a-b"> -<span id="polsturmifzeroexactlyknown"></span><h2><a class="toc-backref" href="#id115"><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="#id129"><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, 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> -<p><tt class="docutils literal">index</tt> may be a TeX count, or a <tt class="docutils literal">\value{latexcounter}</tt>, or a -numerical expression as parsable by <tt class="docutils literal">\numexpr</tt>: it does not -have to be given via explicit digits.</p> -<p class="last">This remark applies also to the other package macros with -<tt class="docutils literal">index</tt> being the name of the argument in this documentation. -There is also an out-of-range check done for some reasonable -error message (right before everything goes haywire).</p> +<p class="last"><tt class="docutils literal">index</tt> is allowed to be something like <tt class="docutils literal">1+2*3</tt> as it is fed +to <tt class="docutils literal"><span class="pre">\the\numexpr...\relax</span></tt>.</p> </div> </blockquote> </div> <div class="section" id="polsturmisolatedzeroleft-sturmname-index"> -<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> +<span id="polsturmisolatedzeroleft"></span><h2><a class="toc-backref" href="#id130"><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 -obtained via <a class="reference internal" href="#polsturmisolatezeros-sturmname">\PolSturmIsolateZeros{sturmname}</a> and possibly -refined afterwards.</blockquote> +<p>Expands to the left end-point for the <tt class="docutils literal">index</tt>-th interval, as +computed by some earlier <a class="reference internal" href="#polsturmisolatezeros-sturmname">\PolSturmIsolateZeros{sturmname}</a>.</p> +<div class="admonition note"> +<p class="first admonition-title">Note</p> +<p class="last">Of course, this is kept updated by macros such as +<a class="reference internal" href="#polrefineinterval-n">\PolRefineInterval{sturmname}{index}</a>.</p> +</div> +<p>The value is pre-formatted using <a class="reference internal" href="#poldectostring">\PolDecTostring</a>.</p> +</blockquote> </div> <div class="section" id="polsturmisolatedzeroright-sturmname-index"> -<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> +<span id="polsturmisolatedzeroright"></span><h2><a class="toc-backref" href="#id131"><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 -obtained via <a class="reference internal" href="#polsturmisolatezeros-sturmname">\PolSturmIsolateZeros{sturmname}</a> and possibly -refined afterwards.</blockquote> +<p>Expands to the right end-point for the <tt class="docutils literal">index</tt>-th interval as +computed by some earlier <a class="reference internal" href="#polsturmisolatezeros-sturmname">\PolSturmIsolateZeros{sturmname}</a> and +possibly refined afterwards.</p> +<p>The value is pre-formatted using <a class="reference internal" href="#poldectostring">\PolDecTostring</a>.</p> +</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> +<span id="polsturmisolatedzeromultiplicity"></span><h2><a class="toc-backref" href="#id132"><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> +<tt class="docutils literal">index</tt>-th interval.</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> @@ -1903,15 +2203,22 @@ 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="#id119"><tt class="docutils literal">\PolSturmNbOfIsolatedZeros{sturmname}</tt></a></h2> +<span id="polsturmnbofisolatedzeros"></span><h2><a class="toc-backref" href="#id133"><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 -polynomial used to create the Sturm chain via +<tt class="docutils literal"><sturmname>_0</tt>, i.e. the number of distinct real roots of the +polynomial originally used to create the Sturm chain via <a class="reference internal" href="#poltosturm-polname-sturmname">\PolToSturm{polname}{sturmname}</a>.</blockquote> +<div class="admonition warning"> +<p class="first admonition-title">Warning</p> +<p class="last">The next few macros counting roots, with or without multiplicities, +less than or equal to some value, are under evaluation and may be +removed from the package if their utility is judged to be not high +enough. They can be re-coded at user level on the basis of the other +documented package macros anyway.</p> </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> +<h3><a class="toc-backref" href="#id134"><tt class="docutils literal"><span class="pre">\PolSturmNbOfRootsOf{sturmname}\LessThanOrEqualTo{value}</span></tt></a></h3> <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 @@ -1927,7 +2234,7 @@ of the above constraint.</p> </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> +<h3><a class="toc-backref" href="#id135"><tt class="docutils literal"><span class="pre">\PolSturmNbOfRootsOf{sturmname}\LessThanOrEqualToExpr{expression}</span></tt></a></h3> <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 @@ -1940,91 +2247,160 @@ beforehand.</p> </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> +<h3><a class="toc-backref" href="#id136"><tt class="docutils literal"><span class="pre">\PolSturmNbWithMultOfRootsOf{sturmname}\LessThanOrEqualTo{value}</span></tt></a></h3> <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> +<p class="last"><a class="reference internal" href="#id12">\PolSturmIsolateZeros*{sturmname}</a> (or the double starred +variant) 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> +<h3><a class="toc-backref" href="#id137"><tt class="docutils literal"><span class="pre">\PolSturmNbWithMultOfRootsOf{sturmname}\LessThanOrEqualToExpr{expression}</span></tt></a></h3> <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 +<p class="last"><a class="reference internal" href="#id12">\PolSturmIsolateZeros*{sturmname}</a> (or the double starred +variant) must have been executed beforehand.</p> +</div> +</blockquote> +</div> +</div> +<div class="section" id="polsturmnbofrationalroots-sturmname"> +<h2><a class="toc-backref" href="#id138"><tt class="docutils literal">\PolSturmNbOfRationalRoots{sturmname}</tt></a></h2> +<blockquote> +<p>Expands to the number of rational roots (without multiplicities).</p> +<div class="admonition attention"> +<p class="first admonition-title">Attention!</p> +<p class="last"><a class="reference internal" href="#id14">\PolSturmIsolateZeros**{sturmname}</a> must have been executed +beforehand.</p> +</div> +</blockquote> +</div> +<div class="section" id="polsturmnbofrationalrootswithmultiplicities-sturmname"> +<h2><a class="toc-backref" href="#id139"><tt class="docutils literal">\PolSturmNbOfRationalRootsWithMultiplicities{sturmname}</tt></a></h2> +<blockquote> +<p>Expands to the number of rational roots (counted with multiplicities).</p> +<div class="admonition attention"> +<p class="first admonition-title">Attention!</p> +<p class="last"><a class="reference internal" href="#id14">\PolSturmIsolateZeros**{sturmname}</a> must have been executed +beforehand.</p> +</div> +</blockquote> +</div> +<div class="section" id="polsturmrationalroot-sturmname-k"> +<h2><a class="toc-backref" href="#id140"><tt class="docutils literal"><span class="pre">\PolSturmRationalRoot{sturmname}{k}</span></tt></a></h2> +<blockquote> +<p>Expands to the <tt class="docutils literal">k</tt>th rational root (they are ordered and indexed +starting at 1 for the most negative).</p> +<div class="admonition attention"> +<p class="first admonition-title">Attention!</p> +<p class="last"><a class="reference internal" href="#id14">\PolSturmIsolateZeros**{sturmname}</a> must have been executed +beforehand.</p> +</div> +</blockquote> +</div> +<div class="section" id="polsturmrationalrootindex-sturmname-k"> +<h2><a class="toc-backref" href="#id141"><tt class="docutils literal"><span class="pre">\PolSturmRationalRootIndex{sturmname}{k}</span></tt></a></h2> +<blockquote> +<p>Expands to <tt class="docutils literal">index</tt> of the <tt class="docutils literal">k</tt>th rational root as part of the +ordered real roots (without multiplicities). I.e., above macro +<a class="reference internal" href="#polsturmrationalroot-sturmname-k">\PolSturmRationalRoot{sturmname}{k}</a> is equivalent to this +nested call:</p> +<pre class="literal-block"> +\PolSturmIsolatedZeroLeft{sturmname}{\PolSturmRationalRootIndex{sturmname}{k}} +</pre> +<div class="admonition attention"> +<p class="first admonition-title">Attention!</p> +<p class="last"><a class="reference internal" href="#id14">\PolSturmIsolateZeros**{sturmname}</a> must have been executed +beforehand.</p> +</div> +</blockquote> +</div> +<div class="section" id="polsturmrationalrootmultiplicity-sturmname-k"> +<h2><a class="toc-backref" href="#id142"><tt class="docutils literal"><span class="pre">\PolSturmRationalRootMultiplicity{sturmname}{k}</span></tt></a></h2> +<blockquote> +<p>Expands to the multiplicity of the <tt class="docutils literal">k</tt>th rational root.</p> +<div class="admonition attention"> +<p class="first admonition-title">Attention!</p> +<p class="last"><a class="reference internal" href="#id14">\PolSturmIsolateZeros**{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="#id124"><tt class="docutils literal"><span class="pre">\PolIntervalWidth{sturmname}{index}</span></tt></a></h2> +<span id="polintervalwidth"></span><h2><a class="toc-backref" href="#id143"><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 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="#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="id32"> -<span id="polprintintervalstheendpoint"></span><h3><a class="toc-backref" href="#id126"><tt class="docutils literal">\PolPrintIntervalsTheEndPoint</tt></a></h3> +<div class="section" id="expandable-macros-for-use-within-execution-of-polprintintervals"> +<h2><a class="toc-backref" href="#id144">Expandable macros for use within execution of <tt class="docutils literal">\PolPrintIntervals</tt></a></h2> +<p>These macros are for usage within custom user redefinitions of +<a class="reference internal" href="#polprintintervalsknownroot">\PolPrintIntervalsKnownRoot</a>, <a class="reference internal" href="#polprintintervalsunknownroot">\PolPrintIntervalsUnknownRoot</a>, or +in redefinitions of <a class="reference internal" href="#polprintintervalsprintexactzero">PolPrintIntervalsPrintExactZero</a> (used in the +default for the former) and of <a class="reference internal" href="#polprintintervalsprintleftendpoint">\PolPrintIntervalsPrintLeftEndPoint</a>, +<a class="reference internal" href="#polprintintervalsprintrightendpoint">\PolPrintIntervalsPrintRightEndPoint</a> (used in the default for the +latter).</p> +<div class="admonition attention"> +<p class="first admonition-title">Attention!</p> +<p class="last">Some macros formerly mentioned here got removed at 0.7: +<tt class="docutils literal">\PolPrintIntervalsTheEndPoint</tt>, +<tt class="docutils literal"><span class="pre">\PolIfEndPointIsPositive{A}{B}</span></tt>, +<tt class="docutils literal"><span class="pre">\PolIfEndPointIsNegative{A}{B}</span></tt>, +<tt class="docutils literal"><span class="pre">\PolIfEndPointIsZero{A}{B}</span></tt>.</p> +</div> +<div class="section" id="polprintintervalsthevar"> +<h3><a class="toc-backref" href="#id145"><tt class="docutils literal">\PolPrintIntervalsTheVar</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 -<a class="reference internal" href="#polprintintervalsprintexactzero">\PolPrintIntervalsPrintExactZero</a> this macro expands to the left -or right end point of the considered interval. Serves as default -replacement for <a class="reference internal" href="#polprintintervalsprintleftendpoint">\PolPrintIntervalsPrintLeftEndPoint</a> , etc...</blockquote> +Expands to the name (default <tt class="docutils literal">Z</tt>) used for representing the roots, +which was passed as optional argument <tt class="docutils literal">varname</tt> to +<a class="reference internal" href="#polprintintervals-varname-sturmname">\PolPrintIntervals[varname]{sturmname}</a>.</blockquote> </div> -<div class="section" id="id33"> -<span id="polprintintervalstheindex"></span><h3><a class="toc-backref" href="#id127"><tt class="docutils literal">\PolPrintIntervalsTheIndex</tt></a></h3> +<div class="section" id="polprintintervalstheindex"> +<h3><a class="toc-backref" href="#id146"><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 -<a class="reference internal" href="#polprintintervalsprintexactzero">\PolPrintIntervalsPrintExactZero</a> this macro expands to the index -of the considered interval. For example if user wants to print the -corresponding end points in red, the index value can thus be tested -in the replacement text of <a class="reference internal" href="#polprintintervalsprintleftendpoint">\PolPrintIntervalsPrintLeftEndPoint</a> and -the other two similar macros.</blockquote> +Expands to the index of the considered interval (indexing starting +at 1 for the leftmost interval).</blockquote> </div> -<div class="section" id="polifendpointispositive-a-b"> -<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> +<div class="section" id="polprintintervalsthesturmname"> +<h3><a class="toc-backref" href="#id147"><tt class="docutils literal">\PolPrintIntervalsTheSturmName</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 -<a class="reference internal" href="#polprintintervalsprintexactzero">\PolPrintIntervalsPrintExactZero</a> this macro executes <tt class="docutils literal">A</tt> if -the considered interval end-point is positive, else <tt class="docutils literal">B</tt>.</blockquote> +Expands to the argument which was passed as <tt class="docutils literal">sturmname</tt> to +<a class="reference internal" href="#polprintintervals-varname-sturmname">\PolPrintIntervals[varname]{sturmname}</a>.</blockquote> </div> -<div class="section" id="polifendpointisnegative-a-b"> -<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> +<div class="section" id="polprintintervalstheleftendpoint"> +<h3><a class="toc-backref" href="#id148"><tt class="docutils literal">\PolPrintIntervalsTheLeftEndPoint</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 -<a class="reference internal" href="#polprintintervalsprintexactzero">\PolPrintIntervalsPrintExactZero</a> this macro executes <tt class="docutils literal">A</tt> if -the considered interval end-point is negative, else <tt class="docutils literal">B</tt>.</blockquote> +The left end point of the interval, as would be produced by +<a class="reference internal" href="#polsturmisolatedzeroleft">\PolSturmIsolatedZeroLeft</a> if it was +used with arguments the Sturm chain name and interval index returned +by <a class="reference internal" href="#polprintintervalsthesturmname">\PolPrintIntervalsTheSturmName</a> and +<a class="reference internal" href="#polprintintervalstheindex">\PolPrintIntervalsTheIndex</a>.</blockquote> </div> -<div class="section" id="polifendpointiszero-a-b"> -<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> +<div class="section" id="polprintintervalstherightendpoint"> +<h3><a class="toc-backref" href="#id149"><tt class="docutils literal">\PolPrintIntervalsTheRightEndPoint</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 -<a class="reference internal" href="#polprintintervalsprintexactzero">\PolPrintIntervalsPrintExactZero</a> this macro executes <tt class="docutils literal">A</tt> if -the considered interval end-point is zero, else <tt class="docutils literal">B</tt>.</blockquote> +The right end point of the interval, as would be produced by +<a class="reference internal" href="#polsturmisolatedzeroright">\PolSturmIsolatedZeroRight</a> for +this Sturm chain name and index.</blockquote> +</div> +<div class="section" id="polprintintervalsthemultiplicity"> +<h3><a class="toc-backref" href="#id150"><tt class="docutils literal">\PolPrintIntervalsTheMultiplicity</tt></a></h3> +<blockquote> +The multiplicity of the unique root within the interval of index +<a class="reference internal" href="#polprintintervalstheindex">\PolPrintIntervalsTheIndex</a>. Makes sense only if the starred (or +double-starred) variant of <a class="reference internal" href="#polsturmisolatezeros">\PolSturmIsolateZeros</a> was used earlier.</blockquote> </div> </div> <div class="section" id="poldectostring-decimal-number"> -<span id="poldectostring"></span><h2><a class="toc-backref" href="#id131"><tt class="docutils literal">\PolDecToString{decimal number}</tt></a></h2> +<span id="poldectostring"></span><h2><a class="toc-backref" href="#id151"><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 @@ -2035,15 +2411,15 @@ now an alias to it.</p> and <tt class="docutils literal"><span class="pre">\PolDecToString{123.450e-8}</span></tt> to <tt class="docutils literal">0.00000123450</tt> which illustrates that trailing zeros are not trimmed. To trim trailing zeroes, one can use <tt class="docutils literal"><span class="pre">\PolDecToString{\xintREZ{#1}}</span></tt>.</p> -<p>The exact behaviour of this macro may evolve in future releases of +<p>The precise behaviour of this macro may evolve in future releases of <a class="reference external" href="http://www.ctan.org/pkg/xint">xint</a>.</p> </blockquote> </div> </div> <div class="section" id="booleans-with-default-setting-as-indicated"> -<h1><a class="toc-backref" href="#id132">Booleans (with default setting as indicated)</a></h1> +<h1><a class="toc-backref" href="#id152">Booleans (with default setting as indicated)</a></h1> <div class="section" id="xintverbosefalse"> -<h2><a class="toc-backref" href="#id133"><tt class="docutils literal">\xintverbosefalse</tt></a></h2> +<h2><a class="toc-backref" href="#id153"><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 @@ -2056,20 +2432,41 @@ unstable and undocumented internal structures.</p> </blockquote> </div> <div class="section" id="poltypesetallfalse"> -<h2><a class="toc-backref" href="#id134"><tt class="docutils literal">\poltypesetallfalse</tt></a></h2> +<h2><a class="toc-backref" href="#id154"><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="#id135"><tt class="docutils literal">\poltoexprallfalse</tt></a></h2> +<h2><a class="toc-backref" href="#id155"><tt class="docutils literal">\poltoexprallfalse</tt></a></h2> <blockquote> If <tt class="docutils literal">true</tt>, <a class="reference internal" href="#poltoexpr-polname">\PolToExpr{polname}</a> and <a class="reference internal" href="#poltofloatexpr-polname">\PolToFloatExpr{polname}</a> will also include the vanishing coefficients in their outputs.</blockquote> </div> </div> +<div class="section" id="polexprsetup"> +<h1><a class="toc-backref" href="#id156"><tt class="docutils literal">\polexprsetup</tt></a></h1> +<blockquote> +<p>Serves to customize the package. Currently only two keys are +recognized:</p> +<ul class="simple"> +<li><tt class="docutils literal">norr</tt>: the postfix that <a class="reference internal" href="#id14">\PolSturmIsolateZeros**{sturmname}</a> +should append to <tt class="docutils literal">sturmname</tt> to declare the primitive polynomial +obtained from original one after removal of all rational roots. +The default value is <tt class="docutils literal">_norr</tt> (standing for “no rational roots”).</li> +<li><tt class="docutils literal">sqfnorr</tt>: the postfix that <a class="reference internal" href="#id14">\PolSturmIsolateZeros**{sturmname}</a> +should append to <tt class="docutils literal">sturmname</tt> to declare the primitive polynomial +obtained from original one after removal of all rational roots and +suppression of all multiplicities. +The default value is <tt class="docutils literal">_sqf_norr</tt> (standing for “square-free with +no rational roots”).</li> +</ul> +<p>The package executes <tt class="docutils literal">\polexprsetup{norr=_norr, +sqfnorr=_sqf_norr}</tt> as default.</p> +</blockquote> +</div> <div class="section" id="technicalities"> -<h1><a class="toc-backref" href="#id136">Technicalities</a></h1> +<h1><a class="toc-backref" href="#id157">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 @@ -2078,7 +2475,7 @@ can use <a class="reference internal" href="#id2">\PolDef{f}{P(x)}</a> rather. The colon in <tt class="docutils literal">:=</tt> may be active with no consequences.</p> </li> <li><p class="first">As a consequence of <a class="reference external" href="http://www.ctan.org/pkg/xint">xintfrac</a> addition and subtraction always using -least common multiples for the denominators <a class="footnote-reference" href="#id35" id="id34">[5]</a>, user-chosen common +least common multiples for the denominators <a class="footnote-reference" href="#id37" id="id36">[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; @@ -2094,10 +2491,10 @@ denominators survive additions and multiplications. For example, this:</p> default) it recognizes and filters out coefficients equal to one or minus one (since release <tt class="docutils literal">0.3</tt>). One can use for example <tt class="docutils literal">\PolToCSV{PQ}</tt> to see the internally stored coefficients.</p> -<table class="docutils footnote" frame="void" id="id35" rules="none"> +<table class="docutils footnote" frame="void" id="id37" rules="none"> <colgroup><col class="label" /><col /></colgroup> <tbody valign="top"> -<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 +<tr><td class="label"><a class="fn-backref" href="#id36">[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> @@ -2126,7 +2523,7 @@ documented and unstable. Don't use them.</p> </ul> </div> <div class="section" id="change-log"> -<h1><a class="toc-backref" href="#id137">CHANGE LOG</a></h1> +<h1><a class="toc-backref" href="#id158">CHANGE LOG</a></h1> <ul> <li><p class="first">v0.1 (2018/01/11): initial release. Features:</p> <ul class="simple"> @@ -2166,7 +2563,7 @@ using expressions in the second argument.</p> <ul class="simple"> <li><a class="reference internal" href="#poltoexpr">\PolToExpr</a> now by default uses <em>descending</em> powers (it also treats differently coefficients equal to 1 or -1.) -Use <a class="reference internal" href="#id26">\PolToExpr*</a> for <em>ascending</em> powers.</li> +Use <a class="reference internal" href="#id30">\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 @@ -2183,7 +2580,7 @@ removed; the former meaning is available as <a class="reference internal" href=" <li><a class="reference internal" href="#poltoexproneterm">\PolToExprOneTerm</a></li> <li><a class="reference internal" href="#poltofloatexproneterm">\PolToFloatExprOneTerm</a></li> <li><a class="reference internal" href="#poltoexprcmd">\PolToExprCmd</a></li> -<li><a class="reference internal" href="#id29">\PolToFloatExprCmd</a></li> +<li><a class="reference internal" href="#id33">\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> @@ -2268,7 +2665,7 @@ they actually make pre-existing such variant undefined.</p> <li><a class="reference internal" href="#polprintintervalsprintexactzero">\PolPrintIntervalsPrintExactZero</a></li> <li><a class="reference internal" href="#polprintintervalsprintleftendpoint">\PolPrintIntervalsPrintLeftEndPoint</a></li> <li><a class="reference internal" href="#polprintintervalsprintrightendpoint">\PolPrintIntervalsPrintRightEndPoint</a></li> -<li><a class="reference internal" href="#id16">\PolReduceCoeffs*</a></li> +<li><a class="reference internal" href="#id20">\PolReduceCoeffs*</a></li> <li><a class="reference internal" href="#polmakemonic">\PolMakeMonic</a></li> </ul> </li> @@ -2282,11 +2679,11 @@ they actually make pre-existing such variant undefined.</p> <li><a class="reference internal" href="#polsturmifzeroexactlyknown">\PolSturmIfZeroExactlyKnown</a></li> <li><a class="reference internal" href="#polsturmisolatedzeroleft">\PolSturmIsolatedZeroLeft</a></li> <li><a class="reference internal" href="#polsturmisolatedzeroright">\PolSturmIsolatedZeroRight</a></li> -<li><a class="reference internal" href="#polprintintervalstheendpoint">\PolPrintIntervalsTheEndPoint</a></li> +<li><tt class="docutils literal">\PolPrintIntervalsTheEndPoint</tt> (removed at 0.7)</li> <li><a class="reference internal" href="#polprintintervalstheindex">\PolPrintIntervalsTheIndex</a></li> -<li><a class="reference internal" href="#polifendpointispositive">\PolIfEndPointIsPositive</a></li> -<li><a class="reference internal" href="#polifendpointisnegative">\PolIfEndPointIsNegative</a></li> -<li><a class="reference internal" href="#polifendpointiszero">\PolIfEndPointIsZero</a></li> +<li><tt class="docutils literal">\PolIfEndPointIsPositive</tt> (removed at 0.7)</li> +<li><tt class="docutils literal">\PolIfEndPointIsNegative</tt> (removed at 0.7)</li> +<li><tt class="docutils literal">\PolIfEndPointIsZero</tt> (removed at 0.7)</li> <li><a class="reference internal" href="#polintervalwidth">\PolIntervalWidth</a></li> <li><a class="reference internal" href="#poldectostring">\PolDecToString</a></li> </ul> @@ -2371,15 +2768,65 @@ acts like the <a class="reference internal" href="#polsturmisolatezeros">non-sta </li> </ul> </li> +<li><p class="first">v0.7 (2018/12/08)</p> +<ul class="simple"> +<li>breaking changes:<ul> +<li>although <a class="reference internal" href="#polprintintervals-varname-sturmname">\PolPrintIntervals[varname]{sturmname}</a> default output +remains the same, some auxiliary macros for user-customization +have been removed: <tt class="docutils literal">\PolPrintIntervalsTheEndPoint</tt>, +<tt class="docutils literal"><span class="pre">\PolIfEndPointIsPositive{A}{B}</span></tt>, +<tt class="docutils literal"><span class="pre">\PolIfEndPointIsNegative{A}{B}</span></tt>, and +<tt class="docutils literal"><span class="pre">\PolIfEndPointIsZero{A}{B}</span></tt>.</li> +</ul> +</li> +<li>bugfix:<ul> +<li>it could happen that, contrarily to documentation, an interval +computed by <a class="reference internal" href="#polsturmisolatezeros-sturmname">\PolSturmIsolateZeros{sturmname}</a> had zero as an +endpoint,</li> +<li><a class="reference internal" href="#polensureintervallength-sturmname-index-e">\PolEnsureIntervalLength{sturmname}{index}{E}</a> could under +certain circumstances erroneously replace a non-zero root by +zero,</li> +<li><a class="reference internal" href="#polensureintervallengths-sturmname-e">\PolEnsureIntervalLengths{sturmname}{E}</a> crashed when used with +a polynomial with no real roots, hence for which no isolation intervals +existed (thanks to Thomas Söll for report).</li> +</ul> +</li> +<li>new macros:<ul> +<li><a class="reference internal" href="#id14">\PolSturmIsolateZeros**{sturmname}</a></li> +<li><a class="reference internal" href="#polsturmisolatezerosgetmultiplicitiesandrationalroots-sturmname">\PolSturmIsolateZerosGetMultiplicitiesAndRationalRoots{sturmname}</a></li> +<li><a class="reference internal" href="#polsturmisolatezerosandfindrationalroots-sturmname">\PolSturmIsolateZerosAndFindRationalRoots{sturmname}</a></li> +<li><a class="reference internal" href="#polexprsetup">\polexprsetup</a></li> +<li><a class="reference internal" href="#id18">\PolPrintIntervals*</a></li> +<li><a class="reference internal" href="#polprintintervalsnorealroots">\PolPrintIntervalsNoRealRoots</a></li> +<li><a class="reference internal" href="#polprintintervalsbeginenv">\PolPrintIntervalsBeginEnv</a></li> +<li><a class="reference internal" href="#polprintintervalsendenv">\PolPrintIntervalsEndEnv</a></li> +<li><a class="reference internal" href="#polprintintervalsknownroot">\PolPrintIntervalsKnownRoot</a></li> +<li><a class="reference internal" href="#polprintintervalsunknownroot">\PolPrintIntervalsUnknownRoot</a></li> +<li><a class="reference internal" href="#polprintintervalsprintmultiplicity">\PolPrintIntervalsPrintMultiplicity</a></li> +</ul> +</li> +<li>new expandable macros:<ul> +<li><a class="reference internal" href="#polsturmnbofrationalroots-sturmname">\PolSturmNbOfRationalRoots{sturmname}</a></li> +<li><a class="reference internal" href="#polsturmnbofrationalrootswithmultiplicities-sturmname">\PolSturmNbOfRationalRootsWithMultiplicities{sturmname}</a></li> +<li><a class="reference internal" href="#polsturmrationalroot-sturmname-k">\PolSturmRationalRoot{sturmname}{k}</a></li> +<li><a class="reference internal" href="#polsturmrationalrootindex-sturmname-k">\PolSturmRationalRootIndex{sturmname}{k}</a></li> +<li><a class="reference internal" href="#polsturmrationalrootmultiplicity-sturmname-k">\PolSturmRationalRootMultiplicity{sturmname}{k}</a></li> +<li><a class="reference internal" href="#polprintintervalsthevar">\PolPrintIntervalsTheVar</a></li> +<li><a class="reference internal" href="#polprintintervalsthesturmname">\PolPrintIntervalsTheSturmName</a></li> +<li><a class="reference internal" href="#polprintintervalsthemultiplicity">\PolPrintIntervalsTheMultiplicity</a></li> +</ul> +</li> +</ul> +</li> </ul> </div> <div class="section" id="acknowledgments"> -<h1><a class="toc-backref" href="#id138">Acknowledgments</a></h1> +<h1><a class="toc-backref" href="#id159">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 to them on occasion of the <tt class="docutils literal">0.6</tt> release for their +<p>Renewed thanks to them on occasion of the <tt class="docutils literal">0.6</tt> and <tt class="docutils literal">0.7</tt> releases for their continued interest.</p> <p>See README.md for the License.</p> </div> |