summarylogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.SRCINFO57
-rw-r--r--PKGBUILD56
-rw-r--r--latte-count.patch14
-rw-r--r--sagemath-matplotlib-3.4.patch12
-rw-r--r--sagemath-optional-packages.patch2
-rw-r--r--sagemath-pari-2.13.patch2375
-rw-r--r--test-optional.patch2
7 files changed, 1883 insertions, 635 deletions
diff --git a/.SRCINFO b/.SRCINFO
index 8a958467cdf6..80fdb3899741 100644
--- a/.SRCINFO
+++ b/.SRCINFO
@@ -1,6 +1,6 @@
pkgbase = sagemath-git
pkgdesc = Open Source Mathematics Software, free alternative to Magma, Maple, Mathematica, and Matlab
- pkgver = 9.3.rc0.r0.g2c25f07cfd
+ pkgver = 9.3.r0.gd6c5cd9be7
pkgrel = 1
url = http://www.sagemath.org
arch = x86_64
@@ -37,6 +37,7 @@ pkgbase = sagemath-git
depends = python-pillow
depends = python-pplpy
depends = python-sphinx
+ depends = python-ipywidgets
depends = gap
depends = flintqs
depends = lcalc
@@ -60,7 +61,7 @@ pkgbase = sagemath-git
depends = sage-data-polytopes_db
depends = sage-data-conway_polynomials
depends = iml
- depends = libgiac
+ depends = giac
depends = libhomfly
depends = libbraiding
depends = symmetrica
@@ -68,6 +69,7 @@ pkgbase = sagemath-git
optdepends = cython: to compile cython code
optdepends = python-pkgconfig: to compile cython code
optdepends = jmol: alternative 3D plot engine
+ optdepends = jupyter-jsmol: alternative 3D plot engine in the Jupyter notebook
optdepends = sagemath-doc: HTML documentation
optdepends = python-igraph: igraph backend for graph theory
optdepends = sage-numerical-backends-coin: COIN mixed integer linear programming backend
@@ -92,6 +94,9 @@ pkgbase = sagemath-git
optdepends = cryptominisat5: SAT solver
optdepends = python-pycosat: picosat SAT solver
optdepends = python-pip: to install optional packages with sage -pip
+ optdepends = sage-notebook-exporter: convert flask notebooks to Jupyter
+ provides = sagemath
+ conflicts = sagemath
source = git://git.sagemath.org/sage.git#branch=develop
source = sagemath-optional-packages.patch
source = latte-count.patch
@@ -99,51 +104,15 @@ pkgbase = sagemath-git
source = sagemath-pari-2.13.patch
source = sagemath-lrcalc2.patch
source = sagemath-eclib-20210310.patch
+ source = sagemath-matplotlib-3.4.patch
sha256sums = SKIP
- sha256sums = 4fdf318ec9a54567877b93af8c668ad925f2a82370048db158d134b58b064204
- sha256sums = af922e1f978821a9a1f6c9a56130d71e5011c84a7aee7bf66a591bee658af30b
- sha256sums = 7da0dbcda15a327c21dc33853cb8f98cb86a283139f8735e3b20a71d49458a88
- sha256sums = 33907a0681900b9580b8aa5b3d2ddb2d609977076c38fdbc47279ecef4104ed1
+ sha256sums = c100a61c8dfade43bebc622a363abcb3d935a2f40958371ad87a9eb00689f8b0
+ sha256sums = 88e944f23c3b2391dc2e9f9be8e1131152d837dc8c829dfc714663869a272e81
+ sha256sums = af984186f852d2847d770a18fb6822296c50a652dbf55a1ed59d27517c3d3ee4
+ sha256sums = 32d586609dd6970f103574f75287bb641eb0a93618e84a1f671a2816e9420012
sha256sums = 240ac4c29d96d56407a20e1b7f9846e342a7eb2bb4edd6e5c86b3b5a8ff462f9
sha256sums = e7b31f5e7ea88681c6eda41e5a74a2859a12dd128e75c00db3cfbd1d8ddf080d
+ sha256sums = 5e6f919a386e1a9e9caf7528088a3a3f3f3fc51b158a4daf435771afb1212384
pkgname = sagemath-git
- optdepends = cython: to compile cython code
- optdepends = python-pkgconfig: to compile cython code
- optdepends = jmol: alternative 3D plot engine
- optdepends = sagemath-doc: HTML documentation
- optdepends = python-igraph: igraph backend for graph theory
- optdepends = sage-numerical-backends-coin: COIN mixed integer linear programming backend
- optdepends = sage-numerical-backends-gurobi: Gurobi mixed integer linear programming backend
- optdepends = coin-or-csdp: for computing Lovász theta-function of graphs
- optdepends = buckygen: for generating fullerene graphs
- optdepends = plantri: for generating some classes of graphs
- optdepends = benzene: for generating fusenes and benzenoids
- optdepends = ffmpeg: to export animations to video
- optdepends = imagemagick: to show animations
- optdepends = coxeter: Coxeter groups implementation
- optdepends = rubiks: Rubiks cube algorithms
- optdepends = lrs: Algorithms for linear reverse search used in game theory and for computing volume of polytopes
- optdepends = python-pynormaliz: Normaliz backend for polyhedral computations
- optdepends = latte-integrale: integral point count in polyhedra
- optdepends = python-jupymake: polymake backend for polyhedral computations
- optdepends = shared_meataxe: faster matrix arithmetic over finite fields
- optdepends = openblas: faster linear algebra
- optdepends = sirocco: for computing the fundamental group of the complement of a plane curve
- optdepends = primecount: faster prime_pi implementation
- optdepends = dot2tex: for displaying some diagrams
- optdepends = cryptominisat5: SAT solver
- optdepends = python-pycosat: picosat SAT solver
- optdepends = python-pip: to install optional packages with sage -pip
- optdepends = sagemath-jupyter-git: Jupyter kernel
- provides = sagemath
- conflicts = sagemath
-
-pkgname = sagemath-jupyter-git
- pkgdesc = Jupyter kernel for SageMath
- depends = sagemath
- depends = python-jupyter_client
- depends = python-ipywidgets
- depends = jupyter-jsmol
- optdepends = sage-notebook-exporter: convert flask notebooks to Jupyter
diff --git a/PKGBUILD b/PKGBUILD
index 4dca55f08553..50b64ace3621 100644
--- a/PKGBUILD
+++ b/PKGBUILD
@@ -5,21 +5,21 @@
# Contributor: Osman Ugus <ugus11 at yahoo dot com>
# Contributor: Stefan Husmann <stefan-husmann at t-online dot de>
-pkgbase=sagemath-git
-pkgname=(sagemath-git sagemath-jupyter-git)
-pkgver=9.3.rc0.r0.g2c25f07cfd
+pkgname=sagemath-git
+pkgver=9.3.r0.gd6c5cd9be7
pkgrel=1
-pkgdesc="Open Source Mathematics Software, free alternative to Magma, Maple, Mathematica, and Matlab"
+pkgdesc='Open Source Mathematics Software, free alternative to Magma, Maple, Mathematica, and Matlab'
arch=(x86_64)
-url="http://www.sagemath.org"
+url='http://www.sagemath.org'
license=(GPL)
depends=(ipython palp brial cliquer maxima-ecl gfan sympow nauty python-rpy2 python-fpylll python-psutil python-cypari2
- python-matplotlib python-scipy python-sympy python-networkx python-pillow python-pplpy python-sphinx
+ python-matplotlib python-scipy python-sympy python-networkx python-pillow python-pplpy python-sphinx python-ipywidgets
gap flintqs lcalc lrcalc arb eclib zn_poly gd python-cvxopt pynac linbox m4rie pari-galdata pari-seadata-small planarity rankwidth tachyon
sage-data-combinatorial_designs sage-data-elliptic_curves sage-data-graphs sage-data-polytopes_db sage-data-conway_polynomials
- iml libgiac libhomfly libbraiding symmetrica threejs-sage)
+ iml giac libhomfly libbraiding symmetrica threejs-sage)
optdepends=('cython: to compile cython code' 'python-pkgconfig: to compile cython code'
- 'jmol: alternative 3D plot engine' 'sagemath-doc: HTML documentation' 'python-igraph: igraph backend for graph theory'
+ 'jmol: alternative 3D plot engine' 'jupyter-jsmol: alternative 3D plot engine in the Jupyter notebook'
+ 'sagemath-doc: HTML documentation' 'python-igraph: igraph backend for graph theory'
'sage-numerical-backends-coin: COIN mixed integer linear programming backend'
'sage-numerical-backends-gurobi: Gurobi mixed integer linear programming backend'
'coin-or-csdp: for computing Lovász theta-function of graphs'
@@ -33,22 +33,26 @@ optdepends=('cython: to compile cython code' 'python-pkgconfig: to compile cytho
'shared_meataxe: faster matrix arithmetic over finite fields' 'openblas: faster linear algebra'
'sirocco: for computing the fundamental group of the complement of a plane curve' 'primecount: faster prime_pi implementation'
'dot2tex: for displaying some diagrams' 'cryptominisat5: SAT solver' 'python-pycosat: picosat SAT solver'
- 'python-pip: to install optional packages with sage -pip')
+ 'python-pip: to install optional packages with sage -pip' 'sage-notebook-exporter: convert flask notebooks to Jupyter')
makedepends=(cython boost ratpoints python-jinja sirocco mcqd coxeter bliss tdlib python-pkgconfig shared_meataxe primecount git)
+conflicts=(sagemath)
+provides=(sagemath)
source=(git://git.sagemath.org/sage.git#branch=develop
sagemath-optional-packages.patch
latte-count.patch
test-optional.patch
sagemath-pari-2.13.patch
sagemath-lrcalc2.patch
- sagemath-eclib-20210310.patch)
+ sagemath-eclib-20210310.patch
+ sagemath-matplotlib-3.4.patch)
sha256sums=('SKIP'
- '4fdf318ec9a54567877b93af8c668ad925f2a82370048db158d134b58b064204'
- 'af922e1f978821a9a1f6c9a56130d71e5011c84a7aee7bf66a591bee658af30b'
- '7da0dbcda15a327c21dc33853cb8f98cb86a283139f8735e3b20a71d49458a88'
- '33907a0681900b9580b8aa5b3d2ddb2d609977076c38fdbc47279ecef4104ed1'
+ 'c100a61c8dfade43bebc622a363abcb3d935a2f40958371ad87a9eb00689f8b0'
+ '88e944f23c3b2391dc2e9f9be8e1131152d837dc8c829dfc714663869a272e81'
+ 'af984186f852d2847d770a18fb6822296c50a652dbf55a1ed59d27517c3d3ee4'
+ '32d586609dd6970f103574f75287bb641eb0a93618e84a1f671a2816e9420012'
'240ac4c29d96d56407a20e1b7f9846e342a7eb2bb4edd6e5c86b3b5a8ff462f9'
- 'e7b31f5e7ea88681c6eda41e5a74a2859a12dd128e75c00db3cfbd1d8ddf080d')
+ 'e7b31f5e7ea88681c6eda41e5a74a2859a12dd128e75c00db3cfbd1d8ddf080d'
+ '5e6f919a386e1a9e9caf7528088a3a3f3f3fc51b158a4daf435771afb1212384')
pkgver() {
cd sage
@@ -65,6 +69,8 @@ prepare(){
patch -p1 -i ../sagemath-lrcalc2.patch
# Fix build with eclib 20210310 https://trac.sagemath.org/ticket/31443
patch -p1 -i ../sagemath-eclib-20210310.patch
+# Fix deprecation warnings with matplotlib 3.4 https://trac.sagemath.org/ticket/31580
+ patch -p1 -i ../sagemath-matplotlib-3.4.patch
# Arch-specific patches
# assume all optional packages are installed
@@ -82,31 +88,17 @@ build() {
python setup.py build
}
-package_sagemath-git() {
- optdepends+=('sagemath-jupyter-git: Jupyter kernel')
- conflicts=(sagemath)
- provides=(sagemath)
-
+package() {
cd sage/build/pkgs/sagelib/src
+
python setup.py install --root="$pkgdir" --optimize=1
# Remove sage_setup
rm -r "$pkgdir"/usr/lib/python*/site-packages/sage_setup
-# Split jupyter kernel
- rm -r "$pkgdir"/usr/share
-}
-
-package_sagemath-jupyter-git() {
- pkgdesc='Jupyter kernel for SageMath'
- depends=(sagemath python-jupyter_client python-ipywidgets jupyter-jsmol)
- optdepends=('sage-notebook-exporter: convert flask notebooks to Jupyter')
-
- cd sage/src
- python -c "from sage.repl.ipython_kernel.install import SageKernelSpec; SageKernelSpec.update(prefix='$pkgdir/usr')"
# fix symlinks to assets
_pythonpath=`python -c "from sysconfig import get_path; print(get_path('platlib'))"`
- for _i in $(ls sage/ext_data/notebook-ipython); do
+ for _i in $(ls "$srcdir"/sage-$pkgver/src/sage/ext_data/notebook-ipython); do
rm "$pkgdir"/usr/share/jupyter/kernels/sagemath/$_i
ln -s $_pythonpath/sage/ext_data/notebook-ipython/$_i "$pkgdir"/usr/share/jupyter/kernels/sagemath/
done
diff --git a/latte-count.patch b/latte-count.patch
index 4c0a10b99209..86f6727178bc 100644
--- a/latte-count.patch
+++ b/latte-count.patch
@@ -2,7 +2,7 @@ diff --git a/src/sage/geometry/polyhedron/base_ZZ.py b/src/sage/geometry/polyhed
index 268af9db0d..70d41dfa30 100644
--- a/src/sage/geometry/polyhedron/base_ZZ.py
+++ b/src/sage/geometry/polyhedron/base_ZZ.py
-@@ -194,7 +194,7 @@ class Polyhedron_ZZ(Polyhedron_base):
+@@ -193,7 +193,7 @@ class Polyhedron_ZZ(Polyhedron_base):
sage: p = P._ehrhart_polynomial_latte(maxdet=5, verbose=True) # optional - latte_int
This is LattE integrale ...
...
@@ -11,7 +11,7 @@ index 268af9db0d..70d41dfa30 100644
...
sage: p # optional - latte_int
1/2*t^2 + 3/2*t + 1
-@@ -202,7 +202,7 @@ class Polyhedron_ZZ(Polyhedron_base):
+@@ -201,7 +201,7 @@ class Polyhedron_ZZ(Polyhedron_base):
sage: p = P._ehrhart_polynomial_latte(dual=True, verbose=True) # optional - latte_int
This is LattE integrale ...
...
@@ -20,7 +20,7 @@ index 268af9db0d..70d41dfa30 100644
...
sage: p # optional - latte_int
1/2*t^2 + 3/2*t + 1
-@@ -210,7 +210,7 @@ class Polyhedron_ZZ(Polyhedron_base):
+@@ -209,7 +209,7 @@ class Polyhedron_ZZ(Polyhedron_base):
sage: p = P._ehrhart_polynomial_latte(irrational_primal=True, verbose=True) # optional - latte_int
This is LattE integrale ...
...
@@ -29,7 +29,7 @@ index 268af9db0d..70d41dfa30 100644
...
sage: p # optional - latte_int
1/2*t^2 + 3/2*t + 1
-@@ -218,7 +218,7 @@ class Polyhedron_ZZ(Polyhedron_base):
+@@ -217,7 +217,7 @@ class Polyhedron_ZZ(Polyhedron_base):
sage: p = P._ehrhart_polynomial_latte(irrational_all_primal=True, verbose=True) # optional - latte_int
This is LattE integrale ...
...
@@ -38,7 +38,7 @@ index 268af9db0d..70d41dfa30 100644
...
sage: p # optional - latte_int
1/2*t^2 + 3/2*t + 1
-@@ -230,7 +230,7 @@ class Polyhedron_ZZ(Polyhedron_base):
+@@ -229,7 +229,7 @@ class Polyhedron_ZZ(Polyhedron_base):
...
RuntimeError: LattE integrale program failed (exit code 1):
...
@@ -51,7 +51,7 @@ diff --git a/src/sage/interfaces/latte.py b/src/sage/interfaces/latte.py
index 066cedd401..302b39910d 100644
--- a/src/sage/interfaces/latte.py
+++ b/src/sage/interfaces/latte.py
-@@ -96,7 +96,7 @@ def count(arg, ehrhart_polynomial=False, multivariate_generating_function=False,
+@@ -95,7 +95,7 @@ def count(arg, ehrhart_polynomial=False, multivariate_generating_function=False,
sage: n = count(cddin, cdd=True, verbose=True, raw_output=True) # optional - latte_int
This is LattE integrale ...
...
@@ -60,7 +60,7 @@ index 066cedd401..302b39910d 100644
...
Total Unimodular Cones: ...
Maximum number of simplicial cones in memory at once: ...
-@@ -117,7 +117,7 @@ def count(arg, ehrhart_polynomial=False, multivariate_generating_function=False,
+@@ -127,7 +127,7 @@ def count(arg, ehrhart_polynomial=False, multivariate_generating_function=False,
arg = str_to_bytes(arg)
diff --git a/sagemath-matplotlib-3.4.patch b/sagemath-matplotlib-3.4.patch
new file mode 100644
index 000000000000..3a0d4abd5783
--- /dev/null
+++ b/sagemath-matplotlib-3.4.patch
@@ -0,0 +1,12 @@
+diff --git a/src/sage/plot/arrow.py b/src/sage/plot/arrow.py
+index 0247872298..63de0ad5dd 100644
+--- a/src/sage/plot/arrow.py
++++ b/src/sage/plot/arrow.py
+@@ -397,7 +397,6 @@ class Arrow(GraphicPrimitive):
+ self._n = n
+
+ def get_paths(self, renderer):
+- self._patch.set_dpi_cor(renderer.points_to_pixels(1.))
+ paths, fillables = self._patch.get_path_in_displaycoord()
+ return paths
+
diff --git a/sagemath-optional-packages.patch b/sagemath-optional-packages.patch
index 1fcf6100c686..f59d7823b3d2 100644
--- a/sagemath-optional-packages.patch
+++ b/sagemath-optional-packages.patch
@@ -2,7 +2,7 @@ diff --git a/build/pkgs/sagelib/src/setup.py b/build/pkgs/sagelib/src/setup.py
index 0d7c29d746..fb34cbfd5e 100755
--- a/build/pkgs/sagelib/src/setup.py
+++ b/build/pkgs/sagelib/src/setup.py
-@@ -66,10 +66,9 @@ if sdist:
+@@ -69,10 +69,9 @@ if sdist:
else:
distributions = ['']
optional_packages_with_extensions = ['mcqd', 'bliss', 'tdlib', 'primecount',
diff --git a/sagemath-pari-2.13.patch b/sagemath-pari-2.13.patch
index 667f6d88aa08..031a10950923 100644
--- a/sagemath-pari-2.13.patch
+++ b/sagemath-pari-2.13.patch
@@ -1,3 +1,247 @@
+diff --git a/build/pkgs/pari/checksums.ini b/build/pkgs/pari/checksums.ini
+index f10b432dbb..ec00516a1d 100644
+--- a/build/pkgs/pari/checksums.ini
++++ b/build/pkgs/pari/checksums.ini
+@@ -1,5 +1,5 @@
+ tarball=pari-VERSION.tar.gz
+-sha1=2b9ff51feb388664b834dc346a44867546c78618
+-md5=fb2968d7805424518fe44a59a2024afd
+-cksum=1247903778
++sha1=40731c850cc50fb4994148fac49fda4f68ce6106
++md5=826064cf75af268be8a482ade6e27501
++cksum=550849474
+ upstream_url=https://pari.math.u-bordeaux.fr/pub/pari/unix/pari-VERSION.tar.gz
+diff --git a/build/pkgs/pari/package-version.txt b/build/pkgs/pari/package-version.txt
+index 25cce6b355..94f15e9cc3 100644
+--- a/build/pkgs/pari/package-version.txt
++++ b/build/pkgs/pari/package-version.txt
+@@ -1 +1 @@
+-2.11.4.p1
++2.13.1
+diff --git a/build/pkgs/pari/patches/pari-rnfdisc.patch b/build/pkgs/pari/patches/pari-rnfdisc.patch
+new file mode 100644
+index 0000000000..3a26e96687
+--- /dev/null
++++ b/build/pkgs/pari/patches/pari-rnfdisc.patch
+@@ -0,0 +1,19 @@
++From 3edb98db78dd49bb8b4137b46781a7cd570c2556 Mon Sep 17 00:00:00 2001
++From: Bill Allombert <Bill.Allombert@math.u-bordeaux.fr>
++Date: Sun, 28 Mar 2021 13:27:24 +0200
++Subject: [PATCH] rnfdisc_factored: remove spurious Q_primpart [#2284]
++
++diff --git a/src/basemath/base2.c b/src/basemath/base2.c
++index b2b63ada5..531f5c558 100644
++--- a/src/basemath/base2.c
+++++ b/src/basemath/base2.c
++@@ -3582,7 +3582,7 @@ rnfdisc_factored(GEN nf, GEN pol, GEN *pd)
++
++ nf = checknf(nf);
++ pol = rnfdisc_get_T(nf, pol, &lim);
++- disc = nf_to_scalar_or_basis(nf, nfX_disc(nf, Q_primpart(pol)));
+++ disc = nf_to_scalar_or_basis(nf, nfX_disc(nf, pol));
++ pol = nfX_to_monic(nf, pol, NULL);
++ fa = idealfactor_partial(nf, disc, lim);
++ P = gel(fa,1); l = lg(P);
++
+diff --git a/build/pkgs/pari/patches/prot_none_cygwin.patch b/build/pkgs/pari/patches/prot_none_cygwin.patch
+index 5cb7438b14..16340dd492 100644
+--- a/build/pkgs/pari/patches/prot_none_cygwin.patch
++++ b/build/pkgs/pari/patches/prot_none_cygwin.patch
+@@ -3,10 +3,10 @@ Fix pari_mainstack_mreset() on Cygwin
+ Rejected upstream because Cygwin is considered a dead platform
+
+ diff --git a/src/language/init.c b/src/language/init.c
+-index 2d13684..6ea2888 100644
++index 8473a3b..d9993cc 100644
+ --- a/src/language/init.c
+ +++ b/src/language/init.c
+-@@ -653,8 +653,8 @@ pari_mainstack_mfree(void *s, size_t size)
++@@ -884,8 +884,8 @@ pari_mainstack_mfree(void *s, size_t size)
+ /* Completely discard the memory mapped between the addresses "from"
+ * and "to" (which must be page-aligned).
+ *
+@@ -17,7 +17,7 @@ index 2d13684..6ea2888 100644
+ * still keep the mapping such that we can change the flags to
+ * PROT_READ|PROT_WRITE later.
+ *
+-@@ -662,7 +662,12 @@ pari_mainstack_mfree(void *s, size_t size)
++@@ -893,7 +893,12 @@ pari_mainstack_mfree(void *s, size_t size)
+ * calling mprotect(..., PROT_NONE) because the latter will keep the
+ * memory committed (this is in particular relevant on Linux with
+ * vm.overcommit = 2). This remains true even when calling
+@@ -31,15 +31,17 @@ index 2d13684..6ea2888 100644
+ static void
+ pari_mainstack_mreset(pari_sp from, pari_sp to)
+ {
+-@@ -671,9 +676,13 @@ pari_mainstack_mreset(pari_sp from, pari_sp to)
++@@ -902,11 +907,15 @@ pari_mainstack_mreset(pari_sp from, pari_sp to)
+ if (!s) return;
+
+ addr = (void*)from;
+ +#ifdef __CYGWIN__
+ + if (mprotect(addr, s, PROT_NONE)) pari_err(e_MEM);
+ +#else
++ BLOCK_SIGINT_START;
+ res = mmap(addr, s, PROT_NONE,
+ MAP_FIXED|MAP_PRIVATE|MAP_ANONYMOUS|MAP_NORESERVE, -1, 0);
++ BLOCK_SIGINT_END;
+ if (res != addr) pari_err(e_MEM);
+ +#endif
+ }
+diff --git a/build/pkgs/pari/spkg-configure.m4 b/build/pkgs/pari/spkg-configure.m4
+index 9a1b0c7db8..719b8089ee 100644
+--- a/build/pkgs/pari/spkg-configure.m4
++++ b/build/pkgs/pari/spkg-configure.m4
+@@ -1,6 +1,6 @@
+ SAGE_SPKG_CONFIGURE([pari], [
+ dnl See gp_version below on how the version is computed from MAJV.MINV.PATCHV
+- m4_pushdef([SAGE_PARI_MINVER],["133889"])
++ m4_pushdef([SAGE_PARI_MINVER],["134401"])
+ SAGE_SPKG_DEPCHECK([gmp mpir readline], [
+ AC_PATH_PROG([GP], [gp])
+ if test x$GP = x; then dnl GP test
+@@ -78,8 +78,8 @@ SAGE_SPKG_CONFIGURE([pari], [
+ sage_spkg_install_pari=yes
+ fi
+ AC_MSG_CHECKING([whether bnfisunit bug of pari 2.11.3 is fixed])
+- bug_check=`echo "bnf = bnfinit(y^4-y-1); bnfisunit(bnf,-y^3+2*y^2-1)" | $GP -qf 2>> config.log`
+- expected="[[0, 2, Mod(0, 2)]]~"
++ bug_check=`echo "bnf = bnfinit(y^4-y-1); bnfisunit(bnf,-y^3+2*y^2-1)==[[0,2,0]]~" | $GP -qf 2>> config.log`
++ expected="1"
+ if test x"$bug_check" = x"$expected"; then
+ AC_MSG_RESULT([yes])
+ else
+@@ -99,6 +99,16 @@ SAGE_SPKG_CONFIGURE([pari], [
+ AC_MSG_NOTICE([Otherwise Sage will build its own pari/GP.])
+ sage_spkg_install_pari=yes
+ fi
++ AC_MSG_CHECKING([whether rnfdisc bug of pari 2.13.1 is fixed])
++ bug_check=`echo "K = nfinit(y^4-10*y^2+1); disc = rnfdisc(K,x^2-(y^3/2+y^2-5*y/2+1)); idealnorm(K,disc)" | $GP -qf 2 >> config.log`
++ expected="2304"
++ if test x"$bug_check" = x"$expected"; then
++ AC_MSG_RESULT([yes])
++ else
++ AC_MSG_RESULT([no; cannot use system pari/GP with known bug])
++ AC_MSG_NOTICE([Upgrade your system package and reconfigure.])
++ AC_MSG_NOTICE([Otherwise Sage will build its own pari/GP.])
++ fi
+ fi dnl end GP test
+
+ if test x$sage_spkg_install_pari = xno; then dnl main PARI test
+diff --git a/src/doc/en/thematic_tutorials/explicit_methods_in_number_theory/nf_galois_groups.rst b/src/doc/en/thematic_tutorials/explicit_methods_in_number_theory/nf_galois_groups.rst
+index 07e84de55e..1d78922865 100644
+--- a/src/doc/en/thematic_tutorials/explicit_methods_in_number_theory/nf_galois_groups.rst
++++ b/src/doc/en/thematic_tutorials/explicit_methods_in_number_theory/nf_galois_groups.rst
+@@ -305,7 +305,7 @@ ideal classes containing :math:`(5,\sqrt{-30})` and
+ sage: category(C)
+ Category of finite enumerated commutative groups
+ sage: C.gens()
+- (Fractional ideal class (2, a), Fractional ideal class (3, a))
++ (Fractional ideal class (5, a), Fractional ideal class (3, a))
+
+
+ Arithmetic in the class group
+@@ -322,17 +322,17 @@ means "the product of the 0th and 1st generators of the class group
+ sage: K.<a> = QuadraticField(-30)
+ sage: C = K.class_group()
+ sage: C.0
+- Fractional ideal class (2, a)
++ Fractional ideal class (5, a)
+ sage: C.0.ideal()
+- Fractional ideal (2, a)
++ Fractional ideal (5, a)
+ sage: I = C.0 * C.1
+ sage: I
+- Fractional ideal class (5, a)
++ Fractional ideal class (2, a)
+
+
+ Next we find that the class of the fractional ideal
+ :math:`(2,\sqrt{-30}+4/3)` is equal to the ideal class
+-:math:`C.0`.
++:math:`C.0*C.1`.
+
+ .. link
+
+@@ -342,7 +342,7 @@ Next we find that the class of the fractional ideal
+ sage: J = C(A)
+ sage: J
+ Fractional ideal class (2/3, 1/3*a)
+- sage: J == C.0
++ sage: J == C.0*C.1
+ True
+
+
+diff --git a/src/doc/en/thematic_tutorials/sandpile.rst b/src/doc/en/thematic_tutorials/sandpile.rst
+index 75ac904ec5..7dd7091415 100644
+--- a/src/doc/en/thematic_tutorials/sandpile.rst
++++ b/src/doc/en/thematic_tutorials/sandpile.rst
+@@ -324,9 +324,9 @@ sink.
+ [1, 1, 3]
+ sage: S.reduced_laplacian().dense_matrix().smith_form()
+ (
+- [1 0 0] [ 0 0 1] [3 1 4]
+- [0 1 0] [ 1 0 0] [4 1 6]
+- [0 0 3], [ 0 1 -1], [4 1 5]
++ [1 0 0] [ 1 0 0] [1 3 5]
++ [0 1 0] [ 0 1 0] [1 4 6]
++ [0 0 3], [ 0 -1 1], [1 4 7]
+ )
+
+ Adding the identity to any recurrent configuration and stabilizing yields
+@@ -687,7 +687,7 @@ Approximation to the zero set (setting ``x_0 = 1``)::
+ The zeros are generated as a group by a single vector::
+
+ sage: S.points()
+- [[(1/2*I + 1/2)*sqrt(2), -(1/2*I + 1/2)*sqrt(2)]]
++ [[-(1/2*I + 1/2)*sqrt(2), (1/2*I + 1/2)*sqrt(2)]]
+
+
+ Resolutions
+@@ -1384,12 +1384,12 @@ EXAMPLES::
+
+ sage: s = sandpiles.Cycle(5)
+ sage: s.group_gens()
+- [{1: 1, 2: 1, 3: 1, 4: 0}]
++ [{1: 0, 2: 1, 3: 1, 4: 1}]
+ sage: s.group_gens()[0].order()
+ 5
+ sage: s = sandpiles.Complete(5)
+ sage: s.group_gens(False)
+- [[2, 2, 3, 2], [2, 3, 2, 2], [3, 2, 2, 2]]
++ [[2, 3, 2, 2], [2, 2, 3, 2], [2, 2, 2, 3]]
+ sage: [i.order() for i in s.group_gens()]
+ [5, 5, 5]
+ sage: s.invariant_factors()
+@@ -2058,7 +2058,7 @@ single generator for the group of solutions.
+
+ sage: S = sandpiles.Complete(4)
+ sage: S.points()
+- [[1, I, -I], [I, 1, -I]]
++ [[-I, I, 1], [-I, 1, I]]
+
+ ---
+
+@@ -4257,7 +4257,7 @@ EXAMPLES::
+ sage: D.is_linearly_equivalent([0,1,1])
+ True
+ sage: D.is_linearly_equivalent([0,1,1],True)
+- (1, 0, 0)
++ (0, -1, -1)
+ sage: v = vector(D.is_linearly_equivalent([0,1,1],True))
+ sage: vector(D.values()) - s.laplacian()*v
+ (0, 1, 1)
+@@ -4983,8 +4983,8 @@ Other
+
+ sage: P = matrix([[2,3,-7,-3],[5,2,-5,5],[8,2,5,4],[-5,-9,6,6]])
+ sage: wilmes_algorithm(P)
+- [ 1642 -13 -1627 -1]
+- [ -1 1980 -1582 -397]
++ [ 3279 -79 -1599 -1600]
++ [ -1 1539 -136 -1402]
+ [ 0 -1 1650 -1649]
+ [ 0 0 -1658 1658]
+
diff --git a/src/sage/arith/misc.py b/src/sage/arith/misc.py
index 173baa3b79..62977f095e 100644
--- a/src/sage/arith/misc.py
@@ -83,7 +327,7 @@ index 74f0786646..21cff9cbb3 100644
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
+index 1cfe6318f8..420af8f6a2 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));
@@ -96,155 +340,469 @@ index aede9fc941..27cc124372 100644
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 79c75ad784..9919e4187c 100644
+index 79c75ad784..5b2326a8e7 100644
--- a/src/sage/geometry/cone.py
+++ b/src/sage/geometry/cone.py
-@@ -4273,31 +4273,31 @@ class ConvexRationalPolyhedralCone(IntegralRayCollection, Container):
- M(-5, 21, 0, -3),
- M( 0, -2, 0, 1),
+@@ -3504,8 +3504,8 @@ class ConvexRationalPolyhedralCone(IntegralRayCollection, Container):
+
+ sage: K = Cone([(1,0,0), (0,1,0)])
+ sage: K.solid_restriction().rays()
+- N(1, 0),
+- N(0, 1)
++ N(0, 1),
++ N(1, 0)
+ in 2-d lattice N
+
+ The solid restriction of a single ray has the same
+@@ -3624,7 +3624,7 @@ class ConvexRationalPolyhedralCone(IntegralRayCollection, Container):
+ sage: C2_Z2 = Cone([(1,0),(1,2)])
+ sage: C2_Z2._split_ambient_lattice()
+ sage: C2_Z2._sublattice
+- Sublattice <N(1, 2), N(0, -1)>
++ Sublattice <N(1, 0), N(0, 1)>
+
+ Trivial cone::
+
+@@ -3695,9 +3695,9 @@ class ConvexRationalPolyhedralCone(IntegralRayCollection, Container):
+ sage: cone.rays().basis().matrix().det()
+ -4
+ sage: cone.sublattice()
+- Sublattice <N(-1, -1, 1), N(1, 0, 0), N(1, 1, 0)>
++ Sublattice <N(1, 1, 1), N(0, -1, 0), N(-1, -1, 0)>
+ sage: matrix( cone.sublattice().gens() ).det()
+- 1
++ -1
+
+ Another example::
+
+@@ -3709,7 +3709,7 @@ class ConvexRationalPolyhedralCone(IntegralRayCollection, Container):
+ N(4, -5, 1)
+ in 3-d lattice N
+ sage: c.sublattice()
+- Sublattice <N(1, 2, 3), N(4, -5, 1)>
++ Sublattice <N(4, -5, 1), N(1, 2, 3)>
+ sage: c.sublattice(5, -3, 4)
+ N(5, -3, 4)
+ sage: c.sublattice(1, 0, 0)
+@@ -3805,14 +3805,14 @@ class ConvexRationalPolyhedralCone(IntegralRayCollection, Container):
+
+ sage: c = Cone([(1,2,3), (4,-5,1)])
+ sage: c.sublattice()
+- Sublattice <N(1, 2, 3), N(4, -5, 1)>
++ Sublattice <N(4, -5, 1), N(1, 2, 3)>
+ sage: c.sublattice_complement()
+- Sublattice <N(0, -6, -5)>
++ Sublattice <N(2, -3, 0)>
+ sage: m = matrix( c.sublattice().gens() + c.sublattice_complement().gens() )
+ sage: m
+- [ 1 2 3]
+ [ 4 -5 1]
+- [ 0 -6 -5]
++ [ 1 2 3]
++ [ 2 -3 0]
+ sage: m.det()
+ -1
+ """
+@@ -3856,7 +3856,7 @@ class ConvexRationalPolyhedralCone(IntegralRayCollection, Container):
+ Sublattice <>
+ sage: c12 = Cone([(1,1,1), (1,-1,1)])
+ sage: c12.sublattice()
+- Sublattice <N(1, -1, 1), N(0, 1, 0)>
++ Sublattice <N(1, 1, 1), N(0, -1, 0)>
+ sage: c12.orthogonal_sublattice()
+ Sublattice <M(1, 0, -1)>
+
+@@ -3922,15 +3922,15 @@ class ConvexRationalPolyhedralCone(IntegralRayCollection, Container):
+ sage: sigma = Cone([(1,1,1,3),(1,-1,1,3),(-1,-1,1,3),(-1,1,1,3)])
+ sage: rho = Cone([(-1, -1, 1, 3), (-1, 1, 1, 3)])
+ sage: sigma.sublattice()
+- Sublattice <N(-1, -1, 1, 3), N(1, 0, 0, 0), N(1, 1, 0, 0)>
++ Sublattice <N(1, 1, 1, 3), N(0, -1, 0, 0), N(-1, -1, 0, 0)>
+ sage: rho.sublattice()
+- Sublattice <N(-1, 1, 1, 3), N(0, -1, 0, 0)>
++ Sublattice <N(-1, -1, 1, 3), N(0, 1, 0, 0)>
+ sage: sigma.relative_quotient(rho)
+ 1-d lattice, quotient
+- of Sublattice <N(-1, -1, 1, 3), N(1, 0, 0, 0), N(1, 1, 0, 0)>
++ of Sublattice <N(1, 1, 1, 3), N(0, -1, 0, 0), N(-1, -1, 0, 0)>
+ by Sublattice <N(1, 0, -1, -3), N(0, 1, 0, 0)>
+ sage: sigma.relative_quotient(rho).gens()
+- (N[1, 1, 0, 0],)
++ (N[1, 0, 0, 0],)
+
+ More complicated example::
+
+@@ -3938,12 +3938,12 @@ class ConvexRationalPolyhedralCone(IntegralRayCollection, Container):
+ sage: sigma = Cone([(1, 2, 3), (1, -1, 1), (-1, 1, 1), (-1, -1, 1)])
+ sage: N_sigma = sigma.sublattice()
+ sage: N_sigma
+- Sublattice <N(-1, 1, 1), N(1, 2, 3), N(0, 1, 1)>
++ Sublattice <N(1, 2, 3), N(1, -1, 1), N(-1, -1, -2)>
+ sage: N_rho = rho.sublattice()
+ sage: N_rho
+ Sublattice <N(1, -1, 1), N(1, 2, 3)>
+ sage: sigma.relative_quotient(rho).gens()
+- (N[0, 1, 1],)
++ (N[-1, -1, -2],)
+ sage: N = rho.lattice()
+ sage: N_sigma == N.span(N_rho.gens() + tuple(q.lift()
+ ....: for q in sigma.relative_quotient(rho).gens()))
+@@ -3958,12 +3958,12 @@ class ConvexRationalPolyhedralCone(IntegralRayCollection, Container):
+ Sublattice <N(1, -1, 1), N(1, 2, 3)>
+ sage: sigma1.relative_quotient(rho)
+ 1-d lattice, quotient
+- of Sublattice <N(-1, 1, 1), N(1, 2, 3), N(0, 1, 1)>
++ of Sublattice <N(1, 2, 3), N(1, -1, 1), N(-1, -1, -2)>
+ by Sublattice <N(1, 2, 3), N(0, 3, 2)>
+ sage: sigma1.relative_quotient(rho).gens()
+- (N[0, 1, 1],)
++ (N[-1, -1, -2],)
+ sage: sigma2.relative_quotient(rho).gens()
+- (N[-1, 0, -2],)
++ (N[0, 2, 1],)
+ """
+ try:
+ cached_values = self._relative_quotient
+@@ -4263,9 +4263,9 @@ class ConvexRationalPolyhedralCone(IntegralRayCollection, Container):
+ sage: Cone([[1,0],[3,4]]).dual().Hilbert_basis()
+ M(0, 1),
+ M(4, -3),
+- M(3, -2),
++ M(1, 0),
+ M(2, -1),
+- M(1, 0)
++ M(3, -2)
+ in 2-d lattice M
+ sage: cone = Cone([[1,2,3,4],[0,1,0,7],[3,1,0,2],[0,0,1,0]]).dual()
+ sage: cone.Hilbert_basis() # long time
+@@ -4275,16 +4275,16 @@ class ConvexRationalPolyhedralCone(IntegralRayCollection, Container):
M(15, -63, 25, 9),
-- M( 2, -3, 0, 1),
-- M( 1, -4, 1, 1),
+ 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(-1, 3, 0, 0),
+ M( 1, -5, 2, 1),
M( 3, -5, 1, 1),
-- M( 6, -5, 0, 1),
-- M( 3, -13, 5, 2),
+ M( 6, -5, 0, 1),
+ M( 3, -13, 5, 2),
M( 2, -6, 2, 1),
-- M( 5, -6, 1, 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( 8, -6, 0, 1),
++ M( 0, 1, 0, 0),
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( 7, -28, 11, 4),
+@@ -4295,9 +4295,9 @@ class ConvexRationalPolyhedralCone(IntegralRayCollection, Container):
+ 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(-1, 7, 0, -1),
- M( 1, 0, 0, 0)
-+ M( 0, 1, 0, 0)
++ M(-3, 14, 0, -2)
in 4-d lattice M
Not a strictly convex cone::
+diff --git a/src/sage/geometry/fan.py b/src/sage/geometry/fan.py
+index c5c3eb646e..2380086903 100644
+--- a/src/sage/geometry/fan.py
++++ b/src/sage/geometry/fan.py
+@@ -3008,8 +3008,8 @@ class RationalPolyhedralFan(IntegralRayCollection, Callable, Container):
+
+ sage: f = Fan([Cone([(1,0,1,0), (0,1,1,0)])])
+ sage: f.virtual_rays()
+- N(0, 0, 0, 1),
+- N(0, 0, 1, 0)
++ N(1, 0, 0, 0),
++ N(0, 0, 0, 1)
+ in 4-d lattice N
+
+ sage: f.rays()
+@@ -3018,14 +3018,14 @@ class RationalPolyhedralFan(IntegralRayCollection, Callable, Container):
+ in 4-d lattice N
+
+ sage: f.virtual_rays([0])
+- N(0, 0, 0, 1)
++ N(1, 0, 0, 0)
+ in 4-d lattice N
+
+ You can also give virtual ray indices directly, without
+ packing them into a list::
+
+ sage: f.virtual_rays(0)
+- N(0, 0, 0, 1)
++ N(1, 0, 0, 0)
+ in 4-d lattice N
+
+ Make sure that :trac:`16344` is fixed and one can compute
+diff --git a/src/sage/geometry/fan_isomorphism.py b/src/sage/geometry/fan_isomorphism.py
+index 04732ab0c2..18a6c9b199 100644
+--- a/src/sage/geometry/fan_isomorphism.py
++++ b/src/sage/geometry/fan_isomorphism.py
+@@ -96,9 +96,9 @@ def fan_isomorphism_generator(fan1, fan2):
+ ....: Cone([m2*vector([-1,-14]), m2*vector([-100, -5])])])
+ sage: sorted(fan_isomorphism_generator(fan1, fan2))
+ [
+- [18 1 -5]
+- [ 4 0 -1]
+- [ 5 0 -1]
++ [-12 1 -5]
++ [ -4 0 -1]
++ [ -5 0 -1]
+ ]
+
+ sage: m0 = identity_matrix(ZZ, 2)
+@@ -125,15 +125,15 @@ def fan_isomorphism_generator(fan1, fan2):
+ ]
+ sage: sorted(fan_isomorphism_generator(fan1, fan2))
+ [
+- [ 6 -3 7] [18 1 -5]
+- [ 1 -1 2] [ 4 0 -1]
+- [ 2 -1 2], [ 5 0 -1]
++ [-24 -3 7] [-12 1 -5]
++ [ -7 -1 2] [ -4 0 -1]
++ [ -8 -1 2], [ -5 0 -1]
+ ]
+ sage: sorted(fan_isomorphism_generator(fan2, fan1))
+ [
+- [ 0 -1 1] [ 0 -1 1]
+- [ 1 -7 2] [ 2 -2 -5]
+- [ 0 -5 4], [ 1 0 -3]
++ [ 0 1 -1] [ 0 1 -1]
++ [ 1 -13 8] [ 2 -8 1]
++ [ 0 -5 4], [ 1 0 -3]
+ ]
+ """
+ if not fan_isomorphic_necessary_conditions(fan1, fan2):
+diff --git a/src/sage/geometry/integral_points.pyx b/src/sage/geometry/integral_points.pyx
+index 765b0a5bb5..37e1d23339 100644
+--- a/src/sage/geometry/integral_points.pyx
++++ b/src/sage/geometry/integral_points.pyx
+@@ -108,13 +108,13 @@ cpdef tuple parallelotope_points(spanning_points, lattice):
+ sage: from sage.geometry.integral_points import parallelotope_points
+ sage: rays = list(map(vector, [(2,0), (0,2)]))
+ sage: parallelotope_points(rays, ZZ^2)
+- ((0, 0), (1, 0), (0, 1), (1, 1))
++ ((0, 0), (0, 1), (1, 0), (1, 1))
+
+ The rays can also be toric lattice points::
+
+ sage: rays = list(map(ToricLattice(2), [(2,0), (0,2)]))
+ sage: parallelotope_points(rays, ToricLattice(2))
+- (N(0, 0), N(1, 0), N(0, 1), N(1, 1))
++ (N(0, 0), N(0, 1), N(1, 0), N(1, 1))
+
+ A non-smooth cone::
+
+diff --git a/src/sage/geometry/polyhedron/ppl_lattice_polytope.py b/src/sage/geometry/polyhedron/ppl_lattice_polytope.py
+index 4236419276..5bf4d59b14 100644
+--- a/src/sage/geometry/polyhedron/ppl_lattice_polytope.py
++++ b/src/sage/geometry/polyhedron/ppl_lattice_polytope.py
+@@ -863,7 +863,7 @@ class LatticePolytope_PPL_class(C_Polyhedron):
+ sage: proj = poly.base_projection(fiber)
+ sage: proj_matrix = poly.base_projection_matrix(fiber)
+ sage: [ proj(p) for p in poly.integral_points() ]
+- [(-1, -1), (0, 0), (0, 0), (0, 0), (0, 0), (0, 0), (0, 0), (0, 0), (1, 0), (0, 1)]
++ [(-1, -1), (0, 0), (0, 0), (0, 0), (0, 0), (0, 0), (0, 0), (0, 0), (0, 1), (1, 0)]
+ sage: [ proj_matrix*p for p in poly.integral_points() ]
+ [(-1, -1), (0, 0), (0, 0), (0, 0), (0, 0), (0, 0), (0, 0), (0, 0), (0, 1), (1, 0)]
+ """
+diff --git a/src/sage/geometry/toric_lattice.py b/src/sage/geometry/toric_lattice.py
+index 4444d662be..4d8ef3fba6 100644
+--- a/src/sage/geometry/toric_lattice.py
++++ b/src/sage/geometry/toric_lattice.py
+@@ -425,7 +425,7 @@ class ToricLattice_generic(FreeModule_generic_pid):
+ sage: N3 = ToricLattice(3, 'N3')
+ sage: Q = N3 / N3.span([ N3(1,2,3) ])
+ sage: Q.an_element()
+- N3[0, 0, 1]
++ N3[1, 0, 0]
+ sage: N2 = ToricLattice(2, 'N2')
+ sage: N2( Q.an_element() )
+ N2(1, 0)
+@@ -1297,9 +1297,9 @@ class ToricLattice_quotient_element(FGP_Element):
+ sage: e == e2
+ True
+ sage: e.vector()
+- (4)
++ (-4)
+ sage: e2.vector()
+- (4)
++ (-4)
+ """
+
+ def _latex_(self):
+@@ -1407,7 +1407,7 @@ class ToricLattice_quotient(FGP_Module_class):
+ sage: Q
+ 1-d lattice, quotient of 3-d lattice N by Sublattice <N(1, 0, 1), N(0, 1, -1)>
+ sage: Q.gens()
+- (N[0, 0, 1],)
++ (N[1, 0, 0],)
+
+ Here, ``sublattice`` happens to be of codimension one in ``N``. If
+ you want to prescribe the sign of the quotient generator, you can
+@@ -1416,15 +1416,15 @@ class ToricLattice_quotient(FGP_Module_class):
+ sage: Q = N.quotient(sublattice, positive_point=N(0,0,-1)); Q
+ 1-d lattice, quotient of 3-d lattice N by Sublattice <N(1, 0, 1), N(0, 1, -1)>
+ sage: Q.gens()
+- (N[0, 0, -1],)
++ (N[1, 0, 0],)
+
+ or::
+
+ sage: M = N.dual()
+- sage: Q = N.quotient(sublattice, positive_dual_point=M(0,0,-1)); Q
++ sage: Q = N.quotient(sublattice, positive_dual_point=M(1,0,0)); Q
+ 1-d lattice, quotient of 3-d lattice N by Sublattice <N(1, 0, 1), N(0, 1, -1)>
+ sage: Q.gens()
+- (N[0, 0, -1],)
++ (N[1, 0, 0],)
+
+ TESTS::
+
diff --git a/src/sage/groups/abelian_gps/abelian_group.py b/src/sage/groups/abelian_gps/abelian_group.py
-index e6d8e16903..148c60abbc 100644
+index e6d8e16903..a493506524 100644
--- a/src/sage/groups/abelian_gps/abelian_group.py
+++ b/src/sage/groups/abelian_gps/abelian_group.py
-@@ -1440,7 +1440,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]
+@@ -1523,7 +1523,7 @@ class AbelianGroup_class(UniqueRepresentation, AbelianGroupBase):
+ generated by {f0, f0*f1^2}
+ sage: AbelianGroup([4,4]).subgroup_reduced( [ [1,0], [1,2] ])
+ Multiplicative Abelian subgroup isomorphic to C2 x C4
+- generated by {f1^2, f0}
++ generated by {f0^2*f1^2, f0^3}
+ """
+ from sage.matrix.constructor import matrix
+ d = self.ngens()
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
+index 3dcedeb7e3..2c76b75e0c 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
-
+@@ -43,7 +43,7 @@ def AdditiveAbelianGroup(invs, remember_generators = True):
+ sage: H = AdditiveAbelianGroup([0, 2, 3], remember_generators = False); H
+ Additive abelian group isomorphic to Z/6 + Z
+ sage: H.gens()
+- ((0, 1, 2), (1, 0, 0))
++ ((0, 1, 1), (1, 0, 0))
+
+ There are several ways to create elements of an additive abelian group.
+ Realize that there are two sets of generators: the "obvious" ones composed
diff --git a/src/sage/groups/fqf_orthogonal.py b/src/sage/groups/fqf_orthogonal.py
-index 3c5190589b..c536f03064 100644
+index 3c5190589b..ae9fc2fae2 100644
--- a/src/sage/groups/fqf_orthogonal.py
+++ b/src/sage/groups/fqf_orthogonal.py
-@@ -156,9 +156,9 @@ class FqfOrthogonalGroup(AbelianGroupAutomorphismGroup_subgroup):
- sage: S2 = 9 * T
- sage: Q = S1/S2
+@@ -133,16 +133,16 @@ class FqfOrthogonalGroup(AbelianGroupAutomorphismGroup_subgroup):
+ sage: T
+ Finite quadratic module over Integer Ring with invariants (3, 3, 3)
+ Gram matrix of the quadratic form with values in Q/2Z:
+- [4/3 0 0]
++ [2/3 0 0]
+ [ 0 2/3 0]
+- [ 0 0 2/3]
++ [ 0 0 4/3]
+ sage: T.orthogonal_group()
+ Group of isometries of
+ Finite quadratic module over Integer Ring with invariants (3, 3, 3)
+ Gram matrix of the quadratic form with values in Q/2Z:
+- [4/3 0 0]
++ [2/3 0 0]
+ [ 0 2/3 0]
+- [ 0 0 2/3]
++ [ 0 0 4/3]
+ generated by 2 elements
+ sage: q = matrix.diagonal(QQ, [3/2, 1/4, 1/4])
+ sage: T = TorsionQuadraticForm(q)
+@@ -158,7 +158,7 @@ class FqfOrthogonalGroup(AbelianGroupAutomorphismGroup_subgroup):
sage: G = T.orthogonal_group()
-- sage: g = G(matrix(ZZ, 2, [8, 0, 0, 1]))
-+ sage: g = G(matrix(ZZ, 2, [7, 12, 8, 19]))
+ sage: g = G(matrix(ZZ, 2, [8, 0, 0, 1]))
sage: Q.1 * g
- (0, 2)
+ (0, 1)
"""
Element = FqfIsometry
+@@ -225,8 +225,8 @@ class FqfOrthogonalGroup(AbelianGroupAutomorphismGroup_subgroup):
+ sage: f = OL(f)
+ sage: fbar = Oq(f)
+ sage: fbar
+- [4 3]
+- [3 1]
++ [1 3]
++ [3 4]
+
+ Note that the following does not work since it may lead to ambiguities, see :trac:`30669`::
+
+@@ -307,12 +307,12 @@ class FqfOrthogonalGroup(AbelianGroupAutomorphismGroup_subgroup):
+ Right action by Group of isometries of
+ Finite quadratic module over Integer Ring with invariants (3, 3)
+ Gram matrix of the quadratic form with values in Q/2Z:
+- [4/3 0]
+- [ 0 2/3]
++ [2/3 0]
++ [ 0 4/3]
+ generated by 2 elements on Finite quadratic module over Integer Ring with invariants (3, 3)
+ Gram matrix of the quadratic form with values in Q/2Z:
+- [4/3 0]
+- [ 0 2/3]
++ [2/3 0]
++ [ 0 4/3]
+ """
+ import operator
+ if op == operator.mul and not self_on_left:
+@@ -450,19 +450,19 @@ class ActionOnFqf(Action):
+ Right action by Group of isometries of
+ Finite quadratic module over Integer Ring with invariants (3, 3)
+ Gram matrix of the quadratic form with values in Q/2Z:
+- [4/3 0]
+- [ 0 2/3]
++ [2/3 0]
++ [ 0 4/3]
+ generated by 2 elements on Finite quadratic module over Integer Ring with invariants (3, 3)
+ Gram matrix of the quadratic form with values in Q/2Z:
+- [4/3 0]
+- [ 0 2/3]
++ [2/3 0]
++ [ 0 4/3]
+ sage: x = q.an_element()
+ sage: g = G.an_element()
+ sage: A(x, g).parent()
+ Finite quadratic module over Integer Ring with invariants (3, 3)
+ Gram matrix of the quadratic form with values in Q/2Z:
+- [4/3 0]
+- [ 0 2/3]
++ [2/3 0]
++ [ 0 4/3]
+ sage: q = TorsionQuadraticForm(matrix.diagonal([2/3, 2/3, 6/8, 1/4]))
+ sage: G = q.orthogonal_group()
+ sage: q2 = q.primary_part(2)
+diff --git a/src/sage/homology/chain_complex.py b/src/sage/homology/chain_complex.py
+index 49aaff1a85..47d14b4b9c 100644
+--- a/src/sage/homology/chain_complex.py
++++ b/src/sage/homology/chain_complex.py
+@@ -1270,7 +1270,7 @@ class ChainComplex_class(Parent):
+ sage: C_k = ChainComplex({0:d0, 1:d1, 2:d2}, degree=-1)
+ sage: C_k.homology(generators=true, algorithm='no_chomp')
+ {0: [(Z, Chain(0:(1)))],
+- 1: [(C2, Chain(1:(1, 0, 0))), (Z, Chain(1:(0, 0, 1)))],
++ 1: [(C2, Chain(1:(0, 1, -1))), (Z, Chain(1:(0, 1, 0)))],
+ 2: []}
+
+ From a torus using a field::
+diff --git a/src/sage/homology/simplicial_complex.py b/src/sage/homology/simplicial_complex.py
+index 8db479fd54..6c71bce482 100644
+--- a/src/sage/homology/simplicial_complex.py
++++ b/src/sage/homology/simplicial_complex.py
+@@ -2305,7 +2305,7 @@ class SimplicialComplex(Parent, GenericCellComplex):
+
+ sage: simplicial_complexes.Torus().homology(generators=True, algorithm='no_chomp')
+ {0: [],
+- 1: [(Z, (1, 2) - (1, 6) + (2, 6)), (Z, (3, 4) - (3, 6) + (4, 6))],
++ 1: [(Z, (2, 4) - (2, 6) + (4, 6)), (Z, (1, 4) - (1, 6) + (4, 6))],
+ 2: [(Z,
+ (0, 1, 2) - (0, 1, 5) + (0, 2, 6) - (0, 3, 4) + (0, 3, 5) - (0, 4, 6) - (1, 2, 4) + (1, 3, 4) - (1, 3, 6) + (1, 5, 6) - (2, 3, 5) + (2, 3, 6) + (2, 4, 5) - (4, 5, 6))]}
+ """
diff --git a/src/sage/lfunctions/pari.py b/src/sage/lfunctions/pari.py
index f810157b3e..f621b57c67 100644
--- a/src/sage/lfunctions/pari.py
@@ -259,7 +817,7 @@ index f810157b3e..f621b57c67 100644
.. RUBRIC:: Number field
diff --git a/src/sage/libs/pari/__init__.py b/src/sage/libs/pari/__init__.py
-index 77eda66097..3fa4618631 100644
+index 77eda66097..e9112b2e3e 100644
--- a/src/sage/libs/pari/__init__.py
+++ b/src/sage/libs/pari/__init__.py
@@ -161,12 +161,12 @@ exact object. Therefore, you should set the precision for each method
@@ -270,7 +828,8 @@ index 77eda66097..3fa4618631 100644
+ sage: eta1 = e.elleta(precision=50)[0]
sage: eta1.sage()
3.6054636014326520859158205642077267748
- sage: eta1 = e.elleta(precision=180)[0]
+- sage: eta1 = e.elleta(precision=180)[0]
++ sage: eta1 = e.elleta(precision=150)[0]
sage: eta1.sage()
- 3.60546360143265208591582056420772677481026899659802474544
+ 3.605463601432652085915820564207726774810268996598024745444380641429820491740
@@ -278,7 +837,7 @@ index 77eda66097..3fa4618631 100644
"""
diff --git a/src/sage/libs/pari/tests.py b/src/sage/libs/pari/tests.py
-index eb1c04f1e6..40329aea82 100644
+index dd7f8e9bf8..2aa382269a 100644
--- a/src/sage/libs/pari/tests.py
+++ b/src/sage/libs/pari/tests.py
@@ -135,7 +135,7 @@ Some more exotic examples::
@@ -361,17 +920,183 @@ index eb1c04f1e6..40329aea82 100644
sage: pari(-12).quadhilbert() # Not fundamental
Traceback (most recent call last):
...
-@@ -1762,7 +1762,7 @@ library::
+@@ -1760,12 +1760,12 @@ These are some doctests that used to be part of Sage and were removed from the c
+ library::
+
sage: e = pari([0,0,0,-82,0]).ellinit()
- sage: eta1 = e.elleta(precision=100)[0]
+- sage: eta1 = e.elleta(precision=100)[0]
++ sage: eta1 = e.elleta(precision=50)[0]
sage: eta1.sage()
-- 3.6054636014326520859158205642077267748
-+ 3.60546360143265208591582056420772677481026899659802474544
- sage: eta1 = e.elleta(precision=180)[0]
+ 3.6054636014326520859158205642077267748
+- sage: eta1 = e.elleta(precision=180)[0]
++ sage: eta1 = e.elleta(precision=150)[0]
sage: eta1.sage()
- 3.60546360143265208591582056420772677481026899659802474544
+- 3.60546360143265208591582056420772677481026899659802474544
++ 3.605463601432652085915820564207726774810268996598024745444380641429820491740
+
+ sage: from cypari2 import Pari
+ sage: pari = Pari()
+diff --git a/src/sage/matrix/matrix_integer_dense.pyx b/src/sage/matrix/matrix_integer_dense.pyx
+index 5c2d94bab2..2fdcf65ac6 100644
+--- a/src/sage/matrix/matrix_integer_dense.pyx
++++ b/src/sage/matrix/matrix_integer_dense.pyx
+@@ -2400,13 +2400,13 @@ cdef class Matrix_integer_dense(Matrix_dense):
+ [0 3 0]
+ [0 0 0]
+ sage: U
+- [ 0 1 0]
++ [ 0 2 -1]
+ [ 0 -1 1]
+- [-1 2 -1]
++ [ 1 -2 1]
+ sage: V
+- [-1 4 1]
+- [ 1 -3 -2]
+ [ 0 0 1]
++ [-1 2 -2]
++ [ 1 -1 1]
+ sage: U*A*V
+ [1 0 0]
+ [0 3 0]
+@@ -2421,12 +2421,12 @@ cdef class Matrix_integer_dense(Matrix_dense):
+ [0 2]
+ [0 0]
+ sage: U
+- [ 0 1 0]
++ [ 0 2 -1]
+ [ 0 -1 1]
+- [-1 2 -1]
++ [ 1 -2 1]
+ sage: V
+- [-1 3]
+- [ 1 -2]
++ [-1 1]
++ [ 1 0]
+ sage: U * A * V
+ [1 0]
+ [0 2]
+@@ -2445,7 +2445,8 @@ cdef class Matrix_integer_dense(Matrix_dense):
+
+ :meth:`elementary_divisors`
+ """
+- v = self.__pari__().matsnf(1).sage()
++ X = self.matrix_space()([self[i,j] for i in xrange(self._nrows-1,-1,-1) for j in xrange(self._ncols-1,-1,-1)])
++ v = X.__pari__().matsnf(1).sage()
+ # need to reverse order of rows of U, columns of V, and both of D.
+ D = self.matrix_space()([v[2][i,j] for i in xrange(self._nrows-1,-1,-1) for j in xrange(self._ncols-1,-1,-1)])
+
+@@ -2461,13 +2462,13 @@ cdef class Matrix_integer_dense(Matrix_dense):
+ # silly special cases for matrices with 0 columns (PARI has a unique empty matrix)
+ U = self.matrix_space(ncols = self._nrows)(1)
+ else:
+- U = self.matrix_space(ncols = self._nrows)([v[0][i,j] for i in xrange(self._nrows-1,-1,-1) for j in xrange(self._nrows)])
++ U = self.matrix_space(ncols = self._nrows)([v[0][i,j] for i in xrange(self._nrows-1,-1,-1) for j in xrange(self._nrows-1,-1,-1)])
+
+ if self._nrows == 0:
+ # silly special cases for matrices with 0 rows (PARI has a unique empty matrix)
+ V = self.matrix_space(nrows = self._ncols)(1)
+ else:
+- V = self.matrix_space(nrows = self._ncols)([v[1][i,j] for i in xrange(self._ncols) for j in xrange(self._ncols-1,-1,-1)])
++ V = self.matrix_space(nrows = self._ncols)([v[1][i,j] for i in xrange(self._ncols-1,-1,-1) for j in xrange(self._ncols-1,-1,-1)])
+
+ return D, U, V
+
+diff --git a/src/sage/matrix/matrix_integer_sparse.pyx b/src/sage/matrix/matrix_integer_sparse.pyx
+index c53c92602e..8223fa8ab0 100644
+--- a/src/sage/matrix/matrix_integer_sparse.pyx
++++ b/src/sage/matrix/matrix_integer_sparse.pyx
+@@ -611,13 +611,13 @@ cdef class Matrix_integer_sparse(Matrix_sparse):
+ [0 3 0]
+ [0 0 0]
+ sage: U
+- [ 0 1 0]
++ [ 0 2 -1]
+ [ 0 -1 1]
+- [-1 2 -1]
++ [ 1 -2 1]
+ sage: V
+- [-1 4 1]
+- [ 1 -3 -2]
+ [ 0 0 1]
++ [-1 2 -2]
++ [ 1 -1 1]
+ sage: U*A*V
+ [1 0 0]
+ [0 3 0]
+@@ -632,12 +632,12 @@ cdef class Matrix_integer_sparse(Matrix_sparse):
+ [0 2]
+ [0 0]
+ sage: U
+- [ 0 1 0]
++ [ 0 2 -1]
+ [ 0 -1 1]
+- [-1 2 -1]
++ [ 1 -2 1]
+ sage: V
+- [-1 3]
+- [ 1 -2]
++ [-1 1]
++ [ 1 0]
+ sage: U * A * V
+ [1 0]
+ [0 2]
+diff --git a/src/sage/modular/etaproducts.py b/src/sage/modular/etaproducts.py
+index b656a0f7de..4a90b2cecf 100644
+--- a/src/sage/modular/etaproducts.py
++++ b/src/sage/modular/etaproducts.py
+@@ -146,7 +146,7 @@ class EtaGroupElement(Element):
+
+ sage: eta1, eta2 = EtaGroup(4).basis() # indirect doctest
+ sage: eta1 * eta2
+- Eta product of level 4 : (eta_1)^8 (eta_4)^-8
++ Eta product of level 4 : (eta_1)^24 (eta_2)^-48 (eta_4)^24
+ """
+ newdict = {d: self._rdict.get(d, 0) + other._rdict.get(d, 0)
+ for d in union(self._rdict, other._rdict)}
+@@ -161,7 +161,7 @@ class EtaGroupElement(Element):
+
+ sage: eta1, eta2 = EtaGroup(4).basis()
+ sage: eta1 / eta2 # indirect doctest
+- Eta product of level 4 : (eta_1)^-24 (eta_2)^48 (eta_4)^-24
++ Eta product of level 4 : (eta_1)^-8 (eta_4)^8
+ sage: (eta1 / eta2) * eta2 == eta1
+ True
+ """
+@@ -509,16 +509,16 @@ class EtaGroup_class(UniqueRepresentation, Parent):
+ sage: EtaGroup(5).basis()
+ [Eta product of level 5 : (eta_1)^6 (eta_5)^-6]
+ sage: EtaGroup(12).basis()
+- [Eta product of level 12 : (eta_1)^2 (eta_2)^1 (eta_3)^2 (eta_4)^-1 (eta_6)^-7 (eta_12)^3,
++ [Eta product of level 12 : (eta_1)^-3 (eta_2)^2 (eta_3)^1 (eta_4)^-1 (eta_6)^-2 (eta_12)^3,
+ Eta product of level 12 : (eta_1)^-4 (eta_2)^2 (eta_3)^4 (eta_6)^-2,
++ Eta product of level 12 : (eta_1)^6 (eta_2)^-9 (eta_3)^-2 (eta_4)^3 (eta_6)^3 (eta_12)^-1,
+ Eta product of level 12 : (eta_1)^-1 (eta_2)^3 (eta_3)^3 (eta_4)^-2 (eta_6)^-9 (eta_12)^6,
+- Eta product of level 12 : (eta_1)^1 (eta_2)^-1 (eta_3)^-3 (eta_4)^-2 (eta_6)^7 (eta_12)^-2,
+- Eta product of level 12 : (eta_1)^-6 (eta_2)^9 (eta_3)^2 (eta_4)^-3 (eta_6)^-3 (eta_12)^1]
++ Eta product of level 12 : (eta_1)^3 (eta_3)^-1 (eta_4)^-3 (eta_12)^1]
+ sage: EtaGroup(12).basis(reduce=False) # much bigger coefficients
+- [Eta product of level 12 : (eta_2)^24 (eta_12)^-24,
+- Eta product of level 12 : (eta_1)^-336 (eta_2)^576 (eta_3)^696 (eta_4)^-216 (eta_6)^-576 (eta_12)^-144,
+- Eta product of level 12 : (eta_1)^-8 (eta_2)^-2 (eta_6)^2 (eta_12)^8,
+- Eta product of level 12 : (eta_1)^1 (eta_2)^9 (eta_3)^13 (eta_4)^-4 (eta_6)^-15 (eta_12)^-4,
++ [Eta product of level 12 : (eta_1)^384 (eta_2)^-576 (eta_3)^-696 (eta_4)^216 (eta_6)^576 (eta_12)^96,
++ Eta product of level 12 : (eta_2)^24 (eta_12)^-24,
++ Eta product of level 12 : (eta_1)^-40 (eta_2)^116 (eta_3)^96 (eta_4)^-30 (eta_6)^-80 (eta_12)^-62,
++ Eta product of level 12 : (eta_1)^-4 (eta_2)^-33 (eta_3)^-4 (eta_4)^1 (eta_6)^3 (eta_12)^37,
+ Eta product of level 12 : (eta_1)^15 (eta_2)^-24 (eta_3)^-29 (eta_4)^9 (eta_6)^24 (eta_12)^5]
+
+ ALGORITHM: An eta product of level `N` is uniquely
+@@ -1030,7 +1030,7 @@ def _eta_relations_helper(eta1, eta2, degree, qexp_terms, labels, verbose):
+ sage: from sage.modular.etaproducts import _eta_relations_helper
+ sage: r,s = EtaGroup(4).basis()
+ sage: _eta_relations_helper(r,s,4,100,['a','b'],False)
+- [a*b - a + 16]
++ [a + 1/16*b - 1/16]
+ sage: _eta_relations_helper(EtaProduct(26, {2:2,13:2,26:-2,1:-2}),EtaProduct(26, {2:4,13:2,26:-4,1:-2}),3,12,['a','b'],False) # not enough terms, will return rubbish
+ [1]
+ """
diff --git a/src/sage/modular/local_comp/liftings.py b/src/sage/modular/local_comp/liftings.py
-index 91bfd2448d..f9bf800b22 100644
+index 91bfd2448d..f629bc659b 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):
@@ -381,9 +1106,9 @@ index 91bfd2448d..f9bf800b22 100644
- [10 14 3]
- [ 9 10 3]
- [ 3 3 1]
-+ [ -2 -4 3]
-+ [ -9 -14 3]
-+ [ -6 -9 1]
++ [-2 -1 0]
++ [ 0 1 -3]
++ [ 3 0 4]
sage: A = matrix(Zmod(7), 2, [1,0,0,1])
sage: L = lift_for_SL(A)
@@ -402,11 +1127,25 @@ index 8bb3d46a00..3bce61f4eb 100644
True
"""
x = self.number_field().coerce(x)
+diff --git a/src/sage/modular/modform/find_generators.py b/src/sage/modular/modform/find_generators.py
+index 18055ef00f..40f4f7c858 100644
+--- a/src/sage/modular/modform/find_generators.py
++++ b/src/sage/modular/modform/find_generators.py
+@@ -400,8 +400,7 @@ class ModularFormsRing(SageObject):
+ sage: ModularFormsRing(Gamma0(13)).generators(maxweight=12, prec=4)
+ [(2, 1 + 2*q + 6*q^2 + 8*q^3 + O(q^4)), (4, 1 + O(q^4)), (4, q + O(q^4)), (4, q^2 + O(q^4)), (4, q^3 + O(q^4)), (6, 1 + O(q^4)), (6, q + O(q^4))]
+ sage: ModularFormsRing(Gamma0(13),base_ring=ZZ).generators(maxweight=12, prec=4)
+- [(2, 1 + 2*q + 6*q^2 + 8*q^3 + O(q^4)), (4, O(q^4)), (4, q^3 + O(q^4)), (4, q^2 + O(q^4)), (4, q + O(q^4)), (6, O(q^4)), (6, O(q^4)), (12, O(q^4))]
+-
++ [(2, 1 + 2*q + 6*q^2 + 8*q^3 + O(q^4)), (4, q + 4*q^2 + 10*q^3 + O(q^4)), (4, 2*q^2 + 5*q^3 + O(q^4)), (4, q^2 + O(q^4)), (4, -2*q^3 + O(q^4)), (6, O(q^4)), (6, O(q^4)), (12, O(q^4))]
+ sage: [k for k,f in ModularFormsRing(1, QQ).generators(maxweight=12)]
+ [4, 6]
+ sage: [k for k,f in ModularFormsRing(1, ZZ).generators(maxweight=12)]
diff --git a/src/sage/modular/modsym/p1list_nf.py b/src/sage/modular/modsym/p1list_nf.py
-index 7a91d353e3..b71fc8aac4 100644
+index 709a91035a..91f7efada6 100644
--- a/src/sage/modular/modsym/p1list_nf.py
+++ b/src/sage/modular/modsym/p1list_nf.py
-@@ -956,7 +956,7 @@ class P1NFList(SageObject):
+@@ -957,7 +957,7 @@ class P1NFList(SageObject):
sage: N = k.ideal(a + 1)
sage: P = P1NFList(N)
sage: u = k.unit_group().gens_values(); u
@@ -429,7 +1168,7 @@ index 67c46766c8..d1f1f55024 100644
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
+index 53857d31a0..5a948b6152 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):
@@ -446,7 +1185,7 @@ index 53857d31a0..6557b7f308 100644
(0, 1)
sage: Q.0.lift()
- (0, 0, 1)
-+ (0, -6, 1)
++ (0, 6, 1)
sage: Q.1.lift()
- (0, 2, 0)
+ (0, -2, 0)
@@ -482,7 +1221,7 @@ index 53857d31a0..6557b7f308 100644
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 38b95d40a3..629c7bbca2 100644
+index 38b95d40a3..935d0ab5c0 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. ::
@@ -491,7 +1230,7 @@ index 38b95d40a3..629c7bbca2 100644
User basis matrix:
- [0 0 1]
- [0 2 0]
-+ [ 0 -8 1]
++ [ 0 8 1]
+ [ 0 -2 0]
Create elements of M0 either by coercing in elements of V0, getting generators,
@@ -512,19 +1251,22 @@ index 38b95d40a3..629c7bbca2 100644
(1, 15)
sage: x.lift()
- (0, -2, 1)
-+ (0, -6, 1)
++ (0, 10, 1)
sage: M0(vector([1/2,0,0]))
- (0, 14)
+ (0, 2)
sage: x.additive_order()
16
-@@ -144,7 +144,7 @@ You can explicitly coerce elements of the kernel into M0 though. ::
+@@ -142,9 +142,9 @@ You can explicitly coerce elements of the kernel into M0 though. ::
+ Finitely generated module V/W over Integer Ring with invariants (2, 16)
+
sage: M0(K.0)
- (2, 0)
+- (2, 0)
++ (2, 8)
sage: M0(K.1)
- (3, 1)
-+ (1, 13)
++ (1, 5)
sage: f(M0(K.0))
(0)
sage: f(M0(K.1))
@@ -553,9 +1295,9 @@ index 38b95d40a3..629c7bbca2 100644
- [ 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]
++ [ 1 0 0] [ 1 0 0] [ 1 0 8]
++ [ 0 4 0] [ 0 1 1] [ 0 0 -1]
++ [ 0 0 12], [ 0 -1 0], [ 0 1 3]
)
"""
return self._relative_matrix().smith_form()
@@ -564,65 +1306,55 @@ index 38b95d40a3..629c7bbca2 100644
((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)]
++ [(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]
+@@ -1069,15 +1069,15 @@ class FGP_Module_class(Module):
sage: D.gens_to_smith()
-- [0 3 0]
-+ [0 3 6]
+ [0 3 0]
[0 0 3]
- [0 2 0]
- [1 0 0]
-- [0 0 4]
-+ [0 4 4]
++ [0 4 0]
+ [1 2 0]
-+ [0 0 8]
+ [0 0 4]
sage: T = D.gens_to_smith()*D.smith_to_gens()
sage: T
- [ 3 0 15 0 0]
-- [ 0 33 0 0 3]
++ [ 3 0 3 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]
++ [ 4 0 4 0 0]
++ [ 2 0 3 1 0]
+ [ 0 44 0 0 4]
The matrix `T` now satisfies a certain congruence::
-
-@@ -1120,14 +1120,14 @@ class FGP_Module_class(Module):
+@@ -1120,13 +1120,13 @@ 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]
++ [ 0 0 1 1 0]
++ [ 1 0 1 0 0]
+ [ 0 11 0 0 1]
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]
++ [ 1 6 0]
++ [ 0 7 0]
+ [ 0 0 37]
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)
++ (2, 33, 3, 1, 3)
"""
if self.base_ring() != ZZ:
# it is not
@@ -631,7 +1363,7 @@ index 38b95d40a3..629c7bbca2 100644
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))
++ ((0, 3, 0), (0, 0, 3), (0, 4, 0), (1, 2, 0), (0, 0, 8))
We create some element of D::
@@ -640,23 +1372,35 @@ index 38b95d40a3..629c7bbca2 100644
sage: v = D.gens_vector(x)
sage: v
- (2, 9, 10, 1, 33)
-+ (26, 11, 3, 1, 18)
++ (2, 9, 3, 1, 33)
The output can be further reduced::
sage: D.gens_vector(x, reduce=True)
- (0, 1, 1, 1, 0)
-+ (0, 3, 0, 1, 0)
++ (0, 1, 0, 1, 0)
Let us check::
+@@ -1262,9 +1262,9 @@ class FGP_Module_class(Module):
+ If x is not in self, it is coerced in::
+
+ sage: Q.coordinate_vector(V.0)
+- (1, 0, -3)
++ (1, -3, 0)
+ sage: Q.coordinate_vector(Q(V.0))
+- (1, 0, -3)
++ (1, -3, 0)
+
+ TESTS::
+
@@ -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 6 1]
+ [ 0 -2 0]
sage: phi = Q.hom([Q.0, 4*Q.1])
sage: x = Q(V.0); x
@@ -682,12 +1426,12 @@ index 38b95d40a3..629c7bbca2 100644
True
sage: x = Q(V.2); x
- (1, 0)
-+ (1, 9)
++ (1, 3)
sage: Q.coordinate_vector(x)
- (1, 0)
- sage: x == Q.0
-+ (1, -3)
-+ sage: x == Q.0-3*Q.1
++ (1, 3)
++ sage: x == Q.0 + 3*Q.1
True
"""
try:
@@ -697,7 +1441,7 @@ index 38b95d40a3..629c7bbca2 100644
User basis matrix:
- [0 0 1]
- [0 1 0]
-+ [ 0 -3 1]
++ [ 0 3 1]
+ [ 0 -1 0]
sage: O.W()
Free module of degree 3 and rank 2 over Integer Ring
@@ -707,12 +1451,12 @@ index 38b95d40a3..629c7bbca2 100644
sage: Q = V/W
sage: Q.random_element()
- (1, 10)
-+ (1, 11)
++ (1, 5)
"""
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 fbbd479c6e..679965df96 100644
+index fbbd479c6e..ce5df8df52 100644
--- a/src/sage/modules/fg_pid/fgp_morphism.py
+++ b/src/sage/modules/fg_pid/fgp_morphism.py
@@ -258,20 +258,20 @@ class FGP_Morphism(Morphism):
@@ -721,7 +1465,7 @@ index fbbd479c6e..679965df96 100644
User basis matrix:
- [0 0 1]
- [0 2 0]
-+ [ 0 -6 1]
++ [ 0 6 1]
+ [ 0 -2 0]
sage: phi = Q.hom([Q.0, 4*Q.1])
sage: x = Q(V.0); x
@@ -734,51 +1478,119 @@ index fbbd479c6e..679965df96 100644
False
sage: phi(x)
- (0, 4)
-+ (0, 8)
- sage: phi(4*Q.1)
- (0, 4)
+- sage: phi(4*Q.1)
+- (0, 4)
- sage: phi(4*Q.1) == phi(x)
++ (0, 8)
++ sage: phi(8*Q.1)
++ (0, 8)
+ sage: phi(8*Q.1) == phi(x)
True
"""
from .fgp_module import is_FGP_Module
+diff --git a/src/sage/modules/free_quadratic_module_integer_symmetric.py b/src/sage/modules/free_quadratic_module_integer_symmetric.py
+index 7de14e8d77..d09578682e 100644
+--- a/src/sage/modules/free_quadratic_module_integer_symmetric.py
++++ b/src/sage/modules/free_quadratic_module_integer_symmetric.py
+@@ -549,8 +549,8 @@ def IntegralLatticeGluing(Lattices, glue, return_embeddings=False):
+ sage: [L, phi] = IntegralLatticeGluing([L1, L2], [[f1, g1], [f2, 2 * g2]], True)
+ sage: phi[0]
+ Free module morphism defined by the matrix
+- [ 2 2 -1 -2]
+- [ 0 2 0 -1]
++ [ 2 2 -2 -1]
++ [ 0 2 -1 0]
+ Domain: Lattice of degree 4 and rank 2 over Integer Ring
+ Basis matrix:
+ [1 1 0 0]
+@@ -563,7 +563,7 @@ def IntegralLatticeGluing(Lattices, glue, return_embeddings=False):
+ Codomain: Lattice of degree 10 and rank 4 over Integer Ring
+ Basis matrix:
+ [ 1/2 0 -1/2 0 0 1/2 0 0 1/2 1/2]
+- [ 0 1/2 1/2 0 0 0 0 0 1/2 1/2]
++ [ 0 1/2 1/2 0 0 1/2 0 0 0 0]
+ [ 0 0 0 0 0 1 0 0 0 0]
+ [ 0 0 0 0 0 0 0 0 1 1]
+ Inner product matrix:
+@@ -784,7 +784,7 @@ class FreeQuadraticModule_integer_symmetric(FreeQuadraticModule_submodule_with_b
+ Finite quadratic module over Integer Ring with invariants (2, 10)
+ Gram matrix of the quadratic form with values in Q/2Z:
+ [ 1 1/2]
+- [1/2 9/5]
++ [1/2 1/5]
+ sage: L.discriminant_group(2)
+ Finite quadratic module over Integer Ring with invariants (2, 2)
+ Gram matrix of the quadratic form with values in Q/2Z:
+@@ -793,7 +793,7 @@ class FreeQuadraticModule_integer_symmetric(FreeQuadraticModule_submodule_with_b
+ sage: L.discriminant_group(5)
+ Finite quadratic module over Integer Ring with invariants (5,)
+ Gram matrix of the quadratic form with values in Q/2Z:
+- [6/5]
++ [4/5]
+
+ TESTS::
+
+@@ -1463,8 +1463,8 @@ def local_modification(M, G, p, check=True):
+ sage: local_modification(M, L.gram_matrix(), 2)
+ Lattice of degree 4 and rank 4 over Integer Ring
+ Basis matrix:
+- [1/3 0 1/3 2/3]
+- [ 0 1/3 1/3 2/3]
++ [1/3 0 2/3 2/3]
++ [ 0 1/3 0 2/3]
+ [ 0 0 1 0]
+ [ 0 0 0 1]
+ Inner product matrix:
diff --git a/src/sage/modules/torsion_quadratic_module.py b/src/sage/modules/torsion_quadratic_module.py
-index 39e7065ac4..6086d1180d 100644
+index 27a019554e..f922c0c278 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()
+@@ -62,7 +62,7 @@ def TorsionQuadraticForm(q):
+
+ TESTS::
+
+- sage: TorsionQuadraticForm(matrix.diagonal([3/8,3/8,3/4]))
++ sage: TorsionQuadraticForm(matrix.diagonal([3/4,3/8,3/8]))
+ Finite quadratic module over Integer Ring with invariants (4, 8, 8)
+ Gram matrix of the quadratic form with values in Q/2Z:
+ [3/4 0 0]
+@@ -1030,10 +1030,10 @@ class TorsionQuadraticModule(FGP_Module_class, CachedRepresentation):
+ sage: T
+ Finite quadratic module over Integer Ring with invariants (6, 6, 12, 12)
+ Gram matrix of the quadratic form with values in Q/(1/3)Z:
+- [1/18 5/36 0 0]
+- [5/36 1/18 5/36 5/36]
+- [ 0 5/36 1/36 1/72]
+- [ 0 5/36 1/72 1/36]
++ [ 1/18 1/12 5/36 1/36]
++ [ 1/12 1/6 1/36 1/9]
++ [ 5/36 1/36 1/36 11/72]
++ [ 1/36 1/9 11/72 1/36]
+ sage: T.normal_form()
+ Finite quadratic module over Integer Ring with invariants (6, 6, 12, 12)
+ Gram matrix of the quadratic form with values in Q/(1/3)Z:
+diff --git a/src/sage/quadratic_forms/extras.py b/src/sage/quadratic_forms/extras.py
+index 37c30e9afa..2baa4e3cfa 100644
+--- a/src/sage/quadratic_forms/extras.py
++++ b/src/sage/quadratic_forms/extras.py
+@@ -94,12 +94,12 @@ def extend_to_primitive(A_input):
+
+ sage: A = Matrix(ZZ, 3, 2, range(6))
+ sage: extend_to_primitive(A)
+- [ 0 1 0]
++ [ 0 1 -1]
+ [ 2 3 0]
+- [ 4 5 -1]
++ [ 4 5 0]
+
+ sage: extend_to_primitive([vector([1,2,3])])
+- [(1, 2, 3), (0, 1, 0), (0, 0, 1)]
++ [(1, 2, 3), (0, 1, 1), (-1, 0, 0)]
+
+ """
+ ## Deal with a list of vectors
diff --git a/src/sage/quadratic_forms/genera/genus.py b/src/sage/quadratic_forms/genera/genus.py
-index d4e8ffc00d..0865e37c6e 100644
+index f0718593ea..35de7eea8d 100644
--- a/src/sage/quadratic_forms/genera/genus.py
+++ b/src/sage/quadratic_forms/genera/genus.py
@@ -2897,18 +2897,18 @@ class GenusSymbol_global_ring(object):
@@ -789,10 +1601,10 @@ index d4e8ffc00d..0865e37c6e 100644
- [ 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]
++ [ 1/2 0 1/2 0]
++ [ 0 3/2 0 0]
++ [ 1/2 0 3/4 0]
++ [ 0 0 0 25/24]
sage: A = matrix.diagonal(ZZ, [1, -4, 6, 8])
sage: GS = Genus(A)
sage: GS.discriminant_form()
@@ -801,30 +1613,118 @@ index d4e8ffc00d..0865e37c6e 100644
- [ 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]
++ [ 1/2 1/2 0]
++ [ 1/2 3/4 0]
++ [ 0 0 1/24]
"""
from sage.modules.torsion_quadratic_module import TorsionQuadraticForm
qL = []
+diff --git a/src/sage/quadratic_forms/quadratic_form__split_local_covering.py b/src/sage/quadratic_forms/quadratic_form__split_local_covering.py
+index 92102fcbd1..85abc20a86 100644
+--- a/src/sage/quadratic_forms/quadratic_form__split_local_covering.py
++++ b/src/sage/quadratic_forms/quadratic_form__split_local_covering.py
+@@ -318,25 +318,25 @@ def complementary_subform_to_vector(self, v):
+ sage: Q1 = DiagonalQuadraticForm(ZZ, [1,3,5,7])
+ sage: Q1.complementary_subform_to_vector([1,0,0,0])
+ Quadratic form in 3 variables over Integer Ring with coefficients:
+- [ 3 0 0 ]
++ [ 7 0 0 ]
+ [ * 5 0 ]
+- [ * * 7 ]
++ [ * * 3 ]
+
+ ::
+
+ sage: Q1.complementary_subform_to_vector([1,1,0,0])
+ Quadratic form in 3 variables over Integer Ring with coefficients:
+- [ 12 0 0 ]
++ [ 7 0 0 ]
+ [ * 5 0 ]
+- [ * * 7 ]
++ [ * * 12 ]
+
+ ::
+
+ sage: Q1.complementary_subform_to_vector([1,1,1,1])
+ Quadratic form in 3 variables over Integer Ring with coefficients:
+- [ 624 -480 -672 ]
+- [ * 880 -1120 ]
+- [ * * 1008 ]
++ [ 880 -480 -160 ]
++ [ * 624 -96 ]
++ [ * * 240 ]
+
+ """
+ n = self.dim()
+@@ -417,8 +417,8 @@ def split_local_cover(self):
+ sage: Q1.split_local_cover()
+ Quadratic form in 3 variables over Integer Ring with coefficients:
+ [ 3 0 0 ]
+- [ * 7 0 ]
+- [ * * 5 ]
++ [ * 5 0 ]
++ [ * * 7 ]
+
+ """
+ ## 0. If a split local cover already exists, then return it.
+diff --git a/src/sage/rings/finite_rings/finite_field_base.pyx b/src/sage/rings/finite_rings/finite_field_base.pyx
+index 972f07e6de..124d9cfd56 100644
+--- a/src/sage/rings/finite_rings/finite_field_base.pyx
++++ b/src/sage/rings/finite_rings/finite_field_base.pyx
+@@ -1621,14 +1621,14 @@ cdef class FiniteField(Field):
+
+ We check that :trac:`23801` is resolved::
+
+- sage: k.<a> = GF(3^240)
++ sage: k.<a> = GF(5^240)
+ sage: l, inc = k.subfield(3, 'z', map=True); l
+- Finite Field in z of size 3^3
++ Finite Field in z of size 5^3
+ sage: inc
+ Ring morphism:
+- From: Finite Field in z of size 3^3
+- To: Finite Field in a of size 3^240
+- Defn: z |--> a^239 + a^238 + ... + a^3 + 2
++ From: Finite Field in z of size 5^3
++ To: Finite Field in a of size 5^240
++ Defn: z |--> 2*a^235 + a^231 + ... + a + 4
+
+ There is no coercion since we can't ensure compatibility with larger
+ fields in this case::
+@@ -1639,7 +1639,7 @@ cdef class FiniteField(Field):
+ But there is still a compatibility among the generators chosen for the subfields::
+
+ sage: ll, iinc = k.subfield(12, 'w', map=True)
+- sage: x = iinc(ll.gen())^((3^12-1)/(3^3-1))
++ sage: x = iinc(ll.gen())^((5^12-1)/(5^3-1))
+ sage: x.minimal_polynomial() == l.modulus()
+ True
+
diff --git a/src/sage/rings/finite_rings/finite_field_constructor.py b/src/sage/rings/finite_rings/finite_field_constructor.py
-index 81ff16b1b6..46d56b923f 100644
+index 04073fc52a..48c5a78302 100644
--- a/src/sage/rings/finite_rings/finite_field_constructor.py
+++ b/src/sage/rings/finite_rings/finite_field_constructor.py
-@@ -284,11 +284,6 @@ class FiniteFieldFactory(UniqueFactory):
+@@ -284,14 +284,14 @@ 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()
++ sage: K.<a> = GF(5^45)
+ sage: a.multiplicative_order()
- 189478062869360049565633138
-- sage: a.is_square()
-- True
- sage: K.<b> = GF(5^40, modulus="primitive")
++ 7105427357601001858711242675781
+ sage: a.is_square()
+ True
+- sage: K.<b> = GF(5^40, modulus="primitive")
++ sage: K.<b> = GF(5^45, modulus="primitive")
sage: b.multiplicative_order()
- 9094947017729282379150390624
+- 9094947017729282379150390624
++ 28421709430404007434844970703124
+
+ The modulus must be irreducible::
+
diff --git a/src/sage/rings/finite_rings/integer_mod_ring.py b/src/sage/rings/finite_rings/integer_mod_ring.py
-index 0dcef0d21a..7b4f8b1b4b 100644
+index 0dcef0d21a..8380acc653 100644
--- a/src/sage/rings/finite_rings/integer_mod_ring.py
+++ b/src/sage/rings/finite_rings/integer_mod_ring.py
@@ -626,7 +626,7 @@ class IntegerModRing_generic(quotient_ring.QuotientRing_generic):
@@ -832,7 +1732,7 @@ index 0dcef0d21a..7b4f8b1b4b 100644
((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,), ())
++ ((11, 7), (11, 4), (2,), (11,), (14,), (7,), (4,), ())
sage: Integers(2).multiplicative_subgroups()
((),)
sage: len(Integers(341).multiplicative_subgroups())
@@ -899,7 +1799,7 @@ index cd4c2212c3..007a68e4c0 100644
sage: c = OK(a)
sage: b = k(a); b
diff --git a/src/sage/rings/integer.pyx b/src/sage/rings/integer.pyx
-index 77a3a18913..421a90e10e 100644
+index a2f913df7f..0bae1cc505 100644
--- a/src/sage/rings/integer.pyx
+++ b/src/sage/rings/integer.pyx
@@ -5474,7 +5474,7 @@ cdef class Integer(sage.structure.element.EuclideanDomainElement):
@@ -912,7 +1812,7 @@ index 77a3a18913..421a90e10e 100644
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 2a5dd11c95..14458b8062 100644
+index 5c0a33eb74..ccd088d630 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::
@@ -1021,10 +1921,10 @@ index 46d0ca8c9d..1ad6d583a8 100644
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 5f5efd2a13..4c28bc332d 100644
+index f4cdb9e4f3..70a142ba5c 100644
--- a/src/sage/rings/number_field/number_field.py
+++ b/src/sage/rings/number_field/number_field.py
-@@ -3583,7 +3583,7 @@ class NumberField_generic(WithEqualityById, number_field_base.NumberField):
+@@ -3590,7 +3590,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))
@@ -1033,7 +1933,7 @@ index 5f5efd2a13..4c28bc332d 100644
sage: M.ideal(K.ideal(2, a)) == M.ideal(a*(b - c)/2)
True
-@@ -4751,7 +4751,7 @@ class NumberField_generic(WithEqualityById, number_field_base.NumberField):
+@@ -4758,7 +4758,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,
@@ -1042,7 +1942,7 @@ index 5f5efd2a13..4c28bc332d 100644
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
-@@ -4793,8 +4793,8 @@ class NumberField_generic(WithEqualityById, number_field_base.NumberField):
+@@ -4800,8 +4800,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]
@@ -1052,7 +1952,7 @@ index 5f5efd2a13..4c28bc332d 100644
TESTS:
-@@ -4931,7 +4931,7 @@ class NumberField_generic(WithEqualityById, number_field_base.NumberField):
+@@ -4938,7 +4938,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,
@@ -1061,7 +1961,7 @@ index 5f5efd2a13..4c28bc332d 100644
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)
-@@ -6108,28 +6108,37 @@ class NumberField_generic(WithEqualityById, number_field_base.NumberField):
+@@ -6115,28 +6115,37 @@ class NumberField_generic(WithEqualityById, number_field_base.NumberField):
try:
return self._integral_basis_dict[v]
except (AttributeError, KeyError):
@@ -1119,7 +2019,7 @@ index 5f5efd2a13..4c28bc332d 100644
def reduced_basis(self, prec=None):
r"""
-@@ -6837,7 +6846,7 @@ class NumberField_generic(WithEqualityById, number_field_base.NumberField):
+@@ -6763,7 +6772,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()
@@ -1128,7 +2028,7 @@ index 5f5efd2a13..4c28bc332d 100644
For big number fields, provably computing the unit group can
take a very long time. In this case, one can ask for the
-@@ -6848,14 +6857,14 @@ class NumberField_generic(WithEqualityById, number_field_base.NumberField):
+@@ -6774,14 +6783,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
@@ -1149,7 +2049,7 @@ index 5f5efd2a13..4c28bc332d 100644
TESTS:
-@@ -6864,7 +6873,7 @@ class NumberField_generic(WithEqualityById, number_field_base.NumberField):
+@@ -6790,7 +6799,7 @@ class NumberField_generic(WithEqualityById, number_field_base.NumberField):
sage: K.<a> = NumberField(1/2*x^2 - 1/6)
sage: K.units()
@@ -1158,7 +2058,7 @@ index 5f5efd2a13..4c28bc332d 100644
"""
proof = proof_flag(proof)
-@@ -6943,7 +6952,7 @@ class NumberField_generic(WithEqualityById, number_field_base.NumberField):
+@@ -6869,7 +6878,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
@@ -1167,7 +2067,7 @@ index 5f5efd2a13..4c28bc332d 100644
"""
proof = proof_flag(proof)
-@@ -7131,7 +7140,7 @@ class NumberField_generic(WithEqualityById, number_field_base.NumberField):
+@@ -7057,7 +7066,7 @@ class NumberField_generic(WithEqualityById, number_field_base.NumberField):
sage: solutions, bound = K.S_unit_solutions(S, prec=100, include_bound=True)
sage: bound
@@ -1176,7 +2076,7 @@ index 5f5efd2a13..4c28bc332d 100644
"""
from .S_unit_solver import solve_S_unit_equation
return solve_S_unit_equation(self, S, prec, include_exponents, include_bound, proof)
-@@ -10970,9 +10979,9 @@ class NumberField_cyclotomic(NumberField_absolute):
+@@ -10877,9 +10886,9 @@ class NumberField_cyclotomic(NumberField_absolute):
EXAMPLES::
sage: k5.<z> = CyclotomicField(5)
@@ -1188,7 +2088,7 @@ index 5f5efd2a13..4c28bc332d 100644
sage: z^7 + 3
z^2 + 3
sage: k5(w) # indirect doctest
-@@ -10983,7 +10992,7 @@ class NumberField_cyclotomic(NumberField_absolute):
+@@ -10890,7 +10899,7 @@ class NumberField_cyclotomic(NumberField_absolute):
sage: F = CyclotomicField(8)
sage: z = F.gen()
@@ -1197,7 +2097,7 @@ index 5f5efd2a13..4c28bc332d 100644
E(8)-E(8)^3
sage: F(a)
-zeta8^3 + zeta8
-@@ -10997,6 +11006,7 @@ class NumberField_cyclotomic(NumberField_absolute):
+@@ -10904,6 +10913,7 @@ class NumberField_cyclotomic(NumberField_absolute):
It also works with the old pexpect interface to GAP::
@@ -1206,10 +2106,10 @@ index 5f5efd2a13..4c28bc332d 100644
[ [ E(4), 1 ], [ 0, 1+E(8)-E(8)^3 ] ]
sage: b[1,2]
diff --git a/src/sage/rings/number_field/number_field_element.pyx b/src/sage/rings/number_field/number_field_element.pyx
-index 562a76fa84..ca54b7f95f 100644
+index 29932830f3..35e2857d96 100644
--- a/src/sage/rings/number_field/number_field_element.pyx
+++ b/src/sage/rings/number_field/number_field_element.pyx
-@@ -1628,7 +1628,7 @@ cdef class NumberFieldElement(FieldElement):
+@@ -1632,7 +1632,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
@@ -1218,7 +2118,7 @@ index 562a76fa84..ca54b7f95f 100644
sage: t[1].norm(K)
-a
-@@ -1743,11 +1743,11 @@ cdef class NumberFieldElement(FieldElement):
+@@ -1747,11 +1747,11 @@ cdef class NumberFieldElement(FieldElement):
sage: Q.<X> = K[]
sage: L.<b> = NumberField(X^4 + a)
sage: t = (-a)._rnfisnorm(L); t
@@ -1233,7 +2133,7 @@ index 562a76fa84..ca54b7f95f 100644
3
diff --git a/src/sage/rings/number_field/number_field_ideal.py b/src/sage/rings/number_field/number_field_ideal.py
-index 2e6a368843..aa2cc3c297 100644
+index 01e5d47902..2478fdb009 100644
--- a/src/sage/rings/number_field/number_field_ideal.py
+++ b/src/sage/rings/number_field/number_field_ideal.py
@@ -231,7 +231,7 @@ class NumberFieldIdeal(Ideal_generic):
@@ -1254,7 +2154,140 @@ index 2e6a368843..aa2cc3c297 100644
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
-@@ -3118,7 +3118,7 @@ class NumberFieldFractionalIdeal(MultiplicativeGroupElement, NumberFieldIdeal):
+@@ -780,7 +780,6 @@ class NumberFieldIdeal(Ideal_generic):
+ sage: P = EllipticCurve(L, '57a1').lift_x(z_x) * 3
+ sage: ideal = L.fractional_ideal(P[0], P[1])
+ sage: ideal.is_principal(proof=False)
+- *** Warning: precision too low for generators, not given.
+ True
+ sage: len(ideal.gens_reduced(proof=False))
+ 1
+@@ -789,7 +788,7 @@ class NumberFieldIdeal(Ideal_generic):
+ self._is_principal = True
+ self._reduced_generators = self.gens()
+ return self._reduced_generators
+- self._cache_bnfisprincipal(proof=proof, gens_needed=True)
++ self._cache_bnfisprincipal(proof=proof, gens=True)
+ return self._reduced_generators
+
+ def gens_two(self):
+@@ -828,10 +827,13 @@ class NumberFieldIdeal(Ideal_generic):
+ try:
+ return self.__two_generators
+ except AttributeError:
+- if self.is_zero():
+- self.__two_generators = (0,0)
+- return self.__two_generators
+- K = self.number_field()
++ pass
++
++ K = self.number_field()
++
++ if self.is_zero():
++ self.__two_generators = (K.zero(), K.zero())
++ else:
+ HNF = self.pari_hnf()
+ # Check whether the ideal is generated by an integer, i.e.
+ # whether HNF is a multiple of the identity matrix
+@@ -840,7 +842,8 @@ class NumberFieldIdeal(Ideal_generic):
+ else:
+ a, alpha = K.pari_nf().idealtwoelt(HNF)
+ self.__two_generators = (K(a), K(alpha))
+- return self.__two_generators
++
++ return self.__two_generators
+
+ def integral_basis(self):
+ r"""
+@@ -1030,7 +1033,7 @@ class NumberFieldIdeal(Ideal_generic):
+ raise ValueError("%s is not a prime ideal" % self)
+ return self._pari_prime
+
+- def _cache_bnfisprincipal(self, proof=None, gens_needed=False):
++ def _cache_bnfisprincipal(self, proof=None, gens=False):
+ r"""
+ This function is essentially the implementation of
+ :meth:`is_principal`, :meth:`gens_reduced` and
+@@ -1042,9 +1045,8 @@ class NumberFieldIdeal(Ideal_generic):
+
+ - ``proof`` -- proof flag. If ``proof=False``, assume GRH.
+
+- - ``gens_needed`` -- (default: True) if True, insist on computing
+- the reduced generators of the ideal. With ``gens=False``, they
+- may or may not be computed (depending on how big the ideal is).
++ - ``gens`` -- (default: False) if True, also computes the reduced
++ generators of the ideal.
+
+ OUTPUT:
+
+@@ -1052,6 +1054,15 @@ class NumberFieldIdeal(Ideal_generic):
+ ``_ideal_class_log`` (see :meth:`ideal_class_log`),
+ ``_is_principal`` (see :meth:`is_principal`) and
+ ``_reduced_generators``.
++
++ TESTS:
++
++ Check that no warnings are triggered from PARI/GP (see :trac:`30801`)::
++
++ sage: K.<a> = NumberField(x^2 - x + 112941801)
++ sage: I = K.ideal((112941823, a + 49942513))
++ sage: I.is_principal()
++ False
+ """
+ # Since pari_bnf() is cached, this call to pari_bnf() should not
+ # influence the run-time much. Also, this simplifies the handling
+@@ -1063,29 +1074,33 @@ class NumberFieldIdeal(Ideal_generic):
+
+ # If we already have _reduced_generators, no need to compute them again
+ if hasattr(self, "_reduced_generators"):
+- gens_needed = False
++ gens = False
+
+ # Is there something to do?
+- if hasattr(self, "_ideal_class_log") and not gens_needed:
++ if hasattr(self, "_ideal_class_log") and not gens:
+ self._is_principal = not any(self._ideal_class_log)
+ return
+
+- # Call bnfisprincipal().
+- # If gens_needed, use flag=3 which will insist on computing
+- # the generator. Otherwise, use flag=1, where the generator
+- # may or may not be computed.
+- v = bnf.bnfisprincipal(self.pari_hnf(), 3 if gens_needed else 1)
+- self._ideal_class_log = list(v[0])
+- self._is_principal = not any(self._ideal_class_log)
+-
+- if self._is_principal:
+- # Cache reduced generator if it was computed
+- if v[1]:
+- g = self.number_field()(v[1])
+- self._reduced_generators = (g,)
++ if not gens:
++ v = bnf.bnfisprincipal(self.pari_hnf(), 0)
++ self._ideal_class_log = list(v)
++ self._is_principal = not any(self._ideal_class_log)
+ else:
+- # Non-principal ideal, compute two generators if asked for
+- if gens_needed:
++ # TODO: this is a bit of a waste. We ask bnfisprincipal to compute the compact form and then
++ # convert this compact form back into an expanded form.
++ # (though calling with 3 instead of 5 most likely triggers an error with memory allocation failure)
++ v = bnf.bnfisprincipal(self.pari_hnf(), 5)
++ e = v[0]
++ t = v[1]
++ t = bnf.nfbasistoalg(bnf.nffactorback(t))
++ self._ideal_class_log = list(e)
++ self._is_principal = not any(self._ideal_class_log)
++
++ if self._is_principal:
++ g = self.number_field()(t)
++ self._reduced_generators = (g,)
++ elif gens:
++ # Non-principal ideal
+ self._reduced_generators = self.gens_two()
+
+ def is_principal(self, proof=None):
+@@ -3118,7 +3133,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
@@ -1277,7 +2310,7 @@ index 37c20150ad..078682fa1f 100644
7^2
"""
diff --git a/src/sage/rings/number_field/number_field_rel.py b/src/sage/rings/number_field/number_field_rel.py
-index 312cbdf874..436af50e87 100644
+index e103bd8e59..3097a98002 100644
--- a/src/sage/rings/number_field/number_field_rel.py
+++ b/src/sage/rings/number_field/number_field_rel.py
@@ -396,18 +396,18 @@ class NumberField_relative(NumberField_generic):
@@ -1557,10 +2590,10 @@ index d0508258a0..6dd6b68cb3 100644
(3, 1, 4, 1, 5, 9, 2)
sage: SUK.log(u) == v
diff --git a/src/sage/rings/polynomial/polynomial_element.pyx b/src/sage/rings/polynomial/polynomial_element.pyx
-index e1fc897291..bfa66fc570 100644
+index 570c148e72..17f3ec8da9 100644
--- a/src/sage/rings/polynomial/polynomial_element.pyx
+++ b/src/sage/rings/polynomial/polynomial_element.pyx
-@@ -7550,7 +7550,7 @@ cdef class Polynomial(CommutativeAlgebraElement):
+@@ -7619,7 +7619,7 @@ cdef class Polynomial(CommutativeAlgebraElement):
[(-3.5074662110434039?e451, 1)]
sage: p = bigc*x + 1
sage: p.roots(ring=RR)
@@ -1570,69 +2603,115 @@ index e1fc897291..bfa66fc570 100644
[(-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 1ed1faaf15..6d4bb74464 100644
+index 699e0ac285..046180445f 100644
--- a/src/sage/rings/polynomial/polynomial_quotient_ring.py
+++ b/src/sage/rings/polynomial/polynomial_quotient_ring.py
-@@ -1305,7 +1305,16 @@ class PolynomialQuotientRing_generic(CommutativeRing):
+@@ -1307,7 +1307,7 @@ class PolynomialQuotientRing_generic(CommutativeRing):
+ `x^2 + 31` from 12 to 2, i.e. we lose a generator of order 6 (this was
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)]
+- sage: S.S_class_group([K.ideal(a)])
++ sage: S.S_class_group([K.ideal(a)]) # representation varies, not tested
+ [((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)]
Note that all the returned values live where we expect them to::
+diff --git a/src/sage/sandpiles/sandpile.py b/src/sage/sandpiles/sandpile.py
+index ad1cc56276..ce4e7fdc9b 100644
+--- a/src/sage/sandpiles/sandpile.py
++++ b/src/sage/sandpiles/sandpile.py
+@@ -1494,12 +1494,12 @@ class Sandpile(DiGraph):
+
+ sage: s = sandpiles.Cycle(5)
+ sage: s.group_gens()
+- [{1: 1, 2: 1, 3: 1, 4: 0}]
++ [{1: 0, 2: 1, 3: 1, 4: 1}]
+ sage: s.group_gens()[0].order()
+ 5
+ sage: s = sandpiles.Complete(5)
+ sage: s.group_gens(False)
+- [[2, 2, 3, 2], [2, 3, 2, 2], [3, 2, 2, 2]]
++ [[2, 3, 2, 2], [2, 2, 3, 2], [2, 2, 2, 3]]
+ sage: [i.order() for i in s.group_gens()]
+ [5, 5, 5]
+ sage: s.invariant_factors()
+@@ -2817,7 +2817,7 @@ class Sandpile(DiGraph):
+
+ sage: S = sandpiles.Complete(4)
+ sage: S.points()
+- [[1, I, -I], [I, 1, -I]]
++ [[-I, I, 1], [-I, 1, I]]
+ """
+ return self._points
+
+@@ -5015,7 +5015,7 @@ class SandpileDivisor(dict):
+ sage: D.is_linearly_equivalent([0,1,1])
+ True
+ sage: D.is_linearly_equivalent([0,1,1],True)
+- (1, 0, 0)
++ (0, -1, -1)
+ sage: v = vector(D.is_linearly_equivalent([0,1,1],True))
+ sage: vector(D.values()) - s.laplacian()*v
+ (0, 1, 1)
+@@ -6646,8 +6646,8 @@ def wilmes_algorithm(M):
+
+ sage: P = matrix([[2,3,-7,-3],[5,2,-5,5],[8,2,5,4],[-5,-9,6,6]])
+ sage: wilmes_algorithm(P)
+- [ 1642 -13 -1627 -1]
+- [ -1 1980 -1582 -397]
++ [ 3279 -79 -1599 -1600]
++ [ -1 1539 -136 -1402]
+ [ 0 -1 1650 -1649]
+ [ 0 0 -1658 1658]
diff --git a/src/sage/schemes/elliptic_curves/ell_finite_field.py b/src/sage/schemes/elliptic_curves/ell_finite_field.py
-index 87fbec3b69..adf0d2c73f 100644
+index 2aca9491af..76b111b423 100644
--- a/src/sage/schemes/elliptic_curves/ell_finite_field.py
+++ b/src/sage/schemes/elliptic_curves/ell_finite_field.py
-@@ -785,11 +785,11 @@ class EllipticCurve_finite_field(EllipticCurve_field, HyperellipticCurve_finite_
+@@ -785,11 +785,13 @@ class EllipticCurve_finite_field(EllipticCurve_field, HyperellipticCurve_finite_
sage: len(E.gens())
2
sage: E.cardinality()
- 867361737988403547207212930746733987710588
-+ 867361737988403547206134229616487867594472
- sage: E.gens()[0].order()
+- sage: E.gens()[0].order()
- 433680868994201773603606465373366993855294
-+ 433680868994201773603067114808243933797236
- sage: E.gens()[1].order()
+- sage: E.gens()[1].order()
- 433680868994201773603606465373366993855294
++ 867361737988403547206134229616487867594472
++ sage: a = E.gens()[0].order(); a # random
++ 433680868994201773603067114808243933797236
++ sage: b = E.gens()[1].order(); b # random
++ 30977204928157269543076222486303138128374
++ sage: lcm(a,b)
+ 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 7b02e8f663..354ba4af74 100644
+index 7b02e8f663..a1a48d2397 100644
--- a/src/sage/schemes/elliptic_curves/ell_generic.py
+++ b/src/sage/schemes/elliptic_curves/ell_generic.py
-@@ -2945,15 +2945,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],
+@@ -527,7 +527,7 @@ class EllipticCurve_generic(WithEqualityById, plane_curve.ProjectivePlaneCurve):
+ sage: E = EllipticCurve([0,0,0,-49,0])
+ sage: T = E.torsion_subgroup()
+ sage: [E(t) for t in T]
+- [(0 : 1 : 0), (-7 : 0 : 1), (0 : 0 : 1), (7 : 0 : 1)]
++ [(0 : 1 : 0), (0 : 0 : 1), (-7 : 0 : 1), (7 : 0 : 1)]
+
+ ::
+
+@@ -2951,8 +2951,8 @@ class EllipticCurve_generic(WithEqualityById, plane_curve.ProjectivePlaneCurve):
+ 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]]
++ [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 4a33e52600..6a3d46b326 100644
+index 29316bebeb..ccfa33915a 100644
--- a/src/sage/schemes/elliptic_curves/ell_number_field.py
+++ b/src/sage/schemes/elliptic_curves/ell_number_field.py
@@ -214,9 +214,9 @@ class EllipticCurve_number_field(EllipticCurve_field):
@@ -1640,42 +2719,52 @@ index 4a33e52600..6a3d46b326 100644
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)
+- 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)])
++ (2, 2, [(0 : 0 : 1)])
++ sage: E.simon_two_descent(lim1=5, lim3=5, limtriv=10, maxprob=7, limbigprime=10)
++ (2, 2, [(-1 : 0 : 1), (-2 : -1/2*a - 1/2 : 1)])
::
-@@ -244,22 +244,22 @@ class EllipticCurve_number_field(EllipticCurve_field):
- C = Mod(y, y^2 + 7)
- <BLANKLINE>
- Computing L(S,2)
+@@ -238,35 +238,7 @@ class EllipticCurve_number_field(EllipticCurve_field):
+ K = bnfinit(y^2 + 7);
+ a = Mod(y,K.pol);
+ bnfellrank(K, [0, 0, 0, 1, a], [[Mod(1/2*y + 3/2, y^2 + 7), Mod(-y - 2, y^2 + 7)]]);
+- elliptic curve: Y^2 = x^3 + Mod(1, y^2 + 7)*x + Mod(y, y^2 + 7)
+- A = Mod(0, y^2 + 7)
+- B = Mod(1, y^2 + 7)
+- 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
+- <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))
+- 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/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]]
+- 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
-@@ -298,8 +298,8 @@ class EllipticCurve_number_field(EllipticCurve_field):
+- m1 = 1
+- m2 = 1
+- #S(E/K)[2] = 2
+- #E(K)/2E(K) = 2
+- #III(E/K)[2] = 1
+- rank(E/K) = 1
+- listpoints = [[Mod(1/2*y + 3/2, y^2 + 7), Mod(-y - 2, y^2 + 7)]]
++ ...
+ v = [1, 1, [[Mod(1/2*y + 3/2, y^2 + 7), Mod(-y - 2, y^2 + 7)]]]
+ sage: v
+ (1, 1, [(1/2*a + 3/2 : -a - 2 : 1)])
+@@ -298,8 +270,8 @@ class EllipticCurve_number_field(EllipticCurve_field):
sage: E.simon_two_descent() # long time (4s on sage.math, 2013)
(3,
3,
@@ -1686,25 +2775,104 @@ index 4a33e52600..6a3d46b326 100644
"""
verbose = int(verbose)
if known_points is None:
+@@ -2228,29 +2200,29 @@ class EllipticCurve_number_field(EllipticCurve_field):
+ sage: EK = E.base_extend(K)
+ sage: EK.torsion_points() # long time (1s on sage.math, 2014)
+ [(0 : 1 : 0),
+- (16 : 60 : 1),
+- (5 : 5 : 1),
+- (5 : -6 : 1),
+- (16 : -61 : 1),
+ (t : 1/11*t^3 + 6/11*t^2 + 19/11*t + 48/11 : 1),
+- (-3/55*t^3 - 7/55*t^2 - 2/55*t - 133/55 : 6/55*t^3 + 3/55*t^2 + 25/11*t + 156/55 : 1),
+- (-9/121*t^3 - 21/121*t^2 - 127/121*t - 377/121 : -7/121*t^3 + 24/121*t^2 + 197/121*t + 16/121 : 1),
+- (5/121*t^3 - 14/121*t^2 - 158/121*t - 453/121 : -49/121*t^3 - 129/121*t^2 - 315/121*t - 207/121 : 1),
+- (10/121*t^3 + 49/121*t^2 + 168/121*t + 73/121 : 32/121*t^3 + 60/121*t^2 - 261/121*t - 807/121 : 1),
+ (1/11*t^3 - 5/11*t^2 + 19/11*t - 40/11 : -6/11*t^3 - 3/11*t^2 - 26/11*t - 321/11 : 1),
+- (14/121*t^3 - 15/121*t^2 + 90/121*t + 232/121 : 16/121*t^3 - 69/121*t^2 + 293/121*t - 46/121 : 1),
+- (3/55*t^3 + 7/55*t^2 + 2/55*t + 78/55 : 7/55*t^3 - 24/55*t^2 + 9/11*t + 17/55 : 1),
+- (-5/121*t^3 + 36/121*t^2 - 84/121*t + 24/121 : 34/121*t^3 - 27/121*t^2 + 305/121*t + 708/121 : 1),
+- (-26/121*t^3 + 20/121*t^2 - 219/121*t - 995/121 : 15/121*t^3 + 156/121*t^2 - 232/121*t + 2766/121 : 1),
+ (1/11*t^3 - 5/11*t^2 + 19/11*t - 40/11 : 6/11*t^3 + 3/11*t^2 + 26/11*t + 310/11 : 1),
+- (-26/121*t^3 + 20/121*t^2 - 219/121*t - 995/121 : -15/121*t^3 - 156/121*t^2 + 232/121*t - 2887/121 : 1),
+- (-5/121*t^3 + 36/121*t^2 - 84/121*t + 24/121 : -34/121*t^3 + 27/121*t^2 - 305/121*t - 829/121 : 1),
+- (3/55*t^3 + 7/55*t^2 + 2/55*t + 78/55 : -7/55*t^3 + 24/55*t^2 - 9/11*t - 72/55 : 1),
+- (14/121*t^3 - 15/121*t^2 + 90/121*t + 232/121 : -16/121*t^3 + 69/121*t^2 - 293/121*t - 75/121 : 1),
+ (t : -1/11*t^3 - 6/11*t^2 - 19/11*t - 59/11 : 1),
++ (16 : 60 : 1),
++ (-3/55*t^3 - 7/55*t^2 - 2/55*t - 133/55 : 6/55*t^3 + 3/55*t^2 + 25/11*t + 156/55 : 1),
++ (14/121*t^3 - 15/121*t^2 + 90/121*t + 232/121 : 16/121*t^3 - 69/121*t^2 + 293/121*t - 46/121 : 1),
++ (-26/121*t^3 + 20/121*t^2 - 219/121*t - 995/121 : -15/121*t^3 - 156/121*t^2 + 232/121*t - 2887/121 : 1),
+ (10/121*t^3 + 49/121*t^2 + 168/121*t + 73/121 : -32/121*t^3 - 60/121*t^2 + 261/121*t + 686/121 : 1),
++ (5 : 5 : 1),
++ (-9/121*t^3 - 21/121*t^2 - 127/121*t - 377/121 : -7/121*t^3 + 24/121*t^2 + 197/121*t + 16/121 : 1),
++ (3/55*t^3 + 7/55*t^2 + 2/55*t + 78/55 : 7/55*t^3 - 24/55*t^2 + 9/11*t + 17/55 : 1),
++ (-5/121*t^3 + 36/121*t^2 - 84/121*t + 24/121 : -34/121*t^3 + 27/121*t^2 - 305/121*t - 829/121 : 1),
+ (5/121*t^3 - 14/121*t^2 - 158/121*t - 453/121 : 49/121*t^3 + 129/121*t^2 + 315/121*t + 86/121 : 1),
++ (5 : -6 : 1),
++ (5/121*t^3 - 14/121*t^2 - 158/121*t - 453/121 : -49/121*t^3 - 129/121*t^2 - 315/121*t - 207/121 : 1),
++ (-5/121*t^3 + 36/121*t^2 - 84/121*t + 24/121 : 34/121*t^3 - 27/121*t^2 + 305/121*t + 708/121 : 1),
++ (3/55*t^3 + 7/55*t^2 + 2/55*t + 78/55 : -7/55*t^3 + 24/55*t^2 - 9/11*t - 72/55 : 1),
+ (-9/121*t^3 - 21/121*t^2 - 127/121*t - 377/121 : 7/121*t^3 - 24/121*t^2 - 197/121*t - 137/121 : 1),
++ (16 : -61 : 1),
++ (10/121*t^3 + 49/121*t^2 + 168/121*t + 73/121 : 32/121*t^3 + 60/121*t^2 - 261/121*t - 807/121 : 1),
++ (-26/121*t^3 + 20/121*t^2 - 219/121*t - 995/121 : 15/121*t^3 + 156/121*t^2 - 232/121*t + 2766/121 : 1),
++ (14/121*t^3 - 15/121*t^2 + 90/121*t + 232/121 : -16/121*t^3 + 69/121*t^2 - 293/121*t - 75/121 : 1),
+ (-3/55*t^3 - 7/55*t^2 - 2/55*t - 133/55 : -6/55*t^3 - 3/55*t^2 - 25/11*t - 211/55 : 1)]
+
+ ::
diff --git a/src/sage/schemes/elliptic_curves/ell_rational_field.py b/src/sage/schemes/elliptic_curves/ell_rational_field.py
-index 2953e80cac..b9d34cd64a 100644
+index eea4c88330..31db08b9fa 100644
--- a/src/sage/schemes/elliptic_curves/ell_rational_field.py
+++ b/src/sage/schemes/elliptic_curves/ell_rational_field.py
-@@ -5407,9 +5407,9 @@ class EllipticCurve_rational_field(EllipticCurve_number_field):
+@@ -4082,7 +4082,7 @@ class EllipticCurve_rational_field(EllipticCurve_number_field):
+ sage: G.1
+ (282 : 0 : 1)
+ sage: list(G)
+- [(0 : 1 : 0), (147 : 12960 : 1), (2307 : 97200 : 1), (-933 : 29160 : 1), (1011 : 0 : 1), (-933 : -29160 : 1), (2307 : -97200 : 1), (147 : -12960 : 1), (282 : 0 : 1), (8787 : 816480 : 1), (-285 : 27216 : 1), (1227 : 22680 : 1), (-1293 : 0 : 1), (1227 : -22680 : 1), (-285 : -27216 : 1), (8787 : -816480 : 1)]
++ [(0 : 1 : 0), (147 : -12960 : 1), (2307 : -97200 : 1), (-933 : -29160 : 1), (1011 : 0 : 1), (-933 : 29160 : 1), (2307 : 97200 : 1), (147 : 12960 : 1), (-1293 : 0 : 1), (1227 : 22680 : 1), (-285 : 27216 : 1), (8787 : 816480 : 1), (282 : 0 : 1), (8787 : -816480 : 1), (-285 : -27216 : 1), (1227 : -22680 : 1)]
+ """
+ try:
+ G = self.__torsion_subgroup
+@@ -5405,10 +5405,10 @@ class EllipticCurve_rational_field(EllipticCurve_number_field):
+ EXAMPLES::
sage: E = EllipticCurve('37a1')
- sage: E.eval_modular_form([1.5+I,2.0+I,2.5+I],100) # abs tol 1e-20
+- 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([1.5+I,2.0+I,2.5+I],100)
++ [-0.0018743978548152085...,
++ 0.0018604485340371083...,
++ -0.0018743978548152085...]
sage: E.eval_modular_form(2.1+I, 100) # abs tol 1e-16
[0.00150864362757267079 + 0.00109100341113449845*I]
+diff --git a/src/sage/schemes/elliptic_curves/ell_torsion.py b/src/sage/schemes/elliptic_curves/ell_torsion.py
+index 7f6f0f9701..33265f11d7 100644
+--- a/src/sage/schemes/elliptic_curves/ell_torsion.py
++++ b/src/sage/schemes/elliptic_curves/ell_torsion.py
+@@ -84,7 +84,7 @@ class EllipticCurveTorsionSubgroup(groups.AdditiveAbelianGroupWrapper):
+ sage: E = EllipticCurve([0,0,0,-49,0])
+ sage: T = E.torsion_subgroup()
+ sage: [E(t) for t in T]
+- [(0 : 1 : 0), (-7 : 0 : 1), (0 : 0 : 1), (7 : 0 : 1)]
++ [(0 : 1 : 0), (0 : 0 : 1), (-7 : 0 : 1), (7 : 0 : 1)]
+
+ An example where the torsion subgroup is trivial::
+
+@@ -256,7 +256,7 @@ class EllipticCurveTorsionSubgroup(groups.AdditiveAbelianGroupWrapper):
+ sage: E = EllipticCurve(K,[0,0,0,1,0])
+ sage: tor = E.torsion_subgroup()
+ sage: tor.points()
+- [(0 : 1 : 0), (-i : 0 : 1), (0 : 0 : 1), (i : 0 : 1)]
++ [(0 : 1 : 0), (0 : 0 : 1), (-i : 0 : 1), (i : 0 : 1)]
+ """
+ return [x.element() for x in self]
+
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
+index 7178da3685..8342d92ed3 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):
@@ -1714,25 +2882,25 @@ index 7178da3685..ea0a7e88bc 100644
- [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]
++ 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 0f1d17f995..dd53ba9dac 100644
+index 0f1d17f995..fe1899f647 100644
--- a/src/sage/schemes/elliptic_curves/period_lattice.py
+++ b/src/sage/schemes/elliptic_curves/period_lattice.py
-@@ -1626,7 +1626,7 @@ class PeriodLattice_ell(PeriodLattice):
+@@ -1625,7 +1625,7 @@ class PeriodLattice_ell(PeriodLattice):
+ sage: P,Q = T[2]
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: Lambda.elliptic_logarithm(P+3*Q, 100)
++ sage: Lambda.elliptic_logarithm(P, 100)
+ 4.7100131126199672766973600998
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..78730f930a 100644
+index 89e82467b0..84d32fe373 100644
--- a/src/sage/schemes/toric/chow_group.py
+++ b/src/sage/schemes/toric/chow_group.py
@@ -62,7 +62,7 @@ EXAMPLES::
@@ -1740,7 +2908,7 @@ index 89e82467b0..78730f930a 100644
sage: a = sum( A.gen(i) * (i+1) for i in range(A.ngens()) ) # an element of A
sage: a # long time (2s on sage.math, 2011)
- ( 3 | 1 mod 7 | 0 mod 2, 1 mod 2, 4, 5, 6, 7, 8 | 9 )
-+ ( 3 | 1 mod 7 | 1 mod 2, 0 mod 2, 4, 5, 6, 7, 8 | 9 )
++ ( 9 | 1 mod 7 | 1 mod 2, 0 mod 2, 4, 5, 6, 7, 8 | 3 )
The Chow group elements are printed as ``( a0 | a1 mod 7 | a2 mod 2,
a3 mod 2, a4, a5, a6, a7, a8 | a9 )``, which denotes the element of
@@ -1761,45 +2929,223 @@ index 89e82467b0..78730f930a 100644
Chow cycles can be of mixed degrees::
+@@ -151,7 +151,7 @@ class ChowCycle(FGP_Element):
+ sage: P2 = toric_varieties.P2()
+ sage: A = P2.Chow_group()
+ sage: A.gens()
+- (( 1 | 0 | 0 ), ( 0 | 1 | 0 ), ( 0 | 0 | 1 ))
++ (( 0 | 0 | 1 ), ( 0 | 1 | 0 ), ( 1 | 0 | 0 ))
+ sage: cone = P2.fan(1)[0]
+ sage: A(cone)
+ ( 0 | 1 | 0 )
+@@ -199,7 +199,7 @@ class ChowCycle(FGP_Element):
+ sage: A.degree()
+ (Z, Z, Z)
+ sage: A.an_element()._repr_()
+- '( 1 | 0 | 0 )'
++ '( 0 | 0 | 1 )'
+
+ A more complicated example with torsion::
+
+@@ -208,7 +208,7 @@ class ChowCycle(FGP_Element):
+ sage: A.degree()
+ (Z, 0, C2 x Z^5, Z)
+ sage: sum( A.gen(i) * (i+1) for i in range(A.ngens()) )
+- ( 2 || 1 mod 2, 3, 4, 5, 6, 7 | 8 )
++ ( 8 || 1 mod 2, 3, 4, 5, 6, 7 | 2 )
+ """
+ A = self.parent()
+ s = '('
+@@ -245,7 +245,7 @@ class ChowCycle(FGP_Element):
+ sage: P2 = toric_varieties.P2()
+ sage: A = P2.Chow_group()
+ sage: [ a.degree() for a in A.gens() ]
+- [0, 1, 2]
++ [2, 1, 0]
+ """
+ if '_dim' in self.__dict__:
+ return self._dim
+@@ -279,9 +279,9 @@ class ChowCycle(FGP_Element):
+ sage: A = toric_varieties.P2().Chow_group()
+ sage: cycle = 10*A.gen(0) + 11*A.gen(1) + 12*A.gen(2)
+ sage: cycle
+- ( 10 | 11 | 12 )
++ ( 12 | 11 | 10 )
+ sage: cycle.project_to_degree(2)
+- ( 0 | 0 | 12 )
++ ( 0 | 0 | 10 )
+ """
+ ambient_dim = self.parent()._variety.dimension()
+ v = list(self.lift())
+@@ -307,7 +307,7 @@ class ChowCycle(FGP_Element):
+
+ sage: P2 = toric_varieties.P2()
+ sage: A = P2.Chow_group()
+- sage: a = 5*A.gen(0) + 7*A.gen(1); a
++ sage: a = 5*A.gen(2) + 7*A.gen(1); a
+ ( 5 | 7 | 0 )
+ sage: a.count_points()
+ 5
+@@ -373,7 +373,7 @@ class ChowCycle(FGP_Element):
+ V(y)
+ sage: A = dP6.Chow_group()
+ sage: A(cone)
+- ( 0 | 0, 0, 0, 1 | 0 )
++ ( 0 | 0, 0, 1, 0 | 0 )
+ sage: intersection = A(cone).intersection_with_divisor(D); intersection
+ ( -1 | 0, 0, 0, 0 | 0 )
+ sage: intersection.count_points()
+@@ -405,8 +405,8 @@ class ChowCycle(FGP_Element):
+ ( 0 | 0, 0, 0, 0 | 0 ), ( 0 | 0, 0, 0, 0 | 0 ),
+ ( 0 | 0, 0, 0, 0 | 0 )]
+ sage: [ r.intersection_with_divisor(D).lift() for r in dP6.Chow_group().relation_gens() ]
+- [(0, 0, 0, 0, 0, 0, 0, 0, 1, -1, 0, 0, 0),
+- (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
++ [(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
++ (0, 0, 0, 0, 0, 0, 0, 0, 1, -1, 0, 0, 0),
+ (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
+ (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
+ (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
+@@ -504,13 +504,13 @@ class ChowCycle(FGP_Element):
+ sage: HH = WP4.cohomology_ring()
+ sage: cone3d = Cone([(0,0,1,0), (0,0,0,1), (-9,-6,-1,-1)])
+ sage: A(cone3d)
+- ( 0 | 1 | 0 | 0 | 0 )
++ ( 0 | -1 | 0 | 0 | 0 )
+ sage: HH(cone3d)
+ [3*z4^3]
+
+ sage: D = -WP4.K() # the anticanonical divisor
+ sage: A(D)
+- ( 0 | 0 | 0 | 18 | 0 )
++ ( 0 | 0 | 0 | -18 | 0 )
+ sage: HH(D)
+ [18*z4]
+
+@@ -605,7 +605,7 @@ class ChowGroup_class(FGP_Module_class, WithEqualityById):
+ sage: A = ChowGroup_class(P2,ZZ,True); A
+ Chow group of 2-d CPR-Fano toric variety covered by 3 affine patches
+ sage: A.an_element()
+- ( 1 | 0 | 0 )
++ ( 0 | 0 | 1 )
+ """
+
+ Element = ChowCycle
+@@ -627,7 +627,7 @@ class ChowGroup_class(FGP_Module_class, WithEqualityById):
+
+ sage: A_ZZ = P2.Chow_group()
+ sage: 2 * A_ZZ.an_element() * 3
+- ( 6 | 0 | 0 )
++ ( 0 | 0 | 6 )
+ sage: 1/2 * A_ZZ.an_element() * 1/3
+ Traceback (most recent call last):
+ ...
+@@ -705,9 +705,9 @@ class ChowGroup_class(FGP_Module_class, WithEqualityById):
+ sage: A = dP6.Chow_group()
+ sage: cone = dP6.fan(dim=1)[4]
+ sage: A(cone)
+- ( 0 | 0, 1, 0, 0 | 0 )
++ ( 0 | 1, 1, 0, -1 | 0 )
+ sage: A(Cone(cone)) # isomorphic but not identical to a cone of the fan!
+- ( 0 | 0, 1, 0, 0 | 0 )
++ ( 0 | 1, 1, 0, -1 | 0 )
+ sage: A( dP6.K() )
+ ( 0 | -1, -2, -2, -1 | 0 )
+ """
+@@ -1003,7 +1003,7 @@ class ChowGroup_class(FGP_Module_class, WithEqualityById):
+
+ sage: A = toric_varieties.P2().Chow_group()
+ sage: A.gens()
+- (( 1 | 0 | 0 ), ( 0 | 1 | 0 ), ( 0 | 0 | 1 ))
++ (( 0 | 0 | 1 ), ( 0 | 1 | 0 ), ( 1 | 0 | 0 ))
+ sage: A.gens(degree=1)
+ (( 0 | 1 | 0 ),)
+ """
+diff --git a/src/sage/schemes/toric/divisor.py b/src/sage/schemes/toric/divisor.py
+index e03b724ae6..eddbda0d21 100644
+--- a/src/sage/schemes/toric/divisor.py
++++ b/src/sage/schemes/toric/divisor.py
+@@ -113,7 +113,7 @@ The (rational) divisor class group is where the Kaehler cone lives::
+ in Basis lattice of The toric rational divisor class group
+ of a 2-d CPR-Fano toric variety covered by 6 affine patches
+ sage: Kc.ray(1).lift()
+- V(y) + V(v)
++ V(x) + V(w)
+
+ Given a divisor `D`, we have an associated line bundle (or a reflexive
+ sheaf, if `D` is not Cartier) `\mathcal{O}(D)`. Its sections are::
+@@ -1011,10 +1011,10 @@ class ToricDivisor_generic(Divisor_generic):
+ sage: Cartier
+ 2*V(z0) + 2*V(z1) + V(z2) + V(z3) + V(z4)
+ sage: Cartier.move_away_from(line_cone)
+- -V(z2) - V(z3) + V(z4)
++ 3*V(z2) + 3*V(z3) - V(z4)
+ sage: QQ_Weil = X.divisor([1,0,1,1,0])
+ sage: QQ_Weil.move_away_from(line_cone)
+- V(z2)
++ 2*V(z2) + V(z3) - 1/2*V(z4)
+ """
+ m = self.m(cone)
+ X = self.parent().scheme()
+@@ -1112,9 +1112,9 @@ class ToricDivisor_generic(Divisor_generic):
+ EXAMPLES::
+
+ sage: dP6 = toric_varieties.dP6()
+- sage: cone = dP6.fan(1)[0]
++ sage: cone = dP6.fan(1)[5]
+ sage: D = dP6.divisor(cone); D
+- V(x)
++ V(w)
+ sage: D.Chow_cycle()
+ ( 0 | -1, 0, 1, 1 | 0 )
+ sage: dP6.Chow_group()(cone)
+@@ -1959,11 +1959,11 @@ class ToricRationalDivisorClassGroup(FreeModule_ambient_field, UniqueRepresentat
+ [1 1 0 0 0]
+ [0 2 1 1 1]
+ sage: Cl._lift_matrix
+- [1 0]
+- [0 0]
+- [0 0]
+- [0 1]
+- [0 0]
++ [ 0 0]
++ [ 1 0]
++ [ 0 0]
++ [-2 1]
++ [ 0 0]
+ sage: Cl._lift_matrix.base_ring()
+ Integer Ring
+ """
+diff --git a/src/sage/schemes/toric/divisor_class.pyx b/src/sage/schemes/toric/divisor_class.pyx
+index f0e6eeca7e..52874594a5 100644
+--- a/src/sage/schemes/toric/divisor_class.pyx
++++ b/src/sage/schemes/toric/divisor_class.pyx
+@@ -39,9 +39,9 @@ The only special method is :meth:`~ToricRationalDivisorClass.lift` to get a
+ divisor representing a divisor class::
+
+ sage: D.lift()
+- V(x) - 2*V(u) + 3*V(y) - 4*V(v)
++ -3*V(x) - 9*V(u) + 7*V(z) + 3*V(w)
+ sage: E.lift()
+- 1/2*V(x) - 2/3*V(u) + 3/4*V(y) - 4/5*V(v)
++ -3/10*V(x) - 133/60*V(u) + 31/20*V(z) + 3/4*V(w)
+ """
+
+
+@@ -279,7 +279,7 @@ cdef class ToricRationalDivisorClass(Vector_rational_dense):
+ sage: D.divisor_class()
+ Divisor class [29, 6, 8, 10, 0]
+ sage: Dequiv = D.divisor_class().lift(); Dequiv
+- 6*V(z1) - 17*V(z2) - 22*V(z3) - 7*V(z4) + 25*V(z6) + 32*V(z7)
++ 15*V(z1) - 11*V(z2) - 9*V(z5) + 19*V(z6) + 10*V(z7)
+ sage: Dequiv == D
+ False
+ sage: Dequiv.divisor_class() == D.divisor_class()
diff --git a/src/sage/schemes/toric/homset.py b/src/sage/schemes/toric/homset.py
-index 4bff92bcb0..ff6211cabe 100644
+index 4bff92bcb0..f13482bae0 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):
+@@ -641,7 +641,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())
@@ -1808,7 +3154,7 @@ index 4bff92bcb0..ff6211cabe 100644
sage: cubic.point_set().cardinality()
6
"""
-@@ -661,7 +676,7 @@ class SchemeHomset_points_subscheme_toric_field(SchemeHomset_points_toric_base):
+@@ -661,7 +661,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())
@@ -1817,40 +3163,56 @@ index 4bff92bcb0..ff6211cabe 100644
sage: cubic.point_set().cardinality()
6
"""
+diff --git a/src/sage/schemes/toric/morphism.py b/src/sage/schemes/toric/morphism.py
+index 94be447f9c..0d8ed6f20d 100644
+--- a/src/sage/schemes/toric/morphism.py
++++ b/src/sage/schemes/toric/morphism.py
+@@ -1692,7 +1692,7 @@ class SchemeMorphism_fan_fiber_component_toric_variety(SchemeMorphism):
+ From: 2-d toric variety covered by 4 affine patches
+ To: 4-d toric variety covered by 23 affine patches
+ Defn: Defined on coordinates by sending [z0 : z1 : z2 : z3] to
+- [1 : 1 : 1 : 1 : z3 : 0 : 1 : z2 : 1 : 1 : 1 : z1 : z0 : 1 : 1]
++ [1 : 1 : 1 : 1 : z2 : 0 : 1 : z3 : 1 : 1 : 1 : z1 : z0 : 1 : 1]
+ sage: type(fiber_component.embedding_morphism())
+ <class 'sage.schemes.toric.morphism.SchemeMorphism_fan_fiber_component_toric_variety'>
+ """
+@@ -1775,7 +1775,7 @@ class SchemeMorphism_fan_fiber_component_toric_variety(SchemeMorphism):
+ From: 2-d toric variety covered by 4 affine patches
+ To: 4-d toric variety covered by 23 affine patches
+ Defn: Defined on coordinates by sending [z0 : z1 : z2 : z3] to
+- [1 : 1 : 1 : 1 : z3 : 0 : 1 : z2 : 1 : 1 : 1 : z1 : z0 : 1 : 1]
++ [1 : 1 : 1 : 1 : z2 : 0 : 1 : z3 : 1 : 1 : 1 : z1 : z0 : 1 : 1]
+
+ sage: primitive_cone = Cone([(-1, 2, -1, 0)])
+ sage: f = fibration.fiber_component(primitive_cone).embedding_morphism()
+@@ -1949,11 +1949,11 @@ class SchemeMorphism_fan_fiber_component_toric_variety(SchemeMorphism):
+ sage: f = fc.embedding_morphism()
+ sage: for r in fc.fan().rays():
+ ....: print("{} {}".format(r, f._image_ray_multiplicity(r)))
+- N(-1, 2) (11, 1)
++ N(-1, -1) (9, 2)
+ N(0, 1) (5, 1)
+- N(1, -3) (9, 2)
++ N(1, 0) (11, 1)
+ sage: f._ray_index_map
+- {N(-3, 4): 10, N(-1, 2): 11, N(0, 1): 5, N(1, 0): 4, N(2, -6): 9}
++ {N(-2, -2): 9, N(-1, 2): 4, N(0, 1): 5, N(1, 0): 11, N(3, -2): 10}
+ """
+ try:
+ image_ray_index = self._ray_index_map[fiber_ray]
+@@ -1997,7 +1997,7 @@ class SchemeMorphism_fan_fiber_component_toric_variety(SchemeMorphism):
+ V(z0) + V(z1) + 3*V(z2) + 4*V(z3)
+ sage: fc = f.fiber_component(Cone([(1,1,0)]))
+ sage: fc.embedding_morphism().pullback_divisor(D)
+- 2*V(z0) + 3*V(z1)
++ 4*V(z0) + V(z1) + 4*V(z2)
+ sage: fc = f.fiber_component(Cone([(1,0,0)]))
+ sage: fc.embedding_morphism().pullback_divisor(D)
+ -V(z0) - 3*V(z1) - 3*V(z2)
diff --git a/src/sage/schemes/toric/points.py b/src/sage/schemes/toric/points.py
-index 31e7769ede..361a010d2b 100644
+index 31e7769ede..2ea3067e8a 100644
--- a/src/sage/schemes/toric/points.py
+++ b/src/sage/schemes/toric/points.py
-@@ -537,7 +537,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()
-@@ -673,7 +673,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
-@@ -955,9 +955,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(
@@ -986,7 +986,7 @@ class FiniteFieldSubschemePointEnumerator(NaiveSubschemePointEnumerator):
sage: point_set = X.point_set()
sage: ffe = point_set._enumerator()
@@ -1860,22 +3222,28 @@ index 31e7769ede..361a010d2b 100644
"""
for cone, nonzero_coordinates, cokernel in self.ambient.cone_points_iter():
R = PolynomialRing(self.ambient.ring, cokernel.ngens(), 't')
-@@ -1011,11 +1011,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/schemes/toric/variety.py b/src/sage/schemes/toric/variety.py
+index 1bcfd27f82..5650488045 100644
+--- a/src/sage/schemes/toric/variety.py
++++ b/src/sage/schemes/toric/variety.py
+@@ -1498,7 +1498,7 @@ class ToricVariety_field(AmbientSpace):
+ in Basis lattice of The toric rational divisor class group
+ of a 2-d CPR-Fano toric variety covered by 4 affine patches
+ sage: [ divisor_class.lift() for divisor_class in Kc.rays() ]
+- [V(x), V(s)]
++ [V(y), V(t)]
+ sage: Kc.lattice()
+ Basis lattice of The toric rational divisor class group of a
+ 2-d CPR-Fano toric variety covered by 4 affine patches
+@@ -1654,7 +1654,7 @@ class ToricVariety_field(AmbientSpace):
+ sage: A = toric_varieties.P2().Chow_group(); A
+ Chow group of 2-d CPR-Fano toric variety covered by 3 affine patches
+ sage: A.gens()
+- (( 1 | 0 | 0 ), ( 0 | 1 | 0 ), ( 0 | 0 | 1 ))
++ (( 0 | 0 | 1 ), ( 0 | 1 | 0 ), ( 1 | 0 | 0 ))
+ """
+ from sage.schemes.toric.chow_group import ChowGroup
+ return ChowGroup(self,base_ring)
diff --git a/src/sage/structure/factorization.py b/src/sage/structure/factorization.py
index 1d32db0842..7636f1a9ba 100644
--- a/src/sage/structure/factorization.py
@@ -1903,68 +3271,34 @@ index 1d32db0842..7636f1a9ba 100644
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
+index d67a33e7c4..e3c78e6620 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,\
+@@ -233,11 +233,11 @@ Sage example in ./linalg.tex, line 1640::
....: [-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]
-+ )
++ [ 3 1 2 -1 0]
++ [1 0 0 0 0] [ 0 0 1 0] [ 0 0 0 0 1]
++ [0 1 0 0 0] [ 0 1 0 0] [ 1 1 1 1 -1]
++ [0 0 3 0 0] [ 1 -2 -4 1] [-3 -2 -3 -1 0]
++ [0 0 0 6 0], [ 0 0 4 -1], [ 1 0 0 -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
+index ac15dad7a9..6996d34012 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),
+@@ -414,18 +414,18 @@ r"""
+ 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
@@ -1972,94 +3306,35 @@ index 6c25aa5dc5..8bdceb9424 100644
- Defn: c5 |--> 1/80*c^5 + 79/40*c,
- None),
- (Number Field in c6 with defining polynomial x^4 + 8,
-- Ring morphism:
++ (Number Field in c5 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
++ 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: 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)
- ]
-
- ~~~~~~~~~~~~~~~~~~~~~~ ::
++ 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
diff --git a/src/sage/tests/parigp.py b/src/sage/tests/parigp.py
-index c118b6eb37..f567ade058 100644
+index c118b6eb37..4692b613de 100644
--- a/src/sage/tests/parigp.py
+++ b/src/sage/tests/parigp.py
-@@ -2,15 +2,6 @@ r"""
- This file is meant to catch errors in the PARI/GP package which are not
- caught by any other tests.
+@@ -6,9 +6,7 @@ Check that :trac:`9876` has been fixed, this test comes from PARI's
+ self-test :pari:`rnfkummer` but was modified such that the answer is
+ canonical::
--Check that :trac:`9876` has been fixed, this test comes from PARI's
--self-test :pari:`rnfkummer` but was modified such that the answer is
--canonical::
--
- sage: pari('addprimes([31438243, 238576291, 18775387483, 24217212463267, 1427657500359111961, 135564809928627323997297867381959])')
- [31438243, 238576291, 18775387483, 24217212463267, 1427657500359111961, 135564809928627323997297867381959]
- sage: pari('K = bnfinit(y^4-52*y^2+26,1); pol = rnfkummer(bnrinit(K,3,1),Mat(5)); L = rnfinit(K, pol); polredabs(polredbest(L.polabs))') # long time
-- x^20 - 112*x^18 + 5108*x^16 - 123460*x^14 + 1724337*x^12 - 14266996*x^10 + 69192270*x^8 - 188583712*x^6 + 260329852*x^4 - 141461008*x^2 + 19860776
--
- Check that :trac:`10195` (PARI bug 1153) has been fixed::
++ sage: pari('K = bnfinit(y^4-52*y^2+26,1); pol = rnfkummer(bnrinit(K,3,1),Mat(5)); L = rnfinit(K, [pol, 10^6]); polredabs(polredbest(L.polabs))') # long time
+ x^20 - 112*x^18 + 5108*x^16 - 123460*x^14 + 1724337*x^12 - 14266996*x^10 + 69192270*x^8 - 188583712*x^6 + 260329852*x^4 - 141461008*x^2 + 19860776
- sage: print(gp.eval("mathnf([0,0,0,0,0,0,0,0,0,13;0,0,0,0,0,0,0,0,23,6;0,0,0,0,0,0,0,23,-4,-7;0,0,0,0,0,0,17,-3,5,-5;0,0,0,0,0,56,16,-16,-15,-17;0,0,0,0,57,24,-16,-25,2,-21;0,0,0,114,9,56,51,-52,25,-55;0,0,113,-31,-11,24,0,28,34,-16;0,50,3,2,16,-6,-2,7,-19,-21;118,43,51,23,37,-52,18,38,51,28],0)"))
+ Check that :trac:`10195` (PARI bug 1153) has been fixed::
diff --git a/test-optional.patch b/test-optional.patch
index c4388362d76c..51ff9bd5d605 100644
--- a/test-optional.patch
+++ b/test-optional.patch
@@ -2,7 +2,7 @@ diff --git a/src/sage/doctest/control.py b/src/sage/doctest/control.py
index 2d93841e50..937e20cd2e 100644
--- a/src/sage/doctest/control.py
+++ b/src/sage/doctest/control.py
-@@ -356,20 +356,6 @@ class DocTestController(SageObject):
+@@ -357,20 +357,6 @@ class DocTestController(SageObject):
# Special case to run all optional tests
options.optional = True
else: