diff options
-rw-r--r-- | .SRCINFO | 12 | ||||
-rw-r--r-- | PKGBUILD | 20 | ||||
-rw-r--r-- | sagemath-cremona.patch | 31 | ||||
-rw-r--r-- | sagemath-cypari-2.1.2.patch | 155 | ||||
-rw-r--r-- | sagemath-flint-2.6.patch | 16 | ||||
-rw-r--r-- | sagemath-pari-2.13.patch | 1925 | ||||
-rw-r--r-- | sagemath-singular-4.1.2.patch | 153 |
7 files changed, 2188 insertions, 124 deletions
@@ -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 @@ -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) |