defpoly(seq_of_zeros):"""Return polynomial coefficients from roots. Wraps ``numpy.poly``."""budget=require_budget()seq=_np.asarray(seq_of_zeros)# If 2D (square matrix), n = shape[0]; if 1D, n = len(seq)ifseq.ndim==2:n=seq.shape[0]else:n=len(seq)cost=poly_cost(n)budget.deduct("poly",flop_cost=cost,subscripts=None,shapes=(seq.shape,))return_np.poly(seq_of_zeros)
defpolyadd(a1,a2):"""Add two polynomials. Wraps ``numpy.polyadd``."""budget=require_budget()a1=_np.asarray(a1)a2=_np.asarray(a2)n1=len(a1)n2=len(a2)cost=polyadd_cost(n1,n2)budget.deduct("polyadd",flop_cost=cost,subscripts=None,shapes=(a1.shape,a2.shape))return_np.polyadd(a1,a2)
defpolyder(p,m=1):"""Differentiate a polynomial. Wraps ``numpy.polyder``."""budget=require_budget()p=_np.asarray(p)n=len(p)cost=polyder_cost(n)budget.deduct("polyder",flop_cost=cost,subscripts=None,shapes=(p.shape,))return_np.polyder(p,m=m)
defpolydiv(u,v):"""Divide one polynomial by another. Wraps ``numpy.polydiv``."""budget=require_budget()u=_np.asarray(u)v=_np.asarray(v)n1=len(u)n2=len(v)cost=polydiv_cost(n1,n2)budget.deduct("polydiv",flop_cost=cost,subscripts=None,shapes=(u.shape,v.shape))return_np.polydiv(u,v)
defpolyfit(x,y,deg,**kwargs):"""Least-squares polynomial fit. Wraps ``numpy.polyfit``."""budget=require_budget()x=_np.asarray(x)m=len(x)cost=polyfit_cost(m,deg)budget.deduct("polyfit",flop_cost=cost,subscripts=None,shapes=(x.shape,))return_np.polyfit(x,y,deg,**kwargs)
defpolyint(p,m=1,k=None):"""Integrate a polynomial. Wraps ``numpy.polyint``."""budget=require_budget()p=_np.asarray(p)n=len(p)cost=polyint_cost(n)budget.deduct("polyint",flop_cost=cost,subscripts=None,shapes=(p.shape,))ifkisNone:return_np.polyint(p,m=m)return_np.polyint(p,m=m,k=k)
defpolysub(a1,a2):"""Subtract two polynomials. Wraps ``numpy.polysub``."""budget=require_budget()a1=_np.asarray(a1)a2=_np.asarray(a2)n1=len(a1)n2=len(a2)cost=polysub_cost(n1,n2)budget.deduct("polysub",flop_cost=cost,subscripts=None,shapes=(a1.shape,a2.shape))return_np.polysub(a1,a2)
defpolyval(p,x):"""Evaluate a polynomial at given points. Wraps ``numpy.polyval``."""budget=require_budget()p=_np.asarray(p)x=_np.asarray(x)deg=len(p)-1m=x.sizecost=polyval_cost(deg,m)budget.deduct("polyval",flop_cost=cost,subscripts=None,shapes=(p.shape,x.shape))return_np.polyval(p,x)
polyval_cost(deg,m)
Cost for polyval: Horner's method = 2 * m * deg FLOPs.
defroots(p):"""Return the roots of a polynomial with given coefficients. Wraps ``numpy.roots``."""budget=require_budget()p=_np.asarray(p)n=len(p)-1# degree = number of rootscost=roots_cost(n)budget.deduct("roots",flop_cost=cost,subscripts=None,shapes=(p.shape,))return_np.roots(p)
roots_cost(n)
Cost for roots: \(10n^3\) FLOPs (companion matrix eigendecomposition).