]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Add polynomial_from_roots() to the itertools recipes (#96102)
authorRaymond Hettinger <rhettinger@users.noreply.github.com>
Sun, 21 Aug 2022 14:41:29 +0000 (09:41 -0500)
committerGitHub <noreply@github.com>
Sun, 21 Aug 2022 14:41:29 +0000 (09:41 -0500)
Doc/library/itertools.rst

index 55a4c90137f677c637b24f0b2f715e728f540ca5..c35ff8c4343fc996678ab37da8d2c36e3275e3f3 100644 (file)
@@ -800,6 +800,18 @@ which incur interpreter overhead.
            window.append(x)
            yield sum(map(operator.mul, 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]
+       roots = list(map(operator.neg, roots))
+       return [
+           sum(map(math.prod, combinations(roots, k)))
+           for k in range(len(roots) + 1)
+       ]
+
    def flatten(list_of_lists):
        "Flatten one level of nesting"
        return chain.from_iterable(list_of_lists)
@@ -1137,6 +1149,13 @@ which incur interpreter overhead.
     >>> list(convolve(data, [1, -2, 1]))
     [20, 0, -36, 24, -20, 20, -20, -4, 16]
 
+    >>> polynomial_from_roots([5, -4, 3])
+    [1, -4, -17, 60]
+    >>> factored = lambda x: (x - 5) * (x + 4) * (x - 3)
+    >>> expanded = lambda x: x**3 -4*x**2 -17*x + 60
+    >>> all(factored(x) == expanded(x) for x in range(-10, 11))
+    True
+
     >>> list(flatten([('a', 'b'), (), ('c', 'd', 'e'), ('f',), ('g', 'h', 'i')]))
     ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']