Skip to content

Commit

Permalink
Tweak polynomial itertool recipes (GH-102880)
Browse files Browse the repository at this point in the history
  • Loading branch information
rhettinger authored Mar 21, 2023
1 parent 7436874 commit 0214c7a
Showing 1 changed file with 13 additions and 14 deletions.
27 changes: 13 additions & 14 deletions Doc/library/itertools.rst
Original file line number Diff line number Diff line change
Expand Up @@ -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.

Expand All @@ -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."
Expand Down

0 comments on commit 0214c7a

Please sign in to comment.