Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 23 additions & 12 deletions src/sage/rings/polynomial/multi_polynomial_ideal.py
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down Expand Up @@ -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.

Expand All @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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()
Expand Down Expand Up @@ -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.
Expand Down Expand Up @@ -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.

Expand Down Expand Up @@ -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.

Expand All @@ -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:
Expand Down Expand Up @@ -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``.

Expand Down Expand Up @@ -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.
Expand Down Expand Up @@ -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" )
Expand All @@ -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.

Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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.

Expand Down Expand Up @@ -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:
Expand Down
6 changes: 2 additions & 4 deletions src/sage/rings/polynomial/polynomial_modn_dense_ntl.pyx
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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:
Expand All @@ -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
Expand Down
6 changes: 3 additions & 3 deletions src/sage/rings/polynomial/polynomial_rational_flint.pyx
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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``.

Expand All @@ -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_())

Expand Down
34 changes: 21 additions & 13 deletions src/sage/rings/polynomial/polynomial_singular_interface.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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_`.
Expand Down Expand Up @@ -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.

Expand Down Expand Up @@ -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():
Expand All @@ -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.

Expand All @@ -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
Expand Down Expand Up @@ -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.

Expand Down Expand Up @@ -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:
Expand All @@ -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
7 changes: 4 additions & 3 deletions src/sage/rings/polynomial/polynomial_template.pxi
Original file line number Diff line number Diff line change
Expand Up @@ -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)

Expand Down Expand Up @@ -816,7 +814,7 @@ cdef class Polynomial_template(Polynomial):
celement_truncate(&r.x, &self.x, n, (<Polynomial_template>self)._cparent)
return r

def _singular_(self, singular=singular_default):
def _singular_(self, singular=None):
r"""
Return Singular representation of this polynomial

Expand All @@ -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_())
6 changes: 4 additions & 2 deletions src/sage/rings/quotient_ring_element.py
Original file line number Diff line number Diff line change
Expand Up @@ -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.

Expand Down Expand Up @@ -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):
Expand Down