def Ideal(*args, **kwds): r""" Create the ideal in ring with given generators. There are some shorthand notations for creating an ideal, in addition to using the :func:`Ideal` function: - ``R.ideal(gens, coerce=True)`` - ``gens*R`` - ``R*gens`` INPUT: - ``R`` - A ring (optional; if not given, will try to infer it from ``gens``) - ``gens`` - list of elements generating the ideal - ``coerce`` - bool (optional, default: ``True``); whether ``gens`` need to be coerced into the ring. OUTPUT: The ideal of ring generated by ``gens``. EXAMPLES:: sage: R, x = PolynomialRing(ZZ, 'x').objgen() sage: I = R.ideal([4 + 3*x + x^2, 1 + x^2]) sage: I Ideal (x^2 + 3*x + 4, x^2 + 1) of Univariate Polynomial Ring in x over Integer Ring sage: Ideal(R, [4 + 3*x + x^2, 1 + x^2]) Ideal (x^2 + 3*x + 4, x^2 + 1) of Univariate Polynomial Ring in x over Integer Ring sage: Ideal((4 + 3*x + x^2, 1 + x^2)) Ideal (x^2 + 3*x + 4, x^2 + 1) of Univariate Polynomial Ring in x over Integer Ring :: sage: ideal(x^2-2*x+1, x^2-1) Ideal (x^2 - 2*x + 1, x^2 - 1) of Univariate Polynomial Ring in x over Integer Ring sage: ideal([x^2-2*x+1, x^2-1]) Ideal (x^2 - 2*x + 1, x^2 - 1) of Univariate Polynomial Ring in x over Integer Ring sage: l = [x^2-2*x+1, x^2-1] sage: ideal(f^2 for f in l) Ideal (x^4 - 4*x^3 + 6*x^2 - 4*x + 1, x^4 - 2*x^2 + 1) of Univariate Polynomial Ring in x over Integer Ring This example illustrates how Sage finds a common ambient ring for the ideal, even though 1 is in the integers (in this case). :: sage: R.<t> = ZZ['t'] sage: i = ideal(1,t,t^2) sage: i Ideal (1, t, t^2) of Univariate Polynomial Ring in t over Integer Ring sage: ideal(1/2,t,t^2) Principal ideal (1) of Univariate Polynomial Ring in t over Rational Field This shows that the issues at :trac:`1104` are resolved:: sage: Ideal(3, 5) Principal ideal (1) of Integer Ring sage: Ideal(ZZ, 3, 5) Principal ideal (1) of Integer Ring sage: Ideal(2, 4, 6) Principal ideal (2) of Integer Ring You have to provide enough information that Sage can figure out which ring to put the ideal in. :: sage: I = Ideal([]) Traceback (most recent call last): ... ValueError: unable to determine which ring to embed the ideal in sage: I = Ideal() Traceback (most recent call last): ... ValueError: need at least one argument Note that some rings use different ideal implementations than the standard, even if they are PIDs.:: sage: R.<x> = GF(5)[] sage: I = R*(x^2+3) sage: type(I) <class 'sage.rings.polynomial.ideal.Ideal_1poly_field'> You can also pass in a specific ideal type:: sage: from sage.rings.ideal import Ideal_pid sage: I = Ideal(x^2+3,ideal_class=Ideal_pid) sage: type(I) <class 'sage.rings.ideal.Ideal_pid'> TESTS:: sage: R, x = PolynomialRing(ZZ, 'x').objgen() sage: I = R.ideal([4 + 3*x + x^2, 1 + x^2]) sage: I == loads(dumps(I)) True :: sage: I = Ideal(R, [4 + 3*x + x^2, 1 + x^2]) sage: I == loads(dumps(I)) True :: sage: I = Ideal((4 + 3*x + x^2, 1 + x^2)) sage: I == loads(dumps(I)) True This shows that the issue at :trac:`5477` is fixed:: sage: R.<x> = QQ[] sage: I = R.ideal([x + x^2]) sage: J = R.ideal([2*x + 2*x^2]) sage: J Principal ideal (x^2 + x) of Univariate Polynomial Ring in x over Rational Field sage: S = R.quotient_ring(I) sage: U = R.quotient_ring(J) sage: I == J True sage: S == U True """ if len(args) == 0: raise ValueError, "need at least one argument" if len(args) == 1 and args[0] == []: raise ValueError, "unable to determine which ring to embed the ideal in" first = args[0] if not isinstance(first, sage.rings.ring.Ring): if isinstance(first, Ideal_generic) and len(args) == 1: R = first.ring() gens = first.gens() else: if isinstance(first, (list, tuple, GeneratorType)) and len(args) == 1: gens = first else: gens = args gens = Sequence(gens) R = gens.universe() else: R = first gens = args[1:] if not commutative_ring.is_CommutativeRing(R): raise TypeError, "R must be a commutative ring" return R.ideal(*gens, **kwds)
def Ideal(*args, **kwds): r""" Create the ideal in ring with given generators. There are some shorthand notations for creating an ideal, in addition to using the :func:`Ideal` function: - ``R.ideal(gens, coerce=True)`` - ``gens*R`` - ``R*gens`` INPUT: - ``R`` - A ring (optional; if not given, will try to infer it from ``gens``) - ``gens`` - list of elements generating the ideal - ``coerce`` - bool (optional, default: ``True``); whether ``gens`` need to be coerced into the ring. OUTPUT: The ideal of ring generated by ``gens``. EXAMPLES:: sage: R.<x> = ZZ[] sage: I = R.ideal([4 + 3*x + x^2, 1 + x^2]) sage: I Ideal (x^2 + 3*x + 4, x^2 + 1) of Univariate Polynomial Ring in x over Integer Ring sage: Ideal(R, [4 + 3*x + x^2, 1 + x^2]) Ideal (x^2 + 3*x + 4, x^2 + 1) of Univariate Polynomial Ring in x over Integer Ring sage: Ideal((4 + 3*x + x^2, 1 + x^2)) Ideal (x^2 + 3*x + 4, x^2 + 1) of Univariate Polynomial Ring in x over Integer Ring :: sage: ideal(x^2-2*x+1, x^2-1) Ideal (x^2 - 2*x + 1, x^2 - 1) of Univariate Polynomial Ring in x over Integer Ring sage: ideal([x^2-2*x+1, x^2-1]) Ideal (x^2 - 2*x + 1, x^2 - 1) of Univariate Polynomial Ring in x over Integer Ring sage: l = [x^2-2*x+1, x^2-1] sage: ideal(f^2 for f in l) Ideal (x^4 - 4*x^3 + 6*x^2 - 4*x + 1, x^4 - 2*x^2 + 1) of Univariate Polynomial Ring in x over Integer Ring This example illustrates how Sage finds a common ambient ring for the ideal, even though 1 is in the integers (in this case). :: sage: R.<t> = ZZ['t'] sage: i = ideal(1,t,t^2) sage: i Ideal (1, t, t^2) of Univariate Polynomial Ring in t over Integer Ring sage: ideal(1/2,t,t^2) Principal ideal (1) of Univariate Polynomial Ring in t over Rational Field This shows that the issues at :trac:`1104` are resolved:: sage: Ideal(3, 5) Principal ideal (1) of Integer Ring sage: Ideal(ZZ, 3, 5) Principal ideal (1) of Integer Ring sage: Ideal(2, 4, 6) Principal ideal (2) of Integer Ring You have to provide enough information that Sage can figure out which ring to put the ideal in. :: sage: I = Ideal([]) Traceback (most recent call last): ... ValueError: unable to determine which ring to embed the ideal in sage: I = Ideal() Traceback (most recent call last): ... ValueError: need at least one argument Note that some rings use different ideal implementations than the standard, even if they are PIDs.:: sage: R.<x> = GF(5)[] sage: I = R*(x^2+3) sage: type(I) <class 'sage.rings.polynomial.ideal.Ideal_1poly_field'> You can also pass in a specific ideal type:: sage: from sage.rings.ideal import Ideal_pid sage: I = Ideal(x^2+3,ideal_class=Ideal_pid) sage: type(I) <class 'sage.rings.ideal.Ideal_pid'> TESTS:: sage: R.<x> = ZZ[] sage: I = R.ideal([4 + 3*x + x^2, 1 + x^2]) sage: I == loads(dumps(I)) True :: sage: I = Ideal(R, [4 + 3*x + x^2, 1 + x^2]) sage: I == loads(dumps(I)) True :: sage: I = Ideal((4 + 3*x + x^2, 1 + x^2)) sage: I == loads(dumps(I)) True This shows that the issue at :trac:`5477` is fixed:: sage: R.<x> = QQ[] sage: I = R.ideal([x + x^2]) sage: J = R.ideal([2*x + 2*x^2]) sage: J Principal ideal (x^2 + x) of Univariate Polynomial Ring in x over Rational Field sage: S = R.quotient_ring(I) sage: U = R.quotient_ring(J) sage: I == J True sage: S == U True """ if len(args) == 0: raise ValueError("need at least one argument") if len(args) == 1 and args[0] == []: raise ValueError( "unable to determine which ring to embed the ideal in") first = args[0] if not isinstance(first, sage.rings.ring.Ring): if isinstance(first, Ideal_generic) and len(args) == 1: R = first.ring() gens = first.gens() else: if isinstance(first, (list, tuple, GeneratorType)) and len(args) == 1: gens = first else: gens = args gens = Sequence(gens) R = gens.universe() else: R = first gens = args[1:] if not commutative_ring.is_CommutativeRing(R): raise TypeError("R must be a commutative ring") return R.ideal(*gens, **kwds)