def rs_integrate(self, x): """ integrate ``p`` with respect to ``x`` Examples ======== >>> from diofant.polys.domains import QQ >>> from diofant.polys.rings import ring >>> R, x, y = ring('x, y', QQ) >>> p = x + x**2*y**3 >>> rs_integrate(p, x) 1/3*x**3*y**3 + 1/2*x**2 """ ring = self.ring p1 = ring.zero n = ring.gens.index(x) mn = [0] * ring.ngens mn[n] = 1 mn = tuple(mn) for expv in self: e = monomial_mul(expv, mn) p1[e] = self[expv] / (expv[n] + 1) return p1
def representing_matrix(m): M = [[domain.zero] * len(basis) for _ in range(len(basis))] for i, v in enumerate(basis): r = ring.term_new(monomial_mul(m, v), domain.one).rem(G) for monom, coeff in r.terms(): j = basis.index(monom) M[j][i] = coeff return M
def rs_square(p1, x, prec): """ square modulo ``O(x**prec)`` Examples ======== >>> from diofant.polys.domains import QQ >>> from diofant.polys.rings import ring >>> R, x = ring('x', QQ) >>> p = x**2 + 2*x + 1 >>> rs_square(p, x, 3) 6*x**2 + 4*x + 1 """ ring = p1.ring p = ring.zero iv = ring.gens.index(x) get = p.get items = list(p1.items()) items.sort(key=lambda e: e[0][iv]) monomial_mul = ring.monomial_mul for i in range(len(items)): exp1, v1 = items[i] for j in range(i): exp2, v2 = items[j] if exp1[iv] + exp2[iv] < prec: exp = monomial_mul(exp1, exp2) p[exp] = get(exp, 0) + v1 * v2 else: break p = p.imul_num(2) get = p.get for expv, v in p1.items(): if 2 * expv[iv] < prec: e2 = monomial_mul(expv, expv) p[e2] = get(e2, 0) + v**2 p.strip_zero() return p
def rs_mul(p1, p2, x, prec): """ product of series modulo ``O(x**prec)`` ``x`` is the series variable or its position in the generators. Examples ======== >>> from diofant.polys.domains import QQ >>> from diofant.polys.rings import ring >>> R, x = ring('x', QQ) >>> p1 = x**2 + 2*x + 1 >>> p2 = x + 1 >>> rs_mul(p1, p2, x, 3) 3*x**2 + 3*x + 1 """ ring = p1.ring p = ring.zero if ring.__class__ != p2.ring.__class__ or ring != p2.ring: raise ValueError('p1 and p2 must have the same ring') iv = ring.gens.index(x) if not isinstance(p2, PolyElement): raise ValueError('p1 and p2 must have the same ring') if ring == p2.ring: get = p.get items2 = list(p2.items()) items2.sort(key=lambda e: e[0][iv]) if ring.ngens == 1: for exp1, v1 in p1.items(): for exp2, v2 in items2: exp = exp1[0] + exp2[0] if exp < prec: exp = (exp, ) p[exp] = get(exp, 0) + v1 * v2 else: break else: monomial_mul = ring.monomial_mul for exp1, v1 in p1.items(): for exp2, v2 in items2: if exp1[iv] + exp2[iv] < prec: exp = monomial_mul(exp1, exp2) p[exp] = get(exp, 0) + v1 * v2 else: break p.strip_zero() return p
def sdm_monomial_mul(M, X): """ Multiply tuple ``X`` representing a monomial of `K[X]` into the tuple ``M`` representing a monomial of `F`. Examples ======== Multiplying `xy^3` into `x f_1` yields `x^2 y^3 f_1`: >>> sdm_monomial_mul((1, 1, 0), (1, 3)) (1, 2, 3) """ return (M[0],) + monomial_mul(X, M[1:])
def test_monomial_mul(): assert monomial_mul((3, 4, 1), (1, 2, 0)) == (4, 6, 1)