summarylogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.SRCINFO4
-rw-r--r--PKGBUILD4
-rw-r--r--sagemath-ipython7.patch16
-rw-r--r--sagemath-singular-4.1.2.patch525
4 files changed, 410 insertions, 139 deletions
diff --git a/.SRCINFO b/.SRCINFO
index 2edc93024e8a..b31f5e365064 100644
--- a/.SRCINFO
+++ b/.SRCINFO
@@ -108,9 +108,9 @@ pkgbase = sagemath-git
sha256sums = 6a5470d7044a50a35a6478f57c19adf72fe54aefebeea8a095915b63f9e219ac
sha256sums = 876fd1c0fc3471b56e54d960d79e5ce1d5fc49cebf6eed27043a7380854c792c
sha256sums = 937074fa7a8a4e2aba9ea77ec622fe937985a1a9176c48460d51325ee877a4f5
- sha256sums = 107b9e6877329fe95cc558a671c8a0a3a645c25bbfa2f484d75e21b583160fb6
+ sha256sums = 0a78fe1ca875028c72a80fb2006aa6017922894dffd114086132ff35e7a26009
sha256sums = e44bbde87f3312548faad75b7383ef21fade55be251ab5804de41cd3842ca8a0
- sha256sums = 0b79606ce932d12ce4e2baebd660bf42faebca3138511987faf5569a5f3adbbf
+ sha256sums = dca48f2eba8a27fdc027214faa63241f023f9e02e7bf2ca48b69395ce5a8d31b
sha256sums = 9062b412595e81a5ca560a5ae789f8b7318981689cb8d076b30d8c54a4fc4495
sha256sums = ea5c54b2f2b12cb59633e6a0ad26e1f3809cb8ad60e889c31495aef0a7eeb578
diff --git a/PKGBUILD b/PKGBUILD
index e1c3dff3981d..4e396e760d11 100644
--- a/PKGBUILD
+++ b/PKGBUILD
@@ -49,9 +49,9 @@ sha256sums=('SKIP'
'6a5470d7044a50a35a6478f57c19adf72fe54aefebeea8a095915b63f9e219ac'
'876fd1c0fc3471b56e54d960d79e5ce1d5fc49cebf6eed27043a7380854c792c'
'937074fa7a8a4e2aba9ea77ec622fe937985a1a9176c48460d51325ee877a4f5'
- '107b9e6877329fe95cc558a671c8a0a3a645c25bbfa2f484d75e21b583160fb6'
+ '0a78fe1ca875028c72a80fb2006aa6017922894dffd114086132ff35e7a26009'
'e44bbde87f3312548faad75b7383ef21fade55be251ab5804de41cd3842ca8a0'
- '0b79606ce932d12ce4e2baebd660bf42faebca3138511987faf5569a5f3adbbf'
+ 'dca48f2eba8a27fdc027214faa63241f023f9e02e7bf2ca48b69395ce5a8d31b'
'9062b412595e81a5ca560a5ae789f8b7318981689cb8d076b30d8c54a4fc4495'
'ea5c54b2f2b12cb59633e6a0ad26e1f3809cb8ad60e889c31495aef0a7eeb578')
diff --git a/sagemath-ipython7.patch b/sagemath-ipython7.patch
index 09830f221529..28efd1440b6f 100644
--- a/sagemath-ipython7.patch
+++ b/sagemath-ipython7.patch
@@ -3275,6 +3275,22 @@ index ad2dba4fbc..1cd1fa7ba4 100644
"""
return self._nproc
+diff --git a/src/sage/parallel/use_fork.py b/src/sage/parallel/use_fork.py
+index 77842ec794..2c1689bd25 100644
+--- a/src/sage/parallel/use_fork.py
++++ b/src/sage/parallel/use_fork.py
+@@ -281,9 +281,9 @@ class p_iter_fork(object):
+ """
+ import os, sys
+ try:
+- from imp import reload
+- except ImportError:
+ from importlib import reload
++ except ImportError:
++ from imp import reload
+ from sage.misc.persist import save
+
+ # Make it so all stdout is sent to a file so it can
diff --git a/src/sage/plot/graphics.py b/src/sage/plot/graphics.py
index 31131ab220..bc33919835 100644
--- a/src/sage/plot/graphics.py
diff --git a/sagemath-singular-4.1.2.patch b/sagemath-singular-4.1.2.patch
index 9239ee1908c0..556d5fd77ba4 100644
--- a/sagemath-singular-4.1.2.patch
+++ b/sagemath-singular-4.1.2.patch
@@ -1,5 +1,66 @@
+diff --git a/src/doc/en/constructions/algebraic_geometry.rst b/src/doc/en/constructions/algebraic_geometry.rst
+index a312548..db84096 100644
+--- a/src/doc/en/constructions/algebraic_geometry.rst
++++ b/src/doc/en/constructions/algebraic_geometry.rst
+@@ -139,7 +139,7 @@ Other methods
+
+ sage: singular.lib("brnoeth.lib")
+ sage: s = singular.ring(2,'(x,y)','lp')
+- sage: I = singular.ideal('[x^4+x, y^4+y]')
++ sage: I = singular.ideal('x^4+x', 'y^4+y')
+ sage: L = singular.closed_points(I)
+ sage: # Here you have all the points :
+ sage: print(L)
+diff --git a/src/sage/algebras/free_algebra.py b/src/sage/algebras/free_algebra.py
+index c24add0..25e84ff 100644
+--- a/src/sage/algebras/free_algebra.py
++++ b/src/sage/algebras/free_algebra.py
+@@ -39,7 +39,15 @@ two-sided ideals, and thus provide ideal containment tests::
+ Free Associative Unital Algebra on 3 generators (x, y, z) over Rational Field
+ sage: I = F*[x*y+y*z,x^2+x*y-y*x-y^2]*F
+ sage: I.groebner_basis(degbound=4)
+- Twosided Ideal (y*z*y*y - y*z*y*z + y*z*z*y - y*z*z*z, y*z*y*x + y*z*y*z + y*z*z*x + y*z*z*z, y*y*z*y - y*y*z*z + y*z*z*y - y*z*z*z, y*y*z*x + y*y*z*z + y*z*z*x + y*z*z*z, y*y*y - y*y*z + y*z*y - y*z*z, y*y*x + y*y*z + y*z*x + y*z*z, x*y + y*z, x*x - y*x - y*y - y*z) of Free Associative Unital Algebra on 3 generators (x, y, z) over Rational Field
++ Twosided Ideal (x*y + y*z,
++ x*x - y*x - y*y - y*z,
++ y*y*y - y*y*z + y*z*y - y*z*z,
++ y*y*x + y*y*z + y*z*x + y*z*z,
++ y*y*z*y - y*y*z*z + y*z*z*y - y*z*z*z,
++ y*z*y*y - y*z*y*z + y*z*z*y - y*z*z*z,
++ y*y*z*x + y*y*z*z + y*z*z*x + y*z*z*z,
++ y*z*y*x + y*z*y*z + y*z*z*x + y*z*z*z) of Free Associative Unital
++ Algebra on 3 generators (x, y, z) over Rational Field
+ sage: y*z*y*y*z*z + 2*y*z*y*z*z*x + y*z*y*z*z*z - y*z*z*y*z*x + y*z*z*z*z*x in I
+ True
+
+@@ -236,7 +244,7 @@ class FreeAlgebraFactory(UniqueFactory):
+ a*b^2*c^3
+ """
+ def create_key(self, base_ring, arg1=None, arg2=None,
+- sparse=None, order='degrevlex',
++ sparse=None, order=None,
+ names=None, name=None,
+ implementation=None, degrees=None):
+ """
+@@ -267,6 +275,8 @@ class FreeAlgebraFactory(UniqueFactory):
+ return tuple(degrees),base_ring
+ # test if we can use libSingular/letterplace
+ if implementation == "letterplace":
++ if order is None:
++ order = 'degrevlex' if degrees is None else 'deglex'
+ args = [arg for arg in (arg1, arg2) if arg is not None]
+ kwds = dict(sparse=sparse, order=order, implementation="singular")
+ if name is not None:
+@@ -277,7 +287,7 @@ class FreeAlgebraFactory(UniqueFactory):
+ if degrees is None:
+ return (PolRing,)
+ from sage.all import TermOrder
+- T = PolRing.term_order() + TermOrder('lex',1)
++ T = TermOrder(PolRing.term_order(), PolRing.ngens() + 1)
+ varnames = list(PolRing.variable_names())
+ newname = 'x'
+ while newname in varnames:
diff --git a/src/sage/algebras/letterplace/free_algebra_element_letterplace.pyx b/src/sage/algebras/letterplace/free_algebra_element_letterplace.pyx
-index f78b522dc4..1b6c26ac03 100644
+index f78b522..4b5b834 100644
--- a/src/sage/algebras/letterplace/free_algebra_element_letterplace.pyx
+++ b/src/sage/algebras/letterplace/free_algebra_element_letterplace.pyx
@@ -24,7 +24,6 @@ from cpython.object cimport PyObject_RichCompare
@@ -10,70 +71,210 @@ index f78b522dc4..1b6c26ac03 100644
#####################
# Free algebra elements
-@@ -444,9 +443,10 @@ cdef class FreeAlgebraElement_letterplace(AlgebraElement):
+@@ -444,9 +443,9 @@ cdef class FreeAlgebraElement_letterplace(AlgebraElement):
cdef int i
if P.monomial_divides(s_poly,p_poly):
return True
-+ # current_ring has one additional variable if the variables have weights
-+ realngens = A._current_ring.ngens() / A.degbound()
++ realngens = A._commutative_ring.ngens()
for i from 0 <= i < p_d-s_d:
- s_poly = singular_system("stest",s_poly,1,
- A._degbound,A.__ngens,ring=P)
-+ s_poly = s_poly.shift(realngens)
++ s_poly = s_poly._cycle(realngens)
if P.monomial_divides(s_poly,p_poly):
return True
return False
-@@ -600,7 +600,9 @@ cdef class FreeAlgebraElement_letterplace(AlgebraElement):
+@@ -600,7 +599,8 @@ cdef class FreeAlgebraElement_letterplace(AlgebraElement):
# we must put the polynomials into the same ring
left._poly = A._current_ring(left._poly)
right._poly = A._current_ring(right._poly)
- rshift = singular_system("stest",right._poly,left._poly.degree(),A._degbound,A.__ngens, ring=A._current_ring)
-+ # current_ring has one additional variable if the variables have weights
-+ realngens = A._current_ring.ngens() / A.degbound()
-+ rshift = right._poly.shift(left._poly.degree()*realngens)
++ realngens = A._commutative_ring.ngens()
++ rshift = right._poly._cycle(left._poly.degree() * realngens)
return FreeAlgebraElement_letterplace(A,left._poly*rshift, check=False)
def __pow__(FreeAlgebraElement_letterplace self, int n, k):
-@@ -626,10 +628,11 @@ cdef class FreeAlgebraElement_letterplace(AlgebraElement):
+@@ -626,10 +626,10 @@ cdef class FreeAlgebraElement_letterplace(AlgebraElement):
self._poly = A._current_ring(self._poly)
cdef int d = self._poly.degree()
q = p = self._poly
-+ # current_ring has one additional variable if the variables have weights
-+ realngens = A._current_ring.ngens() / A.degbound()
++ realngens = A._commutative_ring.ngens()
cdef int i
for i from 0<i<n:
- q = singular_system("stest",q,d,A._degbound,A.__ngens,
- ring=A._current_ring)
-+ q = q.shift(d*realngens)
++ q = q._cycle(d * realngens)
p *= q
return FreeAlgebraElement_letterplace(A, p, check=False)
+diff --git a/src/sage/algebras/letterplace/free_algebra_letterplace.pxd b/src/sage/algebras/letterplace/free_algebra_letterplace.pxd
+index 7e5f2bb..d1d162c 100644
+--- a/src/sage/algebras/letterplace/free_algebra_letterplace.pxd
++++ b/src/sage/algebras/letterplace/free_algebra_letterplace.pxd
+@@ -13,8 +13,15 @@ from sage.rings.ring cimport Algebra
+ from sage.structure.element cimport AlgebraElement, ModuleElement, RingElement, Element
+ from sage.rings.polynomial.multi_polynomial_libsingular cimport MPolynomialRing_libsingular, MPolynomial_libsingular
+ from sage.algebras.letterplace.free_algebra_element_letterplace cimport FreeAlgebraElement_letterplace
++from sage.libs.singular.decl cimport ring
+
+
++cdef class FreeAlgebra_letterplace_libsingular():
++ cdef ring* _lp_ring
++ cdef MPolynomialRing_libsingular _commutative_ring
++ cdef MPolynomialRing_libsingular _lp_ring_internal
++ cdef object __ngens
++
+ cdef class FreeAlgebra_letterplace(Algebra):
+ cdef MPolynomialRing_libsingular _commutative_ring
+ cdef MPolynomialRing_libsingular _current_ring
diff --git a/src/sage/algebras/letterplace/free_algebra_letterplace.pyx b/src/sage/algebras/letterplace/free_algebra_letterplace.pyx
-index 7a8400052e..edbbd5767a 100644
+index 7a84000..02d0e89 100644
--- a/src/sage/algebras/letterplace/free_algebra_letterplace.pyx
+++ b/src/sage/algebras/letterplace/free_algebra_letterplace.pyx
-@@ -113,7 +113,6 @@ from sage.rings.noncommutative_ideals import IdealMonoid_nc
+@@ -37,7 +37,15 @@ The preceding containment test is based on the computation of Groebner
+ bases with degree bound::
+
+ sage: I.groebner_basis(degbound=4)
+- Twosided Ideal (y*z*y*y - y*z*y*z + y*z*z*y - y*z*z*z, y*z*y*x + y*z*y*z + y*z*z*x + y*z*z*z, y*y*z*y - y*y*z*z + y*z*z*y - y*z*z*z, y*y*z*x + y*y*z*z + y*z*z*x + y*z*z*z, y*y*y - y*y*z + y*z*y - y*z*z, y*y*x + y*y*z + y*z*x + y*z*z, x*y + y*z, x*x - y*x - y*y - y*z) of Free Associative Unital Algebra on 3 generators (x, y, z) over Rational Field
++ Twosided Ideal (x*y + y*z,
++ x*x - y*x - y*y - y*z,
++ y*y*y - y*y*z + y*z*y - y*z*z,
++ y*y*x + y*y*z + y*z*x + y*z*z,
++ y*y*z*y - y*y*z*z + y*z*z*y - y*z*z*z,
++ y*z*y*y - y*z*y*z + y*z*z*y - y*z*z*z,
++ y*y*z*x + y*y*z*z + y*z*z*x + y*z*z*z,
++ y*z*y*x + y*z*y*z + y*z*z*x + y*z*z*z) of Free Associative Unital
++ Algebra on 3 generators (x, y, z) over Rational Field
+
+ When reducing an element by `I`, the original generators are chosen::
+
+@@ -67,7 +75,13 @@ different normal form::
+ Lexicographic term order
+ sage: J = L*[a*b+b*c,a^2+a*b-b*c-c^2]*L
+ sage: J.groebner_basis(4)
+- Twosided Ideal (2*b*c*b - b*c*c + c*c*b, a*c*c - 2*b*c*a - 2*b*c*c - c*c*a, a*b + b*c, a*a - 2*b*c - c*c) of Free Associative Unital Algebra on 3 generators (a, b, c) over Rational Field
++ Twosided Ideal (2*b*c*b - b*c*c + c*c*b,
++ a*b + b*c,
++ -a*c*c + 2*b*c*a + 2*b*c*c + c*c*a,
++ a*c*c*b - 2*b*c*c*b + b*c*c*c,
++ a*a - 2*b*c - c*c,
++ a*c*c*a - 2*b*c*c*a - 4*b*c*c*c - c*c*c*c) of Free Associative Unital
++ Algebra on 3 generators (a, b, c) over Rational Field
+ sage: (b*c*b*b).normal_form(J)
+ 1/2*b*c*c*b - 1/2*c*c*b*b
+
+@@ -105,15 +119,16 @@ TESTS::
+ from sage.misc.misc_c import prod
+ from sage.rings.polynomial.polynomial_ring_constructor import PolynomialRing
+ from sage.libs.singular.function import lib, singular_function
+-from sage.rings.polynomial.term_order import TermOrder
++from sage.libs.singular.function cimport RingWrap
++from sage.libs.singular.ring cimport singular_ring_delete, singular_ring_reference
+ from sage.categories.algebras import Algebras
+ from sage.rings.noncommutative_ideals import IdealMonoid_nc
++from sage.rings.polynomial.plural cimport new_CRing
+
+ #####################
# Define some singular functions
lib("freegb.lib")
- poly_reduce = singular_function("NF")
+-poly_reduce = singular_function("NF")
-singular_system=singular_function("system")
++freeAlgebra = singular_function("freeAlgebra")
# unfortunately we can not set Singular attributes for MPolynomialRing_libsingular
# Hence, we must constantly work around Letterplace's sanity checks,
-@@ -683,7 +682,7 @@ cdef class FreeAlgebra_letterplace(Algebra):
+@@ -242,7 +257,7 @@ cdef class FreeAlgebra_letterplace(Algebra):
+ sage: F.<a,b,c> = FreeAlgebra(K, implementation='letterplace')
+ sage: TestSuite(F).run()
+ """
+- if not isinstance(R,MPolynomialRing_libsingular):
++ if not isinstance(R, MPolynomialRing_libsingular):
+ raise TypeError("A letterplace algebra must be provided by a polynomial ring of type %s" % MPolynomialRing_libsingular)
+ self.__ngens = R.ngens()
+ if degrees is None:
+@@ -260,7 +275,9 @@ cdef class FreeAlgebra_letterplace(Algebra):
+ if degrees is None:
+ self._degrees = tuple([int(1)]*self.__ngens)
+ else:
+- if (not isinstance(degrees,(tuple,list))) or len(degrees)!=self.__ngens-1 or any(i <= 0 for i in degrees):
++ if (not isinstance(degrees, (tuple, list))) \
++ or len(degrees) != self.__ngens - self._nb_slackvars \
++ or any(i <= 0 for i in degrees):
+ raise TypeError("The generator degrees must be given by a list or tuple of %d positive integers" % (self.__ngens-1))
+ self._degrees = tuple([int(i) for i in degrees])
+ self.set_degbound(max(self._degrees))
+@@ -666,7 +683,7 @@ cdef class FreeAlgebra_letterplace(Algebra):
+ Sage, since it does the reductions in a different order
+ compared to Singular. Therefore, we call the original Singular
+ reduction method, and prevent a warning message by asserting
+- that `G` is a Groebner basis.
++ that `G` is a Groebner basis. ::
+
+ sage: from sage.libs.singular.function import singular_function
+ sage: poly_reduce = singular_function("NF")
+@@ -683,7 +700,7 @@ cdef class FreeAlgebra_letterplace(Algebra):
degbound = self._degbound
cdef list G = [C(x._poly) for x in g]
for y in G:
- out.extend([y]+[singular_system("stest",y,n+1,degbound,ngens,ring=C) for n in xrange(d-y.degree())])
-+ out.extend([y]+[y.shift(ngens*(n+1)) for n in xrange(d-y.degree())])
++ out.extend([y]+[y._cycle(ngens*(n+1)) for n in xrange(d-y.degree())])
return C.ideal(out)
###########################
+@@ -879,3 +896,28 @@ cdef class FreeAlgebra_letterplace(Algebra):
+ PNames[P.ngens(): len(PNames): P.ngens()+1] = list(Names[self.ngens(): len(Names): self.ngens()+1])[:P.degbound()]
+ x = Ppoly.hom([Gens[Names.index(asdf)] for asdf in PNames])(x.letterplace_polynomial())
+ return FreeAlgebraElement_letterplace(self,self._current_ring(x))
++
++cdef class FreeAlgebra_letterplace_libsingular():
++ """
++ Internally used wrapper around a Singular Letterplace polynomial ring.
++ """
++
++ def __cinit__(self, MPolynomialRing_libsingular commutative_ring,
++ int degbound):
++ cdef RingWrap rw = freeAlgebra(commutative_ring, degbound)
++ self._lp_ring = singular_ring_reference(rw._ring)
++ # `_lp_ring` viewed as `MPolynomialRing_libsingular` with additional
++ # letterplace attributes set (for internal use only)
++ self._lp_ring_internal = new_CRing(rw, commutative_ring.base_ring())
++ self._commutative_ring = commutative_ring
++
++ def __init__(self, commutative_ring, degbound):
++ self.__ngens = commutative_ring.ngens() * degbound
++
++ def __dealloc__(self):
++ r"""
++ Carefully deallocate the ring, without changing ``currRing``
++ (since this method can be at unpredictable times due to garbage
++ collection).
++ """
++ singular_ring_delete(self._lp_ring)
diff --git a/src/sage/algebras/letterplace/letterplace_ideal.pyx b/src/sage/algebras/letterplace/letterplace_ideal.pyx
-index 5776c58cf7..52d3477bf6 100644
+index 5776c58..e73663b 100644
--- a/src/sage/algebras/letterplace/letterplace_ideal.pyx
+++ b/src/sage/algebras/letterplace/letterplace_ideal.pyx
-@@ -48,7 +48,7 @@ from sage.rings.infinity import Infinity
+@@ -27,7 +27,11 @@ One can compute Groebner bases out to a finite degree, can compute normal
+ forms and can test containment in the ideal::
+
+ sage: I.groebner_basis(degbound=3)
+- Twosided Ideal (y*y*y - y*y*z + y*z*y - y*z*z, y*y*x + y*y*z + y*z*x + y*z*z, x*y + y*z, x*x - y*x - y*y - y*z) of Free Associative Unital Algebra on 3 generators (x, y, z) over Rational Field
++ Twosided Ideal (x*y + y*z,
++ x*x - y*x - y*y - y*z,
++ y*y*y - y*y*z + y*z*y - y*z*z,
++ y*y*x + y*y*z + y*z*x + y*z*z) of Free Associative Unital Algebra
++ on 3 generators (x, y, z) over Rational Field
+ sage: (x*y*z*y*x).normal_form(I)
+ y*z*z*y*z + y*z*z*z*x + y*z*z*z*z
+ sage: x*y*z*y*x - (x*y*z*y*x).normal_form(I) in I
+@@ -41,14 +45,14 @@ AUTHOR:
+
+ from sage.rings.noncommutative_ideals import Ideal_nc
+ from sage.libs.singular.function import lib, singular_function
+-from sage.algebras.letterplace.free_algebra_letterplace cimport FreeAlgebra_letterplace
++from sage.algebras.letterplace.free_algebra_letterplace cimport FreeAlgebra_letterplace, FreeAlgebra_letterplace_libsingular
+ from sage.algebras.letterplace.free_algebra_element_letterplace cimport FreeAlgebraElement_letterplace
+ from sage.rings.infinity import Infinity
+
#####################
# Define some singular functions
lib("freegb.lib")
@@ -82,101 +283,129 @@ index 5776c58cf7..52d3477bf6 100644
poly_reduce=singular_function("NF")
class LetterplaceIdeal(Ideal_nc):
-@@ -276,8 +276,7 @@ class LetterplaceIdeal(Ideal_nc):
+@@ -68,14 +72,22 @@ class LetterplaceIdeal(Ideal_nc):
+ sage: I.groebner_basis(2)
+ Twosided Ideal (x*y + y*z, x*x - y*x - y*y - y*z) of Free Associative Unital Algebra on 3 generators (x, y, z) over Rational Field
+ sage: I.groebner_basis(4)
+- Twosided Ideal (y*z*y*y - y*z*y*z + y*z*z*y - y*z*z*z, y*z*y*x + y*z*y*z + y*z*z*x + y*z*z*z, y*y*z*y - y*y*z*z + y*z*z*y - y*z*z*z, y*y*z*x + y*y*z*z + y*z*z*x + y*z*z*z, y*y*y - y*y*z + y*z*y - y*z*z, y*y*x + y*y*z + y*z*x + y*z*z, x*y + y*z, x*x - y*x - y*y - y*z) of Free Associative Unital Algebra on 3 generators (x, y, z) over Rational Field
++ Twosided Ideal (x*y + y*z,
++ x*x - y*x - y*y - y*z,
++ y*y*y - y*y*z + y*z*y - y*z*z,
++ y*y*x + y*y*z + y*z*x + y*z*z,
++ y*y*z*y - y*y*z*z + y*z*z*y - y*z*z*z,
++ y*z*y*y - y*z*y*z + y*z*z*y - y*z*z*z,
++ y*y*z*x + y*y*z*z + y*z*z*x + y*z*z*z,
++ y*z*y*x + y*z*y*z + y*z*z*x + y*z*z*z) of Free Associative Unital
++ Algebra on 3 generators (x, y, z) over Rational Field
+
+ Groebner bases are cached. If one has computed a Groebner basis
+ out to a high degree then it will also be returned if a Groebner
+ basis with a lower degree bound is requested::
+
+- sage: I.groebner_basis(2)
+- Twosided Ideal (y*z*y*y - y*z*y*z + y*z*z*y - y*z*z*z, y*z*y*x + y*z*y*z + y*z*z*x + y*z*z*z, y*y*z*y - y*y*z*z + y*z*z*y - y*z*z*z, y*y*z*x + y*y*z*z + y*z*z*x + y*z*z*z, y*y*y - y*y*z + y*z*y - y*z*z, y*y*x + y*y*z + y*z*x + y*z*z, x*y + y*z, x*x - y*x - y*y - y*z) of Free Associative Unital Algebra on 3 generators (x, y, z) over Rational Field
++ sage: I.groebner_basis(2) is I.groebner_basis(4)
++ True
+
+ Of course, the normal form of any element has to satisfy the following::
+
+@@ -115,8 +127,11 @@ class LetterplaceIdeal(Ideal_nc):
+ sage: F.<x,y,z> = FreeAlgebra(QQ, implementation='letterplace',degrees=[1,2,3])
+ sage: I = F*[x*y+z-y*x,x*y*z-x^6+y^3]*F
+ sage: I.groebner_basis(Infinity)
+- Twosided Ideal (x*z*z - y*x*x*z - y*x*y*y + y*x*z*x + y*y*y*x + z*x*z + z*y*y - z*z*x,
+- x*y - y*x + z,
++ Twosided Ideal (x*y - y*x + z,
++ x*x*x*x*x*x - y*x*z - y*y*y + z*z,
++ x*z*z - y*x*x*z + y*x*z*x + y*y*z + y*z*y + z*x*z + z*y*y - z*z*x,
++ x*x*x*x*x*z + x*x*x*x*z*x + x*x*x*z*x*x + x*x*z*x*x*x + x*z*x*x*x*x +
++ y*x*z*y - y*y*x*z + y*z*z + z*x*x*x*x*x - z*z*y,
+ x*x*x*x*z*y*y + x*x*x*z*y*y*x - x*x*x*z*y*z - x*x*z*y*x*z + x*x*z*y*y*x*x +
+ x*x*z*y*y*y - x*x*z*y*z*x - x*z*y*x*x*z - x*z*y*x*z*x +
+ x*z*y*y*x*x*x + 2*x*z*y*y*y*x - 2*x*z*y*y*z - x*z*y*z*x*x -
+@@ -134,10 +149,7 @@ class LetterplaceIdeal(Ideal_nc):
+ z*y*y*y*y - 3*z*y*y*z*x - z*y*z*x*x*x - 2*z*y*z*y*x +
+ 2*z*y*z*z - z*z*x*x*x*x*x + 4*z*z*x*x*z + 4*z*z*x*z*x -
+ 4*z*z*y*x*x*x - 3*z*z*y*y*x + 4*z*z*y*z + 4*z*z*z*x*x +
+- 2*z*z*z*y,
+- x*x*x*x*x*z + x*x*x*x*z*x + x*x*x*z*x*x + x*x*z*x*x*x + x*z*x*x*x*x +
+- y*x*z*y - y*y*x*z + y*z*z + z*x*x*x*x*x - z*z*y,
+- x*x*x*x*x*x - y*x*z - y*y*y + z*z)
++ 2*z*z*z*y)
+ of Free Associative Unital Algebra on 3 generators (x, y, z) over Rational Field
+
+ Again, we can compute normal forms::
+@@ -225,7 +237,15 @@ class LetterplaceIdeal(Ideal_nc):
+ sage: I.groebner_basis() # not tested
+ Twosided Ideal (y*y*y - y*y*z + y*z*y - y*z*z, y*y*x + y*y*z + y*z*x + y*z*z, x*y + y*z, x*x - y*x - y*y - y*z) of Free Associative Unital Algebra on 3 generators (x, y, z) over Rational Field
+ sage: I.groebner_basis(4)
+- Twosided Ideal (y*z*y*y - y*z*y*z + y*z*z*y - y*z*z*z, y*z*y*x + y*z*y*z + y*z*z*x + y*z*z*z, y*y*z*y - y*y*z*z + y*z*z*y - y*z*z*z, y*y*z*x + y*y*z*z + y*z*z*x + y*z*z*z, y*y*y - y*y*z + y*z*y - y*z*z, y*y*x + y*y*z + y*z*x + y*z*z, x*y + y*z, x*x - y*x - y*y - y*z) of Free Associative Unital Algebra on 3 generators (x, y, z) over Rational Field
++ Twosided Ideal (x*y + y*z,
++ x*x - y*x - y*y - y*z,
++ y*y*y - y*y*z + y*z*y - y*z*z,
++ y*y*x + y*y*z + y*z*x + y*z*z,
++ y*y*z*y - y*y*z*z + y*z*z*y - y*z*z*z,
++ y*z*y*y - y*z*y*z + y*z*z*y - y*z*z*z,
++ y*y*z*x + y*y*z*z + y*z*z*x + y*z*z*z,
++ y*z*y*x + y*z*y*z + y*z*z*x + y*z*z*z) of Free Associative
++ Unital Algebra on 3 generators (x, y, z) over Rational Field
+ sage: I.groebner_basis(2) is I.groebner_basis(4)
+ True
+ sage: G = I.groebner_basis(4)
+@@ -237,7 +257,14 @@ class LetterplaceIdeal(Ideal_nc):
+
+ sage: I = F*[x*y-y*x,x*z-z*x,y*z-z*y,x^2*y-z^3,x*y^2+z*x^2]*F
+ sage: I.groebner_basis(Infinity)
+- Twosided Ideal (z*z*z*y*y + z*z*z*z*x, z*x*x*x + z*z*z*y, y*z - z*y, y*y*x + z*x*x, y*x*x - z*z*z, x*z - z*x, x*y - y*x) of Free Associative Unital Algebra on 3 generators (x, y, z) over Rational Field
++ Twosided Ideal (-y*z + z*y,
++ -x*z + z*x,
++ -x*y + y*x,
++ x*x*z + x*y*y,
++ x*x*y - z*z*z,
++ x*x*x*z + y*z*z*z,
++ x*z*z*z*z + y*y*z*z*z) of Free Associative Unital Algebra
++ on 3 generators (x, y, z) over Rational Field
+
+ Since the commutators of the generators are contained in the ideal,
+ we can verify the above result by a computation in a polynomial ring
+@@ -275,9 +302,32 @@ class LetterplaceIdeal(Ideal_nc):
+ libsingular_options['redSB'] = True
A.set_degbound(degbound)
P = A._current_ring
- out = [FreeAlgebraElement_letterplace(A,X,check=False) for X in
+- out = [FreeAlgebraElement_letterplace(A,X,check=False) for X in
- singular_system("freegb",P.ideal([x._poly for x in self.__GB.gens()]),
- degbound,A.__ngens, ring = P)]
-+ singular_twostd(P.ideal([x._poly for x in self.__GB.gens()]), ring = P)]
++
++ # note that degbound might be smaller than A._degbound due to caching,
++ # but degbound must be large enough to map all generators to the
++ # letterplace ring L
++ if degbound < A._degbound:
++ max_deg = max([x._poly.degree() for x in self.__GB.gens()])
++ if degbound < max_deg:
++ degbound = max_deg
++
++ # The following is a workaround for calling Singular's new Letterplace
++ # API (see :trac:`25993`). We construct a temporary polynomial ring L
++ # with letterplace attributes set as required by the API. As L has
++ # duplicate variable names, we need to handle this ring carefully; in
++ # particular, we cannot coerce to and from L, so we use homomorphisms
++ # for the conversion.
++
++ cdef FreeAlgebra_letterplace_libsingular lp_ring = \
++ FreeAlgebra_letterplace_libsingular(A._commutative_ring, degbound)
++ L = lp_ring._lp_ring_internal
++ to_L = P.hom(L.gens(), L, check=False)
++ from_L = L.hom(P.gens(), P, check=False)
++ I = L.ideal([to_L(x._poly) for x in self.__GB.gens()])
++ gb = singular_twostd(I)
++ out = [FreeAlgebraElement_letterplace(A, from_L(X), check=False)
++ for X in gb]
++
libsingular_options['redTail'] = bck[0]
libsingular_options['redSB'] = bck[1]
self.__GB = A.ideal(out,side='twosided',coerce=False)
-diff --git a/src/sage/combinat/root_system/hecke_algebra_representation.py b/src/sage/combinat/root_system/hecke_algebra_representation.py
-index 6498afbeaa..b1ad7ea6fa 100644
---- a/src/sage/combinat/root_system/hecke_algebra_representation.py
-+++ b/src/sage/combinat/root_system/hecke_algebra_representation.py
-@@ -745,7 +745,7 @@ class HeckeAlgebraRepresentation(WithEqualityById, SageObject):
- -2121 + 212,
- (q2/(q1-q2))*2121 + (q2/(-q1+q2))*121 + (q2/(-q1+q2))*212 - 12 + ((-q2)/(-q1+q2))*21 + 2,
- ((-q2^2)/(-q1^2+q1*q2-q2^2))*2121 - 121 + (q2^2/(-q1^2+q1*q2-q2^2))*212 + 21,
-- ((q1^2+q2^2)/(-q1^2+q1*q2-q2^2))*2121 + ((-q1^2-q2^2)/(-q1^2+q1*q2-q2^2))*121 + ((-q2^2)/(-q1^2+q1*q2-q2^2))*212 + (q2^2/(-q1^2+q1*q2-q2^2))*12 - 21 + 1,
-+ ((-q1^2-q2^2)/(q1^2-q1*q2+q2^2))*2121 + ((-q1^2-q2^2)/(-q1^2+q1*q2-q2^2))*121 + ((-q2^2)/(-q1^2+q1*q2-q2^2))*212 + (q2^2/(-q1^2+q1*q2-q2^2))*12 - 21 + 1,
- 2121,
- (q2/(-q1+q2))*2121 + ((-q2)/(-q1+q2))*121 - 212 + 12,
- -2121 + 121]
-diff --git a/src/sage/combinat/root_system/non_symmetric_macdonald_polynomials.py b/src/sage/combinat/root_system/non_symmetric_macdonald_polynomials.py
-index 3ae5effddb..898a1fe636 100644
---- a/src/sage/combinat/root_system/non_symmetric_macdonald_polynomials.py
-+++ b/src/sage/combinat/root_system/non_symmetric_macdonald_polynomials.py
-@@ -555,8 +555,7 @@ class NonSymmetricMacdonaldPolynomials(CherednikOperatorsEigenvectors):
- B[(1, 0, 0)]
-
- sage: E[-omega[1]]
-- B[(-1, 0, 0)] + ((-q*q1^6-q*q1^5*q2-q1*q2^5-q2^6)/(-q^3*q1^6-q^2*q1^5*q2-q*q1*q2^5-q2^6))*B[(1, 0, 0)] + ((-q1-q2)/(-q*q1-q2))*B[(0, -1, 0)]
-- + ((q1+q2)/(q*q1+q2))*B[(0, 1, 0)] + ((-q1-q2)/(-q*q1-q2))*B[(0, 0, -1)] + ((-q1-q2)/(-q*q1-q2))*B[(0, 0, 1)]
-+ B[(-1, 0, 0)] + ((q*q1^6+q*q1^5*q2+q1*q2^5+q2^6)/(q^3*q1^6+q^2*q1^5*q2+q*q1*q2^5+q2^6))*B[(1, 0, 0)] + ((q1+q2)/(q*q1+q2))*B[(0, -1, 0)] + ((q1+q2)/(q*q1+q2))*B[(0, 1, 0)] + ((q1+q2)/(q*q1+q2))*B[(0, 0, -1)] + ((q1+q2)/(q*q1+q2))*B[(0, 0, 1)]
-
- sage: E[omega[2]]
- ((-q1*q2^3-q2^4)/(q*q1^4-q2^4))*B[(1, 0, 0)] + B[(0, 1, 0)]
-@@ -567,14 +566,7 @@ class NonSymmetricMacdonaldPolynomials(CherednikOperatorsEigenvectors):
- + ((-q1*q2-q2^2)/(q*q1^2-q2^2))*B[(0, 0, -1)] + ((q1*q2+q2^2)/(-q*q1^2+q2^2))*B[(0, 0, 1)]
-
- sage: E[-omega[1]-omega[2]]
-- ((-q^3*q1^6-q^3*q1^5*q2-2*q^2*q1^6-3*q^2*q1^5*q2+q^2*q1^4*q2^2+2*q^2*q1^3*q2^3+q*q1^5*q2+2*q*q1^4*q2^2-q*q1^3*q2^3-2*q*q1^2*q2^4+q*q1*q2^5+q*q2^6-q1^3*q2^3-q1^2*q2^4+2*q1*q2^5+2*q2^6)/(-q^4*q1^6-q^3*q1^5*q2+q^3*q1^4*q2^2-q*q1^2*q2^4+q*q1*q2^5+q2^6))*B[(0, 0, 0)] + B[(-1, -1, 0)]
-- + ((q*q1^4+q*q1^3*q2+q1*q2^3+q2^4)/(q^3*q1^4+q^2*q1^3*q2+q*q1*q2^3+q2^4))*B[(-1, 1, 0)] + ((q1+q2)/(q*q1+q2))*B[(-1, 0, -1)] + ((-q1-q2)/(-q*q1-q2))*B[(-1, 0, 1)]
-- + ((q*q1^4+q*q1^3*q2+q1*q2^3+q2^4)/(q^3*q1^4+q^2*q1^3*q2+q*q1*q2^3+q2^4))*B[(1, -1, 0)]
-- + ((-q^2*q1^6-q^2*q1^5*q2-q*q1^5*q2+q*q1^3*q2^3+q1^5*q2+q1^4*q2^2-q1^3*q2^3-q1^2*q2^4+q1*q2^5+q2^6)/(-q^4*q1^6-q^3*q1^5*q2+q^3*q1^4*q2^2-q*q1^2*q2^4+q*q1*q2^5+q2^6))*B[(1, 1, 0)]
-- + ((-q*q1^4-2*q*q1^3*q2-q*q1^2*q2^2+q1^3*q2+q1^2*q2^2-q1*q2^3-q2^4)/(-q^3*q1^4-q^2*q1^3*q2-q*q1*q2^3-q2^4))*B[(1, 0, -1)]
-- + ((-q*q1^4-2*q*q1^3*q2-q*q1^2*q2^2+q1^3*q2+q1^2*q2^2-q1*q2^3-q2^4)/(-q^3*q1^4-q^2*q1^3*q2-q*q1*q2^3-q2^4))*B[(1, 0, 1)] + ((q1+q2)/(q*q1+q2))*B[(0, -1, -1)]
-- + ((-q1-q2)/(-q*q1-q2))*B[(0, -1, 1)] + ((q*q1^4+2*q*q1^3*q2+q*q1^2*q2^2-q1^3*q2-q1^2*q2^2+q1*q2^3+q2^4)/(q^3*q1^4+q^2*q1^3*q2+q*q1*q2^3+q2^4))*B[(0, 1, -1)]
-- + ((q*q1^4+2*q*q1^3*q2+q*q1^2*q2^2-q1^3*q2-q1^2*q2^2+q1*q2^3+q2^4)/(q^3*q1^4+q^2*q1^3*q2+q*q1*q2^3+q2^4))*B[(0, 1, 1)]
-+ ((q^3*q1^6+q^3*q1^5*q2+2*q^2*q1^6+3*q^2*q1^5*q2-q^2*q1^4*q2^2-2*q^2*q1^3*q2^3-q*q1^5*q2-2*q*q1^4*q2^2+q*q1^3*q2^3+2*q*q1^2*q2^4-q*q1*q2^5-q*q2^6+q1^3*q2^3+q1^2*q2^4-2*q1*q2^5-2*q2^6)/(q^4*q1^6+q^3*q1^5*q2-q^3*q1^4*q2^2+q*q1^2*q2^4-q*q1*q2^5-q2^6))*B[(0, 0, 0)] + B[(-1, -1, 0)] + ((q*q1^4+q*q1^3*q2+q1*q2^3+q2^4)/(q^3*q1^4+q^2*q1^3*q2+q*q1*q2^3+q2^4))*B[(-1, 1, 0)] + ((q1+q2)/(q*q1+q2))*B[(-1, 0, -1)] + ((-q1-q2)/(-q*q1-q2))*B[(-1, 0, 1)] + ((q*q1^4+q*q1^3*q2+q1*q2^3+q2^4)/(q^3*q1^4+q^2*q1^3*q2+q*q1*q2^3+q2^4))*B[(1, -1, 0)] + ((q^2*q1^6+q^2*q1^5*q2+q*q1^5*q2-q*q1^3*q2^3-q1^5*q2-q1^4*q2^2+q1^3*q2^3+q1^2*q2^4-q1*q2^5-q2^6)/(q^4*q1^6+q^3*q1^5*q2-q^3*q1^4*q2^2+q*q1^2*q2^4-q*q1*q2^5-q2^6))*B[(1, 1, 0)] + ((q*q1^4+2*q*q1^3*q2+q*q1^2*q2^2-q1^3*q2-q1^2*q2^2+q1*q2^3+q2^4)/(q^3*q1^4+q^2*q1^3*q2+q*q1*q2^3+q2^4))*B[(1, 0, -1)] + ((q*q1^4+2*q*q1^3*q2+q*q1^2*q2^2-q1^3*q2-q1^2*q2^2+q1*q2^3+q2^4)/(q^3*q1^4+q^2*q1^3*q2+q*q1*q2^3+q2^4))*B[(1, 0, 1)] + ((q1+q2)/(q*q1+q2))*B[(0, -1, -1)] + ((q1+q2)/(q*q1+q2))*B[(0, -1, 1)] + ((q*q1^4+2*q*q1^3*q2+q*q1^2*q2^2-q1^3*q2-q1^2*q2^2+q1*q2^3+q2^4)/(q^3*q1^4+q^2*q1^3*q2+q*q1*q2^3+q2^4))*B[(0, 1, -1)] + ((q*q1^4+2*q*q1^3*q2+q*q1^2*q2^2-q1^3*q2-q1^2*q2^2+q1*q2^3+q2^4)/(q^3*q1^4+q^2*q1^3*q2+q*q1*q2^3+q2^4))*B[(0, 1, 1)]
-
- sage: E[omega[1]-omega[2]]
- ((q^3*q1^7+q^3*q1^6*q2-q*q1*q2^6-q*q2^7)/(q^3*q1^7-q^2*q1^5*q2^2+q*q1^2*q2^5-q2^7))*B[(0, 0, 0)] + B[(1, -1, 0)]
-@@ -812,7 +804,7 @@ class NonSymmetricMacdonaldPolynomials(CherednikOperatorsEigenvectors):
- ((-q*q1*q2^3-q*q2^4)/(q^2*q1^4-q2^4))*B[(0, 0)] + B[(1, 0)]
-
- sage: E[2*omega[2]] # long time # not checked against Bogdan's notes, but a good self-consistency test
-- ((-q^12*q1^6-q^12*q1^5*q2+2*q^10*q1^5*q2+5*q^10*q1^4*q2^2+3*q^10*q1^3*q2^3+2*q^8*q1^5*q2+4*q^8*q1^4*q2^2+q^8*q1^3*q2^3-q^8*q1^2*q2^4+q^8*q1*q2^5+q^8*q2^6-q^6*q1^3*q2^3+q^6*q1^2*q2^4+4*q^6*q1*q2^5+2*q^6*q2^6+q^4*q1^3*q2^3+3*q^4*q1^2*q2^4+4*q^4*q1*q2^5+2*q^4*q2^6)/(-q^12*q1^6-q^10*q1^5*q2-q^8*q1^3*q2^3+q^6*q1^4*q2^2-q^6*q1^2*q2^4+q^4*q1^3*q2^3+q^2*q1*q2^5+q2^6))*B[(0, 0)] + ((q^7*q1^2*q2+2*q^7*q1*q2^2+q^7*q2^3+q^5*q1^2*q2+2*q^5*q1*q2^2+q^5*q2^3)/(-q^8*q1^3-q^6*q1^2*q2+q^2*q1*q2^2+q2^3))*B[(-1, 0)] + ((q^6*q1*q2+q^6*q2^2)/(-q^6*q1^2+q2^2))*B[(-1, -1)] + ((q^6*q1^2*q2+2*q^6*q1*q2^2+q^6*q2^3+q^4*q1^2*q2+2*q^4*q1*q2^2+q^4*q2^3)/(-q^8*q1^3-q^6*q1^2*q2+q^2*q1*q2^2+q2^3))*B[(-1, 1)] + ((q^3*q1*q2+q^3*q2^2)/(-q^6*q1^2+q2^2))*B[(-1, 2)] + ((-q^7*q1^3-q^7*q1^2*q2+q^7*q1*q2^2+q^7*q2^3+2*q^5*q1^2*q2+4*q^5*q1*q2^2+2*q^5*q2^3+2*q^3*q1^2*q2+4*q^3*q1*q2^2+2*q^3*q2^3)/(-q^8*q1^3-q^6*q1^2*q2+q^2*q1*q2^2+q2^3))*B[(1, 0)] + ((-q^6*q1^2*q2-2*q^6*q1*q2^2-q^6*q2^3-q^4*q1^2*q2-2*q^4*q1*q2^2-q^4*q2^3)/(q^8*q1^3+q^6*q1^2*q2-q^2*q1*q2^2-q2^3))*B[(1, -1)] + ((q^8*q1^3+q^8*q1^2*q2+q^6*q1^3+q^6*q1^2*q2-q^6*q1*q2^2-q^6*q2^3-2*q^4*q1^2*q2-4*q^4*q1*q2^2-2*q^4*q2^3-q^2*q1^2*q2-3*q^2*q1*q2^2-2*q^2*q2^3)/(q^8*q1^3+q^6*q1^2*q2-q^2*q1*q2^2-q2^3))*B[(1, 1)] + ((-q^5*q1^2-q^5*q1*q2+q^3*q1*q2+q^3*q2^2+q*q1*q2+q*q2^2)/(-q^6*q1^2+q2^2))*B[(1, 2)] + ((-q^6*q1^2-q^6*q1*q2+q^4*q1*q2+q^4*q2^2+q^2*q1*q2+q^2*q2^2)/(-q^6*q1^2+q2^2))*B[(2, 0)] + ((q^3*q1*q2+q^3*q2^2)/(-q^6*q1^2+q2^2))*B[(2, -1)] + ((-q^5*q1^2-q^5*q1*q2+q^3*q1*q2+q^3*q2^2+q*q1*q2+q*q2^2)/(-q^6*q1^2+q2^2))*B[(2, 1)] + B[(2, 2)] + ((-q^7*q1^2*q2-2*q^7*q1*q2^2-q^7*q2^3-q^5*q1^2*q2-2*q^5*q1*q2^2-q^5*q2^3)/(q^8*q1^3+q^6*q1^2*q2-q^2*q1*q2^2-q2^3))*B[(0, -1)] + ((q^7*q1^3+q^7*q1^2*q2-q^7*q1*q2^2-q^7*q2^3-2*q^5*q1^2*q2-4*q^5*q1*q2^2-2*q^5*q2^3-2*q^3*q1^2*q2-4*q^3*q1*q2^2-2*q^3*q2^3)/(q^8*q1^3+q^6*q1^2*q2-q^2*q1*q2^2-q2^3))*B[(0, 1)] + ((-q^6*q1^2-q^6*q1*q2+q^4*q1*q2+q^4*q2^2+q^2*q1*q2+q^2*q2^2)/(-q^6*q1^2+q2^2))*B[(0, 2)]
-+ ((-q^12*q1^6-q^12*q1^5*q2+2*q^10*q1^5*q2+5*q^10*q1^4*q2^2+3*q^10*q1^3*q2^3+2*q^8*q1^5*q2+4*q^8*q1^4*q2^2+q^8*q1^3*q2^3-q^8*q1^2*q2^4+q^8*q1*q2^5+q^8*q2^6-q^6*q1^3*q2^3+q^6*q1^2*q2^4+4*q^6*q1*q2^5+2*q^6*q2^6+q^4*q1^3*q2^3+3*q^4*q1^2*q2^4+4*q^4*q1*q2^5+2*q^4*q2^6)/(-q^12*q1^6-q^10*q1^5*q2-q^8*q1^3*q2^3+q^6*q1^4*q2^2-q^6*q1^2*q2^4+q^4*q1^3*q2^3+q^2*q1*q2^5+q2^6))*B[(0, 0)] + ((q^7*q1^2*q2+2*q^7*q1*q2^2+q^7*q2^3+q^5*q1^2*q2+2*q^5*q1*q2^2+q^5*q2^3)/(-q^8*q1^3-q^6*q1^2*q2+q^2*q1*q2^2+q2^3))*B[(-1, 0)] + ((-q^6*q1*q2-q^6*q2^2)/(q^6*q1^2-q2^2))*B[(-1, -1)] + ((q^6*q1^2*q2+2*q^6*q1*q2^2+q^6*q2^3+q^4*q1^2*q2+2*q^4*q1*q2^2+q^4*q2^3)/(-q^8*q1^3-q^6*q1^2*q2+q^2*q1*q2^2+q2^3))*B[(-1, 1)] + ((-q^3*q1*q2-q^3*q2^2)/(q^6*q1^2-q2^2))*B[(-1, 2)] + ((q^7*q1^3+q^7*q1^2*q2-q^7*q1*q2^2-q^7*q2^3-2*q^5*q1^2*q2-4*q^5*q1*q2^2-2*q^5*q2^3-2*q^3*q1^2*q2-4*q^3*q1*q2^2-2*q^3*q2^3)/(q^8*q1^3+q^6*q1^2*q2-q^2*q1*q2^2-q2^3))*B[(1, 0)] + ((q^6*q1^2*q2+2*q^6*q1*q2^2+q^6*q2^3+q^4*q1^2*q2+2*q^4*q1*q2^2+q^4*q2^3)/(-q^8*q1^3-q^6*q1^2*q2+q^2*q1*q2^2+q2^3))*B[(1, -1)] + ((q^8*q1^3+q^8*q1^2*q2+q^6*q1^3+q^6*q1^2*q2-q^6*q1*q2^2-q^6*q2^3-2*q^4*q1^2*q2-4*q^4*q1*q2^2-2*q^4*q2^3-q^2*q1^2*q2-3*q^2*q1*q2^2-2*q^2*q2^3)/(q^8*q1^3+q^6*q1^2*q2-q^2*q1*q2^2-q2^3))*B[(1, 1)] + ((q^5*q1^2+q^5*q1*q2-q^3*q1*q2-q^3*q2^2-q*q1*q2-q*q2^2)/(q^6*q1^2-q2^2))*B[(1, 2)] + ((-q^6*q1^2-q^6*q1*q2+q^4*q1*q2+q^4*q2^2+q^2*q1*q2+q^2*q2^2)/(-q^6*q1^2+q2^2))*B[(2, 0)] + ((-q^3*q1*q2-q^3*q2^2)/(q^6*q1^2-q2^2))*B[(2, -1)] + ((-q^5*q1^2-q^5*q1*q2+q^3*q1*q2+q^3*q2^2+q*q1*q2+q*q2^2)/(-q^6*q1^2+q2^2))*B[(2, 1)] + B[(2, 2)] + ((q^7*q1^2*q2+2*q^7*q1*q2^2+q^7*q2^3+q^5*q1^2*q2+2*q^5*q1*q2^2+q^5*q2^3)/(-q^8*q1^3-q^6*q1^2*q2+q^2*q1*q2^2+q2^3))*B[(0, -1)] + ((q^7*q1^3+q^7*q1^2*q2-q^7*q1*q2^2-q^7*q2^3-2*q^5*q1^2*q2-4*q^5*q1*q2^2-2*q^5*q2^3-2*q^3*q1^2*q2-4*q^3*q1*q2^2-2*q^3*q2^3)/(q^8*q1^3+q^6*q1^2*q2-q^2*q1*q2^2-q2^3))*B[(0, 1)] + ((q^6*q1^2+q^6*q1*q2-q^4*q1*q2-q^4*q2^2-q^2*q1*q2-q^2*q2^2)/(q^6*q1^2-q2^2))*B[(0, 2)]
- sage: E.recursion(2*omega[2])
- [0, 1, 0, 2, 1, 0, 2, 1, 0]
-
-@@ -997,7 +989,7 @@ class NonSymmetricMacdonaldPolynomials(CherednikOperatorsEigenvectors):
- sage: L0 = E.keys()
- sage: omega = L0.fundamental_weights()
- sage: E[2*omega[2]]
-- ((q*q1+q*q2)/(q*q1+q2))*B[(1, 2, 1)] + ((q*q1+q*q2)/(q*q1+q2))*B[(2, 1, 1)] + B[(2, 2, 0)]
-+ ((-q*q1-q*q2)/(-q*q1-q2))*B[(1, 2, 1)] + ((-q*q1-q*q2)/(-q*q1-q2))*B[(2, 1, 1)] + B[(2, 2, 0)]
- sage: for d in range(4): # long time (9s)
- ....: for weight in IntegerVectors(d,3).map(list).map(L0):
- ....: eigenvalues = E.eigenvalues(E[L0(weight)])
-diff --git a/src/sage/combinat/sf/macdonald.py b/src/sage/combinat/sf/macdonald.py
-index 0d32a8dfbf..5e48f87aad 100644
---- a/src/sage/combinat/sf/macdonald.py
-+++ b/src/sage/combinat/sf/macdonald.py
-@@ -483,7 +483,7 @@ class Macdonald(UniqueRepresentation):
- sage: Ht = Sym.macdonald().Ht()
- sage: s = Sym.schur()
- sage: Ht(s([2,1]))
-- ((-q)/(-q*t^2+t^3+q^2-q*t))*McdHt[1, 1, 1] + ((q^2+q*t+t^2)/(-q^2*t^2+q^3+t^3-q*t))*McdHt[2, 1] + (t/(-q^3+q^2*t+q*t-t^2))*McdHt[3]
-+ (q/(q*t^2-t^3-q^2+q*t))*McdHt[1, 1, 1] + ((-q^2-q*t-t^2)/(q^2*t^2-q^3-t^3+q*t))*McdHt[2, 1] + (t/(-q^3+q^2*t+q*t-t^2))*McdHt[3]
- sage: Ht(s([2]))
- ((-q)/(-q+t))*McdHt[1, 1] + (t/(-q+t))*McdHt[2]
- """
-@@ -899,7 +899,7 @@ class MacdonaldPolynomials_generic(sfa.SymmetricFunctionAlgebra_generic):
- sage: Q._multiply(Q[1],Q[2])
- McdQ[2, 1] + ((q^2*t-q^2+q*t-q+t-1)/(q^2*t-1))*McdQ[3]
- sage: Ht._multiply(Ht[1],Ht[2])
-- ((-q^2+1)/(-q^2+t))*McdHt[2, 1] + ((-t+1)/(q^2-t))*McdHt[3]
-+ ((q^2-1)/(q^2-t))*McdHt[2, 1] + ((t-1)/(-q^2+t))*McdHt[3]
- """
- return self( self._s(left)*self._s(right) )
-
diff --git a/src/sage/libs/singular/function.pyx b/src/sage/libs/singular/function.pyx
-index b649ab1e64..3742260aa9 100644
+index b649ab1..3742260 100644
--- a/src/sage/libs/singular/function.pyx
+++ b/src/sage/libs/singular/function.pyx
@@ -1257,7 +1257,7 @@ cdef class SingularFunction(SageObject):
@@ -209,29 +438,53 @@ index b649ab1e64..3742260aa9 100644
The Singular function ``list`` can be called with any number of
arguments::
-diff --git a/src/sage/rings/polynomial/multi_polynomial_element.py b/src/sage/rings/polynomial/multi_polynomial_element.py
-index e5d692150c..f4027eb11e 100644
---- a/src/sage/rings/polynomial/multi_polynomial_element.py
-+++ b/src/sage/rings/polynomial/multi_polynomial_element.py
-@@ -2147,7 +2147,7 @@ def degree_lowest_rational_function(r, x):
- ::
-
- sage: r = f/g; r
-- (-b*c^2 + 2)/(a*b^3*c^6 - 2*a*c)
-+ (-2*b*c^2 - 1)/(2*a*b^3*c^6 + a*c)
- sage: degree_lowest_rational_function(r,a)
- -1
- sage: degree_lowest_rational_function(r,b)
+diff --git a/src/sage/rings/polynomial/multi_polynomial_ideal.py b/src/sage/rings/polynomial/multi_polynomial_ideal.py
+index 22f29ee..1ca1f97 100644
+--- a/src/sage/rings/polynomial/multi_polynomial_ideal.py
++++ b/src/sage/rings/polynomial/multi_polynomial_ideal.py
+@@ -170,7 +170,7 @@ when the system has no solutions over the rationals.
+ which is not 1. ::
+
+ sage: I.groebner_basis()
+- [x + 130433*y + 59079*z, y^2 + 3*y + 17220, y*z + 5*y + 14504, 2*y + 158864, z^2 + 17223, 2*z + 41856, 164878]
++ [x + y + 57119*z + 4, y^2 + 3*y + 17220, y*z + y + 26532, 2*y + 158864, z^2 + 17223, 2*z + 41856, 164878]
+
+ Now for each prime `p` dividing this integer 164878, the Groebner
+ basis of I modulo `p` will be non-trivial and will thus give a
+@@ -3995,9 +3995,9 @@ class MPolynomialIdeal( MPolynomialIdeal_singular_repr, \
+ sage: P.<a,b,c> = PolynomialRing(ZZ,3)
+ sage: I = P * (a + 2*b + 2*c - 1, a^2 - a + 2*b^2 + 2*c^2, 2*a*b + 2*b*c - b)
+ sage: I.groebner_basis()
+- [b^3 - 181*b*c^2 + 222*c^3 - 26*b*c - 146*c^2 + 19*b + 24*c,
+- 2*b*c^2 - 48*c^3 + 3*b*c + 22*c^2 - 2*b - 2*c,
+- 42*c^3 + 45*b^2 + 54*b*c + 22*c^2 - 13*b - 12*c,
++ [b^3 + b*c^2 + 12*c^3 + b^2 + b*c - 4*c^2,
++ 2*b*c^2 - 6*c^3 - b^2 - b*c + 2*c^2,
++ 42*c^3 + b^2 + 2*b*c - 14*c^2 + b,
+ 2*b^2 + 6*b*c + 6*c^2 - b - 2*c,
+ 10*b*c + 12*c^2 - b - 4*c,
+ a + 2*b + 2*c - 1]
diff --git a/src/sage/rings/polynomial/multi_polynomial_libsingular.pyx b/src/sage/rings/polynomial/multi_polynomial_libsingular.pyx
-index 0311cd71bb..e8e9ea9109 100644
+index 74f964c..027ef96 100644
--- a/src/sage/rings/polynomial/multi_polynomial_libsingular.pyx
+++ b/src/sage/rings/polynomial/multi_polynomial_libsingular.pyx
-@@ -2588,6 +2588,15 @@ cdef class MPolynomial_libsingular(MPolynomial):
+@@ -2588,6 +2588,26 @@ cdef class MPolynomial_libsingular(MPolynomial):
"""
return singular_polynomial_str_with_changed_varnames(self._poly, self._parent_ring, varnames)
-+ def shift(self, int n):
++ def _cycle(self, int n):
++ """
++ Permute the variables by shifting ``n`` positions to the right.
++
++ EXAMPLES::
++
++ sage: R.<a,b,c,d> = QQ[]
++ sage: f = a*b + c
++ sage: f._cycle(-1), f._cycle(0), f._cycle(1)
++ (a*d + b, a*b + c, b*c + d)
++ """
+ r = self.parent()
++ n = n % r.ngens()
+ olddict = self.dict()
+ newdict = dict()
+ for key in olddict:
@@ -242,16 +495,18 @@ index 0311cd71bb..e8e9ea9109 100644
def degree(self, MPolynomial_libsingular x=None, int std_grading=False):
"""
Return the maximal degree of this polynomial in ``x``, where
-diff --git a/src/sage/schemes/curves/projective_curve.py b/src/sage/schemes/curves/projective_curve.py
-index b5bd3c8c3e..0b26733ede 100644
---- a/src/sage/schemes/curves/projective_curve.py
-+++ b/src/sage/schemes/curves/projective_curve.py
-@@ -1892,7 +1892,7 @@ class ProjectivePlaneCurve_prime_finite_field(ProjectivePlaneCurve_finite_field)
- sage: C = Curve(f); pts = C.rational_points()
- sage: D = C.divisor([ (3, pts[0]), (-1,pts[1]), (10, pts[5]) ])
- sage: C.riemann_roch_basis(D)
-- [(-x - 2*y)/(-2*x - 2*y), (-x + z)/(x + y)]
-+ [(-2*x + y)/(x + y), (-x + z)/(x + y)]
-
- .. NOTE::
+diff --git a/src/sage/rings/polynomial/plural.pyx b/src/sage/rings/polynomial/plural.pyx
+index d2dec78..6fa2680 100644
+--- a/src/sage/rings/polynomial/plural.pyx
++++ b/src/sage/rings/polynomial/plural.pyx
+@@ -2876,7 +2876,8 @@ cpdef MPolynomialRing_libsingular new_CRing(RingWrap rw, base_ring):
+ self.__ngens = rw.ngens()
+ self.__term_order = TermOrder(rw.ordering_string(), force=True)
+
+- ParentWithGens.__init__(self, base_ring, rw.var_names())
++ ParentWithGens.__init__(self, base_ring, tuple(rw.var_names()),
++ normalize=False)
+ # self._populate_coercion_lists_() # ???
+ #MPolynomialRing_generic.__init__(self, base_ring, n, names, order)
+