summarylogtreecommitdiffstats
diff options
context:
space:
mode:
authorAntonio Rojas2020-11-02 20:08:44 +0100
committerAntonio Rojas2020-11-02 20:08:44 +0100
commitbb9fe3a62cbbe42aa395fd50c4d19486628eef3f (patch)
treea2476b0039acf2819d607995beee90f8d1792608
parentcdc31124dea27c41ccbd20742f91443491cf7809 (diff)
downloadaur-bb9fe3a62cbbe42aa395fd50c4d19486628eef3f.tar.gz
Sync with stable, drop merged patch
-rw-r--r--.SRCINFO12
-rw-r--r--PKGBUILD20
-rw-r--r--sagemath-cremona.patch31
-rw-r--r--sagemath-cypari-2.1.2.patch155
-rw-r--r--sagemath-flint-2.6.patch16
-rw-r--r--sagemath-pari-2.13.patch1925
-rw-r--r--sagemath-singular-4.1.2.patch153
7 files changed, 2188 insertions, 124 deletions
diff --git a/.SRCINFO b/.SRCINFO
index 1d51bf79df11..6b859fca90d2 100644
--- a/.SRCINFO
+++ b/.SRCINFO
@@ -1,6 +1,6 @@
pkgbase = sagemath-git
pkgdesc = Open Source Mathematics Software, free alternative to Magma, Maple, Mathematica, and Matlab
- pkgver = 9.2.rc3.r0.gf976c52c57
+ pkgver = 9.3.beta0.r0.g2c87dc16f2
pkgrel = 1
url = http://www.sagemath.org
arch = x86_64
@@ -96,18 +96,20 @@ pkgbase = sagemath-git
source = sagemath-optional-packages.patch
source = latte-count.patch
source = test-optional.patch
- source = sagemath-cremona.patch
source = sagemath-singular-4.1.2.patch
source = sagemath-gap-4.11.patch
source = sagemath-flint-2.6.patch
+ source = sagemath-cypari-2.1.2.patch
+ source = sagemath-pari-2.13.patch
sha256sums = SKIP
sha256sums = 4fb46b12b5ee5e5bde87f646dc69a7b8929886be247e2d9a9ae1f12efbe5b580
sha256sums = af922e1f978821a9a1f6c9a56130d71e5011c84a7aee7bf66a591bee658af30b
sha256sums = 7da0dbcda15a327c21dc33853cb8f98cb86a283139f8735e3b20a71d49458a88
- sha256sums = 937074fa7a8a4e2aba9ea77ec622fe937985a1a9176c48460d51325ee877a4f5
- sha256sums = 6f98488d0eb3a12b958cd1a34f85b7bee950ac756430371c1e134e564cbbf7d3
+ sha256sums = 881186d016a6eb47b919765b9d4e6abc4560fce54e08cf42bd948ba77e16aa85
sha256sums = 34f06f9776f84f6998b1350555316e0ffea76ed16e149916970f19ef750a467f
- sha256sums = b881d4a6867a6f5360fd204e6a86fd27c6177c539b06f521402e2bcb5a6209cd
+ sha256sums = 5d00b24c1d36b41b8ea3f07b93fc0e00b42dd84d9bc4e9b3d26e5f2cfeba6405
+ sha256sums = dc507eeb75eae1109273879771b4eb56172b7417e87a0693381106afd7554e04
+ sha256sums = a285ab97c4342c1d050db3493c03807a0162ced74a67bea9eb2794f52ce439fc
pkgname = sagemath-git
optdepends = cython: to compile cython code
diff --git a/PKGBUILD b/PKGBUILD
index a4a3967ef595..5b0639cb6a5c 100644
--- a/PKGBUILD
+++ b/PKGBUILD
@@ -7,7 +7,7 @@
pkgbase=sagemath-git
pkgname=(sagemath-git sagemath-jupyter-git)
-pkgver=9.2.rc3.r0.gf976c52c57
+pkgver=9.3.beta0.r0.g2c87dc16f2
pkgrel=1
pkgdesc="Open Source Mathematics Software, free alternative to Magma, Maple, Mathematica, and Matlab"
arch=(x86_64)
@@ -39,18 +39,20 @@ source=(git://git.sagemath.org/sage.git#branch=develop
sagemath-optional-packages.patch
latte-count.patch
test-optional.patch
- sagemath-cremona.patch
sagemath-singular-4.1.2.patch
sagemath-gap-4.11.patch
- sagemath-flint-2.6.patch)
+ sagemath-flint-2.6.patch
+ sagemath-cypari-2.1.2.patch
+ sagemath-pari-2.13.patch)
sha256sums=('SKIP'
'4fb46b12b5ee5e5bde87f646dc69a7b8929886be247e2d9a9ae1f12efbe5b580'
'af922e1f978821a9a1f6c9a56130d71e5011c84a7aee7bf66a591bee658af30b'
'7da0dbcda15a327c21dc33853cb8f98cb86a283139f8735e3b20a71d49458a88'
- '937074fa7a8a4e2aba9ea77ec622fe937985a1a9176c48460d51325ee877a4f5'
- '6f98488d0eb3a12b958cd1a34f85b7bee950ac756430371c1e134e564cbbf7d3'
+ '881186d016a6eb47b919765b9d4e6abc4560fce54e08cf42bd948ba77e16aa85'
'34f06f9776f84f6998b1350555316e0ffea76ed16e149916970f19ef750a467f'
- 'b881d4a6867a6f5360fd204e6a86fd27c6177c539b06f521402e2bcb5a6209cd')
+ '5d00b24c1d36b41b8ea3f07b93fc0e00b42dd84d9bc4e9b3d26e5f2cfeba6405'
+ 'dc507eeb75eae1109273879771b4eb56172b7417e87a0693381106afd7554e04'
+ 'a285ab97c4342c1d050db3493c03807a0162ced74a67bea9eb2794f52ce439fc')
pkgver() {
cd sage
@@ -63,14 +65,16 @@ prepare(){
sed -e '/sage-env/d' -i src/setup.py # Don't try to install sage-env
# Upstream patches
-# use Features to detect Cremona databases https://trac.sagemath.org/ticket/25825
- patch -p1 -i ../sagemath-cremona.patch
# Fixes for singular 4.1.2 https://trac.sagemath.org/ticket/25993
patch -p1 -i ../sagemath-singular-4.1.2.patch
# Fix segfault and tests with flint 2.6 https://trac.sagemath.org/ticket/29719
patch -p1 -i ../sagemath-flint-2.6.patch
# Fix gap.version() and doctests with GAP 4.11 https://trac.sagemath.org/ticket/29314
patch -p1 -i ../sagemath-gap-4.11.patch
+# Fix gcd/lcm between pari and sage objects https://trac.sagemath.org/ticket/30849
+ patch -p1 -i ../sagemath-cypari-2.1.2.patch
+# Port to PARI 2.13 https://trac.sagemath.org/ticket/30801
+ patch -p1 -i ../sagemath-pari-2.13.patch
# Arch-specific patches
# assume all optional packages are installed
diff --git a/sagemath-cremona.patch b/sagemath-cremona.patch
deleted file mode 100644
index 27328953a4bf..000000000000
--- a/sagemath-cremona.patch
+++ /dev/null
@@ -1,31 +0,0 @@
-diff --git a/src/sage/databases/cremona.py b/src/sage/databases/cremona.py
-index 3f8dd62..ed5726a 100644
---- a/src/sage/databases/cremona.py
-+++ b/src/sage/databases/cremona.py
-@@ -51,7 +51,7 @@ from sage.misc.prandom import randint
-
- import sage.schemes.elliptic_curves.constructor as elliptic
- from .sql_db import SQLDatabase, verify_column
--from sage.misc.package import is_package_installed
-+from sage.features.databases import DatabaseCremona
- from sage.env import CREMONA_MINI_DATA_DIR, CREMONA_LARGE_DATA_DIR, SAGE_SHARE
- from sage.misc.all import walltime
-
-@@ -847,7 +847,7 @@ class MiniCremonaDatabase(SQLDatabase):
- if N < self.largest_conductor():
- message = "There is no elliptic curve with label " + label \
- + " in the database"
-- elif is_package_installed('database_cremona_ellcurve'):
-+ elif DatabaseCremona().is_present():
- message = "There is no elliptic curve with label " + label \
- + " in the currently available databases"
- else:
-@@ -1705,7 +1705,7 @@ def CremonaDatabase(name=None,mini=None,set_global=None):
- if name is None and not set_global:
- return _db
- if set_global and name is None:
-- if is_package_installed('database_cremona_ellcurve'):
-+ if DatabaseCremona().is_present():
- name = 'cremona'
- else:
- name = 'cremona mini'
diff --git a/sagemath-cypari-2.1.2.patch b/sagemath-cypari-2.1.2.patch
new file mode 100644
index 000000000000..bfbb02185dbd
--- /dev/null
+++ b/sagemath-cypari-2.1.2.patch
@@ -0,0 +1,155 @@
+diff --git a/src/sage/rings/integer.pyx b/src/sage/rings/integer.pyx
+index 4c835d0..77a3a18 100644
+--- a/src/sage/rings/integer.pyx
++++ b/src/sage/rings/integer.pyx
+@@ -4414,6 +4414,29 @@ cdef class Integer(sage.structure.element.EuclideanDomainElement):
+ sig_off()
+ return z
+
++ def _gcd(self, Integer n):
++ """
++ Return the greatest common divisor of self and `n`.
++
++ EXAMPLES::
++
++ sage: 1._gcd(-1)
++ 1
++ sage: 0._gcd(1)
++ 1
++ sage: 0._gcd(0)
++ 0
++ sage: 2._gcd(2^6)
++ 2
++ sage: 21._gcd(2^6)
++ 1
++ """
++ cdef Integer z = PY_NEW(Integer)
++ sig_on()
++ mpz_gcd(z.value, self.value, n.value)
++ sig_off()
++ return z
++
+ def denominator(self):
+ """
+ Return the denominator of this integer, which of course is
+@@ -6736,33 +6759,6 @@ cdef class Integer(sage.structure.element.EuclideanDomainElement):
+ raise ZeroDivisionError(f"inverse of Mod({self}, {m}) does not exist")
+ return ans
+
+- def gcd(self, n):
+- """
+- Return the greatest common divisor of self and `n`.
+-
+- EXAMPLES::
+-
+- sage: gcd(-1,1)
+- 1
+- sage: gcd(0,1)
+- 1
+- sage: gcd(0,0)
+- 0
+- sage: gcd(2,2^6)
+- 2
+- sage: gcd(21,2^6)
+- 1
+- """
+- if not isinstance(n, Integer) and not isinstance(n, int):
+- left, right = coercion_model.canonical_coercion(self, n)
+- return left.gcd(right)
+- cdef Integer m = as_Integer(n)
+- cdef Integer g = PY_NEW(Integer)
+- sig_on()
+- mpz_gcd(g.value, self.value, m.value)
+- sig_off()
+- return g
+-
+ def crt(self, y, m, n):
+ """
+ Return the unique integer between `0` and `mn` that is congruent to
+diff --git a/src/sage/structure/element.pyx b/src/sage/structure/element.pyx
+index f145e66..1cf634e 100644
+--- a/src/sage/structure/element.pyx
++++ b/src/sage/structure/element.pyx
+@@ -3908,16 +3908,79 @@ def is_PrincipalIdealDomainElement(x):
+ return isinstance(x, PrincipalIdealDomainElement)
+
+ cdef class PrincipalIdealDomainElement(DedekindDomainElement):
++ def gcd(self, right):
++ r"""
++ Return the greatest common divisor of ``self`` and ``other``.
++
++ TESTS:
++
++ :trac:`30849`::
++
++ sage: 2.gcd(pari(3))
++ 1
++ sage: type(2.gcd(pari(3)))
++ <class 'sage.rings.integer.Integer'>
++
++ sage: 2.gcd(pari('1/3'))
++ 1/3
++ sage: type(2.gcd(pari('1/3')))
++ <class 'sage.rings.rational.Rational'>
++
++ sage: import gmpy2
++ sage: 2.gcd(gmpy2.mpz(3))
++ 1
++ sage: type(2.gcd(gmpy2.mpz(3)))
++ <class 'sage.rings.integer.Integer'>
++
++ sage: 2.gcd(gmpy2.mpq(1,3))
++ 1/3
++ sage: type(2.gcd(pari('1/3')))
++ <class 'sage.rings.rational.Rational'>
++ """
++ # NOTE: in order to handle nicely pari or gmpy2 integers we do not rely only on coercion
++ if not isinstance(right, Element):
++ right = py_scalar_to_element(right)
++ if not isinstance(right, Element):
++ right = right.sage()
++ if not ((<Element>right)._parent is self._parent):
++ from sage.arith.all import gcd
++ return coercion_model.bin_op(self, right, gcd)
++ return self._gcd(right)
++
+ def lcm(self, right):
+ """
+ Return the least common multiple of ``self`` and ``right``.
+- """
+- if not isinstance(right, Element) or not ((<Element>right)._parent is self._parent):
++
++ TESTS:
++
++ :trac:`30849`::
++
++ sage: 2.lcm(pari(3))
++ 6
++ sage: type(2.lcm(pari(3)))
++ <class 'sage.rings.integer.Integer'>
++
++ sage: 2.lcm(pari('1/3'))
++ 2
++ sage: type(2.lcm(pari('1/3')))
++ <class 'sage.rings.rational.Rational'>
++
++ sage: import gmpy2
++ sage: 2.lcm(gmpy2.mpz(3))
++ 6
++ sage: type(2.lcm(gmpy2.mpz(3)))
++ <class 'sage.rings.integer.Integer'>
++ """
++ # NOTE: in order to handle nicely pari or gmpy2 integers we do not rely only on coercion
++ if not isinstance(right, Element):
++ right = py_scalar_to_element(right)
++ if not isinstance(right, Element):
++ right = right.sage()
++ if not ((<Element>right)._parent is self._parent):
+ from sage.arith.all import lcm
+ return coercion_model.bin_op(self, right, lcm)
+ return self._lcm(right)
+
+-
+ # This is pretty nasty low level stuff. The idea is to speed up construction
+ # of EuclideanDomainElements (in particular Integers) by skipping some tp_new
+ # calls up the inheritance tree.
diff --git a/sagemath-flint-2.6.patch b/sagemath-flint-2.6.patch
index 185278b1bae8..481e79a76bf1 100644
--- a/sagemath-flint-2.6.patch
+++ b/sagemath-flint-2.6.patch
@@ -108,19 +108,3 @@ index 62379d2..2c163f5 100644
sage: f.lift([1/12])
Traceback (most recent call last):
...
-diff --git a/src/sage/schemes/hyperelliptic_curves/monsky_washnitzer.py b/src/sage/schemes/hyperelliptic_curves/monsky_washnitzer.py
-index 83b63b0..4bdb189 100644
---- a/src/sage/schemes/hyperelliptic_curves/monsky_washnitzer.py
-+++ b/src/sage/schemes/hyperelliptic_curves/monsky_washnitzer.py
-@@ -1875,9 +1875,9 @@ class SpecialHyperellipticQuotientRing(UniqueRepresentation, CommutativeAlgebra)
- if not hasattr(self, '_curve'):
- if self._Q.degree() == 3:
- ainvs = [0, self._Q[2], 0, self._Q[1], self._Q[0]]
-- self._curve = EllipticCurve(ainvs)
-+ self._curve = EllipticCurve(ainvs, check_squarefree=R.is_field())
- else:
-- self._curve = HyperellipticCurve(self._Q)
-+ self._curve = HyperellipticCurve(self._Q, check_squarefree=R.is_field())
-
- else:
- raise NotImplementedError("Must be an elliptic curve or polynomial "
diff --git a/sagemath-pari-2.13.patch b/sagemath-pari-2.13.patch
new file mode 100644
index 000000000000..b0acff637f48
--- /dev/null
+++ b/sagemath-pari-2.13.patch
@@ -0,0 +1,1925 @@
+diff --git a/src/sage/arith/misc.py b/src/sage/arith/misc.py
+index 6e041e65fe..b12fa25251 100644
+--- a/src/sage/arith/misc.py
++++ b/src/sage/arith/misc.py
+@@ -1458,13 +1458,13 @@ def divisors(n):
+
+ sage: K.<a> = QuadraticField(7)
+ sage: divisors(K.ideal(7))
+- [Fractional ideal (1), Fractional ideal (a), Fractional ideal (7)]
++ [Fractional ideal (1), Fractional ideal (-a), Fractional ideal (7)]
+ sage: divisors(K.ideal(3))
+ [Fractional ideal (1), Fractional ideal (3),
+ Fractional ideal (-a + 2), Fractional ideal (-a - 2)]
+ sage: divisors(K.ideal(35))
+- [Fractional ideal (1), Fractional ideal (5), Fractional ideal (a),
+- Fractional ideal (7), Fractional ideal (5*a), Fractional ideal (35)]
++ [Fractional ideal (1), Fractional ideal (5), Fractional ideal (-a),
++ Fractional ideal (7), Fractional ideal (-5*a), Fractional ideal (35)]
+
+ TESTS::
+
+diff --git a/src/sage/ext_data/pari/simon/ell.gp b/src/sage/ext_data/pari/simon/ell.gp
+index 74f0786646..21cff9cbb3 100644
+--- a/src/sage/ext_data/pari/simon/ell.gp
++++ b/src/sage/ext_data/pari/simon/ell.gp
+@@ -1038,7 +1038,7 @@ if( DEBUGLEVEL_ell >= 1, print(" trivial points on E(K) = ");
+ KS2gen = KS2gen[1];
+ for( i = 1, #KS2gen,
+ KS2gen[i] = nfbasistoalg(bnf, KS2gen[i]));
+- KS2gen = concat(Mod(lift(bnf.tufu),bnf.pol),KS2gen);
++ KS2gen = concat(Mod(lift(concat(bnf.tu[2], bnf.fu)),bnf.pol),KS2gen);
+ if( DEBUGLEVEL_ell >= 2,
+ print(" #K(b,2)gen = ",#KS2gen);
+ print(" K(b,2)gen = ",KS2gen));
+@@ -1072,7 +1072,7 @@ if( DEBUGLEVEL_ell >= 1,
+ KS2gen = KS2gen[1];
+ for( i = 1, #KS2gen,
+ KS2gen[i] = nfbasistoalg(bnf, KS2gen[i]));
+- KS2gen = concat(Mod(lift(bnf.tufu),bnf.pol),KS2gen);
++ KS2gen = concat(Mod(lift(concat(bnf.tu[2], bnf.fu)),bnf.pol),KS2gen);
+ if( DEBUGLEVEL_ell >= 2,
+ print(" #K(a^2-4b,2)gen = ",#KS2gen);
+ print(" K(a^2-4b,2)gen = ",KS2gen));
+@@ -1244,11 +1244,11 @@ if( DEBUGLEVEL_ell >= 4, print(" bbbnf.clgp = ",bbbnf.clgp));
+ SL1 = idealmul(bbbnf,SL0,rnfeltup(rrrnf,bleg));
+ SL = idealfactor(bbbnf,SL1)[,1]~;
+ sunL = bnfsunit(bbbnf,SL);
+- fondsunL = concat(bbbnf.futu,vector(#sunL[1],i,nfbasistoalg(bbbnf,sunL[1][i])));
++ fondsunL = concat(concat(bbbnf.fu, bbbnf.tu[2]),vector(#sunL[1],i,nfbasistoalg(bbbnf,sunL[1][i])));
+ normfondsunL = vector(#fondsunL, i, norm(rnfeltabstorel(rrrnf,fondsunL[i])));
+ SK = idealfactor(bnf,idealnorm(bbbnf,SL1))[,1]~;
+ sunK = bnfsunit(bnf,SK);
+- fondsunK = concat(bnf.futu,vector(#sunK[1],i,nfbasistoalg(bnf,sunK[1][i])));
++ fondsunK = concat(concat(bnf.fu, bnf.tu[2]),vector(#sunK[1],i,nfbasistoalg(bnf,sunK[1][i])));
+ vecbleg = bnfissunit(bnf,sunK,bleg);
+ matnorm = matrix(#fondsunK,#normfondsunL,i,j,0);
+ for( i = 1, #normfondsunL,
+@@ -1345,7 +1345,7 @@ if( DEBUGLEVEL_ell >= 4, print("on factorise bb = ",bb));
+ sun = bnfsunit(bnf,idealfactor(bnf,bb)[,1]~);
+ fact = lift(bnfissunit(bnf,sun,bb));
+ if( DEBUGLEVEL_ell >= 4, print("fact = ",fact));
+- suni = concat(bnf.futu,vector(#sun[1],i,nfbasistoalg(bnf,sun[1][i])));
++ suni = concat(concat(bnf.fu, bnf.tu[2]),vector(#sun[1],i,nfbasistoalg(bnf,sun[1][i])));
+ for( i = 1, #suni,
+ if( (f = fact[i]>>1),
+ test =0;
+@@ -1554,7 +1554,7 @@ if( DEBUGLEVEL_ell >= 3, print(" KS2gen = ",KS2gen[1]));
+
+ LS2gen = LS2gen[1];
+ LS2 = vector(#LS2gen,i,lift(nfbasistoalg(Lrnf,LS2gen[i])));
+- LS2 = concat(lift(Lrnf.futu),LS2);
++ LS2 = concat(lift(concat(Lrnf.fu, Lrnf.tu[2])),LS2);
+
+ LS2 = subst(LS2,'x,ttheta);
+ LS2 = LS2*Mod(1,polrel);
+@@ -1992,7 +1992,7 @@ if( DEBUGLEVEL_ell >= 2, print(" Algorithm of complete 2-descent"));
+ KS2gen = KS2gen[1];
+ for( i = 1, #KS2gen,
+ KS2gen[i] = nfbasistoalg(bnf, KS2gen[i]));
+- KS2gen = concat(Mod(lift(bnf.tufu),bnf.pol),KS2gen);
++ KS2gen = concat(Mod(lift(concat(bnf.tu[2], bnf.fu)),bnf.pol),KS2gen);
+ if( DEBUGLEVEL_ell >= 2,
+ print(" #K(S,2)gen = ",#KS2gen);
+ print(" K(S,2)gen = ",KS2gen)
+diff --git a/src/sage/ext_data/pari/simon/ellQ.gp b/src/sage/ext_data/pari/simon/ellQ.gp
+index aede9fc941..27cc124372 100644
+--- a/src/sage/ext_data/pari/simon/ellQ.gp
++++ b/src/sage/ext_data/pari/simon/ellQ.gp
+@@ -1162,7 +1162,7 @@ if( DEBUGLEVEL_ell >= 4, print(" kerval = ",kerval));
+ LS2gen[j]^kerval[j,i]));
+
+ \\ Add the units
+- LS2gen = concat(Mod(bnf[8][5],bnf.pol),LS2gen); \\ LS2gen = concat(bnf.fu,LS2gen);
++ LS2gen = concat(bnf.fu,LS2gen); \\ LS2gen = concat(bnf.fu,LS2gen);
+ \\ Add also the torsion unit if its order is divisible by p.
+ if( bnf[8][4][1]%p == 0, \\ if( bnf.tu[1]%p == 0,
+ LS2gen = concat( [Mod(bnf[8][4][2],bnf.pol)], LS2gen)); \\ LS2gen = concat( [Mod(bnf.tu[2],bnf.pol)], LS2gen));
+diff --git a/src/sage/geometry/cone.py b/src/sage/geometry/cone.py
+index 33b28dbede..1c6873eadd 100644
+--- a/src/sage/geometry/cone.py
++++ b/src/sage/geometry/cone.py
+@@ -4268,31 +4268,31 @@ class ConvexRationalPolyhedralCone(IntegralRayCollection, Container):
+ M(-5, 21, 0, -3),
+ M( 0, -2, 0, 1),
+ M(15, -63, 25, 9),
+- M( 2, -3, 0, 1),
+- M( 1, -4, 1, 1),
+- M(-1, 3, 0, 0),
+ M( 4, -4, 0, 1),
+- M( 1, -5, 2, 1),
+ M( 3, -5, 1, 1),
+- M( 6, -5, 0, 1),
+- M( 3, -13, 5, 2),
+ M( 2, -6, 2, 1),
+- M( 5, -6, 1, 1),
+- M( 0, 1, 0, 0),
+- M( 8, -6, 0, 1),
++ M(-1, 7, 0, -1),
++ M( 6, -21, 8, 3),
++ M( 5, -21, 9, 3),
++ M(-1, 3, 0, 0),
++ M( 7, -28, 11, 4),
++ M( 1, -5, 2, 1),
+ M(-2, 8, 0, -1),
++ M( 8, -6, 0, 1),
++ M( 7, -7, 1, 1),
++ M( 3, -13, 5, 2),
++ M( 2, -3, 0, 1),
++ M( 1, -4, 1, 1),
++ M(-3, 14, 0, -2),
+ M(10, -42, 17, 6),
+- M( 7, -28, 11, 4),
+- M( 5, -21, 9, 3),
+- M( 6, -21, 8, 3),
++ M( 1, 0, 0, 0),
++ M( 0, 0, 1, 0),
++ M( 6, -5, 0, 1),
++ M( 5, -6, 1, 1),
++ M( 4, -7, 2, 1),
+ M( 5, -14, 5, 2),
+ M( 2, -7, 3, 1),
+- M( 4, -7, 2, 1),
+- M( 7, -7, 1, 1),
+- M( 0, 0, 1, 0),
+- M(-3, 14, 0, -2),
+- M(-1, 7, 0, -1),
+- M( 1, 0, 0, 0)
++ M( 0, 1, 0, 0)
+ in 4-d lattice M
+
+ Not a strictly convex cone::
+diff --git a/src/sage/groups/abelian_gps/abelian_group.py b/src/sage/groups/abelian_gps/abelian_group.py
+index dd9944370b..6ebf56b62d 100644
+--- a/src/sage/groups/abelian_gps/abelian_group.py
++++ b/src/sage/groups/abelian_gps/abelian_group.py
+@@ -1452,7 +1452,7 @@ class AbelianGroup_class(UniqueRepresentation, AbelianGroupBase):
+ EXAMPLES::
+
+ sage: AbelianGroup([2,3]).subgroups()
+- [Multiplicative Abelian subgroup isomorphic to C2 x C3 generated by {f0*f1^2},
++ [Multiplicative Abelian subgroup isomorphic to C2 x C3 generated by {f0*f1},
+ Multiplicative Abelian subgroup isomorphic to C2 generated by {f0},
+ Multiplicative Abelian subgroup isomorphic to C3 generated by {f1},
+ Trivial Abelian subgroup]
+diff --git a/src/sage/groups/additive_abelian/additive_abelian_group.py b/src/sage/groups/additive_abelian/additive_abelian_group.py
+index 3dcedeb7e3..48747e4870 100644
+--- a/src/sage/groups/additive_abelian/additive_abelian_group.py
++++ b/src/sage/groups/additive_abelian/additive_abelian_group.py
+@@ -61,18 +61,18 @@ def AdditiveAbelianGroup(invs, remember_generators = True):
+ ((1, 0, 0), (0, 1, 0), (0, 0, 1))
+ sage: [H.0, H.1, H.2]
+ [(1, 0, 0), (0, 1, 0), (0, 0, 1)]
+- sage: p=H.0+H.1+6*H.2; p
+- (1, 1, 6)
++ sage: p=2*H.0+H.1+6*H.2; p
++ (2, 1, 6)
+
+ sage: H.smith_form_gens()
+- ((2, 1, 0), (0, 0, 1))
++ ((1, 1, 0), (0, 0, 1))
+ sage: q=H.linear_combination_of_smith_form_gens([5,6]); q
+- (1, 1, 6)
++ (2, 1, 6)
+ sage: p==q
+ True
+
+- sage: r=H(vector([1,1,6])); r
+- (1, 1, 6)
++ sage: r=H(vector([2,1,6])); r
++ (2, 1, 6)
+ sage: p==r
+ True
+
+@@ -85,21 +85,21 @@ def AdditiveAbelianGroup(invs, remember_generators = True):
+
+ sage: G=AdditiveAbelianGroup([3,2,0], remember_generators=False)
+ sage: G.gens()
+- ((2, 1, 0), (0, 0, 1))
++ ((1, 1, 0), (0, 0, 1))
+ sage: [G.0, G.1]
+- [(2, 1, 0), (0, 0, 1)]
++ [(1, 1, 0), (0, 0, 1)]
+ sage: p=5*G.0+6*G.1; p
+- (1, 1, 6)
++ (2, 1, 6)
+
+ sage: H.smith_form_gens()
+- ((2, 1, 0), (0, 0, 1))
++ ((1, 1, 0), (0, 0, 1))
+ sage: q=G.linear_combination_of_smith_form_gens([5,6]); q
+- (1, 1, 6)
++ (2, 1, 6)
+ sage: p==q
+ True
+
+- sage: r=G(vector([1,1,6])); r
+- (1, 1, 6)
++ sage: r=G(vector([2,1,6])); r
++ (2, 1, 6)
+ sage: p==r
+ True
+
+@@ -427,7 +427,7 @@ class AdditiveAbelianGroup_fixed_gens(AdditiveAbelianGroup_class):
+ sage: G.gens()
+ ((1, 0), (0, 1))
+ sage: G.smith_form_gens()
+- ((1, 2),)
++ ((1, 1),)
+ """
+ return self._orig_gens
+
+diff --git a/src/sage/lfunctions/pari.py b/src/sage/lfunctions/pari.py
+index c45f3bfd5c..233905dd87 100644
+--- a/src/sage/lfunctions/pari.py
++++ b/src/sage/lfunctions/pari.py
+@@ -422,7 +422,7 @@ class LFunction(SageObject):
+ sage: L.derivative(1,E.rank())
+ 1.51863300057685
+ sage: L.taylor_series(1,4)
+- -3...e-19 + (...e-19)*z + 0.759316500288427*z^2 - 0.430302337583362*z^3 + O(z^4)
++ ...e-19 + (...e-19)*z + 0.759316500288427*z^2 - 0.430302337583362*z^3 + O(z^4)
+
+ .. RUBRIC:: Number field
+
+diff --git a/src/sage/libs/pari/convert_sage.pyx b/src/sage/libs/pari/convert_sage.pyx
+index 4e9dc06dd6..7446a91864 100644
+--- a/src/sage/libs/pari/convert_sage.pyx
++++ b/src/sage/libs/pari/convert_sage.pyx
+@@ -144,6 +144,20 @@ cpdef gen_to_sage(Gen z, locals=None):
+ sage: a.parent()
+ Complex Field with 64 bits of precision
+
++ sage: z = pari('1 + 1.0*I'); z
++ 1 + 1.00000000000000*I
++ sage: a = gen_to_sage(z); a
++ 1.00000000000000000 + 1.00000000000000000*I
++ sage: a.parent()
++ Complex Field with 64 bits of precision
++
++ sage: z = pari('1.0 + 1*I'); z
++ 1.00000000000000 + I
++ sage: a = gen_to_sage(z); a
++ 1.00000000000000000 + 1.00000000000000000*I
++ sage: a.parent()
++ Complex Field with 64 bits of precision
++
+ Converting polynomials::
+
+ sage: f = pari('(2/3)*x^3 + x - 5/7 + y')
+@@ -241,7 +255,9 @@ cpdef gen_to_sage(Gen z, locals=None):
+ elif t == t_FRAC:
+ return Rational(z)
+ elif t == t_REAL:
+- prec = prec_words_to_bits(z.precision())
++ prec = z.bitprecision()
++ if prec.type() == 't_INFINITY':
++ prec = 53
+ return RealField(prec)(z)
+ elif t == t_COMPLEX:
+ real = z.real()
+@@ -251,14 +267,19 @@ cpdef gen_to_sage(Gen z, locals=None):
+ if tx in [t_INTMOD, t_PADIC] or ty in [t_INTMOD, t_PADIC]:
+ raise NotImplementedError("No conversion to python available for t_COMPLEX with t_INTMOD or t_PADIC components")
+ if tx == t_REAL or ty == t_REAL:
+- xprec = real.precision() # will be 0 if exact
+- yprec = imag.precision() # will be 0 if exact
+- if xprec == 0:
+- prec = prec_words_to_bits(yprec)
+- elif yprec == 0:
+- prec = prec_words_to_bits(xprec)
++ xprec = real.bitprecision() # will be 0 if exact
++ yprec = imag.bitprecision() # will be 0 if exact
++ if xprec == 0 or yprec == 0:
++ raise RuntimeError
++ if xprec.type() == 't_INFINITY':
++ if yprec.type() == 't_INFINITY':
++ prec = 53
++ else:
++ prec = yprec
++ elif yprec.type() == 't_INFINITY':
++ prec = xprec
+ else:
+- prec = max(prec_words_to_bits(xprec), prec_words_to_bits(yprec))
++ prec = max(xprec, yprec)
+
+ R = RealField(prec)
+ C = ComplexField(prec)
+diff --git a/src/sage/libs/pari/tests.py b/src/sage/libs/pari/tests.py
+index 415a707fe8..6a3626f308 100644
+--- a/src/sage/libs/pari/tests.py
++++ b/src/sage/libs/pari/tests.py
+@@ -135,7 +135,7 @@ Some more exotic examples::
+
+ sage: K.<a> = NumberField(polygen(QQ)^3 - 2)
+ sage: pari(K)
+- [y^3 - 2, [1, 1], -108, 1, [[1, 1.25992104989487, 1.58740105196820; 1, -0.629960524947437 + 1.09112363597172*I, -0.793700525984100 - 1.37472963699860*I], [1, 1.25992104989487, 1.58740105196820; 1, 0.461163111024285, -2.16843016298270; 1, -1.72108416091916, 0.581029111014503], [1, 1, 2; 1, 0, -2; 1, -2, 1], [3, 0, 0; 0, 0, 6; 0, 6, 0], [6, 0, 0; 0, 6, 0; 0, 0, 3], [2, 0, 0; 0, 0, 1; 0, 1, 0], [2, [0, 0, 2; 1, 0, 0; 0, 1, 0]], []], [1.25992104989487, -0.629960524947437 + 1.09112363597172*I], [1, y, y^2], [1, 0, 0; 0, 1, 0; 0, 0, 1], [1, 0, 0, 0, 0, 2, 0, 2, 0; 0, 1, 0, 1, 0, 0, 0, 0, 2; 0, 0, 1, 0, 1, 0, 1, 0, 0]]
++ [y^3 - 2, [1, 1], -108, 1, [[1, 1.25992104989487, 1.58740105196820; 1, -0.629960524947437 + 1.09112363597172*I, -0.793700525984100 - 1.37472963699860*I], [1, 1.25992104989487, 1.58740105196820; 1, 0.461163111024285, -2.16843016298270; 1, -1.72108416091916, 0.581029111014503], [16, 20, 25; 16, 7, -35; 16, -28, 9], [3, 0, 0; 0, 0, 6; 0, 6, 0], [6, 0, 0; 0, 6, 0; 0, 0, 3], [2, 0, 0; 0, 0, 1; 0, 1, 0], [2, [0, 0, 2; 1, 0, 0; 0, 1, 0]], [2, 3]], [1.25992104989487, -0.629960524947437 + 1.09112363597172*I], [1, y, y^2], [1, 0, 0; 0, 1, 0; 0, 0, 1], [1, 0, 0, 0, 0, 2, 0, 2, 0; 0, 1, 0, 1, 0, 0, 0, 0, 2; 0, 0, 1, 0, 1, 0, 1, 0, 0]]
+
+ sage: E = EllipticCurve('37a1')
+ sage: pari(E)
+@@ -375,13 +375,13 @@ Constructors::
+ sage: pari('["bc","ab","bc"]').Set()
+ ["ab", "bc"]
+
+- sage: pari([65,66,123]).Strchr()
++ sage: pari([65,66,123]).strchr()
+ "AB{"
+ sage: pari('"Sage"').Vecsmall()
+ Vecsmall([83, 97, 103, 101])
+- sage: _.Strchr()
++ sage: _.strchr()
+ "Sage"
+- sage: pari([83, 97, 103, 101]).Strchr()
++ sage: pari([83, 97, 103, 101]).strchr()
+ "Sage"
+
+ Basic functions::
+@@ -448,7 +448,7 @@ Basic functions::
+ sage: pari('x').component(0)
+ Traceback (most recent call last):
+ ...
+- PariError: non-existent component: index < 1
++ PariError: nonexistent component: index < 1
+
+ sage: pari('x+1').conj()
+ x + 1
+@@ -763,7 +763,7 @@ Transcendental functions::
+ sage: pari(2).besseli(3+i)
+ 1.12539407613913 + 2.08313822670661*I
+ sage: C.<i> = ComplexField()
+- sage: pari(2+i).besseln(3)
++ sage: pari(2+i).bessely(3)
+ -0.280775566958244 - 0.486708533223726*I
+
+ sage: pari(1.5).cos()
+@@ -818,7 +818,7 @@ Transcendental functions::
+ sage: pari(-1).gamma()
+ Traceback (most recent call last):
+ ...
+- PariError: domain error in gamma: argument = non-positive integer
++ PariError: domain error in gamma: argument = nonpositive integer
+
+ sage: pari(2).gammah()
+ 1.32934038817914
+@@ -866,11 +866,6 @@ Transcendental functions::
+ sage: pari(2).sqrt()
+ 1.41421356237310
+
+- sage: pari(8).sqrtint()
+- 2
+- sage: pari(10^100).sqrtint()
+- 100000000000000000000000000000000000000000000000000
+-
+ sage: pari(2).tan()
+ -2.18503986326152
+ sage: C.<i> = ComplexField()
+@@ -1629,7 +1624,7 @@ General number fields::
+
+ sage: x = QQ['x'].0; nf = pari(x^2 + 2).nfinit()
+ sage: nf.nfgaloisconj()
+- [x, -x]~
++ [-x, x]~
+ sage: nf = pari(x^3 + 2).nfinit()
+ sage: nf.nfgaloisconj()
+ [x]~
+@@ -1672,7 +1667,7 @@ General number fields::
+ [[1, [7605, 4]~, [5610, 5]~, [7913, -6]~; 0, 1, 0, -1; 0, 0, 1, 0; 0, 0, 0, 1], [[19320, 13720; 0, 56], [2, 1; 0, 1], 1, 1]]
+
+ sage: pari('x^3 - 17').nfinit()
+- [x^3 - 17, [1, 1], -867, 3, [[1, 1.68006914259990, 2.57128159065824; 1, -0.340034571299952 - 2.65083754153991*I, -1.28564079532912 + 2.22679517779329*I], [1, 1.68006914259990, 2.57128159065824; 1, -2.99087211283986, 0.941154382464174; 1, 2.31080297023995, -3.51243597312241], [1, 2, 3; 1, -3, 1; 1, 2, -4], [3, 1, 0; 1, -11, 17; 0, 17, 0], [51, 0, 16; 0, 17, 3; 0, 0, 1], [17, 0, -1; 0, 0, 3; -1, 3, 2], [51, [-17, 6, -1; 0, -18, 3; 1, 0, -16]], [3, 17]], [2.57128159065824, -1.28564079532912 + 2.22679517779329*I], [3, x^2 - x + 1, 3*x], [1, 0, -1; 0, 0, 3; 0, 1, 1], [1, 0, 0, 0, -4, 6, 0, 6, -1; 0, 1, 0, 1, 1, -1, 0, -1, 3; 0, 0, 1, 0, 2, 0, 1, 0, 1]]
++ [x^3 - 17, [1, 1], -867, 3, [[1, 1.68006914259990, 2.57128159065824; 1, -0.340034571299952 - 2.65083754153991*I, -1.28564079532912 + 2.22679517779329*I], [1, 1.68006914259990, 2.57128159065824; 1, -2.99087211283986, 0.941154382464174; 1, 2.31080297023995, -3.51243597312241], [16, 27, 41; 16, -48, 15; 16, 37, -56], [3, 1, 0; 1, -11, 17; 0, 17, 0], [51, 0, 16; 0, 17, 3; 0, 0, 1], [17, 0, -1; 0, 0, 3; -1, 3, 2], [51, [-17, 6, -1; 0, -18, 3; 1, 0, -16]], [3, 17]], [2.57128159065824, -1.28564079532912 + 2.22679517779329*I], [3, x^2 - x + 1, 3*x], [1, 0, -1; 0, 0, 3; 0, 1, 1], [1, 0, 0, 0, -4, 6, 0, 6, -1; 0, 1, 0, 1, 1, -1, 0, -1, 3; 0, 0, 1, 0, 2, 0, 1, 0, 1]]
+ sage: pari('x^2 + 10^100 + 1').nfinit()
+ [...]
+ sage: pari('1.0').nfinit()
+@@ -1733,7 +1728,7 @@ General number fields::
+ sage: pari(-23).quadhilbert()
+ x^3 - x^2 + 1
+ sage: pari(145).quadhilbert()
+- x^4 - 6*x^2 - 5*x - 1
++ x^4 - x^3 - 5*x^2 - x + 1
+ sage: pari(-12).quadhilbert() # Not fundamental
+ Traceback (most recent call last):
+ ...
+@@ -1758,7 +1753,7 @@ library::
+ sage: e = pari([0,0,0,-82,0]).ellinit()
+ sage: eta1 = e.elleta(precision=100)[0]
+ sage: eta1.sage()
+- 3.6054636014326520859158205642077267748
++ 3.6054636014326520859158205642077267748...
+ sage: eta1 = e.elleta(precision=180)[0]
+ sage: eta1.sage()
+ 3.60546360143265208591582056420772677481026899659802474544
+diff --git a/src/sage/modular/local_comp/liftings.py b/src/sage/modular/local_comp/liftings.py
+index 5d7be71f16..5ed77f1785 100644
+--- a/src/sage/modular/local_comp/liftings.py
++++ b/src/sage/modular/local_comp/liftings.py
+@@ -222,9 +222,9 @@ def lift_for_SL(A, N=None):
+ TESTS::
+
+ sage: lift_for_SL(matrix(3,3,[1,2,0,3,4,0,0,0,1]),3)
+- [10 14 3]
+- [ 9 10 3]
+- [ 3 3 1]
++ [ -2 -4 3]
++ [ -9 -14 3]
++ [ -6 -9 1]
+
+ sage: A = matrix(Zmod(7), 2, [1,0,0,1])
+ sage: L = lift_for_SL(A)
+diff --git a/src/sage/modular/local_comp/smoothchar.py b/src/sage/modular/local_comp/smoothchar.py
+index 6dedb26e7e..3b1ac90460 100644
+--- a/src/sage/modular/local_comp/smoothchar.py
++++ b/src/sage/modular/local_comp/smoothchar.py
+@@ -1617,8 +1617,8 @@ class SmoothCharacterGroupRamifiedQuadratic(SmoothCharacterGroupGeneric):
+ sage: G = SmoothCharacterGroupRamifiedQuadratic(3, 1, QQ)
+ sage: s = G.number_field().gen()
+ sage: G.discrete_log(4, 3 + 2*s)
+- [5, 1, 1, 1]
+- sage: gs = G.unit_gens(4); gs[0]^5 * gs[1] * gs[2] * gs[3] - (3 + 2*s) in G.ideal(4)
++ [1, 2, 2, 1]
++ sage: gs = G.unit_gens(4); gs[0] * gs[1]^2 * gs[2]^2 * gs[3] - (3 + 2*s) in G.ideal(4)
+ True
+ """
+ x = self.number_field().coerce(x)
+diff --git a/src/sage/modular/modsym/p1list_nf.py b/src/sage/modular/modsym/p1list_nf.py
+index 7a91d353e3..b71fc8aac4 100644
+--- a/src/sage/modular/modsym/p1list_nf.py
++++ b/src/sage/modular/modsym/p1list_nf.py
+@@ -956,7 +956,7 @@ class P1NFList(SageObject):
+ sage: N = k.ideal(a + 1)
+ sage: P = P1NFList(N)
+ sage: u = k.unit_group().gens_values(); u
+- [-1, a^3 + a^2 + a + 12, a^3 + 3*a^2 - 1]
++ [-1, -a^3 - a^2 - a - 12, -a^3 - 3*a^2 + 1]
+ sage: P.apply_J_epsilon(3, u[2]^2)==P.apply_J_epsilon(P.apply_J_epsilon(3, u[2]),u[2])
+ True
+ """
+diff --git a/src/sage/modular/multiple_zeta.py b/src/sage/modular/multiple_zeta.py
+index 540e29d0e5..d534ac776b 100644
+--- a/src/sage/modular/multiple_zeta.py
++++ b/src/sage/modular/multiple_zeta.py
+@@ -455,7 +455,7 @@ class MultizetaValues(UniqueRepresentation):
+ """
+ self.prec = int(prec)
+ self.max_weight = int(max_weight)
+- self._data = pari.zetamultall(self.max_weight, self.prec)
++ self._data = pari.zetamultall(self.max_weight, 0, self.prec)
+
+ def update(self, max_weight, prec):
+ """
+diff --git a/src/sage/modules/fg_pid/fgp_element.py b/src/sage/modules/fg_pid/fgp_element.py
+index 53857d31a0..6557b7f308 100644
+--- a/src/sage/modules/fg_pid/fgp_element.py
++++ b/src/sage/modules/fg_pid/fgp_element.py
+@@ -39,7 +39,7 @@ class FGP_Element(ModuleElement):
+ sage: V = span([[1/2,1,1],[3/2,2,1],[0,0,1]],ZZ); W = V.span([2*V.0+4*V.1, 9*V.0+12*V.1, 4*V.2])
+ sage: Q = V/W
+ sage: x = Q(V.0-V.1); x #indirect doctest
+- (0, 3)
++ (0, 9)
+ sage: isinstance(x, sage.modules.fg_pid.fgp_element.FGP_Element)
+ True
+ sage: type(x)
+@@ -94,14 +94,14 @@ class FGP_Element(ModuleElement):
+ sage: Q.1
+ (0, 1)
+ sage: Q.0.lift()
+- (0, 0, 1)
++ (0, -6, 1)
+ sage: Q.1.lift()
+- (0, 2, 0)
++ (0, -2, 0)
+ sage: x = Q(V.0); x
+- (0, 4)
++ (0, 8)
+ sage: x.lift()
+ (1/2, 0, 0)
+- sage: x == 4*Q.1
++ sage: x == 8*Q.1
+ True
+ sage: x.lift().parent() == V
+ True
+@@ -158,9 +158,9 @@ class FGP_Element(ModuleElement):
+ We test canonical coercion from V and W.
+
+ sage: Q.0 + V.0
+- (1, 4)
++ (1, 8)
+ sage: V.0 + Q.0
+- (1, 4)
++ (1, 8)
+ sage: W.0 + Q.0
+ (1, 0)
+ sage: W.0 + Q.0 == Q.0
+@@ -291,7 +291,7 @@ class FGP_Element(ModuleElement):
+ sage: V = span([[1/2,1,1],[3/2,2,1],[0,0,1]],ZZ); W = V.span([2*V.0+4*V.1, 9*V.0+12*V.1, 4*V.2])
+ sage: Q = V/W
+ sage: Q(V.1)._repr_()
+- '(0, 1)'
++ '(0, 11)'
+ """
+ return repr(self.vector())
+
+diff --git a/src/sage/modules/fg_pid/fgp_module.py b/src/sage/modules/fg_pid/fgp_module.py
+index b111d7fb32..c518d7479a 100644
+--- a/src/sage/modules/fg_pid/fgp_module.py
++++ b/src/sage/modules/fg_pid/fgp_module.py
+@@ -70,17 +70,17 @@ the technical note has a V that need not be equal to V0, in general. ::
+ sage: M0.optimized()[0].V()
+ Free module of degree 3 and rank 2 over Integer Ring
+ User basis matrix:
+- [0 0 1]
+- [0 2 0]
++ [ 0 -8 1]
++ [ 0 -2 0]
+
+ Create elements of M0 either by coercing in elements of V0, getting generators,
+ or coercing in a list or tuple or coercing in 0. Finally, one can express an
+ element as a linear combination of the smith form generators ::
+
+ sage: M0(V0.0)
+- (0, 14)
++ (0, 2)
+ sage: M0(V0.0 + W0.0) # no difference modulo W0
+- (0, 14)
++ (0, 2)
+ sage: M0.linear_combination_of_smith_form_gens([3,20])
+ (3, 4)
+ sage: 3*M0.0 + 20*M0.1
+@@ -93,9 +93,9 @@ coerces to V0, then take the equivalence class modulo W0. ::
+ sage: x = M0.0 - M0.1; x
+ (1, 15)
+ sage: x.lift()
+- (0, -2, 1)
++ (0, -6, 1)
+ sage: M0(vector([1/2,0,0]))
+- (0, 14)
++ (0, 2)
+ sage: x.additive_order()
+ 16
+
+@@ -143,7 +143,7 @@ You can explicitly coerce elements of the kernel into M0 though. ::
+ sage: M0(K.0)
+ (2, 0)
+ sage: M0(K.1)
+- (3, 1)
++ (1, 13)
+ sage: f(M0(K.0))
+ (0)
+ sage: f(M0(K.1))
+@@ -179,7 +179,7 @@ TESTS::
+ sage: Q.linear_combination_of_smith_form_gens([1,3])
+ (1, 3)
+ sage: Q(V([1,3,4]))
+- (0, 11)
++ (0, 1)
+ sage: Q(W([1,16,0]))
+ (0, 0)
+ sage: V = span([[1/2,1,1],[3/2,2,1],[0,0,1]],QQ)
+@@ -632,7 +632,7 @@ class FGP_Module_class(Module):
+ sage: W = V.span([2*V.0+4*V.1, 9*V.0+12*V.1, 4*V.2])
+ sage: Q = V/W
+ sage: x = Q(V.0-V.1); x # indirect doctest
+- (0, 3)
++ (0, 9)
+ sage: type(x)
+ <class 'sage.modules.fg_pid.fgp_module.FGP_Module_class_with_category.element_class'>
+ sage: x is Q(x)
+@@ -931,9 +931,9 @@ class FGP_Module_class(Module):
+ sage: Q = V/W
+ sage: Q._smith_form()
+ (
+- [ 1 0 0] [1 0 0] [ 1 0 -8]
+- [ 0 4 0] [0 0 1] [ 0 0 1]
+- [ 0 0 12], [0 1 0], [ 0 1 0]
++ [ 1 0 0] [ 1 0 1] [ 1 -4 20]
++ [ 0 4 0] [ 0 -1 1] [ 0 0 -1]
++ [ 0 0 12], [ 0 -1 0], [ 0 1 -3]
+ )
+ """
+ return self._relative_matrix().smith_form()
+@@ -1026,7 +1026,7 @@ class FGP_Module_class(Module):
+ sage: Q.smith_form_gens()
+ ((1, 0), (0, 1))
+ sage: [x.lift() for x in Q.smith_form_gens()]
+- [(0, 0, 1), (0, 1, 0)]
++ [(0, -3, 1), (0, -1, 0)]
+ """
+ # Get the rightmost transformation in the Smith form
+ _, _, X = self._smith_form()
+@@ -1067,18 +1067,18 @@ class FGP_Module_class(Module):
+ [ 0 0 0 1/3 0]
+ [ 0 0 0 0 2/3]
+ sage: D.gens_to_smith()
+- [0 3 0]
++ [0 3 6]
+ [0 0 3]
+- [0 2 0]
+- [1 0 0]
+- [0 0 4]
++ [0 4 4]
++ [1 2 0]
++ [0 0 8]
+ sage: T = D.gens_to_smith()*D.smith_to_gens()
+ sage: T
+- [ 3 0 15 0 0]
+- [ 0 33 0 0 3]
+- [ 2 0 10 0 0]
+- [ 0 0 0 1 0]
+- [ 0 44 0 0 4]
++ [27 48 3 0 60]
++ [12 21 0 0 24]
++ [20 36 4 0 48]
++ [ 2 4 3 1 9]
++ [32 56 0 0 64]
+
+ The matrix `T` now satisfies a certain congruence::
+
+@@ -1120,14 +1120,14 @@ class FGP_Module_class(Module):
+ [ 0 0 0 1/3 0]
+ [ 0 0 0 0 2/3]
+ sage: D.smith_to_gens()
+- [ 0 0 0 1 0]
+- [ 1 0 5 0 0]
+- [ 0 11 0 0 1]
++ [0 0 1 1 1]
++ [1 2 1 0 4]
++ [4 7 0 0 8]
+ sage: T = D.smith_to_gens()*D.gens_to_smith()
+ sage: T
+- [ 1 0 0]
+- [ 0 13 0]
+- [ 0 0 37]
++ [ 1 6 12]
++ [ 0 7 48]
++ [ 0 12 109]
+
+ This matrix satisfies the congruence::
+
+@@ -1148,7 +1148,7 @@ class FGP_Module_class(Module):
+ of the user defined generators that is x::
+
+ sage: x.vector() * D.smith_to_gens()
+- (2, 33, 10, 1, 3)
++ (14, 25, 3, 1, 33)
+ """
+ if self.base_ring() != ZZ:
+ # it is not
+@@ -1196,7 +1196,7 @@ class FGP_Module_class(Module):
+ sage: gens = [V(g) for g in gens]
+ sage: D = FGP_with_gens(V, W, gens)
+ sage: D.gens()
+- ((0, 3, 0), (0, 0, 3), (0, 2, 0), (1, 0, 0), (0, 0, 8))
++ ((0, 3, 6), (0, 0, 9), (0, 4, 4), (1, 2, 0), (0, 0, 4))
+
+
+ We create some element of D::
+@@ -1209,12 +1209,12 @@ class FGP_Module_class(Module):
+
+ sage: v = D.gens_vector(x)
+ sage: v
+- (2, 9, 10, 1, 33)
++ (26, 11, 3, 1, 18)
+
+ The output can be further reduced::
+
+ sage: D.gens_vector(x, reduce=True)
+- (0, 1, 1, 1, 0)
++ (0, 3, 0, 1, 0)
+
+ Let us check::
+
+@@ -1278,28 +1278,28 @@ class FGP_Module_class(Module):
+ sage: O.V()
+ Free module of degree 3 and rank 2 over Integer Ring
+ User basis matrix:
+- [0 0 1]
+- [0 2 0]
++ [ 0 -6 1]
++ [ 0 -2 0]
+ sage: phi = Q.hom([Q.0, 4*Q.1])
+ sage: x = Q(V.0); x
+- (0, 4)
++ (0, 8)
+ sage: Q.coordinate_vector(x, reduce=True)
+- (0, 4)
++ (0, 8)
+ sage: Q.coordinate_vector(-x, reduce=False) # random
+- (0, -4)
+- sage: x == 4*Q.1
++ (0, -8)
++ sage: x == 8*Q.1
+ True
+ sage: x = Q(V.1); x
+- (0, 1)
++ (0, 11)
+ sage: Q.coordinate_vector(x)
+- (0, 1)
+- sage: x == Q.1
++ (0, -1)
++ sage: x == -Q.1
+ True
+ sage: x = Q(V.2); x
+- (1, 0)
++ (1, 9)
+ sage: Q.coordinate_vector(x)
+- (1, 0)
+- sage: x == Q.0
++ (1, -3)
++ sage: x == Q.0-3*Q.1
+ True
+ """
+ try:
+@@ -1407,8 +1407,8 @@ class FGP_Module_class(Module):
+ sage: O.V()
+ Free module of degree 3 and rank 2 over Integer Ring
+ User basis matrix:
+- [0 0 1]
+- [0 1 0]
++ [ 0 -3 1]
++ [ 0 -1 0]
+ sage: O.W()
+ Free module of degree 3 and rank 2 over Integer Ring
+ Echelon basis matrix:
+@@ -1699,7 +1699,7 @@ class FGP_Module_class(Module):
+ sage: V = span([[1/2,1,1],[3/2,2,1],[0,0,1]],ZZ); W = V.span([2*V.0+4*V.1, 9*V.0+12*V.1, 4*V.2])
+ sage: Q = V/W
+ sage: Q.random_element()
+- (1, 10)
++ (1, 11)
+ """
+ return self(self._V.random_element(*args, **kwds))
+
+diff --git a/src/sage/modules/fg_pid/fgp_morphism.py b/src/sage/modules/fg_pid/fgp_morphism.py
+index 1944b3777b..91dbc39589 100644
+--- a/src/sage/modules/fg_pid/fgp_morphism.py
++++ b/src/sage/modules/fg_pid/fgp_morphism.py
+@@ -259,20 +259,20 @@ class FGP_Morphism(Morphism):
+ sage: O.V()
+ Free module of degree 3 and rank 2 over Integer Ring
+ User basis matrix:
+- [0 0 1]
+- [0 2 0]
++ [ 0 -6 1]
++ [ 0 -2 0]
+ sage: phi = Q.hom([Q.0, 4*Q.1])
+ sage: x = Q(V.0); x
+- (0, 4)
+- sage: x == 4*Q.1
++ (0, 8)
++ sage: x == 8*Q.1
+ True
+ sage: x in O.V()
+ False
+ sage: phi(x)
+- (0, 4)
++ (0, 8)
+ sage: phi(4*Q.1)
+ (0, 4)
+- sage: phi(4*Q.1) == phi(x)
++ sage: phi(8*Q.1) == phi(x)
+ True
+ """
+ from .fgp_module import is_FGP_Module
+diff --git a/src/sage/modules/torsion_quadratic_module.py b/src/sage/modules/torsion_quadratic_module.py
+index 39e7065ac4..6086d1180d 100644
+--- a/src/sage/modules/torsion_quadratic_module.py
++++ b/src/sage/modules/torsion_quadratic_module.py
+@@ -1230,24 +1230,24 @@ class TorsionQuadraticModule(FGP_Module_class, CachedRepresentation):
+ sage: q.twist(-1)
+ Finite quadratic module over Integer Ring with invariants (3, 9)
+ Gram matrix of the quadratic form with values in Q/Z:
+- [2/3 0]
+- [ 0 8/9]
++ [2/3 1/3]
++ [1/3 8/9]
+
+ This form is defined modulo `3`::
+
+ sage: q.twist(3)
+ Finite quadratic module over Integer Ring with invariants (3, 9)
+ Gram matrix of the quadratic form with values in Q/3Z:
+- [ 1 0]
+- [ 0 1/3]
++ [ 1 2]
++ [ 2 1/3]
+
+ The next form is defined modulo `4`::
+
+ sage: q.twist(4)
+ Finite quadratic module over Integer Ring with invariants (3, 9)
+ Gram matrix of the quadratic form with values in Q/4Z:
+- [4/3 0]
+- [ 0 4/9]
++ [4/3 8/3]
++ [8/3 4/9]
+ """
+ s = self.base_ring().fraction_field()(s)
+ n = self.V().degree()
+diff --git a/src/sage/quadratic_forms/genera/genus.py b/src/sage/quadratic_forms/genera/genus.py
+index 52435da65e..9037a85bc5 100644
+--- a/src/sage/quadratic_forms/genera/genus.py
++++ b/src/sage/quadratic_forms/genera/genus.py
+@@ -2661,18 +2661,18 @@ class GenusSymbol_global_ring(object):
+ sage: GS.discriminant_form()
+ Finite quadratic module over Integer Ring with invariants (2, 2, 4, 24)
+ Gram matrix of the quadratic form with values in Q/2Z:
+- [ 1/2 0 0 0]
+- [ 0 3/2 0 0]
+- [ 0 0 7/4 0]
+- [ 0 0 0 7/24]
++ [ 1/2 0 0 0]
++ [ 0 1/2 1/2 0]
++ [ 0 1/2 7/4 0]
++ [ 0 0 0 31/24]
+ sage: A = matrix.diagonal(ZZ, [1,-4,6,8])
+ sage: GS = Genus(A)
+ sage: GS.discriminant_form()
+ Finite quadratic module over Integer Ring with invariants (2, 4, 24)
+ Gram matrix of the quadratic form with values in Q/Z:
+- [ 1/2 0 0]
+- [ 0 3/4 0]
+- [ 0 0 7/24]
++ [ 1/2 1/2 0]
++ [ 1/2 3/4 0]
++ [ 0 0 19/24]
+ """
+ from sage.modules.torsion_quadratic_module import TorsionQuadraticForm
+ qL = []
+diff --git a/src/sage/rings/finite_rings/finite_field_constructor.py b/src/sage/rings/finite_rings/finite_field_constructor.py
+index 80cf269cc0..9cb22461a0 100644
+--- a/src/sage/rings/finite_rings/finite_field_constructor.py
++++ b/src/sage/rings/finite_rings/finite_field_constructor.py
+@@ -285,11 +285,6 @@ class FiniteFieldFactory(UniqueFactory):
+ (a generator of the multiplicative group), use
+ ``modulus="primitive"`` if you need this::
+
+- sage: K.<a> = GF(5^40)
+- sage: a.multiplicative_order()
+- 189478062869360049565633138
+- sage: a.is_square()
+- True
+ sage: K.<b> = GF(5^40, modulus="primitive")
+ sage: b.multiplicative_order()
+ 9094947017729282379150390624
+diff --git a/src/sage/rings/finite_rings/integer_mod_ring.py b/src/sage/rings/finite_rings/integer_mod_ring.py
+index d5072839b2..315aa4f9be 100644
+--- a/src/sage/rings/finite_rings/integer_mod_ring.py
++++ b/src/sage/rings/finite_rings/integer_mod_ring.py
+@@ -627,7 +627,7 @@ class IntegerModRing_generic(quotient_ring.QuotientRing_generic):
+ sage: Integers(5).multiplicative_subgroups()
+ ((2,), (4,), ())
+ sage: Integers(15).multiplicative_subgroups()
+- ((11, 7), (4, 11), (8,), (11,), (14,), (7,), (4,), ())
++ ((14, 13), (4, 11), (8,), (11,), (14,), (7,), (4,), ())
+ sage: Integers(2).multiplicative_subgroups()
+ ((),)
+ sage: len(Integers(341).multiplicative_subgroups())
+diff --git a/src/sage/rings/finite_rings/residue_field.pyx b/src/sage/rings/finite_rings/residue_field.pyx
+index cd4c2212c3..007a68e4c0 100644
+--- a/src/sage/rings/finite_rings/residue_field.pyx
++++ b/src/sage/rings/finite_rings/residue_field.pyx
+@@ -1055,7 +1055,7 @@ cdef class ReductionMap(Map):
+ sage: f = k.convert_map_from(K)
+ sage: s = f.section(); s
+ Lifting map:
+- From: Residue field in abar of Fractional ideal (14*a^4 - 24*a^3 - 26*a^2 + 58*a - 15)
++ From: Residue field in abar of Fractional ideal (-14*a^4 + 24*a^3 + 26*a^2 - 58*a + 15)
+ To: Number Field in a with defining polynomial x^5 - 5*x + 2
+ sage: s(k.gen())
+ a
+@@ -1268,7 +1268,7 @@ cdef class ResidueFieldHomomorphism_global(RingHomomorphism):
+ sage: f = k.coerce_map_from(K.ring_of_integers())
+ sage: s = f.section(); s
+ Lifting map:
+- From: Residue field in abar of Fractional ideal (14*a^4 - 24*a^3 - 26*a^2 + 58*a - 15)
++ From: Residue field in abar of Fractional ideal (-14*a^4 + 24*a^3 + 26*a^2 - 58*a + 15)
+ To: Maximal Order in Number Field in a with defining polynomial x^5 - 5*x + 2
+ sage: s(k.gen())
+ a
+@@ -1371,10 +1371,10 @@ cdef class LiftingMap(Section):
+ sage: F = K.factor(7)[0][0].residue_field()
+ sage: L = F.lift_map(); L
+ Lifting map:
+- From: Residue field in abar of Fractional ideal (-2*a^4 + a^3 - 4*a^2 + 2*a - 1)
++ From: Residue field in abar of Fractional ideal (2*a^4 - a^3 + 4*a^2 - 2*a + 1)
+ To: Maximal Order in Number Field in a with defining polynomial x^5 + 2
+ sage: L.domain()
+- Residue field in abar of Fractional ideal (-2*a^4 + a^3 - 4*a^2 + 2*a - 1)
++ Residue field in abar of Fractional ideal (2*a^4 - a^3 + 4*a^2 - 2*a + 1)
+
+ sage: K.<a> = CyclotomicField(7)
+ sage: F = K.factor(5)[0][0].residue_field()
+@@ -1498,7 +1498,7 @@ cdef class LiftingMap(Section):
+ sage: F.<tmod> = K.factor(7)[0][0].residue_field()
+ sage: F.lift_map() #indirect doctest
+ Lifting map:
+- From: Residue field in tmod of Fractional ideal (-3*theta_12^2 + 1)
++ From: Residue field in tmod of Fractional ideal (theta_12^2 + 2)
+ To: Maximal Order in Cyclotomic Field of order 12 and degree 4
+ """
+ return "Lifting"
+@@ -1515,7 +1515,7 @@ class ResidueFiniteField_prime_modn(ResidueField_generic, FiniteField_prime_modn
+ sage: P = K.ideal(29).factor()[1][0]
+ sage: k = ResidueField(P)
+ sage: k
+- Residue field of Fractional ideal (a^2 + 2*a + 2)
++ Residue field of Fractional ideal (-a^2 - 2*a - 2)
+ sage: k.order()
+ 29
+ sage: OK = K.maximal_order()
+@@ -1597,7 +1597,7 @@ class ResidueFiniteField_prime_modn(ResidueField_generic, FiniteField_prime_modn
+ sage: P = K.ideal(29).factor()[1][0]
+ sage: k = ResidueField(P)
+ sage: k
+- Residue field of Fractional ideal (a^2 + 2*a + 2)
++ Residue field of Fractional ideal (-a^2 - 2*a - 2)
+ sage: OK = K.maximal_order()
+ sage: c = OK(a)
+ sage: b = k(a); b
+diff --git a/src/sage/rings/integer.pyx b/src/sage/rings/integer.pyx
+index d9c83f3e3c..31d0e61efb 100644
+--- a/src/sage/rings/integer.pyx
++++ b/src/sage/rings/integer.pyx
+@@ -5451,7 +5451,7 @@ cdef class Integer(sage.structure.element.EuclideanDomainElement):
+ sage: 3._bnfisnorm(QuadraticField(-1, 'i'))
+ (1, 3)
+ sage: 7._bnfisnorm(CyclotomicField(7))
+- (-zeta7^5 - zeta7^4 - 2*zeta7^3 - zeta7^2 - zeta7 - 1, 1)
++ (zeta7^5 - zeta7^2, 1)
+ """
+ from sage.rings.rational_field import QQ
+ return QQ(self)._bnfisnorm(K, proof=proof, extra_primes=extra_primes)
+diff --git a/src/sage/rings/number_field/S_unit_solver.py b/src/sage/rings/number_field/S_unit_solver.py
+index 5df5526445..45c59e7e4f 100644
+--- a/src/sage/rings/number_field/S_unit_solver.py
++++ b/src/sage/rings/number_field/S_unit_solver.py
+@@ -24,10 +24,10 @@ EXAMPLES::
+ sage: from sage.rings.number_field.S_unit_solver import solve_S_unit_equation, eq_up_to_order
+ sage: K.<xi> = NumberField(x^2+x+1)
+ sage: S = K.primes_above(3)
+- sage: expected = [((2, 1), (4, 0), xi + 2, -xi - 1),
+- ....: ((5, -1), (4, -1), 1/3*xi + 2/3, -1/3*xi + 1/3),
+- ....: ((5, 0), (1, 0), -xi, xi + 1),
+- ....: ((1, 1), (2, 0), -xi + 1, xi)]
++ sage: expected = [((0, 1), (4, 0), xi + 2, -xi - 1),
++ ....: ((1, -1), (0, -1), 1/3*xi + 2/3, -1/3*xi + 1/3),
++ ....: ((1, 0), (5, 0), xi + 1, -xi),
++ ....: ((2, 0), (5, 1), xi, -xi + 1)]
+ sage: sols = solve_S_unit_equation(K, S, 200)
+ sage: eq_up_to_order(sols, expected)
+ True
+@@ -1781,20 +1781,20 @@ def sieve_ordering(SUK, q):
+ sage: SUK = K.S_unit_group(S=3)
+ sage: sieve_data = list(sieve_ordering(SUK, 19))
+ sage: sieve_data[0]
+- (Fractional ideal (-2*xi^2 + 3),
+- Fractional ideal (xi - 3),
+- Fractional ideal (2*xi + 1))
++ (Fractional ideal (xi - 3),
++ Fractional ideal (-2*xi^2 + 3),
++ Fractional ideal (2*xi + 1))
+
+ sage: sieve_data[1]
+- (Residue field of Fractional ideal (-2*xi^2 + 3),
+- Residue field of Fractional ideal (xi - 3),
+- Residue field of Fractional ideal (2*xi + 1))
++ (Residue field of Fractional ideal (xi - 3),
++ Residue field of Fractional ideal (-2*xi^2 + 3),
++ Residue field of Fractional ideal (2*xi + 1))
+
+ sage: sieve_data[2]
+- ([18, 9, 16, 8], [18, 7, 10, 4], [18, 3, 12, 10])
++ ([18, 7, 16, 4], [18, 9, 12, 8], [18, 3, 10, 10])
+
+ sage: sieve_data[3]
+- (972, 972, 3888)
++ (486, 648, 11664)
+ """
+
+ K = SUK.number_field()
+@@ -2655,10 +2655,10 @@ def sieve_below_bound(K, S, bound=10, bump=10, split_primes_list=[], verbose=Fal
+ sage: S = SUK.primes()
+ sage: sols = sieve_below_bound(K, S, 10)
+ sage: expected = [
+- ....: ((5, -1), (4, -1), 1/3*xi + 2/3, -1/3*xi + 1/3),
+- ....: ((2, 1), (4, 0), xi + 2, -xi - 1),
+- ....: ((2, 0), (1, 1), xi, -xi + 1),
+- ....: ((5, 0), (1, 0), -xi, xi + 1)]
++ ....: ((1, -1), (0, -1), 1/3*xi + 2/3, -1/3*xi + 1/3),
++ ....: ((0, 1), (4, 0), xi + 2, -xi - 1),
++ ....: ((2, 0), (5, 1), xi, -xi + 1),
++ ....: ((1, 0), (5, 0), xi + 1, -xi)]
+ sage: eq_up_to_order(sols, expected)
+ True
+ """
+@@ -2716,10 +2716,10 @@ def solve_S_unit_equation(K, S, prec=106, include_exponents=True, include_bound=
+ sage: S = K.primes_above(3)
+ sage: sols = solve_S_unit_equation(K, S, 200)
+ sage: expected = [
+- ....: ((2, 1), (4, 0), xi + 2, -xi - 1),
+- ....: ((5, -1), (4, -1), 1/3*xi + 2/3, -1/3*xi + 1/3),
+- ....: ((5, 0), (1, 0), -xi, xi + 1),
+- ....: ((1, 1), (2, 0), -xi + 1, xi)]
++ ....: ((0, 1), (4, 0), xi + 2, -xi - 1),
++ ....: ((1, -1), (0, -1), 1/3*xi + 2/3, -1/3*xi + 1/3),
++ ....: ((1, 0), (5, 0), xi + 1, -xi),
++ ....: ((2, 0), (5, 1), xi, -xi + 1)]
+ sage: eq_up_to_order(sols, expected)
+ True
+
+@@ -2727,7 +2727,7 @@ def solve_S_unit_equation(K, S, prec=106, include_exponents=True, include_bound=
+
+ sage: solutions, bound = solve_S_unit_equation(K, S, 100, include_bound=True)
+ sage: bound
+- 6
++ 7
+
+ You can omit the exponent vectors::
+
+diff --git a/src/sage/rings/number_field/class_group.py b/src/sage/rings/number_field/class_group.py
+index 46d0ca8c9d..1ad6d583a8 100644
+--- a/src/sage/rings/number_field/class_group.py
++++ b/src/sage/rings/number_field/class_group.py
+@@ -157,7 +157,7 @@ class FractionalIdealClass(AbelianGroupWithValuesElement):
+ sage: C=K.class_group()
+ sage: c = C(2, a)
+ sage: c^2
+- Fractional ideal class (2, a^2 + 2*a - 1)
++ Fractional ideal class (4, a)
+ sage: c^3
+ Trivial principal fractional ideal class
+ sage: c^1000
+@@ -467,7 +467,7 @@ class ClassGroup(AbelianGroupWithValues_class):
+ sage: CK = K.class_group()
+ sage: CL = L.class_group()
+ sage: [CL(I).exponents() for I in CK]
+- [(0,), (4,), (2,)]
++ [(0,), (2,), (4,)]
+ """
+ if isinstance(args[0], FractionalIdealClass):
+ return self.element_class(self, None, self._number_field.ideal(args[0].ideal()))
+diff --git a/src/sage/rings/number_field/number_field.py b/src/sage/rings/number_field/number_field.py
+index b1de87b926..0123ea2c13 100644
+--- a/src/sage/rings/number_field/number_field.py
++++ b/src/sage/rings/number_field/number_field.py
+@@ -3422,7 +3422,7 @@ class NumberField_generic(WithEqualityById, number_field_base.NumberField):
+ sage: L.<b> = K.extension(x^2 - 3, x^2 + 1)
+ sage: M.<c> = L.extension(x^2 + 1)
+ sage: L.ideal(K.ideal(2, a))
+- Fractional ideal (a)
++ Fractional ideal (-a)
+ sage: M.ideal(K.ideal(2, a)) == M.ideal(a*(b - c)/2)
+ True
+
+@@ -4128,20 +4128,6 @@ class NumberField_generic(WithEqualityById, number_field_base.NumberField):
+ Traceback (most recent call last):
+ ...
+ RuntimeError: Unable to factor discriminant with trial division
+-
+- Next, we illustrate the ``maximize_at_primes`` and ``assume_disc_small``
+- parameters of the ``NumberField`` constructor. The following would take
+- a very long time without the ``maximize_at_primes`` option::
+-
+- sage: K.<a> = NumberField(x^2 - p*q, maximize_at_primes=[p])
+- sage: K.pari_nf()
+- [y^2 - 100000000000000000000...]
+-
+- Since the discriminant is square-free, this also works::
+-
+- sage: K.<a> = NumberField(x^2 - p*q, assume_disc_small=True)
+- sage: K.pari_nf()
+- [y^2 - 100000000000000000000...]
+ """
+ try:
+ return self._pari_nf
+@@ -4590,7 +4576,7 @@ class NumberField_generic(WithEqualityById, number_field_base.NumberField):
+ 1/13*a^2 + 7/13*a - 332/13,
+ -1/13*a^2 + 6/13*a + 345/13,
+ -1,
+- 2/13*a^2 + 1/13*a - 755/13]
++ -2/13*a^2 - 1/13*a + 755/13]
+ sage: units[5] in (1/13*a^2 - 19/13*a - 7/13, 1/13*a^2 + 20/13*a - 7/13)
+ True
+ sage: len(units) == 6
+@@ -4632,8 +4618,8 @@ class NumberField_generic(WithEqualityById, number_field_base.NumberField):
+ sage: K.<a> = QuadraticField(-105)
+ sage: K._S_class_group_quotient_matrix((K.ideal(11, a + 4),))
+ [0 0]
+- [1 0]
+ [0 1]
++ [1 0]
+ """
+ from sage.matrix.constructor import matrix
+ S_clgp_gens = self._S_class_group_and_units(S)[1]
+@@ -4754,7 +4740,7 @@ class NumberField_generic(WithEqualityById, number_field_base.NumberField):
+ 1/13*a^2 + 7/13*a - 332/13,
+ -1/13*a^2 + 6/13*a + 345/13,
+ -1,
+- 2/13*a^2 + 1/13*a - 755/13]
++ -2/13*a^2 - 1/13*a + 755/13]
+ sage: gens[5] in (1/13*a^2 - 19/13*a - 7/13, 1/13*a^2 + 20/13*a - 7/13)
+ True
+ sage: gens[6] in (-1/13*a^2 + 45/13*a - 97/13, 1/13*a^2 - 45/13*a + 97/13)
+@@ -6659,7 +6645,7 @@ class NumberField_generic(WithEqualityById, number_field_base.NumberField):
+ sage: A = x^4 - 10*x^3 + 20*5*x^2 - 15*5^2*x + 11*5^3
+ sage: K = NumberField(A, 'a')
+ sage: K.units()
+- (8/275*a^3 - 12/55*a^2 + 15/11*a - 3,)
++ (-1/275*a^3 - 4/55*a^2 + 5/11*a - 3,)
+
+ For big number fields, provably computing the unit group can
+ take a very long time. In this case, one can ask for the
+@@ -6670,14 +6656,14 @@ class NumberField_generic(WithEqualityById, number_field_base.NumberField):
+ sage: K.units(proof=True) # takes forever, not tested
+ ...
+ sage: K.units(proof=False) # result not independently verified
+- (a^9 + a - 1,
+- a^15 - a^12 + a^10 - a^9 - 2*a^8 + 3*a^7 + a^6 - 3*a^5 + a^4 + 4*a^3 - 3*a^2 - 2*a + 2,
+- a^16 - a^15 + a^14 - a^12 + a^11 - a^10 - a^8 + a^7 - 2*a^6 + a^4 - 3*a^3 + 2*a^2 - 2*a + 1,
++ (-a^9 - a + 1,
++ -a^16 + a^15 - a^14 + a^12 - a^11 + a^10 + a^8 - a^7 + 2*a^6 - a^4 + 3*a^3 - 2*a^2 + 2*a - 1,
+ 2*a^16 - a^14 - a^13 + 3*a^12 - 2*a^10 + a^9 + 3*a^8 - 3*a^6 + 3*a^5 + 3*a^4 - 2*a^3 - 2*a^2 + 3*a + 4,
+- 2*a^16 - 3*a^15 + 3*a^14 - 3*a^13 + 3*a^12 - a^11 + a^9 - 3*a^8 + 4*a^7 - 5*a^6 + 6*a^5 - 4*a^4 + 3*a^3 - 2*a^2 - 2*a + 4,
+- a^16 - a^15 - 3*a^14 - 4*a^13 - 4*a^12 - 3*a^11 - a^10 + 2*a^9 + 4*a^8 + 5*a^7 + 4*a^6 + 2*a^5 - 2*a^4 - 6*a^3 - 9*a^2 - 9*a - 7,
+ a^15 + a^14 + 2*a^11 + a^10 - a^9 + a^8 + 2*a^7 - a^5 + 2*a^3 - a^2 - 3*a + 1,
+- 5*a^16 - 6*a^14 + a^13 + 7*a^12 - 2*a^11 - 7*a^10 + 4*a^9 + 7*a^8 - 6*a^7 - 7*a^6 + 8*a^5 + 6*a^4 - 11*a^3 - 5*a^2 + 13*a + 4)
++ -a^16 - a^15 - a^14 - a^13 - a^12 - a^11 - a^10 - a^9 - a^8 - a^7 - a^6 - a^5 - a^4 - a^3 - a^2 + 2,
++ -2*a^16 + 3*a^15 - 3*a^14 + 3*a^13 - 3*a^12 + a^11 - a^9 + 3*a^8 - 4*a^7 + 5*a^6 - 6*a^5 + 4*a^4 - 3*a^3 + 2*a^2 + 2*a - 4,
++ a^15 - a^12 + a^10 - a^9 - 2*a^8 + 3*a^7 + a^6 - 3*a^5 + a^4 + 4*a^3 - 3*a^2 - 2*a + 2,
++ -a^14 - a^13 + a^12 + 2*a^10 + a^8 - 2*a^7 - 2*a^6 + 2*a^3 - a^2 + 2*a - 2)
+
+ TESTS:
+
+@@ -6686,7 +6672,7 @@ class NumberField_generic(WithEqualityById, number_field_base.NumberField):
+
+ sage: K.<a> = NumberField(1/2*x^2 - 1/6)
+ sage: K.units()
+- (3*a - 2,)
++ (-3*a + 2,)
+ """
+ proof = proof_flag(proof)
+
+@@ -6765,7 +6751,7 @@ class NumberField_generic(WithEqualityById, number_field_base.NumberField):
+ sage: U.gens()
+ (u0, u1, u2, u3, u4, u5, u6, u7, u8)
+ sage: U.gens_values() # result not independently verified
+- [-1, a^9 + a - 1, a^15 - a^12 + a^10 - a^9 - 2*a^8 + 3*a^7 + a^6 - 3*a^5 + a^4 + 4*a^3 - 3*a^2 - 2*a + 2, a^16 - a^15 + a^14 - a^12 + a^11 - a^10 - a^8 + a^7 - 2*a^6 + a^4 - 3*a^3 + 2*a^2 - 2*a + 1, 2*a^16 - a^14 - a^13 + 3*a^12 - 2*a^10 + a^9 + 3*a^8 - 3*a^6 + 3*a^5 + 3*a^4 - 2*a^3 - 2*a^2 + 3*a + 4, 2*a^16 - 3*a^15 + 3*a^14 - 3*a^13 + 3*a^12 - a^11 + a^9 - 3*a^8 + 4*a^7 - 5*a^6 + 6*a^5 - 4*a^4 + 3*a^3 - 2*a^2 - 2*a + 4, a^16 - a^15 - 3*a^14 - 4*a^13 - 4*a^12 - 3*a^11 - a^10 + 2*a^9 + 4*a^8 + 5*a^7 + 4*a^6 + 2*a^5 - 2*a^4 - 6*a^3 - 9*a^2 - 9*a - 7, a^15 + a^14 + 2*a^11 + a^10 - a^9 + a^8 + 2*a^7 - a^5 + 2*a^3 - a^2 - 3*a + 1, 5*a^16 - 6*a^14 + a^13 + 7*a^12 - 2*a^11 - 7*a^10 + 4*a^9 + 7*a^8 - 6*a^7 - 7*a^6 + 8*a^5 + 6*a^4 - 11*a^3 - 5*a^2 + 13*a + 4]
++ [-1, -a^9 - a + 1, -a^16 + a^15 - a^14 + a^12 - a^11 + a^10 + a^8 - a^7 + 2*a^6 - a^4 + 3*a^3 - 2*a^2 + 2*a - 1, 2*a^16 - a^14 - a^13 + 3*a^12 - 2*a^10 + a^9 + 3*a^8 - 3*a^6 + 3*a^5 + 3*a^4 - 2*a^3 - 2*a^2 + 3*a + 4, a^15 + a^14 + 2*a^11 + a^10 - a^9 + a^8 + 2*a^7 - a^5 + 2*a^3 - a^2 - 3*a + 1, -a^16 - a^15 - a^14 - a^13 - a^12 - a^11 - a^10 - a^9 - a^8 - a^7 - a^6 - a^5 - a^4 - a^3 - a^2 + 2, -2*a^16 + 3*a^15 - 3*a^14 + 3*a^13 - 3*a^12 + a^11 - a^9 + 3*a^8 - 4*a^7 + 5*a^6 - 6*a^5 + 4*a^4 - 3*a^3 + 2*a^2 + 2*a - 4, a^15 - a^12 + a^10 - a^9 - 2*a^8 + 3*a^7 + a^6 - 3*a^5 + a^4 + 4*a^3 - 3*a^2 - 2*a + 2, -a^14 - a^13 + a^12 + 2*a^10 + a^8 - 2*a^7 - 2*a^6 + 2*a^3 - a^2 + 2*a - 2]
+ """
+ proof = proof_flag(proof)
+
+@@ -6953,7 +6939,7 @@ class NumberField_generic(WithEqualityById, number_field_base.NumberField):
+
+ sage: solutions, bound = K.S_unit_solutions(S, prec=100, include_bound=True)
+ sage: bound
+- 6
++ 7
+ """
+ from .S_unit_solver import solve_S_unit_equation
+ return solve_S_unit_equation(self, S, prec, include_exponents, include_bound, proof)
+diff --git a/src/sage/rings/number_field/number_field_element.pyx b/src/sage/rings/number_field/number_field_element.pyx
+index 5f62c93af6..6aeed4998e 100644
+--- a/src/sage/rings/number_field/number_field_element.pyx
++++ b/src/sage/rings/number_field/number_field_element.pyx
+@@ -1629,7 +1629,7 @@ cdef class NumberFieldElement(FieldElement):
+ sage: Q.<X> = K[]
+ sage: L.<b> = NumberField(X^4 + a)
+ sage: t = (-a).is_norm(L, element=True); t
+- (True, b^3 + 1)
++ (True, -b^3 - 1)
+ sage: t[1].norm(K)
+ -a
+
+@@ -1744,11 +1744,11 @@ cdef class NumberFieldElement(FieldElement):
+ sage: Q.<X> = K[]
+ sage: L.<b> = NumberField(X^4 + a)
+ sage: t = (-a)._rnfisnorm(L); t
+- (b^3 + 1, 1)
++ (-b^3 - 1, 1)
+ sage: t[0].norm(K)
+ -a
+ sage: t = K(3)._rnfisnorm(L); t
+- (-b^3 - a*b^2 - a^2*b + 1, 3*a^2 - 3*a + 6)
++ (b^3 + a*b^2 + a^2*b - 1, 3*a^2 - 3*a + 6)
+ sage: t[0].norm(K)*t[1]
+ 3
+
+@@ -1801,7 +1801,7 @@ cdef class NumberFieldElement(FieldElement):
+ raise ValueError("L (=%s) must be a relative number field with base field K (=%s) in rnfisnorm" % (L, K))
+
+ rnf_data = K.pari_rnfnorm_data(L, proof=proof)
+- x, q = self.__pari__().rnfisnorm(rnf_data)
++ x, q = pari.rnfisnorm(rnf_data, self)
+ return L(x, check=False), K(q, check=False)
+
+ def _mpfr_(self, R):
+diff --git a/src/sage/rings/number_field/number_field_ideal.py b/src/sage/rings/number_field/number_field_ideal.py
+index 3621d41e11..a5c3f16fff 100644
+--- a/src/sage/rings/number_field/number_field_ideal.py
++++ b/src/sage/rings/number_field/number_field_ideal.py
+@@ -232,7 +232,7 @@ class NumberFieldIdeal(Ideal_generic):
+ sage: K.<a> = NumberField(x^2 + 3); K
+ Number Field in a with defining polynomial x^2 + 3
+ sage: f = K.factor(15); f
+- (Fractional ideal (-a))^2 * (Fractional ideal (5))
++ (Fractional ideal (1/2*a + 3/2))^2 * (Fractional ideal (5))
+ sage: (f[0][0] < f[1][0])
+ True
+ sage: (f[0][0] == f[0][0])
+@@ -621,7 +621,7 @@ class NumberFieldIdeal(Ideal_generic):
+
+ sage: K.<z> = CyclotomicField(7)
+ sage: I = K.factor(11)[0][0]; I
+- Fractional ideal (-2*z^4 - 2*z^2 - 2*z + 1)
++ Fractional ideal (-3*z^4 - 2*z^3 - 2*z^2 - 2)
+ sage: A = I.free_module()
+ sage: A # warning -- choice of basis can be somewhat random
+ Free module of degree 6 and rank 6 over Integer Ring
+@@ -3119,7 +3119,7 @@ class NumberFieldFractionalIdeal(MultiplicativeGroupElement, NumberFieldIdeal):
+ sage: K.<a> = NumberField(x^5 + 2); K
+ Number Field in a with defining polynomial x^5 + 2
+ sage: f = K.factor(19); f
+- (Fractional ideal (a^2 + a - 3)) * (Fractional ideal (-2*a^4 - a^2 + 2*a - 1)) * (Fractional ideal (a^2 + a - 1))
++ (Fractional ideal (a^2 + a - 3)) * (Fractional ideal (2*a^4 + a^2 - 2*a + 1)) * (Fractional ideal (a^2 + a - 1))
+ sage: [i.residue_class_degree() for i, _ in f]
+ [2, 2, 1]
+ """
+diff --git a/src/sage/rings/number_field/number_field_ideal_rel.py b/src/sage/rings/number_field/number_field_ideal_rel.py
+index 4671b71fd2..4cf6b4c658 100644
+--- a/src/sage/rings/number_field/number_field_ideal_rel.py
++++ b/src/sage/rings/number_field/number_field_ideal_rel.py
+@@ -18,7 +18,7 @@ EXAMPLES::
+ sage: G = [from_A(z) for z in I.gens()]; G
+ [7, -2*b*a - 1]
+ sage: K.fractional_ideal(G)
+- Fractional ideal (2*b*a + 1)
++ Fractional ideal ((1/2*b + 2)*a - 1/2*b + 2)
+ sage: K.fractional_ideal(G).absolute_norm().factor()
+ 7^2
+ """
+diff --git a/src/sage/rings/number_field/order.py b/src/sage/rings/number_field/order.py
+index 82e2cd2d07..f15fe4ad17 100644
+--- a/src/sage/rings/number_field/order.py
++++ b/src/sage/rings/number_field/order.py
+@@ -2181,7 +2181,7 @@ def EisensteinIntegers(names="omega"):
+ sage: R
+ Eisenstein Integers in Number Field in omega with defining polynomial x^2 + x + 1 with omega = -0.50000000000000000? + 0.866025403784439?*I
+ sage: factor(3 + omega)
+- (omega) * (-3*omega - 2)
++ (-1) * (-omega - 3)
+ sage: CC(omega)
+ -0.500000000000000 + 0.866025403784439*I
+ sage: omega.minpoly()
+diff --git a/src/sage/rings/number_field/unit_group.py b/src/sage/rings/number_field/unit_group.py
+index 5c94f7407d..47a2755e36 100644
+--- a/src/sage/rings/number_field/unit_group.py
++++ b/src/sage/rings/number_field/unit_group.py
+@@ -15,12 +15,12 @@ The first generator is a primitive root of unity in the field::
+ sage: UK.gens_values() # random
+ [-1/12*a^3 + 1/6*a, 1/24*a^3 + 1/4*a^2 - 1/12*a - 1]
+ sage: UK.gen(0).value()
+- -1/12*a^3 + 1/6*a
++ 1/12*a^3 - 1/6*a
+
+ sage: UK.gen(0)
+ u0
+ sage: UK.gen(0) + K.one() # coerce abstract generator into number field
+- -1/12*a^3 + 1/6*a + 1
++ 1/12*a^3 - 1/6*a + 1
+
+ sage: [u.multiplicative_order() for u in UK.gens()]
+ [4, +Infinity]
+@@ -37,18 +37,18 @@ as elements of an abstract multiplicative group::
+ sage: UK(-1)
+ u0^2
+ sage: [UK(u) for u in (x^4-1).roots(K, multiplicities=False)]
+- [1, u0^2, u0^3, u0]
++ [1, u0^2, u0, u0^3]
+
+ sage: UK.fundamental_units() # random
+ [1/24*a^3 + 1/4*a^2 - 1/12*a - 1]
+ sage: torsion_gen = UK.torsion_generator(); torsion_gen
+ u0
+ sage: torsion_gen.value()
+- -1/12*a^3 + 1/6*a
++ 1/12*a^3 - 1/6*a
+ sage: UK.zeta_order()
+ 4
+ sage: UK.roots_of_unity()
+- [-1/12*a^3 + 1/6*a, -1, 1/12*a^3 - 1/6*a, 1]
++ [1/12*a^3 - 1/6*a, -1, -1/12*a^3 + 1/6*a, 1]
+
+ Exp and log functions provide maps between units as field elements and exponent
+ vectors with respect to the generators::
+@@ -82,7 +82,7 @@ S-unit groups may be constructed, where S is a set of primes::
+ sage: SUK.rank()
+ 4
+ sage: SUK.gens_values()
+- [-1, a^2 + 1, a^5 + a^4 - a^2 - a - 1, a + 1, -a + 1]
++ [-1, a^2 + 1, -a^5 - a^4 + a^2 + a + 1, a + 1, a - 1]
+ sage: u = 9*prod(SUK.gens_values()); u
+ -18*a^5 - 18*a^4 - 18*a^3 - 9*a^2 + 9*a + 27
+ sage: SUK.log(u)
+@@ -100,29 +100,29 @@ A relative number field example::
+ sage: UL.zeta_order()
+ 24
+ sage: UL.roots_of_unity()
+- [-b*a - b,
+- b^2*a,
+- b^3,
+- a + 1,
+- -b*a,
+- -b^2,
+- b^3*a + b^3,
+- a,
+- b,
++ [-b*a,
+ -b^2*a - b^2,
+- b^3*a,
+- -1,
+- b*a + b,
+- -b^2*a,
+ -b^3,
+- -a - 1,
+- b*a,
+- b^2,
+- -b^3*a - b^3,
+ -a,
++ -b*a - b,
++ -b^2,
++ b^3*a,
++ -a - 1,
+ -b,
++ b^2*a,
++ b^3*a + b^3,
++ -1,
++ b*a,
+ b^2*a + b^2,
++ b^3,
++ a,
++ b*a + b,
++ b^2,
+ -b^3*a,
++ a + 1,
++ b,
++ -b^2*a,
++ -b^3*a - b^3,
+ 1]
+
+ A relative extension example, which worked thanks to the code review by F.W.Clarke::
+@@ -199,7 +199,7 @@ class UnitGroup(AbelianGroupWithValues_class):
+ sage: UK.gen(5)
+ u5
+ sage: UK.gen(5).value()
+- z^7 + z
++ -z^7 - z
+
+ An S-unit group::
+
+@@ -216,7 +216,7 @@ class UnitGroup(AbelianGroupWithValues_class):
+ sage: SUK.zeta_order()
+ 26
+ sage: SUK.log(21*z)
+- (12, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1)
++ (25, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1)
+ """
+ # This structure is not a parent in the usual sense. The
+ # "elements" are NumberFieldElement_absolute. Instead, they should
+@@ -250,7 +250,7 @@ class UnitGroup(AbelianGroupWithValues_class):
+ sage: UK.gens()
+ (u0, u1)
+ sage: UK.gens_values()
+- [-1, 6*a - 37]
++ [-1, -6*a + 37]
+
+ sage: K.<a> = QuadraticField(-3)
+ sage: UK = K.unit_group(); UK
+@@ -258,7 +258,7 @@ class UnitGroup(AbelianGroupWithValues_class):
+ sage: UK.gens()
+ (u,)
+ sage: UK.gens_values()
+- [1/2*a + 1/2]
++ [-1/2*a + 1/2]
+
+ sage: K.<z> = CyclotomicField(13)
+ sage: UK = K.unit_group(); UK
+@@ -375,7 +375,7 @@ class UnitGroup(AbelianGroupWithValues_class):
+ sage: UK.gens()
+ (u0, u1)
+ sage: UK.gens_values()
+- [-1, 6*a - 37]
++ [-1, -6*a + 37]
+ sage: UK.ngens()
+ 2
+ sage: [UK(u) for u in UK.gens()]
+@@ -527,9 +527,9 @@ class UnitGroup(AbelianGroupWithValues_class):
+ sage: U.zeta(2, all=True)
+ [-1]
+ sage: U.zeta(3)
+- 1/2*z - 1/2
++ -1/2*z - 1/2
+ sage: U.zeta(3, all=True)
+- [1/2*z - 1/2, -1/2*z - 1/2]
++ [-1/2*z - 1/2, 1/2*z - 1/2]
+ sage: U.zeta(4)
+ Traceback (most recent call last):
+ ...
+@@ -645,7 +645,7 @@ class UnitGroup(AbelianGroupWithValues_class):
+ sage: SUK = UnitGroup(K,S=2)
+ sage: v = (3,1,4,1,5,9,2)
+ sage: u = SUK.exp(v); u
+- -8732*z^11 + 15496*z^10 + 51840*z^9 + 68804*z^8 + 51840*z^7 + 15496*z^6 - 8732*z^5 + 34216*z^3 + 64312*z^2 + 64312*z + 34216
++ 8732*z^11 - 15496*z^10 - 51840*z^9 - 68804*z^8 - 51840*z^7 - 15496*z^6 + 8732*z^5 - 34216*z^3 - 64312*z^2 - 64312*z - 34216
+ sage: SUK.log(u)
+ (3, 1, 4, 1, 5, 9, 2)
+ sage: SUK.log(u) == v
+@@ -692,7 +692,7 @@ class UnitGroup(AbelianGroupWithValues_class):
+ sage: SUK = UnitGroup(K,S=2)
+ sage: v = (3,1,4,1,5,9,2)
+ sage: u = SUK.exp(v); u
+- -8732*z^11 + 15496*z^10 + 51840*z^9 + 68804*z^8 + 51840*z^7 + 15496*z^6 - 8732*z^5 + 34216*z^3 + 64312*z^2 + 64312*z + 34216
++ 8732*z^11 - 15496*z^10 - 51840*z^9 - 68804*z^8 - 51840*z^7 - 15496*z^6 + 8732*z^5 - 34216*z^3 - 64312*z^2 - 64312*z - 34216
+ sage: SUK.log(u)
+ (3, 1, 4, 1, 5, 9, 2)
+ sage: SUK.log(u) == v
+diff --git a/src/sage/rings/polynomial/multi_polynomial_ring.py b/src/sage/rings/polynomial/multi_polynomial_ring.py
+index 20f1574..bf4b831 100644
+--- a/src/sage/rings/polynomial/multi_polynomial_ring.py
++++ b/src/sage/rings/polynomial/multi_polynomial_ring.py
+@@ -526,6 +526,8 @@ class MPolynomialRing_polydict( MPolynomialRing_macaulay2_repr, PolynomialRing_s
+ # univariate polynomials. Below, v is the variable
+ # with highest priority, and the x[i] are expressions
+ # in the remaining variables.
++ if x == 0:
++ return self.zero()
+ v = self.gens_dict_recursive()[str(x.variable())]
+ return sum(self(x[i]) * v ** i for i in range(x.poldegree() + 1))
+ diff --git a/src/sage/rings/polynomial/polynomial_element.pyx b/src/sage/rings/polynomial/polynomial_element.pyx
+index 9855ad13e9..6d13f3cc9e 100644
+--- a/src/sage/rings/polynomial/polynomial_element.pyx
++++ b/src/sage/rings/polynomial/polynomial_element.pyx
+@@ -7528,7 +7528,7 @@ cdef class Polynomial(CommutativeAlgebraElement):
+ [(-3.5074662110434039?e451, 1)]
+ sage: p = bigc*x + 1
+ sage: p.roots(ring=RR)
+- [(0.000000000000000, 1)]
++ [(-2.85106096489671e-452, 1)]
+ sage: p.roots(ring=AA)
+ [(-2.8510609648967059?e-452, 1)]
+ sage: p.roots(ring=QQbar)
+diff --git a/src/sage/rings/polynomial/polynomial_quotient_ring.py b/src/sage/rings/polynomial/polynomial_quotient_ring.py
+index 230dea7fdf..56487f3f4a 100644
+--- a/src/sage/rings/polynomial/polynomial_quotient_ring.py
++++ b/src/sage/rings/polynomial/polynomial_quotient_ring.py
+@@ -1307,7 +1307,16 @@ class PolynomialQuotientRing_generic(CommutativeRing):
+ fixed in :trac:`14489`)::
+
+ sage: S.S_class_group([K.ideal(a)])
+- [((1/4*xbar^2 + 31/4, (-1/8*a + 1/8)*xbar^2 - 31/8*a + 31/8, 1/16*xbar^3 + 1/16*xbar^2 + 31/16*xbar + 31/16, -1/16*a*xbar^3 + (1/16*a + 1/8)*xbar^2 - 31/16*a*xbar + 31/16*a + 31/8), 6), ((-1/4*xbar^2 - 23/4, (1/8*a - 1/8)*xbar^2 + 23/8*a - 23/8, -1/16*xbar^3 - 1/16*xbar^2 - 23/16*xbar - 23/16, 1/16*a*xbar^3 + (-1/16*a - 1/8)*xbar^2 + 23/16*a*xbar - 23/16*a - 23/8), 2)]
++ [((1/4*xbar^2 + 31/4,
++ (-1/8*a + 1/8)*xbar^2 - 31/8*a + 31/8,
++ 1/16*xbar^3 + 1/16*xbar^2 + 31/16*xbar + 31/16,
++ -1/16*a*xbar^3 + (1/16*a + 1/8)*xbar^2 - 31/16*a*xbar + 31/16*a + 31/8),
++ 6),
++ ((-1/4*xbar^2 - 23/4,
++ 1/4*a*xbar^2 + 23/4*a,
++ -1/8*xbar^3 + 1/8*xbar^2 - 23/8*xbar + 23/8,
++ (1/16*a - 1/16)*xbar^3 + (-1/16*a + 1/16)*xbar^2 + (23/16*a - 23/16)*xbar - 23/16*a + 23/16),
++ 2)]
+
+ Note that all the returned values live where we expect them to::
+
+diff --git a/src/sage/schemes/elliptic_curves/ell_finite_field.py b/src/sage/schemes/elliptic_curves/ell_finite_field.py
+index 623b067e27..a4a09b3723 100644
+--- a/src/sage/schemes/elliptic_curves/ell_finite_field.py
++++ b/src/sage/schemes/elliptic_curves/ell_finite_field.py
+@@ -786,11 +786,11 @@ class EllipticCurve_finite_field(EllipticCurve_field, HyperellipticCurve_finite_
+ sage: len(E.gens())
+ 2
+ sage: E.cardinality()
+- 867361737988403547207212930746733987710588
++ 867361737988403547206134229616487867594472
+ sage: E.gens()[0].order()
+- 433680868994201773603606465373366993855294
++ 433680868994201773603067114808243933797236
+ sage: E.gens()[1].order()
+- 433680868994201773603606465373366993855294
++ 433680868994201773603067114808243933797236
+ """
+ G = self.__pari__().ellgroup(flag=1)
+ return tuple(self.point(list(pt)) for pt in G[2])
+diff --git a/src/sage/schemes/elliptic_curves/ell_generic.py b/src/sage/schemes/elliptic_curves/ell_generic.py
+index b41ea4f6b6..588988f2c9 100644
+--- a/src/sage/schemes/elliptic_curves/ell_generic.py
++++ b/src/sage/schemes/elliptic_curves/ell_generic.py
+@@ -2935,15 +2935,7 @@ class EllipticCurve_generic(WithEqualityById, plane_curve.ProjectivePlaneCurve):
+ sage: K.<a> = QuadraticField(2)
+ sage: E = EllipticCurve([1,a])
+ sage: E.pari_curve()
+- [Mod(0, y^2 - 2), Mod(0, y^2 - 2), Mod(0, y^2 - 2), Mod(1, y^2 - 2),
+- Mod(y, y^2 - 2), Mod(0, y^2 - 2), Mod(2, y^2 - 2), Mod(4*y, y^2 - 2),
+- Mod(-1, y^2 - 2), Mod(-48, y^2 - 2), Mod(-864*y, y^2 - 2),
+- Mod(-928, y^2 - 2), Mod(3456/29, y^2 - 2), Vecsmall([5]),
+- [[y^2 - 2, [2, 0], 8, 1, [[1, -1.41421356237310;
+- 1, 1.41421356237310], [1, -1.41421356237310; 1, 1.41421356237310],
+- [1, -1; 1, 1], [2, 0; 0, 4], [4, 0; 0, 2], [2, 0; 0, 1],
+- [2, [0, 2; 1, 0]], []], [-1.41421356237310, 1.41421356237310],
+- [1, y], [1, 0; 0, 1], [1, 0, 0, 2; 0, 1, 1, 0]]], [0, 0, 0, 0, 0]]
++ [Mod(0, y^2 - 2), Mod(0, y^2 - 2), Mod(0, y^2 - 2), Mod(1, y^2 - 2), Mod(y, y^2 - 2), Mod(0, y^2 - 2), Mod(2, y^2 - 2), Mod(4*y, y^2 - 2), Mod(-1, y^2 - 2), Mod(-48, y^2 - 2), Mod(-864*y, y^2 - 2), Mod(-928, y^2 - 2), Mod(3456/29, y^2 - 2), Vecsmall([5]), [[y^2 - 2, [2, 0], 8, 1, [[1, -1.41421356237310; 1, 1.41421356237310], [1, -1.41421356237310; 1, 1.41421356237310], [16, -23; 16, 23], [2, 0; 0, 4], [4, 0; 0, 2], [2, 0; 0, 1], [2, [0, 2; 1, 0]], [2]], [-1.41421356237310, 1.41421356237310], [1, y], [1, 0; 0, 1], [1, 0, 0, 2; 0, 1, 1, 0]]], [0, 0, 0, 0, 0]]
+
+ PARI no longer requires that the `j`-invariant has negative `p`-adic valuation::
+
+diff --git a/src/sage/schemes/elliptic_curves/ell_number_field.py b/src/sage/schemes/elliptic_curves/ell_number_field.py
+index e1111c1c55..c0e91c4f8e 100644
+--- a/src/sage/schemes/elliptic_curves/ell_number_field.py
++++ b/src/sage/schemes/elliptic_curves/ell_number_field.py
+@@ -215,9 +215,9 @@ class EllipticCurve_number_field(EllipticCurve_field):
+ sage: E == loads(dumps(E))
+ True
+ sage: E.simon_two_descent()
+- (2, 2, [(0 : 0 : 1), (1/8*a + 5/8 : -3/16*a - 7/16 : 1)])
++ (2, 2, [(0 : 0 : 1)])
+ sage: E.simon_two_descent(lim1=3, lim3=20, limtriv=5, maxprob=7, limbigprime=10)
+- (2, 2, [(-1 : 0 : 1), (-1/8*a + 5/8 : -3/16*a - 9/16 : 1)])
++ (2, 2, [(-1 : 0 : 1), (5/32*a + 1/32 : -19/128*a + 41/128 : 1)])
+
+ ::
+
+@@ -245,22 +245,22 @@ class EllipticCurve_number_field(EllipticCurve_field):
+ C = Mod(y, y^2 + 7)
+ <BLANKLINE>
+ Computing L(S,2)
+- L(S,2) = [Mod(Mod(-1/2*y + 1/2, y^2 + 7)*x^2 + Mod(-1/2*y - 1/2, y^2 + 7)*x + Mod(-y - 1, y^2 + 7), x^3 + Mod(1, y^2 + 7)*x + Mod(y, y^2 + 7)), Mod(-x^2 + Mod(-1/2*y - 1/2, y^2 + 7)*x + 1, x^3 + Mod(1, y^2 + 7)*x + Mod(y, y^2 + 7)), Mod(-1, x^3 + Mod(1, y^2 + 7)*x + Mod(y, y^2 + 7)), Mod(x^2 + 2, x^3 + Mod(1, y^2 + 7)*x + Mod(y, y^2 + 7)), Mod(x + Mod(1/2*y + 3/2, y^2 + 7), x^3 + Mod(1, y^2 + 7)*x + Mod(y, y^2 + 7)), Mod(x + Mod(1/2*y - 3/2, y^2 + 7), x^3 + Mod(1, y^2 + 7)*x + Mod(y, y^2 + 7))]
++ L(S,2) = [Mod(Mod(1/2*y - 1/2, y^2 + 7)*x^2 + Mod(1/2*y + 1/2, y^2 + 7)*x + Mod(y + 1, y^2 + 7), x^3 + Mod(1, y^2 + 7)*x + Mod(y, y^2 + 7)), Mod(x^2 + Mod(1/2*y + 1/2, y^2 + 7)*x - 1, x^3 + Mod(1, y^2 + 7)*x + Mod(y, y^2 + 7)), Mod(-1, x^3 + Mod(1, y^2 + 7)*x + Mod(y, y^2 + 7)), Mod(x^2 + 2, x^3 + Mod(1, y^2 + 7)*x + Mod(y, y^2 + 7)), Mod(x + Mod(1/2*y + 3/2, y^2 + 7), x^3 + Mod(1, y^2 + 7)*x + Mod(y, y^2 + 7)), Mod(x + Mod(1/2*y - 3/2, y^2 + 7), x^3 + Mod(1, y^2 + 7)*x + Mod(y, y^2 + 7))]
+ <BLANKLINE>
+ Computing the Selmer group
+ #LS2gen = 2
+- LS2gen = [Mod(Mod(-1/2*y + 1/2, y^2 + 7)*x^2 + Mod(-1/2*y - 1/2, y^2 + 7)*x + Mod(-y - 1, y^2 + 7), x^3 + Mod(1, y^2 + 7)*x + Mod(y, y^2 + 7)), Mod(x^2 + Mod(1/2*y + 1/2, y^2 + 7)*x - 1, x^3 + Mod(1, y^2 + 7)*x + Mod(y, y^2 + 7))]
++ LS2gen = [Mod(x^2 + Mod(1/2*y + 1/2, y^2 + 7)*x - 1, x^3 + Mod(1, y^2 + 7)*x + Mod(y, y^2 + 7)), Mod(Mod(-1/2*y + 1/2, y^2 + 7)*x^2 + Mod(-1/2*y - 1/2, y^2 + 7)*x + Mod(-y - 1, y^2 + 7), x^3 + Mod(1, y^2 + 7)*x + Mod(y, y^2 + 7))]
+ Search for trivial points on the curve
+ Trivial points on the curve = [[Mod(1/2*y + 3/2, y^2 + 7), Mod(-y - 2, y^2 + 7)], [1, 1, 0], [Mod(1/2*y + 3/2, y^2 + 7), Mod(-y - 2, y^2 + 7), 1]]
++ zc = Mod(Mod(1, y^2 + 7)*x^2 + Mod(1/2*y + 1/2, y^2 + 7)*x + Mod(-1, y^2 + 7), x^3 + Mod(1, y^2 + 7)*x + Mod(y, y^2 + 7))
++ comes from the trivial point [Mod(1/2*y + 3/2, y^2 + 7), Mod(-y - 2, y^2 + 7)]
+ zc = Mod(Mod(-1/2*y + 1/2, y^2 + 7)*x^2 + Mod(-1/2*y - 1/2, y^2 + 7)*x + Mod(-y - 1, y^2 + 7), x^3 + Mod(1, y^2 + 7)*x + Mod(y, y^2 + 7))
+- Hilbert symbol (Mod(1, y^2 + 7),Mod(-2*y + 2, y^2 + 7)) =
++ Hilbert symbol (Mod(1, y^2 + 7),Mod(-2*y + 2, y^2 + 7)) =
+ sol of quadratic equation = [1, 1, 0]~
+ zc*z1^2 = Mod(4*x + Mod(-2*y + 6, y^2 + 7), x^3 + Mod(1, y^2 + 7)*x + Mod(y, y^2 + 7))
+ quartic: (-1)*Y^2 = x^4 + (3*y - 9)*x^2 + (-8*y + 16)*x + (9/2*y - 11/2)
+ reduced: Y^2 = -x^4 + (-3*y + 9)*x^2 + (-8*y + 16)*x + (-9/2*y + 11/2)
+ not ELS at [2, [0, 1]~, 1, 1, [1, -2; 1, 0]]
+- zc = Mod(Mod(1, y^2 + 7)*x^2 + Mod(1/2*y + 1/2, y^2 + 7)*x + Mod(-1, y^2 + 7), x^3 + Mod(1, y^2 + 7)*x + Mod(y, y^2 + 7))
+- comes from the trivial point [Mod(1/2*y + 3/2, y^2 + 7), Mod(-y - 2, y^2 + 7)]
+ m1 = 1
+ m2 = 1
+ #S(E/K)[2] = 2
+diff --git a/src/sage/schemes/elliptic_curves/ell_rational_field.py b/src/sage/schemes/elliptic_curves/ell_rational_field.py
+index 003c910374..15b4d32dd0 100644
+--- a/src/sage/schemes/elliptic_curves/ell_rational_field.py
++++ b/src/sage/schemes/elliptic_curves/ell_rational_field.py
+@@ -5403,9 +5403,9 @@ class EllipticCurve_rational_field(EllipticCurve_number_field):
+
+ sage: E = EllipticCurve('37a1')
+ sage: E.eval_modular_form([1.5+I,2.0+I,2.5+I],100) # abs tol 1e-20
+- [-0.0018743978548152085771342944989052703431,
+- 0.0018604485340371083710285594393397945456,
+- -0.0018743978548152085771342944989052703431]
++ [-0.00187439785481520858 - 6.91083670607514589e-22*I,
++ 0.00186044853403710837 + 3.71914507780688601e-22*I,
++ -0.00187439785481520858 - 6.39417173217386647e-23*I]
+
+ sage: E.eval_modular_form(2.1+I, 100) # abs tol 1e-20
+ [0.00150864362757267079 + 0.00109100341113449845*I]
+diff --git a/src/sage/schemes/elliptic_curves/isogeny_small_degree.py b/src/sage/schemes/elliptic_curves/isogeny_small_degree.py
+index 7178da3685..ea0a7e88bc 100644
+--- a/src/sage/schemes/elliptic_curves/isogeny_small_degree.py
++++ b/src/sage/schemes/elliptic_curves/isogeny_small_degree.py
+@@ -801,8 +801,8 @@ def isogenies_5_0(E, minimal_models=True):
+ sage: K.<a> = NumberField(x**6-320*x**3-320)
+ sage: E = EllipticCurve(K,[0,0,1,0,0])
+ sage: isogenies_5_0(E)
+- [Isogeny of degree 5 from Elliptic Curve defined by y^2 + y = x^3 over Number Field in a with defining polynomial x^6 - 320*x^3 - 320 to Elliptic Curve defined by y^2 + y = x^3 + (643/8*a^5-15779/48*a^4-32939/24*a^3-71989/2*a^2+214321/6*a-112115/3)*x + (2901961/96*a^5+4045805/48*a^4+12594215/18*a^3-30029635/6*a^2+15341626/3*a-38944312/9) over Number Field in a with defining polynomial x^6 - 320*x^3 - 320,
+- Isogeny of degree 5 from Elliptic Curve defined by y^2 + y = x^3 over Number Field in a with defining polynomial x^6 - 320*x^3 - 320 to Elliptic Curve defined by y^2 + y = x^3 + (-1109/8*a^5-53873/48*a^4-180281/24*a^3-14491/2*a^2+35899/6*a-43745/3)*x + (-17790679/96*a^5-60439571/48*a^4-77680504/9*a^3+1286245/6*a^2-4961854/3*a-73854632/9) over Number Field in a with defining polynomial x^6 - 320*x^3 - 320]
++ [Isogeny of degree 5 from Elliptic Curve defined by y^2 + y = x^3 over Number Field in a with defining polynomial x^6 - 320*x^3 - 320 to Elliptic Curve defined by y^2 + y = x^3 + (241565/32*a^5-362149/48*a^4+180281/24*a^3-9693307/4*a^2+14524871/6*a-7254985/3)*x + (1660391123/192*a^5-829315373/96*a^4+77680504/9*a^3-66622345345/24*a^2+33276655441/12*a-24931615912/9) over Number Field in a with defining polynomial x^6 - 320*x^3 - 320,
++ Isogeny of degree 5 from Elliptic Curve defined by y^2 + y = x^3 over Number Field in a with defining polynomial x^6 - 320*x^3 - 320 to Elliptic Curve defined by y^2 + y = x^3 + (47519/32*a^5-72103/48*a^4+32939/24*a^3-1909753/4*a^2+2861549/6*a-1429675/3)*x + (-131678717/192*a^5+65520419/96*a^4-12594215/18*a^3+5280985135/24*a^2-2637787519/12*a+1976130088/9) over Number Field in a with defining polynomial x^6 - 320*x^3 - 320]
+ """
+ F = E.base_field()
+ if E.j_invariant() != 0:
+diff --git a/src/sage/schemes/elliptic_curves/period_lattice.py b/src/sage/schemes/elliptic_curves/period_lattice.py
+index 0fad45efe2..faff12a17c 100644
+--- a/src/sage/schemes/elliptic_curves/period_lattice.py
++++ b/src/sage/schemes/elliptic_curves/period_lattice.py
+@@ -1627,7 +1627,7 @@ class PeriodLattice_ell(PeriodLattice):
+ sage: embs = K.embeddings(CC)
+ sage: Lambda = E.period_lattice(embs[0])
+ sage: Lambda.elliptic_logarithm(P+3*Q, 100)
+- 4.7100131126199672766973600998
++ 4.3543876242043418255250464574
+ sage: R.<x> = QQ[]
+ sage: K.<a> = NumberField(x^2 + x + 5)
+ sage: E = EllipticCurve(K, [0,0,1,-3,-5])
+diff --git a/src/sage/schemes/toric/chow_group.py b/src/sage/schemes/toric/chow_group.py
+index 89e82467b0..b4ff15dc37 100644
+--- a/src/sage/schemes/toric/chow_group.py
++++ b/src/sage/schemes/toric/chow_group.py
+@@ -93,13 +93,13 @@ Cones of toric varieties can determine their own Chow cycle::
+ sage: cone = X.fan(dim=2)[3]; cone
+ 2-d cone of Rational polyhedral fan in 3-d lattice N
+ sage: A_cone = A(cone); A_cone
+- ( 0 | 1 mod 7 | 0 mod 2, 0 mod 2, 0, 0, 0, 0, 0 | 0 )
++ ( 0 | 6 mod 7 | 0 mod 2, 0 mod 2, 0, 0, 0, 0, 0 | 0 )
+ sage: A_cone.degree()
+ 1
+ sage: 2 * A_cone
+- ( 0 | 2 mod 7 | 0 mod 2, 0 mod 2, 0, 0, 0, 0, 0 | 0 )
++ ( 0 | 5 mod 7 | 0 mod 2, 0 mod 2, 0, 0, 0, 0, 0 | 0 )
+ sage: A_cone + A.gen(0)
+- ( 0 | 1 mod 7 | 0 mod 2, 1 mod 2, 0, 0, 0, 0, 0 | 0 )
++ ( 0 | 6 mod 7 | 1 mod 2, 0 mod 2, 0, 0, 0, 0, 0 | 0 )
+
+ Chow cycles can be of mixed degrees::
+
+diff --git a/src/sage/schemes/toric/homset.py b/src/sage/schemes/toric/homset.py
+index 4bff92bcb0..ff6211cabe 100644
+--- a/src/sage/schemes/toric/homset.py
++++ b/src/sage/schemes/toric/homset.py
+@@ -467,12 +467,27 @@ class SchemeHomset_points_toric_field(SchemeHomset_points_toric_base):
+ sage: point_set.cardinality()
+ 21
+ sage: sorted(X.point_set().list())
+- [[0 : 0 : 1], [0 : 1 : 0], [0 : 1 : 1], [0 : 1 : 3],
+- [1 : 0 : 0], [1 : 0 : 1], [1 : 0 : 3], [1 : 1 : 0],
+- [1 : 1 : 1], [1 : 1 : 2], [1 : 1 : 3], [1 : 1 : 4],
+- [1 : 1 : 5], [1 : 1 : 6], [1 : 3 : 0], [1 : 3 : 1],
+- [1 : 3 : 2], [1 : 3 : 3], [1 : 3 : 4], [1 : 3 : 5],
+- [1 : 3 : 6]]
++ [[0 : 0 : 1],
++ [0 : 1 : 0],
++ [0 : 1 : 1],
++ [0 : 1 : 5],
++ [1 : 0 : 0],
++ [1 : 0 : 1],
++ [1 : 0 : 5],
++ [1 : 1 : 0],
++ [1 : 1 : 1],
++ [1 : 1 : 2],
++ [1 : 1 : 3],
++ [1 : 1 : 4],
++ [1 : 1 : 5],
++ [1 : 1 : 6],
++ [1 : 3 : 1],
++ [1 : 3 : 2],
++ [1 : 3 : 3],
++ [1 : 3 : 4],
++ [1 : 3 : 5],
++ [1 : 3 : 6],
++ [1 : 5 : 0]]
+
+ As for a non-compact example, the blow-up of the plane is the line
+ bundle $O_{\mathbf{P}^1}(-1)$. Its point set is the Cartesian
+@@ -641,7 +656,7 @@ class SchemeHomset_points_subscheme_toric_field(SchemeHomset_points_toric_base):
+ sage: P2.<x,y,z> = toric_varieties.P2(base_ring=GF(5))
+ sage: cubic = P2.subscheme([x^3 + y^3 + z^3])
+ sage: list(cubic.point_set())
+- [[0 : 1 : 4], [1 : 0 : 4], [1 : 4 : 0], [1 : 2 : 1], [1 : 1 : 2], [1 : 3 : 3]]
++ [[0 : 1 : 4], [1 : 0 : 4], [1 : 4 : 0], [1 : 1 : 2], [1 : 2 : 1], [1 : 3 : 3]]
+ sage: cubic.point_set().cardinality()
+ 6
+ """
+@@ -661,7 +676,7 @@ class SchemeHomset_points_subscheme_toric_field(SchemeHomset_points_toric_base):
+ sage: P2.<x,y,z> = toric_varieties.P2(base_ring=GF(5))
+ sage: cubic = P2.subscheme([x^3 + y^3 + z^3])
+ sage: list(cubic.point_set())
+- [[0 : 1 : 4], [1 : 0 : 4], [1 : 4 : 0], [1 : 2 : 1], [1 : 1 : 2], [1 : 3 : 3]]
++ [[0 : 1 : 4], [1 : 0 : 4], [1 : 4 : 0], [1 : 1 : 2], [1 : 2 : 1], [1 : 3 : 3]]
+ sage: cubic.point_set().cardinality()
+ 6
+ """
+diff --git a/src/sage/schemes/toric/points.py b/src/sage/schemes/toric/points.py
+index 4cec2b14ff..18c39d7096 100644
+--- a/src/sage/schemes/toric/points.py
++++ b/src/sage/schemes/toric/points.py
+@@ -538,7 +538,7 @@ class FiniteFieldPointEnumerator(NaiveFinitePointEnumerator):
+ sage: enum._Chow_group_torsion()
+ ((1, 2, 4), (1, 4, 2))
+ sage: enum._Chow_group_torsion_generators()
+- ((1, 2, 4),)
++ ((1, 4, 2),)
+ """
+ if self.fan.is_smooth():
+ return tuple()
+@@ -674,7 +674,7 @@ class FiniteFieldPointEnumerator(NaiveFinitePointEnumerator):
+ sage: list(cokernel)
+ [(0), (1)]
+ sage: [p.lift() for p in cokernel]
+- [(0, 0), (0, 1)]
++ [(0, 0), (0, -1)]
+ """
+ from sage.matrix.constructor import matrix, block_matrix, identity_matrix
+ from sage.rings.all import ZZ
+@@ -956,9 +956,9 @@ class FiniteFieldSubschemePointEnumerator(NaiveSubschemePointEnumerator):
+ sage: ffe.homogeneous_coordinates([0], nonzero_coordinates, cokernel)
+ (1, 1, 0)
+ sage: ffe.homogeneous_coordinates([1], nonzero_coordinates, cokernel)
+- (1, 3, 0)
++ (1, 5, 0)
+ sage: ffe.homogeneous_coordinates([2], nonzero_coordinates, cokernel)
+- (1, 2, 0)
++ (1, 4, 0)
+ """
+ z = [self.ambient.ring.zero()] * len(self.ambient.rays())
+ z_nonzero = self.ambient.exp(
+@@ -987,7 +987,7 @@ class FiniteFieldSubschemePointEnumerator(NaiveSubschemePointEnumerator):
+ sage: point_set = X.point_set()
+ sage: ffe = point_set._enumerator()
+ sage: list(ffe) # indirect doctest
+- [(1, 4, 3), (1, 1, 6), (1, 2, 5)]
++ [(1, 1, 6), (1, 2, 5), (1, 4, 3)]
+ """
+ for cone, nonzero_coordinates, cokernel in self.ambient.cone_points_iter():
+ R = PolynomialRing(self.ambient.ring, cokernel.ngens(), 't')
+@@ -1012,11 +1012,11 @@ class FiniteFieldSubschemePointEnumerator(NaiveSubschemePointEnumerator):
+ sage: Y = X.subscheme(u^3 + v^3 + w^3 + u*v*w)
+ sage: point_set = Y.point_set()
+ sage: list(point_set)
+- [[0 : 1 : 3],
+- [1 : 0 : 3],
+- [1 : 3 : 0],
+- [1 : 1 : 6],
++ [[0 : 1 : 5],
++ [1 : 0 : 5],
++ [1 : 5 : 0],
+ [1 : 1 : 4],
++ [1 : 1 : 6],
+ [1 : 3 : 2],
+ [1 : 3 : 5]]
+ sage: ffe = point_set._enumerator()
+diff --git a/src/sage/structure/factorization.py b/src/sage/structure/factorization.py
+index 1d32db0842..7636f1a9ba 100644
+--- a/src/sage/structure/factorization.py
++++ b/src/sage/structure/factorization.py
+@@ -133,17 +133,17 @@ Factorizations can involve fairly abstract mathematical objects::
+ sage: K.<a> = NumberField(x^2 + 3); K
+ Number Field in a with defining polynomial x^2 + 3
+ sage: f = K.factor(15); f
+- (Fractional ideal (-a))^2 * (Fractional ideal (5))
++ (Fractional ideal (1/2*a + 3/2))^2 * (Fractional ideal (5))
+ sage: f.universe()
+ Monoid of ideals of Number Field in a with defining polynomial x^2 + 3
+ sage: f.unit()
+ Fractional ideal (1)
+ sage: g=K.factor(9); g
+- (Fractional ideal (-a))^4
++ (Fractional ideal (1/2*a + 3/2))^4
+ sage: f.lcm(g)
+- (Fractional ideal (-a))^4 * (Fractional ideal (5))
++ (Fractional ideal (1/2*a + 3/2))^4 * (Fractional ideal (5))
+ sage: f.gcd(g)
+- (Fractional ideal (-a))^2
++ (Fractional ideal (1/2*a + 3/2))^2
+ sage: f.is_integral()
+ True
+
+diff --git a/src/sage/tests/books/computational-mathematics-with-sagemath/linalg_doctest.py b/src/sage/tests/books/computational-mathematics-with-sagemath/linalg_doctest.py
+index d67a33e7c4..7cba0ef6bb 100644
+--- a/src/sage/tests/books/computational-mathematics-with-sagemath/linalg_doctest.py
++++ b/src/sage/tests/books/computational-mathematics-with-sagemath/linalg_doctest.py
+@@ -232,13 +232,13 @@ Sage example in ./linalg.tex, line 1640::
+ sage: A = matrix(ZZ, 4, 5,\
+ ....: [-1,-1,-1,-2,-2,-2,1,1,-1,2,2,2,2,2,-1,2,2,2,2,2])
+ sage: S,U,V = A.smith_form(); S,U,V
+- (
+- [ 0 -2 -1 -5 0]
+- [1 0 0 0 0] [ 1 0 0 0] [ 1 0 1 -1 -1]
+- [0 1 0 0 0] [ 0 0 1 0] [ 0 0 0 0 1]
+- [0 0 3 0 0] [-2 1 0 0] [-1 2 0 5 0]
+- [0 0 0 6 0], [ 0 0 -2 -1], [ 0 -1 0 -2 0]
+- )
++ (
++ [ 0 -2 0 -5 0]
++ [1 0 0 0 0] [ 1 0 0 0] [ 1 0 0 -1 -1]
++ [0 1 0 0 0] [-2 1 1 0] [ 0 0 0 0 1]
++ [0 0 3 0 0] [-4 2 3 0] [-1 1 1 5 0]
++ [0 0 0 6 0], [ 4 -2 -2 -1], [ 0 0 -1 -2 0]
++ )
+
+ Sage example in ./linalg.tex, line 1674::
+
+diff --git a/src/sage/tests/books/judson-abstract-algebra/galois-sage.py b/src/sage/tests/books/judson-abstract-algebra/galois-sage.py
+index 6c25aa5dc5..8bdceb9424 100644
+--- a/src/sage/tests/books/judson-abstract-algebra/galois-sage.py
++++ b/src/sage/tests/books/judson-abstract-algebra/galois-sage.py
+@@ -385,69 +385,49 @@ r"""
+
+ sage: L.subfields()
+ [
+- (Number Field in c0 with defining polynomial x,
+- Ring morphism:
+- From: Number Field in c0 with defining polynomial x
+- To: Number Field in c with defining polynomial x^8 + 28*x^4 + 2500
+- Defn: 0 |--> 0,
+- None),
+- (Number Field in c1 with defining polynomial x^2 + 112*x + 40000,
+- Ring morphism:
+- From: Number Field in c1 with defining polynomial x^2 + 112*x + 40000
+- To: Number Field in c with defining polynomial x^8 + 28*x^4 + 2500
+- Defn: c1 |--> 4*c^4,
+- None),
+- (Number Field in c2 with defining polynomial x^2 + 512,
+- Ring morphism:
+- From: Number Field in c2 with defining polynomial x^2 + 512
+- To: Number Field in c with defining polynomial x^8 + 28*x^4 + 2500
+- Defn: c2 |--> 1/25*c^6 + 78/25*c^2,
+- None),
+- (Number Field in c3 with defining polynomial x^2 - 288,
+- Ring morphism:
+- From: Number Field in c3 with defining polynomial x^2 - 288
+- To: Number Field in c with defining polynomial x^8 + 28*x^4 + 2500
+- Defn: c3 |--> -1/25*c^6 + 22/25*c^2,
+- None),
+- (Number Field in c4 with defining polynomial x^4 + 112*x^2 + 40000,
+- Ring morphism:
+- From: Number Field in c4 with defining polynomial x^4 + 112*x^2 + 40000
+- To: Number Field in c with defining polynomial x^8 + 28*x^4 + 2500
+- Defn: c4 |--> 2*c^2,
+- None),
+- (Number Field in c5 with defining polynomial x^4 + 648,
+- Ring morphism:
+- From: Number Field in c5 with defining polynomial x^4 + 648
+- To: Number Field in c with defining polynomial x^8 + 28*x^4 + 2500
+- Defn: c5 |--> 1/80*c^5 + 79/40*c,
+- None),
+- (Number Field in c6 with defining polynomial x^4 + 8,
+- Ring morphism:
+- From: Number Field in c6 with defining polynomial x^4 + 8
++ (Number Field in c0 with defining polynomial x, Ring morphism:
++ From: Number Field in c0 with defining polynomial x
+ To: Number Field in c with defining polynomial x^8 + 28*x^4 + 2500
+- Defn: c6 |--> -1/80*c^5 + 1/40*c,
+- None),
+- (Number Field in c7 with defining polynomial x^4 - 512,
+- Ring morphism:
+- From: Number Field in c7 with defining polynomial x^4 - 512
+- To: Number Field in c with defining polynomial x^8 + 28*x^4 + 2500
+- Defn: c7 |--> -1/60*c^5 + 41/30*c,
+- None),
+- (Number Field in c8 with defining polynomial x^4 - 32,
+- Ring morphism:
+- From: Number Field in c8 with defining polynomial x^4 - 32
+- To: Number Field in c with defining polynomial x^8 + 28*x^4 + 2500
+- Defn: c8 |--> 1/60*c^5 + 19/30*c,
+- None),
+- (Number Field in c9 with defining polynomial x^8 + 28*x^4 + 2500,
+- Ring morphism:
+- From: Number Field in c9 with defining polynomial x^8 + 28*x^4 + 2500
+- To: Number Field in c with defining polynomial x^8 + 28*x^4 + 2500
+- Defn: c9 |--> c,
+- Ring morphism:
+- From: Number Field in c with defining polynomial x^8 + 28*x^4 + 2500
+- To: Number Field in c9 with defining polynomial x^8 + 28*x^4 + 2500
+- Defn: c |--> c9)
++ Defn: 0 |--> 0, None),
++ (Number Field in c1 with defining polynomial x^2 + 112*x + 40000, Ring morphism:
++ From: Number Field in c1 with defining polynomial x^2 + 112*x + 40000
++ To: Number Field in c with defining polynomial x^8 + 28*x^4 + 2500
++ Defn: c1 |--> 4*c^4, None),
++ (Number Field in c2 with defining polynomial x^2 + 512, Ring morphism:
++ From: Number Field in c2 with defining polynomial x^2 + 512
++ To: Number Field in c with defining polynomial x^8 + 28*x^4 + 2500
++ Defn: c2 |--> 1/25*c^6 + 78/25*c^2, None),
++ (Number Field in c3 with defining polynomial x^2 - 288, Ring morphism:
++ From: Number Field in c3 with defining polynomial x^2 - 288
++ To: Number Field in c with defining polynomial x^8 + 28*x^4 + 2500
++ Defn: c3 |--> -1/25*c^6 + 22/25*c^2, None),
++ (Number Field in c4 with defining polynomial x^4 + 112*x^2 + 40000, Ring morphism:
++ From: Number Field in c4 with defining polynomial x^4 + 112*x^2 + 40000
++ To: Number Field in c with defining polynomial x^8 + 28*x^4 + 2500
++ Defn: c4 |--> 2*c^2, None),
++ (Number Field in c5 with defining polynomial x^4 + 8, Ring morphism:
++ From: Number Field in c5 with defining polynomial x^4 + 8
++ To: Number Field in c with defining polynomial x^8 + 28*x^4 + 2500
++ Defn: c5 |--> -1/80*c^5 + 1/40*c, None),
++ (Number Field in c6 with defining polynomial x^4 + 648, Ring morphism:
++ From: Number Field in c6 with defining polynomial x^4 + 648
++ To: Number Field in c with defining polynomial x^8 + 28*x^4 + 2500
++ Defn: c6 |--> 1/80*c^5 + 79/40*c, None),
++ (Number Field in c7 with defining polynomial x^4 - 512, Ring morphism:
++ From: Number Field in c7 with defining polynomial x^4 - 512
++ To: Number Field in c with defining polynomial x^8 + 28*x^4 + 2500
++ Defn: c7 |--> -1/60*c^5 + 41/30*c, None),
++ (Number Field in c8 with defining polynomial x^4 - 32, Ring morphism:
++ From: Number Field in c8 with defining polynomial x^4 - 32
++ To: Number Field in c with defining polynomial x^8 + 28*x^4 + 2500
++ Defn: c8 |--> 1/60*c^5 + 19/30*c, None),
++ (Number Field in c9 with defining polynomial x^8 + 28*x^4 + 2500, Ring morphism:
++ From: Number Field in c9 with defining polynomial x^8 + 28*x^4 + 2500
++ To: Number Field in c with defining polynomial x^8 + 28*x^4 + 2500
++ Defn: c9 |--> c, Ring morphism:
++ From: Number Field in c with defining polynomial x^8 + 28*x^4 + 2500
++ To: Number Field in c9 with defining polynomial x^8 + 28*x^4 + 2500
++ Defn: c |--> c9)
+ ]
+
+ ~~~~~~~~~~~~~~~~~~~~~~ ::
diff --git a/sagemath-singular-4.1.2.patch b/sagemath-singular-4.1.2.patch
index d9ff96cde883..c42b2f4b9956 100644
--- a/sagemath-singular-4.1.2.patch
+++ b/sagemath-singular-4.1.2.patch
@@ -21,7 +21,7 @@ index a312548..d1c9c95 100644
- Using Singular's ``BrillNoether`` command (for details see the section
Brill-Noether in the Singular online documentation
diff --git a/src/sage/algebras/free_algebra.py b/src/sage/algebras/free_algebra.py
-index 2ba6b72..926ca07 100644
+index 7391dd9..7234f91 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::
@@ -69,10 +69,18 @@ index 2ba6b72..926ca07 100644
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 ba75188..9c9944e 100644
+index ad863ea..d6127c9 100644
--- a/src/sage/algebras/letterplace/free_algebra_element_letterplace.pyx
+++ b/src/sage/algebras/letterplace/free_algebra_element_letterplace.pyx
-@@ -25,7 +25,6 @@ from cpython.object cimport PyObject_RichCompare
+@@ -17,6 +17,7 @@ AUTHOR:
+ # https://www.gnu.org/licenses/
+ # ****************************************************************************
+
++from sage.groups.perm_gps.all import CyclicPermutationGroup
+ from sage.libs.singular.function import lib, singular_function
+ from sage.misc.repr import repr_lincomb
+ from sage.rings.polynomial.multi_polynomial_ideal import MPolynomialIdeal
+@@ -25,7 +26,6 @@ from cpython.object cimport PyObject_RichCompare
# Define some singular functions
lib("freegb.lib")
poly_reduce = singular_function("NF")
@@ -80,38 +88,41 @@ index ba75188..9c9944e 100644
#####################
# Free algebra elements
-@@ -445,9 +444,9 @@ cdef class FreeAlgebraElement_letterplace(AlgebraElement):
+@@ -445,9 +445,10 @@ cdef class FreeAlgebraElement_letterplace(AlgebraElement):
cdef int i
if P.monomial_divides(s_poly,p_poly):
return True
+ realngens = A._commutative_ring.ngens()
++ CG = CyclicPermutationGroup(P.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._cycle(realngens)
++ s_poly = s_poly * CG[realngens]
if P.monomial_divides(s_poly,p_poly):
return True
return False
-@@ -601,7 +600,8 @@ cdef class FreeAlgebraElement_letterplace(AlgebraElement):
+@@ -601,7 +602,9 @@ 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)
+ realngens = A._commutative_ring.ngens()
-+ rshift = right._poly._cycle(left._poly.degree() * realngens)
++ CG = CyclicPermutationGroup(A._current_ring.ngens())
++ rshift = right._poly * CG[left._poly.degree() * realngens]
return FreeAlgebraElement_letterplace(A,left._poly*rshift, check=False)
def __pow__(FreeAlgebraElement_letterplace self, int n, k):
-@@ -627,10 +627,10 @@ cdef class FreeAlgebraElement_letterplace(AlgebraElement):
+@@ -627,10 +630,11 @@ cdef class FreeAlgebraElement_letterplace(AlgebraElement):
self._poly = A._current_ring(self._poly)
cdef int d = self._poly.degree()
q = p = self._poly
+ realngens = A._commutative_ring.ngens()
cdef int i
++ CG = CyclicPermutationGroup(A._current_ring.ngens())
for i from 0<i<n:
- q = singular_system("stest",q,d,A._degbound,A.__ngens,
- ring=A._current_ring)
-+ q = q._cycle(d * realngens)
++ q = q * CG[d * realngens]
p *= q
return FreeAlgebraElement_letterplace(A, p, check=False)
@@ -136,7 +147,7 @@ index 7e5f2bb..d1d162c 100644
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 a9d09ad..0fa69a1 100644
+index a9d09ad..714284e 100644
--- a/src/sage/algebras/letterplace/free_algebra_letterplace.pyx
+++ b/src/sage/algebras/letterplace/free_algebra_letterplace.pyx
@@ -37,7 +37,15 @@ The preceding containment test is based on the computation of Groebner
@@ -220,16 +231,19 @@ index a9d09ad..0fa69a1 100644
sage: from sage.libs.singular.function import singular_function
sage: poly_reduce = singular_function("NF")
-@@ -683,7 +700,7 @@ cdef class FreeAlgebra_letterplace(Algebra):
+@@ -682,8 +699,10 @@ cdef class FreeAlgebra_letterplace(Algebra):
+ ngens = self.__ngens
degbound = self._degbound
cdef list G = [C(x._poly) for x in g]
++ from sage.groups.perm_gps.all import CyclicPermutationGroup
++ CG = CyclicPermutationGroup(C.ngens())
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._cycle(ngens*(n+1)) for n in xrange(d-y.degree())])
++ out.extend([y]+[y * CG[ngens*(n+1)] for n in xrange(d-y.degree())])
return C.ideal(out)
###########################
-@@ -879,3 +896,28 @@ cdef class FreeAlgebra_letterplace(Algebra):
+@@ -879,3 +898,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))
@@ -427,7 +441,7 @@ index 51f4113..ba42ed1 100644
(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 3205a09..d24a691 100644
+index 3537772..ee8ddec 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):
@@ -475,7 +489,7 @@ index 3205a09..d24a691 100644
....: 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 0d32a8d..5e48f87 100644
+index e664e21..cc525b4 100644
--- a/src/sage/combinat/sf/macdonald.py
+++ b/src/sage/combinat/sf/macdonald.py
@@ -483,7 +483,7 @@ class Macdonald(UniqueRepresentation):
@@ -487,7 +501,7 @@ index 0d32a8d..5e48f87 100644
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):
+@@ -901,7 +901,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])
@@ -497,7 +511,7 @@ index 0d32a8d..5e48f87 100644
return self( self._s(left)*self._s(right) )
diff --git a/src/sage/interfaces/singular.py b/src/sage/interfaces/singular.py
-index 78e65d0..bf02916 100644
+index 88a33b0..a7cf5ea 100644
--- a/src/sage/interfaces/singular.py
+++ b/src/sage/interfaces/singular.py
@@ -191,13 +191,21 @@ The 1x1 and 2x2 minors::
@@ -525,7 +539,7 @@ index 78e65d0..bf02916 100644
::
diff --git a/src/sage/libs/singular/function.pyx b/src/sage/libs/singular/function.pyx
-index b649ab1..a405ab2 100644
+index 0fea70a..26c74d0 100644
--- a/src/sage/libs/singular/function.pyx
+++ b/src/sage/libs/singular/function.pyx
@@ -1257,7 +1257,7 @@ cdef class SingularFunction(SageObject):
@@ -568,7 +582,7 @@ index b649ab1..a405ab2 100644
The Singular function ``list`` can be called with any number of
arguments::
diff --git a/src/sage/rings/asymptotic/asymptotics_multivariate_generating_functions.py b/src/sage/rings/asymptotic/asymptotics_multivariate_generating_functions.py
-index 8b03d22..c5cd87b 100644
+index 8b9367e..ef04d4f 100644
--- a/src/sage/rings/asymptotic/asymptotics_multivariate_generating_functions.py
+++ b/src/sage/rings/asymptotic/asymptotics_multivariate_generating_functions.py
@@ -1579,7 +1579,7 @@ class FractionWithFactoredDenominator(RingElement):
@@ -590,10 +604,10 @@ index 8b03d22..c5cd87b 100644
sage: F1 = decomp[1]
sage: p = {x: 1, y: 1, z: 1}
diff --git a/src/sage/rings/polynomial/multi_polynomial_element.py b/src/sage/rings/polynomial/multi_polynomial_element.py
-index e5d6921..f4027eb 100644
+index d86833f..3742439 100644
--- a/src/sage/rings/polynomial/multi_polynomial_element.py
+++ b/src/sage/rings/polynomial/multi_polynomial_element.py
-@@ -2179,7 +2179,7 @@ def degree_lowest_rational_function(r, x):
+@@ -2231,7 +2231,7 @@ def degree_lowest_rational_function(r, x):
::
sage: r = f/g; r
@@ -603,10 +617,10 @@ index e5d6921..f4027eb 100644
-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 962205f..1c9a81d 100644
+index f025b3a..94e130d 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.
+@@ -154,7 +154,7 @@ when the system has no solutions over the rationals.
which is not 1. ::
sage: I.groebner_basis()
@@ -615,7 +629,7 @@ index 962205f..1c9a81d 100644
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
-@@ -1561,8 +1561,8 @@ class MPolynomialIdeal_singular_repr(
+@@ -1567,8 +1567,8 @@ class MPolynomialIdeal_singular_repr(
sage: I2 = y*R
sage: I3 = (x, y)*R
sage: I4 = (x^2 + x*y*z, y^2 - z^3*y, z^3 + y^5*x*z)*R
@@ -626,16 +640,16 @@ index 962205f..1c9a81d 100644
The ideals must share the same ring::
-@@ -4002,7 +4002,7 @@ class MPolynomialIdeal( MPolynomialIdeal_singular_repr, \
+@@ -4008,7 +4008,7 @@ class MPolynomialIdeal( MPolynomialIdeal_singular_repr, \
- sage: J.groebner_basis.set_cache(gb) # optional - giacpy_sage
+ sage: J.groebner_basis.set_cache(gb)
sage: ideal(J.transformed_basis()).change_ring(P).interreduced_basis() # testing trac 21884
- [a - 60*c^3 + 158/7*c^2 + 8/7*c - 1, b + 30*c^3 - 79/7*c^2 + 3/7*c, c^4 - 10/21*c^3 + 1/84*c^2 + 1/84*c]
+ ...[a - 60*c^3 + 158/7*c^2 + 8/7*c - 1, b + 30*c^3 - 79/7*c^2 + 3/7*c, c^4 - 10/21*c^3 + 1/84*c^2 + 1/84*c]
Giac's gbasis over `\QQ` can benefit from a probabilistic lifting and
multi threaded operations::
-@@ -4104,9 +4104,9 @@ class MPolynomialIdeal( MPolynomialIdeal_singular_repr, \
+@@ -4111,9 +4111,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()
@@ -649,41 +663,10 @@ index 962205f..1c9a81d 100644
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 ab18796..868ca8c 100644
+index 1758424..553d22d 100644
--- a/src/sage/rings/polynomial/multi_polynomial_libsingular.pyx
+++ b/src/sage/rings/polynomial/multi_polynomial_libsingular.pyx
-@@ -2549,6 +2549,26 @@ cdef class MPolynomial_libsingular(MPolynomial):
- """
- return singular_polynomial_str_with_changed_varnames(self._poly, self._parent_ring, varnames)
-
-+ 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:
-+ newkey = key[-n:]+key[:-n]
-+ newdict[newkey] = olddict[key]
-+ return r(newdict)
-+
- def degree(self, MPolynomial_libsingular x=None, int std_grading=False):
- """
- Return the degree of this polynomial.
-diff --git a/src/sage/rings/polynomial/multi_polynomial_libsingular.pyx b/src/sage/rings/polynomial/multi_polynomial_libsingular.pyx
-index ab18796..2eb8f24 100644
---- a/src/sage/rings/polynomial/multi_polynomial_libsingular.pyx
-+++ b/src/sage/rings/polynomial/multi_polynomial_libsingular.pyx
-@@ -1348,7 +1348,7 @@ cdef class MPolynomialRing_libsingular(MPolynomialRing_base):
+@@ -1349,7 +1349,7 @@ cdef class MPolynomialRing_libsingular(MPolynomialRing_base):
sage: R = IntegerModRing(15)['x,y']
sage: singular(R)
polynomial ring, over a ring (with zero-divisors), global ordering
@@ -693,10 +676,52 @@ index ab18796..2eb8f24 100644
// block 1 : ordering dp
// : names x y
diff --git a/src/sage/rings/polynomial/plural.pyx b/src/sage/rings/polynomial/plural.pyx
-index 42001d4..8e4eea9 100644
+index c2792ae..aa2ef59 100644
--- a/src/sage/rings/polynomial/plural.pyx
+++ b/src/sage/rings/polynomial/plural.pyx
-@@ -2888,7 +2888,8 @@ cpdef MPolynomialRing_libsingular new_CRing(RingWrap rw, base_ring):
+@@ -390,28 +390,30 @@ cdef class NCPolynomialRing_plural(Ring):
+ TESTS:
+
+ This example caused a segmentation fault with a previous version
+- of this method::
++ of this method. This doctest still results in a segmentation fault
++ occasionally which is difficult to isolate, so this test is partially
++ disabled (:trac:`29528`)::
+
+ sage: import gc
+ sage: from sage.rings.polynomial.plural import NCPolynomialRing_plural
+ sage: from sage.algebras.free_algebra import FreeAlgebra
+ sage: A1.<x,y,z> = FreeAlgebra(QQ, 3)
+ sage: R1 = A1.g_algebra({y*x:x*y-z, z*x:x*z+2*x, z*y:y*z-2*y}, order=TermOrder('degrevlex', 2))
+- sage: A2.<x,y,z> = FreeAlgebra(GF(5), 3)
+- sage: R2 = A2.g_algebra({y*x:x*y-z, z*x:x*z+2*x, z*y:y*z-2*y}, order=TermOrder('degrevlex', 2))
+- sage: A3.<x,y,z> = FreeAlgebra(GF(11), 3)
+- sage: R3 = A3.g_algebra({y*x:x*y-z, z*x:x*z+2*x, z*y:y*z-2*y}, order=TermOrder('degrevlex', 2))
+- sage: A4.<x,y,z> = FreeAlgebra(GF(13), 3)
+- sage: R4 = A4.g_algebra({y*x:x*y-z, z*x:x*z+2*x, z*y:y*z-2*y}, order=TermOrder('degrevlex', 2))
++ sage: A2.<x,y,z> = FreeAlgebra(GF(5), 3) # not tested
++ sage: R2 = A2.g_algebra({y*x:x*y-z, z*x:x*z+2*x, z*y:y*z-2*y}, order=TermOrder('degrevlex', 2)) # not tested
++ sage: A3.<x,y,z> = FreeAlgebra(GF(11), 3) # not tested
++ sage: R3 = A3.g_algebra({y*x:x*y-z, z*x:x*z+2*x, z*y:y*z-2*y}, order=TermOrder('degrevlex', 2)) # not tested
++ sage: A4.<x,y,z> = FreeAlgebra(GF(13), 3) # not tested
++ sage: R4 = A4.g_algebra({y*x:x*y-z, z*x:x*z+2*x, z*y:y*z-2*y}, order=TermOrder('degrevlex', 2)) # not tested
+ sage: _ = gc.collect()
+ sage: foo = R1.gen(0)
+ sage: del foo
+ sage: del R1
+ sage: _ = gc.collect()
+- sage: del R2
+- sage: _ = gc.collect()
+- sage: del R3
+- sage: _ = gc.collect()
++ sage: del R2 # not tested
++ sage: _ = gc.collect() # not tested
++ sage: del R3 # not tested
++ sage: _ = gc.collect() # not tested
+ """
+ singular_ring_delete(self._ring)
+
+@@ -2886,7 +2888,8 @@ cpdef MPolynomialRing_libsingular new_CRing(RingWrap rw, base_ring):
self.__ngens = rw.ngens()
self.__term_order = TermOrder(rw.ordering_string(), force=True)
@@ -720,10 +745,10 @@ index 74b8b82..beee5ad 100644
// block 1 : ordering dp
// : names x y
diff --git a/src/sage/schemes/curves/projective_curve.py b/src/sage/schemes/curves/projective_curve.py
-index 592bb68..962821c 100644
+index 1091c29..4f5936e 100644
--- a/src/sage/schemes/curves/projective_curve.py
+++ b/src/sage/schemes/curves/projective_curve.py
-@@ -1938,7 +1938,7 @@ class ProjectivePlaneCurve_finite_field(ProjectivePlaneCurve_field):
+@@ -2001,7 +2001,7 @@ class ProjectivePlaneCurve_finite_field(ProjectivePlaneCurve_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)