]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Tweak polynomial itertool recipes (GH-102880)
authorRaymond Hettinger <rhettinger@users.noreply.github.com>
Tue, 21 Mar 2023 18:21:57 +0000 (13:21 -0500)
committerGitHub <noreply@github.com>
Tue, 21 Mar 2023 18:21:57 +0000 (13:21 -0500)
Doc/library/itertools.rst

index 38bc369d410dda160fff90630007b32ca27565de..5daadfd3759f4bf7db60a7b21dd9d0ab5d4cf836 100644 (file)
@@ -866,6 +866,17 @@ which incur interpreter overhead.
            window.append(x)
            yield math.sumprod(kernel, window)
 
+   def polynomial_from_roots(roots):
+       """Compute a polynomial's coefficients from its roots.
+
+          (x - 5) (x + 4) (x - 3)  expands to:   x³ -4x² -17x + 60
+       """
+       # polynomial_from_roots([5, -4, 3]) --> [1, -4, -17, 60]
+       expansion = [1]
+       for r in roots:
+           expansion = convolve(expansion, (1, -r))
+       return list(expansion)
+
    def polynomial_eval(coefficients, x):
        """Evaluate a polynomial at a specific value.
 
@@ -876,20 +887,8 @@ which incur interpreter overhead.
        n = len(coefficients)
        if n == 0:
            return x * 0  # coerce zero to the type of x
-       powers = map(pow, repeat(x), range(n))
-       return math.sumprod(reversed(coefficients), powers)
-
-   def polynomial_from_roots(roots):
-       """Compute a polynomial's coefficients from its roots.
-
-          (x - 5) (x + 4) (x - 3)  expands to:   x³ -4x² -17x + 60
-       """
-       # polynomial_from_roots([5, -4, 3]) --> [1, -4, -17, 60]
-       roots = list(map(operator.neg, roots))
-       return [
-           sum(map(math.prod, combinations(roots, k)))
-           for k in range(len(roots) + 1)
-       ]
+       powers = map(pow, repeat(x), reversed(range(n)))
+       return math.sumprod(coefficients, powers)
 
    def iter_index(iterable, value, start=0):
        "Return indices where a value occurs in a sequence or iterable."