diff --git a/src/sage/rings/polynomial/multi_polynomial_ideal.py b/src/sage/rings/polynomial/multi_polynomial_ideal.py index eeb24026d9d..23d287b8c07 100644 --- a/src/sage/rings/polynomial/multi_polynomial_ideal.py +++ b/src/sage/rings/polynomial/multi_polynomial_ideal.py @@ -260,7 +260,6 @@ from sage.libs.singular.standard_options import \ libsingular_gb_standard_options except ImportError: - singular_default = None singular_gb_standard_options = libsingular_gb_standard_options = MethodDecorator try: @@ -616,7 +615,7 @@ class MPolynomialIdeal_singular_repr( An ideal in a multivariate polynomial ring, which has an underlying Singular ring associated to it. """ - def _singular_(self, singular=singular_default): + def _singular_(self, singular=None): """ Return Singular ideal corresponding to this ideal. @@ -629,6 +628,8 @@ def _singular_(self, singular=singular_default): x^3+y, y """ + if singular is None: + singular = singular_default try: self.ring()._singular_(singular).set_ring() I = self.__singular @@ -674,7 +675,7 @@ def _groebner_strategy(self): return GroebnerStrategy(MPolynomialIdeal(self.ring(), self.groebner_basis())) - def plot(self, singular=singular_default): + def plot(self, singular=None): r""" If you somehow manage to install surf, perhaps you can use this function to implicitly plot the real zero locus of this @@ -723,6 +724,8 @@ def plot(self, singular=singular_default): raise TypeError("base ring must have characteristic 0") if not self.is_principal(): raise TypeError("self must be principal") + if singular is None: + singular = singular_default singular.lib('surf') I = singular(self) I.plot() @@ -1027,7 +1030,7 @@ def is_prime(self, **kwds): @handle_AA_and_QQbar @singular_gb_standard_options @libsingular_gb_standard_options - def triangular_decomposition(self, algorithm=None, singular=singular_default): + def triangular_decomposition(self, algorithm=None, singular=None): """ Decompose zero-dimensional ideal ``self`` into triangular sets. @@ -1163,7 +1166,7 @@ def triangular_decomposition(self, algorithm=None, singular=singular_default): @require_field @handle_AA_and_QQbar - def dimension(self, singular=singular_default): + def dimension(self, singular=None): """ The dimension of the ring modulo this ideal. @@ -1478,7 +1481,7 @@ def _groebner_basis_singular(self, algorithm="groebner", *args, **kwds): return S @cached_method - def _groebner_basis_singular_raw(self, algorithm="groebner", singular=singular_default, *args, **kwds): + def _groebner_basis_singular_raw(self, algorithm="groebner", singular=None, *args, **kwds): r""" Return a Groebner basis in Singular format. @@ -1501,6 +1504,8 @@ def _groebner_basis_singular_raw(self, algorithm="groebner", singular=singular_d b*d^4 - b + d^5 - d, b*c - b*d + c^2*d^4 + c*d - 2*d^2, b^2 + 2*b*d + d^2, a + b + c + d] """ + if singular is None: + singular = singular_default #try: # return self.__gb_singular #except AttributeError: @@ -1790,7 +1795,7 @@ def radical(self): @require_field @libsingular_gb_standard_options - def integral_closure(self, p=0, r=True, singular=singular_default): + def integral_closure(self, p=0, r=True, singular=None): """ Let `I` = ``self``. @@ -2025,7 +2030,7 @@ def interreduced_basis(self): @cached_method @handle_AA_and_QQbar @singular_gb_standard_options - def basis_is_groebner(self, singular=singular_default): + def basis_is_groebner(self, singular=None): r""" Return ``True`` if the generators of this ideal (``self.gens()``) form a Groebner basis. @@ -2152,6 +2157,8 @@ def basis_is_groebner(self, singular=singular_default): return False return True except TypeError: + if singular is None: + singular = singular_default R._singular_().set_ring() F = singular( tuple(self.gens()), "module" ) LTF = singular( [f.lt() for f in self.gens()] , "module" ) @@ -2168,7 +2175,7 @@ def basis_is_groebner(self, singular=singular_default): @handle_AA_and_QQbar @singular_gb_standard_options @libsingular_gb_standard_options - def transformed_basis(self, algorithm="gwalk", other_ring=None, singular=singular_default): + def transformed_basis(self, algorithm="gwalk", other_ring=None, singular=None): """ Return a lex or ``other_ring`` Groebner Basis for this ideal. @@ -2260,6 +2267,8 @@ def transformed_basis(self, algorithm="gwalk", other_ring=None, singular=singula nR = R.change_ring(order='lex') else: nR = other_ring + if singular is None: + singular = singular_default Rs = singular(R) Is = singular(I) Is.attrib('isSB',1) @@ -3139,9 +3148,9 @@ def hilbert_numerator(self, grading=None, algorithm='sage'): TESTS:: - sage: I.hilbert_numerator() == I.hilbert_numerator(algorithm='singular') # needs sage.libs.flint + sage: I.hilbert_numerator() == I.hilbert_numerator(algorithm='singular') # needs sage.libs.flint True - sage: J.hilbert_numerator() == J.hilbert_numerator(algorithm='singular') # needs sage.libs.flint + sage: J.hilbert_numerator() == J.hilbert_numerator(algorithm='singular') # needs sage.libs.flint True sage: J.hilbert_numerator(grading=(10,3)) == J.hilbert_numerator(grading=(10,3), algorithm='singular') # needs sage.libs.flint True @@ -3279,7 +3288,7 @@ def _normal_basis_libsingular(self, degree, weights=None): @require_field @handle_AA_and_QQbar def normal_basis(self, degree=None, algorithm='libsingular', - singular=singular_default): + singular=None): """ Return a vector space basis of the quotient ring of this ideal. @@ -3360,6 +3369,8 @@ def normal_basis(self, degree=None, algorithm='libsingular', if algorithm == 'libsingular': return self._normal_basis_libsingular(degree, weights=weights) else: + if singular is None: + singular = singular_default gb = self.groebner_basis() R = self.ring() if degree is None: diff --git a/src/sage/rings/polynomial/polynomial_modn_dense_ntl.pyx b/src/sage/rings/polynomial/polynomial_modn_dense_ntl.pyx index 04e677ee078..e374a4e8aaa 100644 --- a/src/sage/rings/polynomial/polynomial_modn_dense_ntl.pyx +++ b/src/sage/rings/polynomial/polynomial_modn_dense_ntl.pyx @@ -47,8 +47,6 @@ from sage.rings.fraction_field_element import FractionFieldElement from sage.rings.infinity import infinity -from sage.interfaces.singular import singular as singular_default - from sage.structure.element import canonical_coercion, coerce_binop, have_same_parent from sage.libs.ntl.types cimport NTL_SP_BOUND @@ -360,7 +358,7 @@ cdef class Polynomial_dense_mod_n(Polynomial): self._poly = ZZ_pX(v, self.parent().modulus()) # Polynomial_singular_repr stuff, copied due to lack of multiple inheritance - def _singular_(self, singular=singular_default, force=False): + def _singular_(self, singular=None, force=False): self.parent()._singular_(singular, force=force).set_ring() # this is expensive if self.__singular is not None: try: @@ -371,7 +369,7 @@ cdef class Polynomial_dense_mod_n(Polynomial): pass return self._singular_init_(singular) - def _singular_init_(self, singular=singular_default, force=False): + def _singular_init_(self, singular=None, force=False): self.parent()._singular_(singular, force=force).set_ring() # this is expensive self.__singular = singular(str(self)) return self.__singular diff --git a/src/sage/rings/polynomial/polynomial_rational_flint.pyx b/src/sage/rings/polynomial/polynomial_rational_flint.pyx index c67ddf1a4c5..6e73a98b1fa 100644 --- a/src/sage/rings/polynomial/polynomial_rational_flint.pyx +++ b/src/sage/rings/polynomial/polynomial_rational_flint.pyx @@ -39,8 +39,6 @@ from sage.libs.flint.fmpq_poly_sage cimport * from sage.libs.gmp.mpz cimport * from sage.libs.gmp.mpq cimport * -from sage.interfaces.singular import singular as singular_default - from cypari2.gen import Gen as pari_gen from sage.rings.complex_arb cimport ComplexBall @@ -330,7 +328,7 @@ cdef class Polynomial_rational_flint(Polynomial): fmpq_poly_set(res._poly, self._poly) return res - def _singular_(self, singular=singular_default): + def _singular_(self, singular=None): """ Return a Singular representation of ``self``. @@ -345,6 +343,8 @@ cdef class Polynomial_rational_flint(Polynomial): sage: singular(f) # needs sage.libs.singular 3*x^2+2*x+5 """ + if singular is None: + from sage.interfaces.singular import singular self._parent._singular_(singular).set_ring() # Expensive! return singular(self._singular_init_()) diff --git a/src/sage/rings/polynomial/polynomial_singular_interface.py b/src/sage/rings/polynomial/polynomial_singular_interface.py index 761fb0f0d69..3139e30c517 100644 --- a/src/sage/rings/polynomial/polynomial_singular_interface.py +++ b/src/sage/rings/polynomial/polynomial_singular_interface.py @@ -41,11 +41,6 @@ import sage.rings.abc import sage.rings.number_field as number_field -try: - from sage.interfaces.singular import singular -except ImportError: - singular = None - from sage.rings.rational_field import is_RationalField from sage.rings.function_field.function_field_rational import RationalFunctionField from sage.rings.finite_rings.finite_field_base import FiniteField @@ -54,6 +49,7 @@ import sage.rings.finite_rings.finite_field_constructor + def _do_singular_init_(singular, base_ring, char, _vars, order): r""" Implementation of :meth:`PolynomialRing_singular_repr._singular_init_`. @@ -183,7 +179,7 @@ class PolynomialRing_singular_repr: polynomial rings which support conversion from and to Singular rings. """ - def _singular_(self, singular=singular): + def _singular_(self, singular=None): r""" Return a Singular ring for this polynomial ring. @@ -331,9 +327,11 @@ def _singular_(self, singular=singular): - Singular represents precision of floating point numbers base 10 while Sage represents floating point precision base 2. """ + if singular is None: + from sage.interfaces.singular import singular try: R = self.__singular - if not (R.parent() is singular): + if R.parent() is not singular: raise ValueError R._check_valid() if self.base_ring() is ZZ or self.base_ring().is_prime_field(): @@ -348,7 +346,7 @@ def _singular_(self, singular=singular): except (AttributeError, ValueError): return self._singular_init_(singular) - def _singular_init_(self, singular=singular): + def _singular_init_(self, singular=None): """ Return a newly created Singular ring matching this ring. @@ -374,6 +372,9 @@ def _singular_init_(self, singular=singular): _vars = str(self.gens()) order = self.term_order().singular_str() + if singular is None: + from sage.interfaces.singular import singular + self.__singular, self.__minpoly = _do_singular_init_(singular, self.base_ring(), self.characteristic(), _vars, order) return self.__singular @@ -460,14 +461,18 @@ class Polynomial_singular_repr: Due to the incompatibility of Python extension classes and multiple inheritance, this just defers to module-level functions. """ - def _singular_(self, singular=singular): + def _singular_(self, singular=None): + if singular is None: + from sage.interfaces.singular import singular return _singular_func(self, singular) - def _singular_init_func(self, singular=singular): + def _singular_init_func(self, singular=None): + if singular is None: + from sage.interfaces.singular import singular return _singular_init_func(self, singular) -def _singular_func(self, singular=singular): +def _singular_func(self, singular=None): """ Return Singular polynomial matching this polynomial. @@ -500,8 +505,9 @@ def _singular_func(self, singular=singular): sage: R(h^20) == f^20 True """ + if singular is None: + from sage.interfaces.singular import singular self.parent()._singular_(singular).set_ring() # this is expensive - try: self.__singular._check_valid() if self.__singular.parent() is singular: @@ -511,13 +517,15 @@ def _singular_func(self, singular=singular): return _singular_init_func(self, singular) -def _singular_init_func(self, singular=singular): +def _singular_init_func(self, singular=None): """ Return corresponding Singular polynomial but enforce that a new instance is created in the Singular interpreter. Use ``self._singular_()`` instead. """ + if singular is None: + from sage.interfaces.singular import singular self.parent()._singular_(singular).set_ring() # this is expensive self.__singular = singular(str(self)) return self.__singular diff --git a/src/sage/rings/polynomial/polynomial_template.pxi b/src/sage/rings/polynomial/polynomial_template.pxi index 6d9621eac67..31f2903f318 100644 --- a/src/sage/rings/polynomial/polynomial_template.pxi +++ b/src/sage/rings/polynomial/polynomial_template.pxi @@ -24,8 +24,6 @@ from sage.libs.pari.all import pari_gen import operator -from sage.interfaces.singular import singular as singular_default - def make_element(parent, args): return parent(*args) @@ -816,7 +814,7 @@ cdef class Polynomial_template(Polynomial): celement_truncate(&r.x, &self.x, n, (self)._cparent) return r - def _singular_(self, singular=singular_default): + def _singular_(self, singular=None): r""" Return Singular representation of this polynomial @@ -831,5 +829,8 @@ cdef class Polynomial_template(Polynomial): sage: singular(f) # needs sage.libs.singular 3*x^2+2*x-2 """ + if singular is None: + from sage.interfaces.singular import singular + self.parent()._singular_(singular).set_ring() # this is expensive return singular(self._singular_init_()) diff --git a/src/sage/rings/quotient_ring_element.py b/src/sage/rings/quotient_ring_element.py index cbedaf6ecdf..2a46cf9a7b7 100644 --- a/src/sage/rings/quotient_ring_element.py +++ b/src/sage/rings/quotient_ring_element.py @@ -801,7 +801,7 @@ def monomials(self): """ return [self.__class__(self.parent(), m) for m in self.__rep.monomials()] - def _singular_(self, singular=singular_default): + def _singular_(self, singular=None): """ Return Singular representation of self. @@ -844,7 +844,9 @@ def _singular_(self, singular=singular_default): a - 2/3*b """ if singular is None: - raise ImportError("could not import singular") + singular = singular_default + if singular is None: + raise ImportError("could not import singular") return self.__rep._singular_(singular) def _magma_init_(self, magma):