]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Update itertool recipe: polynomial_from_roots() (GH-103973)
authorRaymond Hettinger <rhettinger@users.noreply.github.com>
Fri, 28 Apr 2023 17:25:50 +0000 (12:25 -0500)
committerGitHub <noreply@github.com>
Fri, 28 Apr 2023 17:25:50 +0000 (12:25 -0500)
Doc/library/itertools.rst

index e57c393a6b370bcbb9fae5e560dc231abe2fc995..a0d794017e260259c7f7ad7a4c4224128b4dc880 100644 (file)
@@ -789,6 +789,7 @@ which incur interpreter overhead.
 .. testcode::
 
    import collections
+   import functools
    import math
    import operator
    import random
@@ -1082,7 +1083,7 @@ The following recipes have a more mathematical flavor:
        # convolve(data, [1, -2, 1]) --> 2nd finite difference (2nd derivative)
        kernel = tuple(kernel)[::-1]
        n = len(kernel)
-       padded_signal = chain(repeat(0, n-1), signal, [0] * (n-1))
+       padded_signal = chain(repeat(0, n-1), signal, repeat(0, n-1))
        for window in sliding_window(padded_signal, n):
            yield math.sumprod(kernel, window)
 
@@ -1092,10 +1093,8 @@ The following recipes have a more mathematical flavor:
           (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)
+       factors = zip(repeat(1), map(operator.neg, roots))
+       return list(functools.reduce(convolve, factors, [1]))
 
    def polynomial_eval(coefficients, x):
        """Evaluate a polynomial at a specific value.