def integral(self, var=None): """ Return the integral of this polynomial. By default, the integration variable is the variable of the polynomial. Otherwise, the integration variable is the optional parameter ``var`` .. NOTE:: The integral is always chosen so that the constant term is 0. EXAMPLES:: sage: R.<x> = PolynomialRing(ZZ, sparse=True) sage: (1 + 3*x^10 - 2*x^100).integral() -2/101*x^101 + 3/11*x^11 + x TESTS: Check that :trac:`18600` is fixed:: sage: R.<x> = PolynomialRing(ZZ, sparse=True) sage: (x^2^100).integral() 1/1267650600228229401496703205377*x^1267650600228229401496703205377 Check the correctness when the base ring is a polynomial ring:: sage: R.<x> = PolynomialRing(ZZ, sparse=True) sage: S.<t> = PolynomialRing(R, sparse=True) sage: (x*t+1).integral() 1/2*x*t^2 + t sage: (x*t+1).integral(x) 1/2*x^2*t + x Check the correctness when the base ring is not an integral domain:: sage: R.<x> = PolynomialRing(Zmod(4), sparse=True) sage: (x^4 + 2*x^2 + 3).integral() x^5 + 2*x^3 + 3*x sage: x.integral() Traceback (most recent call last): ... ZeroDivisionError: Inverse does not exist. """ R = self.parent() # TODO: # calling the coercion model bin_op is much more accurate than using the # true division (which is bypassed by polynomials). But it does not work # in all cases!! from sage.structure.element import coercion_model as cm import operator try: Q = cm.bin_op(R.one(), ZZ.one(), operator.truediv).parent() except TypeError: F = (R.base_ring().one()/ZZ.one()).parent() Q = R.change_ring(F) if var is not None and var != R.gen(): return Q({k:v.integral(var) for k,v in six.iteritems(self.__coeffs)}, check=False) return Q({ k+1:v/(k+1) for k,v in six.iteritems(self.__coeffs)}, check=False)
def integral(self, var=None): """ Return the integral of this polynomial. By default, the integration variable is the variable of the polynomial. Otherwise, the integration variable is the optional parameter ``var`` .. NOTE:: The integral is always chosen so that the constant term is 0. EXAMPLES:: sage: R.<x> = PolynomialRing(ZZ, sparse=True) sage: (1 + 3*x^10 - 2*x^100).integral() -2/101*x^101 + 3/11*x^11 + x TESTS: Check that :trac:`18600` is fixed:: sage: R.<x> = PolynomialRing(ZZ, sparse=True) sage: (x^2^100).integral() 1/1267650600228229401496703205377*x^1267650600228229401496703205377 Check the correctness when the base ring is a polynomial ring:: sage: R.<x> = PolynomialRing(ZZ, sparse=True) sage: S.<t> = PolynomialRing(R, sparse=True) sage: (x*t+1).integral() 1/2*x*t^2 + t sage: (x*t+1).integral(x) 1/2*x^2*t + x Check the correctness when the base ring is not an integral domain:: sage: R.<x> = PolynomialRing(Zmod(4), sparse=True) sage: (x^4 + 2*x^2 + 3).integral() x^5 + 2*x^3 + 3*x sage: x.integral() Traceback (most recent call last): ... ZeroDivisionError: Inverse does not exist. """ R = self.parent() # TODO: # calling the coercion model bin_op is much more accurate than using the # true division (which is bypassed by polynomials). But it does not work # in all cases!! from sage.structure.element import coercion_model as cm import operator try: Q = cm.bin_op(R.one(), ZZ.one(), operator.div).parent() except TypeError: F = (R.base_ring().one()/ZZ.one()).parent() Q = R.change_ring(F) if var is not None and var != R.gen(): return Q({k:v.integral(var) for k,v in six.iteritems(self.__coeffs)}, check=False) return Q({ k+1:v/(k+1) for k,v in six.iteritems(self.__coeffs)}, check=False)