def test_coeff(): p = Poly(3*x**2*y + 4*x*y**2 + 1, x, y) assert p.coeff(0, 0) == p.coeff() == 1 assert p.coeff(2, 1) == 3 assert p.coeff(1, 2) == 4 assert p.coeff(1, 1) == 0
def poly_factorize(poly): """Factorize multivariate polynomials into a sum of products of monomials. This function can be used to decompose polynomials into a form which minimizes the number of additions and multiplications, and which thus can be evaluated efficently.""" max_deg = {} if 'horner' in dir(sympy): return sympy.horner(poly) if not isinstance(poly, Poly): poly = Poly(sympy.expand(poly), *poly.atoms(Symbol)) denom, poly = poly.as_integer() # Determine the order of factorization. We proceed through the # symbols, starting with the one present in the highest order # in the polynomial. for i, sym in enumerate(poly.symbols): max_deg[i] = 0 for monom in poly.monoms: for i, symvar in enumerate(monom): max_deg[i] = max(max_deg[i], symvar) ret_poly = 0 monoms = list(poly.monoms) for isym, maxdeg in sorted(max_deg.items(), key=itemgetter(1), reverse=True): drop_idx = [] new_poly = [] for i, monom in enumerate(monoms): if monom[isym] > 0: drop_idx.append(i) new_poly.append((poly.coeff(*monom), monom)) if not new_poly: continue ret_poly += sympy.factor(Poly(new_poly, *poly.symbols)) for idx in reversed(drop_idx): del monoms[idx] # Add any remaining O(1) terms. new_poly = [] for i, monom in enumerate(monoms): new_poly.append((poly.coeff(*monom), monom)) if new_poly: ret_poly += Poly(new_poly, *poly.symbols) return ret_poly / denom
def main(): x=Symbol("x") s = Poly(A(x), x) num = [s.coeff(n) for n in range(11)] print s.as_basic() print num
def main(): x = Symbol("x") s = Poly(A(x), x) num = [s.coeff(n) for n in range(11)] print s.as_basic() print num