summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTravis Scrimshaw <tscrimsh at umn.edu>2015-10-16 13:31:29 -0500
committerTravis Scrimshaw <tscrimsh at umn.edu>2015-10-16 13:31:29 -0500
commit8b851a05c2569a55063539bbc8a19937851f4c93 (patch)
treea7334a2b12dc62d41d7d683926ecbf4e00abdd73
parentFixing doctest failures and letting a few other rings know they are metric sp... (diff)
parentUpdated Sage version to 6.10.beta0 (diff)
Merge branch 'develop' into public/categories/topological_metric_spaces-18175
-rw-r--r--VERSION.txt2
-rw-r--r--build/make/deps6
-rw-r--r--build/pkgs/boehm_gc/dependencies5
-rw-r--r--build/pkgs/boost_cropped/dependencies5
-rw-r--r--build/pkgs/buckygen/dependencies5
-rw-r--r--build/pkgs/cephes/dependencies5
-rw-r--r--build/pkgs/cliquer/dependencies5
-rw-r--r--build/pkgs/combinatorial_designs/dependencies5
-rw-r--r--build/pkgs/compilerwrapper/dependencies5
-rw-r--r--build/pkgs/configure/checksums.ini6
-rw-r--r--build/pkgs/configure/package-version.txt2
-rw-r--r--build/pkgs/cryptominisat/dependencies5
-rw-r--r--build/pkgs/cython/checksums.ini6
-rw-r--r--build/pkgs/cython/package-version.txt2
-rw-r--r--build/pkgs/d3js/dependencies5
-rw-r--r--build/pkgs/database_cremona_ellcurve/dependencies5
-rw-r--r--build/pkgs/database_jones_numfield/dependencies5
-rw-r--r--build/pkgs/database_stein_watkins/dependencies5
-rw-r--r--build/pkgs/database_stein_watkins_mini/dependencies5
-rw-r--r--build/pkgs/database_symbolic_data/dependencies5
-rwxr-xr-xbuild/pkgs/gcc/spkg-install4
-rw-r--r--build/pkgs/graphs/dependencies5
-rw-r--r--build/pkgs/iconv/dependencies5
-rw-r--r--build/pkgs/libogg/dependencies5
-rw-r--r--build/pkgs/lrcalc/dependencies5
-rw-r--r--build/pkgs/nauty/dependencies5
-rw-r--r--build/pkgs/ncurses/dependencies5
-rw-r--r--build/pkgs/networkx/checksums.ini6
-rw-r--r--build/pkgs/networkx/dependencies2
-rw-r--r--build/pkgs/networkx/package-version.txt2
-rwxr-xr-xbuild/pkgs/networkx/spkg-install2
-rw-r--r--build/pkgs/notebook/package-version.txt2
-rw-r--r--build/pkgs/notebook/patches/jupyter_notebook_config.py7
-rwxr-xr-xbuild/pkgs/notebook/spkg-install5
-rw-r--r--build/pkgs/openssl/dependencies5
-rw-r--r--build/pkgs/pari/checksums.ini6
-rw-r--r--build/pkgs/pari/package-version.txt2
-rw-r--r--build/pkgs/pari/patches/KERNELCFLAGS.patch16
-rw-r--r--build/pkgs/pari/patches/README.txt10
-rw-r--r--build/pkgs/pari/patches/det_garbage.patch55
-rw-r--r--build/pkgs/pari/patches/perl_regex.patch200
-rwxr-xr-xbuild/pkgs/pari/spkg-install9
-rw-r--r--build/pkgs/pari_galdata/dependencies5
-rw-r--r--build/pkgs/pari_seadata_small/dependencies5
-rw-r--r--build/pkgs/patch/dependencies5
-rw-r--r--build/pkgs/patchbot/SPKG.txt26
-rw-r--r--build/pkgs/patchbot/checksums.ini4
-rw-r--r--build/pkgs/patchbot/dependencies1
-rw-r--r--build/pkgs/patchbot/package-version.txt1
-rwxr-xr-xbuild/pkgs/patchbot/spkg-install14
-rw-r--r--build/pkgs/patchbot/type1
-rw-r--r--build/pkgs/planarity/dependencies5
-rw-r--r--build/pkgs/plantri/dependencies5
-rw-r--r--build/pkgs/polytopes_db/dependencies5
-rw-r--r--build/pkgs/rubiks/dependencies5
-rw-r--r--build/pkgs/rw/dependencies5
-rw-r--r--build/pkgs/saclib/dependencies5
-rw-r--r--build/pkgs/symmetrica/dependencies5
-rw-r--r--build/pkgs/sympow/dependencies5
-rw-r--r--build/pkgs/termcap/dependencies5
-rw-r--r--build/pkgs/valgrind/dependencies5
-rw-r--r--build/pkgs/zeromq/dependencies5
-rw-r--r--build/pkgs/zlib/dependencies5
-rw-r--r--build/sage_bootstrap/cmdline.py44
-rw-r--r--src/bin/sage-banner2
-rwxr-xr-xsrc/bin/sage-sdist8
-rw-r--r--src/bin/sage-version.sh4
-rw-r--r--src/doc/en/developer/coding_in_python.rst2
-rw-r--r--src/doc/en/reference/algebras/index.rst4
-rw-r--r--src/doc/en/reference/categories/index.rst4
-rw-r--r--src/doc/en/reference/coding/index.rst4
-rw-r--r--src/doc/en/reference/combinat/module_list.rst2
-rw-r--r--src/doc/en/reference/data_structures/index.rst1
-rw-r--r--src/doc/en/reference/graphs/index.rst1
-rw-r--r--src/doc/en/reference/index.rst1
-rw-r--r--src/doc/en/reference/polynomial_rings/polynomial_rings_univar.rst1
-rw-r--r--src/doc/en/reference/rings/asymptotic_expansions_index.rst1
-rw-r--r--src/doc/en/reference/sat/index.rst38
-rw-r--r--src/module_list.py4
-rw-r--r--src/sage/algebras/associated_graded.py341
-rw-r--r--src/sage/algebras/catalog.py2
-rw-r--r--src/sage/algebras/clifford_algebra.py80
-rw-r--r--src/sage/algebras/free_zinbiel_algebra.py253
-rw-r--r--src/sage/algebras/weyl_algebra.py47
-rw-r--r--src/sage/all.py1
-rw-r--r--src/sage/categories/algebras.py2
-rw-r--r--src/sage/categories/algebras_with_basis.py2
-rw-r--r--src/sage/categories/bialgebras.py5
-rw-r--r--src/sage/categories/cartesian_product.py38
-rw-r--r--src/sage/categories/category_with_axiom.py2
-rw-r--r--src/sage/categories/coalgebras.py39
-rw-r--r--src/sage/categories/coalgebras_with_basis.py3
-rw-r--r--src/sage/categories/covariant_functorial_construction.py4
-rw-r--r--src/sage/categories/examples/filtered_algebras_with_basis.py178
-rw-r--r--src/sage/categories/examples/filtered_modules_with_basis.py151
-rw-r--r--src/sage/categories/examples/graded_modules_with_basis.py5
-rw-r--r--src/sage/categories/filtered_algebras.py62
-rw-r--r--src/sage/categories/filtered_algebras_with_basis.py541
-rw-r--r--src/sage/categories/filtered_modules.py161
-rw-r--r--src/sage/categories/filtered_modules_with_basis.py928
-rw-r--r--src/sage/categories/finite_posets.py16
-rw-r--r--src/sage/categories/graded_algebras.py19
-rw-r--r--src/sage/categories/graded_algebras_with_basis.py137
-rw-r--r--src/sage/categories/graded_modules.py119
-rw-r--r--src/sage/categories/graded_modules_with_basis.py164
-rw-r--r--src/sage/categories/groups.py1
-rw-r--r--src/sage/categories/hopf_algebras.py3
-rw-r--r--src/sage/categories/hopf_algebras_with_basis.py1
-rw-r--r--src/sage/categories/modules.py137
-rw-r--r--src/sage/categories/modules_with_basis.py9
-rw-r--r--src/sage/categories/monoids.py3
-rw-r--r--src/sage/categories/posets.py3
-rw-r--r--src/sage/categories/pushout.py426
-rw-r--r--src/sage/categories/sets_cat.py57
-rw-r--r--src/sage/categories/super_algebras.py67
-rw-r--r--src/sage/categories/super_algebras_with_basis.py61
-rw-r--r--src/sage/categories/super_hopf_algebras_with_basis.py30
-rw-r--r--src/sage/categories/super_modules.py229
-rw-r--r--src/sage/categories/super_modules_with_basis.py185
-rw-r--r--src/sage/categories/unique_factorization_domains.py81
-rw-r--r--src/sage/coding/all.py15
-rw-r--r--src/sage/coding/codes_catalog.py9
-rw-r--r--src/sage/coding/encoder.py325
-rw-r--r--src/sage/coding/encoders_catalog.py16
-rw-r--r--src/sage/coding/linear_code.py415
-rw-r--r--src/sage/combinat/all.py2
-rw-r--r--src/sage/combinat/alternating_sign_matrix.py19
-rw-r--r--src/sage/combinat/cluster_algebra_quiver/cluster_seed.py160
-rw-r--r--src/sage/combinat/colored_permutations.py1097
-rw-r--r--src/sage/combinat/combinat.py45
-rw-r--r--src/sage/combinat/designs/block_design.py23
-rw-r--r--src/sage/combinat/designs/incidence_structures.py97
-rw-r--r--src/sage/combinat/diagram_algebras.py166
-rw-r--r--src/sage/combinat/integer_list.py10
-rw-r--r--src/sage/combinat/kazhdan_lusztig.py2
-rw-r--r--src/sage/combinat/ncsf_qsym/generic_basis_code.py5
-rw-r--r--src/sage/combinat/partition.py522
-rw-r--r--src/sage/combinat/perfect_matching.py29
-rw-r--r--src/sage/combinat/posets/__init__.py2
-rw-r--r--src/sage/combinat/posets/cartesian_product.py505
-rw-r--r--src/sage/combinat/posets/elements.py11
-rw-r--r--src/sage/combinat/posets/posets.py216
-rw-r--r--src/sage/combinat/rigged_configurations/kleber_tree.py56
-rw-r--r--src/sage/combinat/rigged_configurations/kr_tableaux.py14
-rw-r--r--src/sage/combinat/rigged_configurations/rigged_configuration_element.py119
-rw-r--r--src/sage/combinat/rigged_configurations/rigged_configurations.py22
-rw-r--r--src/sage/combinat/root_system/integrable_representations.py200
-rw-r--r--src/sage/combinat/similarity_class_type.py43
-rw-r--r--src/sage/combinat/skew_tableau.py109
-rw-r--r--src/sage/combinat/tableau.py2
-rw-r--r--src/sage/combinat/words/word_char.pyx174
-rw-r--r--src/sage/data_structures/mutable_poset.py3523
-rw-r--r--src/sage/databases/findstat.py13
-rw-r--r--src/sage/dynamics/interval_exchanges/template.py47
-rw-r--r--src/sage/functions/log.py44
-rw-r--r--src/sage/geometry/cone.py252
-rw-r--r--src/sage/geometry/hyperbolic_space/hyperbolic_geodesic.py4
-rw-r--r--src/sage/geometry/hyperplane_arrangement/arrangement.py112
-rw-r--r--src/sage/geometry/lattice_polytope.py19
-rw-r--r--src/sage/geometry/linear_expression.py17
-rw-r--r--src/sage/geometry/polyhedron/base.py30
-rw-r--r--src/sage/geometry/polyhedron/double_description.py2
-rw-r--r--src/sage/geometry/polyhedron/double_description_inhomogeneous.py4
-rw-r--r--src/sage/geometry/polyhedron/lattice_euclidean_group_element.py2
-rw-r--r--src/sage/geometry/polyhedron/palp_database.py10
-rw-r--r--src/sage/geometry/polyhedron/ppl_lattice_polytope.py17
-rw-r--r--src/sage/geometry/polyhedron/representation.py4
-rw-r--r--src/sage/graphs/asteroidal_triples.pyx2
-rw-r--r--src/sage/graphs/base/dense_graph.pyx148
-rw-r--r--src/sage/graphs/digraph.py170
-rw-r--r--src/sage/graphs/generators/classical_geometries.py183
-rw-r--r--src/sage/graphs/generators/families.py2
-rw-r--r--src/sage/graphs/generic_graph.py29
-rw-r--r--src/sage/graphs/graph.py568
-rw-r--r--src/sage/graphs/graph_generators.py4
-rw-r--r--src/sage/graphs/graph_input.py527
-rw-r--r--src/sage/graphs/hyperbolicity.pyx2
-rw-r--r--src/sage/graphs/hypergraph_generators.py19
-rw-r--r--src/sage/graphs/independent_sets.pyx2
-rw-r--r--src/sage/graphs/schnyder.py145
-rw-r--r--src/sage/graphs/strongly_regular_db.pyx314
-rw-r--r--src/sage/groups/abelian_gps/abelian_group_element.py1
-rw-r--r--src/sage/groups/abelian_gps/element_base.py10
-rw-r--r--src/sage/groups/additive_abelian/additive_abelian_group.py4
-rw-r--r--src/sage/groups/conjugacy_classes.py2
-rw-r--r--src/sage/groups/finitely_presented_named.py6
-rw-r--r--src/sage/groups/free_group.py11
-rw-r--r--src/sage/groups/matrix_gps/group_element.py13
-rw-r--r--src/sage/homology/simplicial_complex.py2
-rw-r--r--src/sage/interfaces/chomp.py8
-rw-r--r--src/sage/interfaces/octave.py262
-rw-r--r--src/sage/interfaces/sage0.py16
-rw-r--r--src/sage/libs/pari/paridecl.pxd101
-rw-r--r--src/sage/libs/singular/groebner_strategy.pyx4
-rw-r--r--src/sage/matrix/matrix_mod2_dense.pyx12
-rw-r--r--src/sage/matrix/operation_table.py22
-rw-r--r--src/sage/matroids/lean_matrix.pyx16
-rw-r--r--src/sage/matroids/matroid.pyx12
-rw-r--r--src/sage/misc/c3_controlled.pyx4
-rw-r--r--src/sage/misc/cython.py18
-rw-r--r--src/sage/misc/mrange.py107
-rw-r--r--src/sage/misc/rest_index_of_methods.py181
-rw-r--r--src/sage/misc/superseded.py38
-rw-r--r--src/sage/modular/modform_hecketriangle/abstract_ring.py4
-rw-r--r--src/sage/modular/overconvergent/weightspace.py14
-rw-r--r--src/sage/modules/fg_pid/fgp_element.py33
-rw-r--r--src/sage/modules/free_module_element.pyx15
-rw-r--r--src/sage/monoids/free_monoid_element.py17
-rw-r--r--src/sage/monoids/indexed_free_monoid.py27
-rw-r--r--src/sage/plot/arc.py253
-rw-r--r--src/sage/plot/hyperbolic_arc.py12
-rw-r--r--src/sage/plot/hyperbolic_polygon.py14
-rw-r--r--src/sage/repl/display/fancy_repr.py25
-rw-r--r--src/sage/repl/ipython_kernel/install.py20
-rw-r--r--src/sage/rings/all.py3
-rw-r--r--src/sage/rings/asymptotic/all.py1
-rw-r--r--src/sage/rings/asymptotic/asymptotic_ring.py1613
-rw-r--r--src/sage/rings/asymptotic/growth_group.py96
-rw-r--r--src/sage/rings/asymptotic/term_monoid.py213
-rw-r--r--src/sage/rings/cfinite_sequence.py12
-rw-r--r--src/sage/rings/complex_ball_acb.pyx143
-rw-r--r--src/sage/rings/complex_double.pyx20
-rw-r--r--src/sage/rings/complex_interval.pyx50
-rw-r--r--src/sage/rings/complex_interval_field.py9
-rw-r--r--src/sage/rings/complex_number.pyx8
-rw-r--r--src/sage/rings/finite_rings/element_givaro.pyx13
-rw-r--r--src/sage/rings/finite_rings/element_ntl_gf2e.pyx22
-rw-r--r--src/sage/rings/finite_rings/element_pari_ffelt.pyx56
-rw-r--r--src/sage/rings/finite_rings/hom_finite_field.pyx11
-rw-r--r--src/sage/rings/finite_rings/integer_mod.pyx12
-rw-r--r--src/sage/rings/laurent_series_ring_element.pyx3
-rw-r--r--src/sage/rings/morphism.pyx51
-rw-r--r--src/sage/rings/number_field/number_field_element.pyx5
-rw-r--r--src/sage/rings/number_field/number_field_element_quadratic.pyx21
-rw-r--r--src/sage/rings/polynomial/complex_roots.py129
-rw-r--r--src/sage/rings/polynomial/infinite_polynomial_element.py7
-rw-r--r--src/sage/rings/polynomial/laurent_polynomial.pyx34
-rw-r--r--src/sage/rings/polynomial/multi_polynomial_ideal.py51
-rw-r--r--src/sage/rings/polynomial/plural.pyx17
-rw-r--r--src/sage/rings/polynomial/polynomial_element.pyx103
-rw-r--r--src/sage/rings/polynomial/polynomial_element_generic.py68
-rw-r--r--src/sage/rings/polynomial/polynomial_real_mpfr_dense.pyx25
-rw-r--r--src/sage/rings/polynomial/refine_root.pyx141
-rw-r--r--src/sage/rings/power_series_poly.pyx18
-rw-r--r--src/sage/rings/power_series_ring_element.pyx28
-rw-r--r--src/sage/rings/qqbar.py26
-rw-r--r--src/sage/rings/rational.pyx7
-rw-r--r--src/sage/rings/real_arb.pyx341
-rw-r--r--src/sage/rings/real_lazy.pyx91
-rw-r--r--src/sage/rings/real_mpfi.pxd6
-rw-r--r--src/sage/rings/real_mpfi.pyx115
-rw-r--r--src/sage/sandpiles/sandpile.py70
-rw-r--r--src/sage/sat/all.py2
-rw-r--r--src/sage/sat/converters/polybori.py2
-rw-r--r--src/sage/sat/solvers/sat_lp.py145
-rw-r--r--src/sage/sat/solvers/satsolver.pyx60
-rw-r--r--src/sage/sets/cartesian_product.py60
-rw-r--r--src/sage/structure/element.pyx22
-rw-r--r--src/sage/symbolic/ring.pyx16
-rw-r--r--src/sage/tensor/coordinate_patch.py12
-rw-r--r--src/sage/tensor/differential_form_element.py13
-rw-r--r--src/sage/tensor/differential_forms.py4
-rw-r--r--src/sage/version.py4
-rw-r--r--src/sage_setup/autogen/pari/parser.py2
264 files changed, 18090 insertions, 3113 deletions
diff --git a/VERSION.txt b/VERSION.txt
index 2090599..9d90d56 100644
--- a/VERSION.txt
+++ b/VERSION.txt
@@ -1 +1 @@
-Sage version 6.9.rc0, released 2015-09-25
+Sage version 6.10.beta0, released 2015-10-15
diff --git a/build/make/deps b/build/make/deps
index c9becf0..3d0fb93 100644
--- a/build/make/deps
+++ b/build/make/deps
@@ -44,6 +44,12 @@ all-sage: \
$(EXTCODE) \
$(SCRIPTS)
+# Download all packages which should be inside an sdist tarball (the -B
+# option to make forces all targets to be built unconditionally)
+download-for-sdist: base
+ env SAGE_INSTALL_FETCH_ONLY=yes $(MAKE) -B SAGERUNTIME= \
+ $(STANDARD_PACKAGES) gcc mpir python2
+
# TOOLCHAIN consists of dependencies determined by build/make/install,
# including for example the GCC package.
toolchain: $(TOOLCHAIN)
diff --git a/build/pkgs/boehm_gc/dependencies b/build/pkgs/boehm_gc/dependencies
new file mode 100644
index 0000000..3546cda
--- /dev/null
+++ b/build/pkgs/boehm_gc/dependencies
@@ -0,0 +1,5 @@
+# no dependencies
+
+----------
+All lines of this file are ignored except the first.
+It is copied by SAGE_ROOT/build/make/install into SAGE_ROOT/build/make/Makefile.
diff --git a/build/pkgs/boost_cropped/dependencies b/build/pkgs/boost_cropped/dependencies
new file mode 100644
index 0000000..3546cda
--- /dev/null
+++ b/build/pkgs/boost_cropped/dependencies
@@ -0,0 +1,5 @@
+# no dependencies
+
+----------
+All lines of this file are ignored except the first.
+It is copied by SAGE_ROOT/build/make/install into SAGE_ROOT/build/make/Makefile.
diff --git a/build/pkgs/buckygen/dependencies b/build/pkgs/buckygen/dependencies
new file mode 100644
index 0000000..3546cda
--- /dev/null
+++ b/build/pkgs/buckygen/dependencies
@@ -0,0 +1,5 @@
+# no dependencies
+
+----------
+All lines of this file are ignored except the first.
+It is copied by SAGE_ROOT/build/make/install into SAGE_ROOT/build/make/Makefile.
diff --git a/build/pkgs/cephes/dependencies b/build/pkgs/cephes/dependencies
new file mode 100644
index 0000000..3546cda
--- /dev/null
+++ b/build/pkgs/cephes/dependencies
@@ -0,0 +1,5 @@
+# no dependencies
+
+----------
+All lines of this file are ignored except the first.
+It is copied by SAGE_ROOT/build/make/install into SAGE_ROOT/build/make/Makefile.
diff --git a/build/pkgs/cliquer/dependencies b/build/pkgs/cliquer/dependencies
new file mode 100644
index 0000000..3546cda
--- /dev/null
+++ b/build/pkgs/cliquer/dependencies
@@ -0,0 +1,5 @@
+# no dependencies
+
+----------
+All lines of this file are ignored except the first.
+It is copied by SAGE_ROOT/build/make/install into SAGE_ROOT/build/make/Makefile.
diff --git a/build/pkgs/combinatorial_designs/dependencies b/build/pkgs/combinatorial_designs/dependencies
new file mode 100644
index 0000000..3546cda
--- /dev/null
+++ b/build/pkgs/combinatorial_designs/dependencies
@@ -0,0 +1,5 @@
+# no dependencies
+
+----------
+All lines of this file are ignored except the first.
+It is copied by SAGE_ROOT/build/make/install into SAGE_ROOT/build/make/Makefile.
diff --git a/build/pkgs/compilerwrapper/dependencies b/build/pkgs/compilerwrapper/dependencies
new file mode 100644
index 0000000..3546cda
--- /dev/null
+++ b/build/pkgs/compilerwrapper/dependencies
@@ -0,0 +1,5 @@
+# no dependencies
+
+----------
+All lines of this file are ignored except the first.
+It is copied by SAGE_ROOT/build/make/install into SAGE_ROOT/build/make/Makefile.
diff --git a/build/pkgs/configure/checksums.ini b/build/pkgs/configure/checksums.ini
index cf5c6b5..0c17054 100644
--- a/build/pkgs/configure/checksums.ini
+++ b/build/pkgs/configure/checksums.ini
@@ -1,4 +1,4 @@
tarball=configure-VERSION.tar.gz
-sha1=8cfd9c770b0b2b6740da8861b8e5fb55be6a1961
-md5=e24e7847a5df019a174b8a8f4d1928dd
-cksum=1203608624
+sha1=3e0d10789b34d6f890e1575c2a06894a90e4807e
+md5=020a9b7f31e61b57056969b6816455f1
+cksum=2662451870
diff --git a/build/pkgs/configure/package-version.txt b/build/pkgs/configure/package-version.txt
index ee977b5..52bd8e4 100644
--- a/build/pkgs/configure/package-version.txt
+++ b/build/pkgs/configure/package-version.txt
@@ -1 +1 @@
-115
+120
diff --git a/build/pkgs/cryptominisat/dependencies b/build/pkgs/cryptominisat/dependencies
new file mode 100644
index 0000000..3546cda
--- /dev/null
+++ b/build/pkgs/cryptominisat/dependencies
@@ -0,0 +1,5 @@
+# no dependencies
+
+----------
+All lines of this file are ignored except the first.
+It is copied by SAGE_ROOT/build/make/install into SAGE_ROOT/build/make/Makefile.
diff --git a/build/pkgs/cython/checksums.ini b/build/pkgs/cython/checksums.ini
index 9589980..f3ac441 100644
--- a/build/pkgs/cython/checksums.ini
+++ b/build/pkgs/cython/checksums.ini
@@ -1,4 +1,4 @@
tarball=Cython-VERSION.tar.gz
-sha1=2ff0f863d3b996d2265d0bf06e567e5dd23d004d
-md5=db3c5b365e1c3f71c7cd90e96473a3ab
-cksum=1672168057
+sha1=d5592dc3d529c55a5ef95346caccf11c556993bd
+md5=813df20f7ce5f00e60568e0371fbd07c
+cksum=365027876
diff --git a/build/pkgs/cython/package-version.txt b/build/pkgs/cython/package-version.txt
index e13359b..9e40e75 100644
--- a/build/pkgs/cython/package-version.txt
+++ b/build/pkgs/cython/package-version.txt
@@ -1 +1 @@
-0.23.1.p0
+0.23.3
diff --git a/build/pkgs/d3js/dependencies b/build/pkgs/d3js/dependencies
new file mode 100644
index 0000000..3546cda
--- /dev/null
+++ b/build/pkgs/d3js/dependencies
@@ -0,0 +1,5 @@
+# no dependencies
+
+----------
+All lines of this file are ignored except the first.
+It is copied by SAGE_ROOT/build/make/install into SAGE_ROOT/build/make/Makefile.
diff --git a/build/pkgs/database_cremona_ellcurve/dependencies b/build/pkgs/database_cremona_ellcurve/dependencies
new file mode 100644
index 0000000..3546cda
--- /dev/null
+++ b/build/pkgs/database_cremona_ellcurve/dependencies
@@ -0,0 +1,5 @@
+# no dependencies
+
+----------
+All lines of this file are ignored except the first.
+It is copied by SAGE_ROOT/build/make/install into SAGE_ROOT/build/make/Makefile.
diff --git a/build/pkgs/database_jones_numfield/dependencies b/build/pkgs/database_jones_numfield/dependencies
new file mode 100644
index 0000000..3546cda
--- /dev/null
+++ b/build/pkgs/database_jones_numfield/dependencies
@@ -0,0 +1,5 @@
+# no dependencies
+
+----------
+All lines of this file are ignored except the first.
+It is copied by SAGE_ROOT/build/make/install into SAGE_ROOT/build/make/Makefile.
diff --git a/build/pkgs/database_stein_watkins/dependencies b/build/pkgs/database_stein_watkins/dependencies
new file mode 100644
index 0000000..3546cda
--- /dev/null
+++ b/build/pkgs/database_stein_watkins/dependencies
@@ -0,0 +1,5 @@
+# no dependencies
+
+----------
+All lines of this file are ignored except the first.
+It is copied by SAGE_ROOT/build/make/install into SAGE_ROOT/build/make/Makefile.
diff --git a/build/pkgs/database_stein_watkins_mini/dependencies b/build/pkgs/database_stein_watkins_mini/dependencies
new file mode 100644
index 0000000..3546cda
--- /dev/null
+++ b/build/pkgs/database_stein_watkins_mini/dependencies
@@ -0,0 +1,5 @@
+# no dependencies
+
+----------
+All lines of this file are ignored except the first.
+It is copied by SAGE_ROOT/build/make/install into SAGE_ROOT/build/make/Makefile.
diff --git a/build/pkgs/database_symbolic_data/dependencies b/build/pkgs/database_symbolic_data/dependencies
new file mode 100644
index 0000000..3546cda
--- /dev/null
+++ b/build/pkgs/database_symbolic_data/dependencies
@@ -0,0 +1,5 @@
+# no dependencies
+
+----------
+All lines of this file are ignored except the first.
+It is copied by SAGE_ROOT/build/make/install into SAGE_ROOT/build/make/Makefile.
diff --git a/build/pkgs/gcc/spkg-install b/build/pkgs/gcc/spkg-install
index a934113..f9c7fe6 100755
--- a/build/pkgs/gcc/spkg-install
+++ b/build/pkgs/gcc/spkg-install
@@ -137,3 +137,7 @@ $MAKE install
# Force re-installation of mpir, mpfr and mpc with the GCC we just built.
cd "$SAGE_SPKG_INST"
rm -f mpir-* mpfr-* mpc-*
+
+# Force re-configuration: the next time that "make" is run, we don't
+# want GCC to be built again, see Trac #19324
+touch "$SAGE_ROOT/configure"
diff --git a/build/pkgs/graphs/dependencies b/build/pkgs/graphs/dependencies
new file mode 100644
index 0000000..3546cda
--- /dev/null
+++ b/build/pkgs/graphs/dependencies
@@ -0,0 +1,5 @@
+# no dependencies
+
+----------
+All lines of this file are ignored except the first.
+It is copied by SAGE_ROOT/build/make/install into SAGE_ROOT/build/make/Makefile.
diff --git a/build/pkgs/iconv/dependencies b/build/pkgs/iconv/dependencies
new file mode 100644
index 0000000..3546cda
--- /dev/null
+++ b/build/pkgs/iconv/dependencies
@@ -0,0 +1,5 @@
+# no dependencies
+
+----------
+All lines of this file are ignored except the first.
+It is copied by SAGE_ROOT/build/make/install into SAGE_ROOT/build/make/Makefile.
diff --git a/build/pkgs/libogg/dependencies b/build/pkgs/libogg/dependencies
new file mode 100644
index 0000000..3546cda
--- /dev/null
+++ b/build/pkgs/libogg/dependencies
@@ -0,0 +1,5 @@
+# no dependencies
+
+----------
+All lines of this file are ignored except the first.
+It is copied by SAGE_ROOT/build/make/install into SAGE_ROOT/build/make/Makefile.
diff --git a/build/pkgs/lrcalc/dependencies b/build/pkgs/lrcalc/dependencies
new file mode 100644
index 0000000..3546cda
--- /dev/null
+++ b/build/pkgs/lrcalc/dependencies
@@ -0,0 +1,5 @@
+# no dependencies
+
+----------
+All lines of this file are ignored except the first.
+It is copied by SAGE_ROOT/build/make/install into SAGE_ROOT/build/make/Makefile.
diff --git a/build/pkgs/nauty/dependencies b/build/pkgs/nauty/dependencies
new file mode 100644
index 0000000..3546cda
--- /dev/null
+++ b/build/pkgs/nauty/dependencies
@@ -0,0 +1,5 @@
+# no dependencies
+
+----------
+All lines of this file are ignored except the first.
+It is copied by SAGE_ROOT/build/make/install into SAGE_ROOT/build/make/Makefile.
diff --git a/build/pkgs/ncurses/dependencies b/build/pkgs/ncurses/dependencies
new file mode 100644
index 0000000..3546cda
--- /dev/null
+++ b/build/pkgs/ncurses/dependencies
@@ -0,0 +1,5 @@
+# no dependencies
+
+----------
+All lines of this file are ignored except the first.
+It is copied by SAGE_ROOT/build/make/install into SAGE_ROOT/build/make/Makefile.
diff --git a/build/pkgs/networkx/checksums.ini b/build/pkgs/networkx/checksums.ini
index 50122f0..9aaf119 100644
--- a/build/pkgs/networkx/checksums.ini
+++ b/build/pkgs/networkx/checksums.ini
@@ -1,4 +1,4 @@
tarball=networkx-VERSION.tar.gz
-sha1=d6c1524724d3e47f7621bb2072863463924bfb99
-md5=b4a9e68ecd1b0164446ee432d2e20bd0
-cksum=3256827710
+sha1=99292e464c25be5e96de295752880bf5e5f1848a
+md5=eb7a065e37250a4cc009919dacfe7a9d
+cksum=2520536431
diff --git a/build/pkgs/networkx/dependencies b/build/pkgs/networkx/dependencies
index edf2711..d4db0ff 100644
--- a/build/pkgs/networkx/dependencies
+++ b/build/pkgs/networkx/dependencies
@@ -1,4 +1,4 @@
-$(INST)/$(PYTHON)
+$(INST)/$(PYTHON) $(INST)/$(DECORATOR)
----------
All lines of this file are ignored except the first.
diff --git a/build/pkgs/networkx/package-version.txt b/build/pkgs/networkx/package-version.txt
index a8fdfda..c044b1a 100644
--- a/build/pkgs/networkx/package-version.txt
+++ b/build/pkgs/networkx/package-version.txt
@@ -1 +1 @@
-1.8.1
+1.10
diff --git a/build/pkgs/networkx/spkg-install b/build/pkgs/networkx/spkg-install
index 6769f79..5cd75ee 100755
--- a/build/pkgs/networkx/spkg-install
+++ b/build/pkgs/networkx/spkg-install
@@ -15,4 +15,4 @@ rm -rf "$SAGE_LOCAL"/spkg/network*
cd src
-python setup.py install --home="$SAGE_LOCAL" --force
+python setup.py install
diff --git a/build/pkgs/notebook/package-version.txt b/build/pkgs/notebook/package-version.txt
index c5106e6..61d8a2a 100644
--- a/build/pkgs/notebook/package-version.txt
+++ b/build/pkgs/notebook/package-version.txt
@@ -1 +1 @@
-4.0.4
+4.0.4.p1
diff --git a/build/pkgs/notebook/patches/jupyter_notebook_config.py b/build/pkgs/notebook/patches/jupyter_notebook_config.py
new file mode 100644
index 0000000..3bf63a1
--- /dev/null
+++ b/build/pkgs/notebook/patches/jupyter_notebook_config.py
@@ -0,0 +1,7 @@
+# Configuration file for Sage's builtin Jupyter notebook server
+
+# Note for distributors: Sage uses mathjax, so the notebook server
+# needs to have the mathjax_url set to wherever your distribution
+# installs mathjax.
+
+c.NotebookApp.mathjax_url = '../nbextensions/mathjax/MathJax.js'
diff --git a/build/pkgs/notebook/spkg-install b/build/pkgs/notebook/spkg-install
index afb3f30..10759a4 100755
--- a/build/pkgs/notebook/spkg-install
+++ b/build/pkgs/notebook/spkg-install
@@ -1,3 +1,8 @@
#!/usr/bin/env bash
cd src && python setup.py install
+
+# Install the Jupyter notebook configuration
+ETC_JUPYTER="$SAGE_ETC"/jupyter
+mkdir -p "$ETC_JUPYTER"
+cp ../patches/jupyter_notebook_config.py "$ETC_JUPYTER"/
diff --git a/build/pkgs/openssl/dependencies b/build/pkgs/openssl/dependencies
new file mode 100644
index 0000000..3546cda
--- /dev/null
+++ b/build/pkgs/openssl/dependencies
@@ -0,0 +1,5 @@
+# no dependencies
+
+----------
+All lines of this file are ignored except the first.
+It is copied by SAGE_ROOT/build/make/install into SAGE_ROOT/build/make/Makefile.
diff --git a/build/pkgs/pari/checksums.ini b/build/pkgs/pari/checksums.ini
index 8870cbb..c62c530 100644
--- a/build/pkgs/pari/checksums.ini
+++ b/build/pkgs/pari/checksums.ini
@@ -1,4 +1,4 @@
tarball=pari-VERSION.tar.gz
-sha1=307409c3917f6df71d2e10640c119e7d31c1f2e6
-md5=41936ce2dce6bd00a662bf43a772685f
-cksum=855809013
+sha1=fa23e0c8b6e38a356048d19224dc9b9658d77724
+md5=c753faaa4780de5ad8d461f0ffd70ecf
+cksum=1220765312
diff --git a/build/pkgs/pari/package-version.txt b/build/pkgs/pari/package-version.txt
index 8db184f..2b25bd1 100644
--- a/build/pkgs/pari/package-version.txt
+++ b/build/pkgs/pari/package-version.txt
@@ -1 +1 @@
-2.8-1637-g489005a.p1
+2.8-1813-g6157df4.p0
diff --git a/build/pkgs/pari/patches/KERNELCFLAGS.patch b/build/pkgs/pari/patches/KERNELCFLAGS.patch
deleted file mode 100644
index 537dbb5..0000000
--- a/build/pkgs/pari/patches/KERNELCFLAGS.patch
+++ /dev/null
@@ -1,16 +0,0 @@
-diff -ru src/config/get_cc b/config/get_cc
---- src/config/get_cc 2014-02-01 21:41:54.534348273 +0100
-+++ b/config/get_cc 2014-02-01 21:42:50.850930971 +0100
-@@ -94,7 +94,11 @@
- OPTFLAGS="$OPTFLAGS -fno-strict-aliasing"
- fi
- rm -f $exe $exe$exe_suff
-- KERNELCFLAGS=-funroll-loops
-+ if [ "$SAGE_DEBUG" = yes ]; then
-+ KERNELCFLAGS=-O1
-+ else
-+ KERNELCFLAGS=-funroll-loops
-+ fi
-
- DBGFLAGS=${DBGFLAGS:-"-g $warn"}
- # Specific optimisations for some architectures
diff --git a/build/pkgs/pari/patches/README.txt b/build/pkgs/pari/patches/README.txt
index 93ac577..d9aef73 100644
--- a/build/pkgs/pari/patches/README.txt
+++ b/build/pkgs/pari/patches/README.txt
@@ -11,17 +11,7 @@ Patches to configuration files:
Darwin. Submitted upstream, but upstream only applied it for PowerPC.
Since this doesn't break anything and only improves performance, add
the flag unconditionally.
-* KERNELCFLAGS.patch (Jeroen Demeyer): when SAGE_DEBUG=yes, compile
- kernel files with -O1 instead of -funroll-loops; -O0 gives a
- segmentation fault on some OS X systems when doing
- factor(10356613*10694706299664611221)
- See #13921, also reported upstream:
- - http://pari.math.u-bordeaux.fr/archives/pari-dev-1301/msg00000.html
C files:
-* det_garbage.patch (Jeroen Demeyer, #15654): When computing a
- determinant(), only collect garbage once per outer loop iteration.
- Better increase PARI stack size instead of collecting garbage too
- often.
* public_memory_functions.patch (Jeroen Demeyer, #16997): Make some of
PARI's private memory functions public to improve interface with Sage.
diff --git a/build/pkgs/pari/patches/det_garbage.patch b/build/pkgs/pari/patches/det_garbage.patch
deleted file mode 100644
index ab7af66..0000000
--- a/build/pkgs/pari/patches/det_garbage.patch
+++ /dev/null
@@ -1,55 +0,0 @@
-diff --git a/src/basemath/alglin1.c b/src/basemath/alglin1.c
-index cada9eb..515eba9 100644
---- a/src/basemath/alglin1.c
-+++ b/src/basemath/alglin1.c
-@@ -248,6 +248,7 @@ gen_det(GEN a, void *E, const struct bb_field *ff)
- a = RgM_shallowcopy(a);
- for (i=1; i<nbco; i++)
- {
-+ int garbage = 0; /* Only gerepile() once per loop iteration */
- for(k=i; k<=nbco; k++)
- {
- gcoeff(a,k,i) = ff->red(E,gcoeff(a,k,i));
-@@ -272,7 +273,7 @@ gen_det(GEN a, void *E, const struct bb_field *ff)
- for (j=i+1; j<=nbco; j++)
- {
- gcoeff(a,j,k) = ff->add(E, gcoeff(a,j,k), ff->mul(E,m,gcoeff(a,j,i)));
-- if (gc_needed(av,1))
-+ if (gc_needed(av,1) && (garbage++ == 0))
- {
- if(DEBUGMEM>1) pari_warn(warnmem,"det. col = %ld",i);
- gerepileall(av,4, &a,&x,&q,&m);
-@@ -3722,6 +3723,7 @@ det_simple_gauss(GEN a, GEN data, pivot_fun pivot)
- a = RgM_shallowcopy(a);
- for (i=1; i<nbco; i++)
- {
-+ int garbage = 0; /* Only gerepile() once per loop iteration */
- k = pivot(a, data, i, NULL);
- if (k > nbco) return gerepilecopy(av, gcoeff(a,i,i));
- if (k != i)
-@@ -3741,7 +3743,7 @@ det_simple_gauss(GEN a, GEN data, pivot_fun pivot)
- for (j=i+1; j<=nbco; j++)
- {
- gcoeff(a,j,k) = gsub(gcoeff(a,j,k), gmul(m,gcoeff(a,j,i)));
-- if (gc_needed(av,3))
-+ if (gc_needed(av,3) && (garbage++ == 0))
- {
- if(DEBUGMEM>1) pari_warn(warnmem,"det. col = %ld",i);
- gerepileall(av,2, &a,&x);
-@@ -3792,6 +3794,7 @@ det_bareiss(GEN a)
- {
- GEN ci, ck, m;
- int diveuc = (gequal1(pprec)==0);
-+ int garbage = 0; /* Only gerepile() once per loop iteration */
-
- p = gcoeff(a,i,i);
- if (gequal0(p))
-@@ -3828,7 +3831,7 @@ det_bareiss(GEN a)
- GEN p1 = gsub(gmul(p,gel(ck,j)), gmul(m,gel(ci,j)));
- if (diveuc) p1 = mydiv(p1,pprec);
- gel(ck,j) = gerepileupto(av2, p1);
-- if (gc_needed(av,2))
-+ if (gc_needed(av,2) && (garbage++ == 0))
- {
- if(DEBUGMEM>1) pari_warn(warnmem,"det. col = %ld",i);
- gerepileall(av,2, &a,&pprec);
diff --git a/build/pkgs/pari/patches/perl_regex.patch b/build/pkgs/pari/patches/perl_regex.patch
deleted file mode 100644
index 038f4d6..0000000
--- a/build/pkgs/pari/patches/perl_regex.patch
+++ /dev/null
@@ -1,200 +0,0 @@
-commit 257750686ae1fe928a2b4b489844c1b57a108bd3
-Author: Karim Belabas <Karim.Belabas@math.u-bordeaux1.fr>
-Date: Tue Jul 14 15:23:42 2015 +0200
-
- doc_make: escape all {} in regexps [ perl-5.22 warns on these => fatal
-
-diff --git a/src/desc/doc_make b/src/desc/doc_make
-index bb41bc9..8521a9d 100755
---- a/src/desc/doc_make
-+++ b/src/desc/doc_make
-@@ -38,13 +38,13 @@ while (<FILE>)
- $v =~ s/\[\]/[\\,]/g;
- $v =~ s/(\w\w+)/\\var{$1}/g;
- $v =~ s/\^([a-z])/\\hbox{\\kbd{\\pow}}$1/g;
-- $v =~ s/\\var{flag}/\\fl/g;
-- $v =~ s/\\var{(\d+)}/{$1}/g;
-+ $v =~ s/\\var\{flag\}/\\fl/g;
-+ $v =~ s/\\var\{(\d+)\}/{$1}/g;
- $v =~ s/_/\\_/g; # don't merge with first subst: \var{} rule kills it
-
- $v = "\$($v)\$";
- }
-- if ($doc !~ /\\syn\w*{/ && $sec !~ /programming\/control/) {
-+ if ($doc !~ /\\syn\w*\{/ && $sec !~ /programming\/control/) {
- $doc .= library_syntax($fun, $args);
- }
- s/_def_//;
-commit 742c70e505a7e75128720f619d63e882c03e9346
-Author: Karim Belabas <Karim.Belabas@math.u-bordeaux1.fr>
-Date: Tue Jul 14 13:20:07 2015 +0200
-
- gphelp: escape all {} in regexps [ perl-5.22 warns on these => fatal ]
-
-diff --git a/doc/gphelp.in b/doc/gphelp.in
-index 00ff6bd..89f2768 100755
---- a/doc/gphelp.in
-+++ b/doc/gphelp.in
-@@ -298,7 +298,7 @@ sub treat {
- if ($pat =~ /[a-zA-Z0-9]$/) { $pat .= '\b'; } else { $pat .= '}'; }
- while (<DOC>)
- {
-- if (/\\(subsubsec[a-z]*|subsec[a-z]*|section|chapter|label){$pat/)
-+ if (/\\(subsubsec[a-z]*|subsec[a-z]*|section|chapter|label)\{$pat/)
- { $first = $_; last; }
- }
- if (eof(DOC))
-@@ -380,7 +380,7 @@ sub apropos_check {
- return if ($line !~ /$help/i);
-
- local($_) = $current;
-- s/\\b{(.)}/\\$1/;
-+ s/\\b\{(.)\}/\\$1/;
- s/\{\}//g;
- s/\\pow/^/;
- s/\\%/%/;
-@@ -400,7 +400,7 @@ sub apropos {
- @sentence_list = @list = "";
- while (<DOC>)
- {
-- if (/^\\(subsubsec[a-z]*|subsec[a-z]*|section|chapter){/)
-+ if (/^\\(subsubsec[a-z]*|subsec[a-z]*|section|chapter)\{/)
- {
- $new = &get_match($_,'{','}');
- &apropos_check($line, $current);
-@@ -748,7 +748,7 @@ sub basic_subst {
- s/\\fun\s*\{([^{}]*)\}\s*\{((?:[^{}]|\{[^{}]*\})*)\}\s*\{((?:[^{}]|\{[^{}]*\})*)\}/\\kbd{$1 \\key{$2}($3)}\\sidx{$2}/g;
-
- s/\\\\(?=[a-zA-Z])/\\bs /g;
-- s/\\b{}\\b{}/\\bs\\bs /g;
-+ s/\\b\{\}\\b\{\}/\\bs\\bs /g;
- s/\\\\/\\bs/g;
- s/(\'\'|\`\`)/"/g unless $to_pod; # (english) double quotes
- # asymptotic or isomorphic (~) [beware of ties]
-@@ -760,16 +760,16 @@ sub basic_subst {
- s/\\(~|tilde)/~/g;
-
- s/\\(equiv)(?![a-zA-Z])/ = /g;
-- s/\\`a/$tr{agrave}/; s/\\`{a}/$tr{agrave}/;
-- s/\\"o/$tr{ouml}/; s/\\"{o}/$tr{ouml}/;
-- s/\\"u/$tr{uuml}/; s/\\"{u}/$tr{uuml}/;
-- s/\\'e/$tr{eacute}/; s/\\'{e}/$tr{eacute}/;
-+ s/\\`a/$tr{agrave}/; s/\\`\{a\}/$tr{agrave}/;
-+ s/\\"o/$tr{ouml}/; s/\\"\{o\}/$tr{ouml}/;
-+ s/\\"u/$tr{uuml}/; s/\\"\{u\}/$tr{uuml}/;
-+ s/\\'e/$tr{eacute}/; s/\\'\{e\}/$tr{eacute}/;
-
- s/(^|[^\\])%.*/$1/g; # comments
- s/\\vadjust\s*\{\s*\\penalty\s*\d+\s*\}//g;
-
- # We do not strip %\n, thus:
-- s/\\kbd{\n\s*/\\kbd{/g;
-+ s/\\kbd\{\n\s*/\\kbd{/g;
- s/\$\\bf(\b|(?=[\d_]))\s*([^\$]+)\$/\$$tr{startbcode}$1$tr{endbcode}\$/g;
- s/\$/$tr{dollar}/g; # math mode
- s/\t/ /g; s/\\,//g; s/\\[ ;]/ /g; # various spaces
-@@ -779,7 +779,7 @@ sub basic_subst {
- s/\\TeX\{\}/TeX/g;
- s/\\TeX(\W)/TeX$1/g;
- s/ *\\circ\b */ o /g;
-- s/\\d?frac{\s*((?:[^{}]|\{[^{}]*\})*)}{\s*((?:[^{}]|\{[^{}]*\})*)}/($1)\/($2)/g;
-+ s/\\d?frac\{\s*((?:[^{}]|\{[^{}]*\})*)\}\{\s*((?:[^{}]|\{[^{}]*\})*)\}/($1)\/($2)/g;
- s(\\d?frac\s*(\d)\s*(\d))(($1/$2))g;
- s[{\s*(\w)\s*\\over(?![a-zA-Z])\s*(\w)\s*}]{($1/$2)}g;
- s[{\s*((?:[^{}]|\{[^{}]*\})*)\\over(?![a-zA-Z])\s*((?:[^{}]|\{[^{}]*\})*)}][($1)/($2)]g;
-@@ -796,7 +796,7 @@ sub basic_subst {
-
- s/(\\string)?\\_/_/g;
- s/\\([#\$&%|])/$1/g;
-- s/\\(hat(?![a-zA-Z])|\^)({\\?\s*})?/^/g;
-+ s/\\(hat(?![a-zA-Z])|\^)(\{\\?\s*\})?/^/g;
- s/^(\@\[podleader\]head\d *)\\pow(?![a-zA-z])( *)/$1^$2/gm;
- s/ *\\pow(?![a-zA-z]) */^/g;
-
-@@ -896,21 +896,21 @@ sub basic_subst {
- s/\\(floor|ceil|round|binom)\{/$1\{/g;
- s/\\(var|emph)\{([^\}]*)\}/$tr{startit}$2$tr{endit}/g;
- s/\\fl(?![a-zA-Z])/$tr{startit}flag$tr{endit}/g;
-- s/\\b{([^}]*)}/$tr{startcode}\\$1$tr{endcode}/g;
-+ s/\\b\{([^}]*)\}/$tr{startcode}\\$1$tr{endcode}/g;
- s/\\kbdsidx/\\sidx/g;
- s/\\sidx\{[^\}]*\}//g unless $to_pod;
- s/\\[a-zA-Z]*idx\{([^\}]*)\}/$1/g unless $to_pod;
-- s/{\\text{(st|nd|th)}}/\\text{$1}/g;
-- s/\^\\text{th}/-th/g;
-- s/1\^\\text{st}/1st/g;
-- s/2\^\\text{nd}/2nd/g;
-+ s/\{\\text\{(st|nd|th)\}\}/\\text{$1}/g;
-+ s/\^\\text\{th\}/-th/g;
-+ s/1\^\\text\{st\}/1st/g;
-+ s/2\^\\text\{nd\}/2nd/g;
-
- s/\\(text|hbox|Big)//g;
- s/^([ \t]+)\{ *\\(it|sl|bf|tt)\b/S<$1>{\\$2/gm;
- s/\{ *\\(it|sl) *(([^{}]+(?=[{}])|\{[^{}]*\})*)\}/$tr{startit}$2$tr{endit}/g;
- s/\{ *\\bf *(([^{}]+(?=[{}])|\{[^{}]*\})*)\}/$tr{startbold}$1$tr{endbold}/g;
- s/\{ *\\tt *(([^{}]+(?=[{}])|\{[^{}]*\})*)\}/$tr{startpodcode}$1$tr{endpodcode}/g;
-- $seek=1 if (s/\\emph{ */$tr{startit}/g);
-+ $seek=1 if (s/\\emph\{ */$tr{startit}/g);
- if ($seek) { $seek=0 if (s/\}/$tr{endit}/) }
- s/\\(backslash|bs)\{(\w)\}/\\$2/g;
- s/\\(backslash|bs)(?![a-zA-Z]) */\\/g;
-@@ -1028,21 +1028,21 @@ sub TeXprint_topod {
- # Try to guard \label/\sidx (removing possible '.')
- # This somehow breaks index...
- # s/(\\(?:section|subsec(?:ref|idx|op)?(unix)?)\s*{(?:(?:[^{}]+(?=[{}])|{[^{}]+})+)})\.?\s*\\(label|sidx)/$1\n\\$2/;
-- s/(\\(?:section|subsec(?:ref|idx|op)?)\s*{(?:(?:[^{}]+(?=[{}])|{[^{}]+})+)})\.?\s*\\(label|sidx)/$1\n\\$2/;
-+ s/(\\(?:section|subsec(?:ref|idx|op)?)\s*\{(?:(?:[^{}]+(?=[{}])|{[^{}]+})+)\})\.?\s*\\(label|sidx)/$1\n\\$2/;
-
- # last if /\\subsec[\\{}ref]*[\\\${]$help[}\\\$]/o;
-- s/\\chapter\s*{((?:[^{}]|\{[^{}]*\})*)}\s*/\n\n$tr{podleader}head1 NAME\n\nlibPARI - $1\n\n/;
-- s/\\appendix\s*{((?:[^{}]|\{[^{}]*\})*)}\s*/\n\n$tr{podleader}head1 NAME\n\nAppendix - $1\n\n/;
-- s/\\section\s*{((?:[^{}]|\{[^{}]*\})*)}\s*/"\n\n$tr{podleader}head1 " . indexify($1) . "\n\n"/e;
-+ s/\\chapter\s*\{((?:[^{}]|\{[^{}]*\})*)\}\s*/\n\n$tr{podleader}head1 NAME\n\nlibPARI - $1\n\n/;
-+ s/\\appendix\s*\{((?:[^{}]|\{[^{}]*\})*)\}\s*/\n\n$tr{podleader}head1 NAME\n\nAppendix - $1\n\n/;
-+ s/\\section\s*\{((?:[^{}]|\{[^{}]*\})*)\}\s*/"\n\n$tr{podleader}head1 " . indexify($1) . "\n\n"/e;
-
- # Try to delimit by :
-- s/\\subsec(?:ref)?(?:unix)?\s*{(([^{}]+(?=[{}])|{[^{}]+})+)}([^\n]*):[\n ]/"\n\n$tr{podleader}head2 " . indexify("$1$3") . "\n\n"/e;
-- s/\\subsubsec(?:ref)?(?:unix)?\s*{(([^{}]+(?=[{}])|{[^{}]+})+)}([^:]*):\s*/"\n\n$tr{podleader}head3 " . indexify("$1$3") . "\n\n"/e;
-+ s/\\subsec(?:ref)?(?:unix)?\s*\{(([^{}]+(?=[{}])|{[^{}]+})+)\}([^\n]*):[\n ]/"\n\n$tr{podleader}head2 " . indexify("$1$3") . "\n\n"/e;
-+ s/\\subsubsec(?:ref)?(?:unix)?\s*\{(([^{}]+(?=[{}])|{[^{}]+})+)\}([^:]*):\s*/"\n\n$tr{podleader}head3 " . indexify("$1$3") . "\n\n"/e;
- s/\\subsubsec\s*{(([^{}]+(?=[{}])|{[^{}]+})+)}(.*)$/"\n\n$tr{podleader}head3 " . indexify("$1") . "$3\n\n"/me;
- s/\\subseckbd\s*{(([^{}]+(?=[{}])|{[^{}]+})+)}([^:]*):\s*/"\n\n$tr{podleader}head2 " . indexify("$1$3") . "\n\n"/e;
- # Try to delimit by ' '
-- s/\\subsec(?:ref)?(?:unix)?\s*{(([^{}]+(?=[{}])|{[^{}]+})+)}(\S*)\s+/"\n\n$tr{podleader}head2 " . indexify("$1$3") . "\n\n"/e;
-- s/\\subsec(?:title)?(?:unix)?\s*{(([^{}]+(?=[{}])|{[^{}]*})+)}:?\s*/"\n\n$tr{podleader}head2 " . indexify("$1") . "\n\n"/e;
-+ s/\\subsec(?:ref)?(?:unix)?\s*\{(([^{}]+(?=[{}])|{[^{}]+})+)\}(\S*)\s+/"\n\n$tr{podleader}head2 " . indexify("$1$3") . "\n\n"/e;
-+ s/\\subsec(?:title)?(?:unix)?\s*\{(([^{}]+(?=[{}])|{[^{}]*})+)\}:?\s*/"\n\n$tr{podleader}head2 " . indexify("$1") . "\n\n"/e;
-
- # This is to skip preface in refcard:
- /\Q$tr{podleader}\Ehead1|\\title(?![a-zA-Z])\s*\{/o and $seen_start = 1
-@@ -1097,18 +1097,18 @@ sub TeXprint_topod {
- s/\$\$(.*?)\$\$\s*/\n\nS< >$tr{startcode}$1$tr{endcode}\n\n/gs;
- s/\$([^\$]+)\$/$tr{startcode}$1$tr{endcode}/g;
-
-- s/\\s(?:ref|idx){\s*([^{}]*)}/"X<" . for_index($1) . ">"/ge; #
-- s/\\(?:ref|idx){\s*([^{}]*)}/"X<" . for_index($1) . ">$1"/ge;
-+ s/\\s(?:ref|idx)\{\s*([^{}]*)\}/"X<" . for_index($1) . ">"/ge; #
-+ s/\\(?:ref|idx)\{\s*([^{}]*)\}/"X<" . for_index($1) . ">$1"/ge;
-
- # Conflict between different versions of PARI and refcard:
--# s/\\(?:key|li)\s*{(.*)}\s*{(.+)}[ \t]*\n/\n\n=item C<$2>\n\n$1\n\n/msg;
--# s/\\(?:key|li)\s*{(.*)}\s*{}[ \t]*\n/\n\n=back\n\n$1\n\n=over\n\n/mgs;
--# s/\\(key|var)(?![a-zA-Z])\s*{(\w+)}/C<$2>/mg;
-- s/\\var\s*{X<(\w+)>(\w+)}/X<$1>$tr{startcode}$2$tr{endcode}/mg;
-- s/\\var\s*{f{}lag}/$tr{startcode}flag$tr{endcode}/mg;
--
-- s/\\metax(?![a-zA-Z])\s*{(.*)}\s*{\s*(\w+)(?=C\<)(.*)}[ \t]*\n/\n\n=item C<L<$2>$3>\n\n$1\n\n/mg;
-- s/\\metax(?![a-zA-Z])\s*{(.*)}\s*{(.*)}[ \t]*\n/\n\n=item C<$2>\n\n$1\n\n/mg;
-+# s/\\(?:key|li)\s*\{(.*)\}\s*\{(.+)\}[ \t]*\n/\n\n=item C<$2>\n\n$1\n\n/msg;
-+# s/\\(?:key|li)\s*\{(.*)\}\s*\{\}[ \t]*\n/\n\n=back\n\n$1\n\n=over\n\n/mgs;
-+# s/\\(key|var)(?![a-zA-Z])\s*\{(\w+)\}/C<$2>/mg;
-+ s/\\var\s*\{X<(\w+)>(\w+)\}/X<$1>$tr{startcode}$2$tr{endcode}/mg;
-+ s/\\var\s*\{f\{\}lag\}/$tr{startcode}flag$tr{endcode}/mg;
-+
-+ s/\\metax(?![a-zA-Z])\s*\{(.*)\}\s*\{\s*(\w+)(?=C\<)(.*)\}[ \t]*\n/\n\n=item C<L<$2>$3>\n\n$1\n\n/mg;
-+ s/\\metax(?![a-zA-Z])\s*\{(.*)\}\s*\{(.*)\}[ \t]*\n/\n\n=item C<$2>\n\n$1\n\n/mg;
- s/C\<\{\}=/C\<=/g;
- s/\\fl(?![a-zA-Z])/I<flag>/g;
- s/\\file(?![a-zA-Z])/F<file>/g;
diff --git a/build/pkgs/pari/spkg-install b/build/pkgs/pari/spkg-install
index 6a7b1eb..55a64ae 100755
--- a/build/pkgs/pari/spkg-install
+++ b/build/pkgs/pari/spkg-install
@@ -206,7 +206,14 @@ set_environment
# Set CFLAGS
if [ "$SAGE_DEBUG" = yes ]; then
# Disable optimisation, add debug symbols.
- CFLAGS="$CFLAGS -O0 -g"
+ CFLAGS="-O0 -g $CFLAGS"
+
+ # Compile kernel files with -O1 instead of -funroll-loops; -O0 gives
+ # a segmentation fault on some OS X systems when doing
+ # factor(10356613*10694706299664611221)
+ # See #13921, also reported upstream:
+ # - http://pari.math.u-bordeaux.fr/archives/pari-dev-1301/msg00000.html
+ PARI_MAKEFLAGS="KERNELCFLAGS=-O1 $PARI_MAKEFLAGS"
else
# Use PARI's default CFLAGS (with -g added).
# PARI's Configure adds -O3 to the CFLAGS, so we don't need to add
diff --git a/build/pkgs/pari_galdata/dependencies b/build/pkgs/pari_galdata/dependencies
new file mode 100644
index 0000000..3546cda
--- /dev/null
+++ b/build/pkgs/pari_galdata/dependencies
@@ -0,0 +1,5 @@
+# no dependencies
+
+----------
+All lines of this file are ignored except the first.
+It is copied by SAGE_ROOT/build/make/install into SAGE_ROOT/build/make/Makefile.
diff --git a/build/pkgs/pari_seadata_small/dependencies b/build/pkgs/pari_seadata_small/dependencies
new file mode 100644
index 0000000..3546cda
--- /dev/null
+++ b/build/pkgs/pari_seadata_small/dependencies
@@ -0,0 +1,5 @@
+# no dependencies
+
+----------
+All lines of this file are ignored except the first.
+It is copied by SAGE_ROOT/build/make/install into SAGE_ROOT/build/make/Makefile.
diff --git a/build/pkgs/patch/dependencies b/build/pkgs/patch/dependencies
new file mode 100644
index 0000000..3546cda
--- /dev/null
+++ b/build/pkgs/patch/dependencies
@@ -0,0 +1,5 @@
+# no dependencies
+
+----------
+All lines of this file are ignored except the first.
+It is copied by SAGE_ROOT/build/make/install into SAGE_ROOT/build/make/Makefile.
diff --git a/build/pkgs/patchbot/SPKG.txt b/build/pkgs/patchbot/SPKG.txt
new file mode 100644
index 0000000..c34994b
--- /dev/null
+++ b/build/pkgs/patchbot/SPKG.txt
@@ -0,0 +1,26 @@
+= SageMath patchbot =
+
+== Description ==
+
+Apply branches and run tests on open Sage tickets.
+
+The patchbot is used to automate the testing of git branches. It has two
+different aspects: a server side and a client side.
+
+Instructions for using the client side can be found at
+
+http://wiki.sagemath.org/buildbot/details
+
+== License ==
+
+GPLv2+
+
+== Upstream Contact ==
+
+Robert Bradshaw
+Frédéric Chapoton
+https://github.com/robertwb/sage-patchbot/
+
+== Dependencies ==
+
+python, python-dateutil, sage-scripts
diff --git a/build/pkgs/patchbot/checksums.ini b/build/pkgs/patchbot/checksums.ini
new file mode 100644
index 0000000..4a35077
--- /dev/null
+++ b/build/pkgs/patchbot/checksums.ini
@@ -0,0 +1,4 @@
+tarball=patchbot-VERSION.tar.bz2
+sha1=1850ce7004fe49b669be0b53102d32e9095cc307
+md5=a84f244c2f6e6c715676a09028750b36
+cksum=1356602931
diff --git a/build/pkgs/patchbot/dependencies b/build/pkgs/patchbot/dependencies
new file mode 100644
index 0000000..4e1e014
--- /dev/null
+++ b/build/pkgs/patchbot/dependencies
@@ -0,0 +1 @@
+# No dependencies
diff --git a/build/pkgs/patchbot/package-version.txt b/build/pkgs/patchbot/package-version.txt
new file mode 100644
index 0000000..f225a78
--- /dev/null
+++ b/build/pkgs/patchbot/package-version.txt
@@ -0,0 +1 @@
+2.5.2
diff --git a/build/pkgs/patchbot/spkg-install b/build/pkgs/patchbot/spkg-install
new file mode 100755
index 0000000..5dcc96f
--- /dev/null
+++ b/build/pkgs/patchbot/spkg-install
@@ -0,0 +1,14 @@
+#!/usr/bin/env bash
+
+if [ "$SAGE_LOCAL" = "" ]; then
+ echo "SAGE_LOCAL undefined ... exiting";
+ echo "Maybe run 'sage -sh'?"
+ exit 1
+fi
+
+# Delete any currently existing patchbot
+rm -rf "$SAGE_LOCAL/bin/patchbot"
+
+# Copy into final location.
+# The sage-patchbot script knows how to call this...
+cp -Rv src "$SAGE_LOCAL/bin/patchbot"
diff --git a/build/pkgs/patchbot/type b/build/pkgs/patchbot/type
new file mode 100644
index 0000000..134d9bc
--- /dev/null
+++ b/build/pkgs/patchbot/type
@@ -0,0 +1 @@
+optional
diff --git a/build/pkgs/planarity/dependencies b/build/pkgs/planarity/dependencies
new file mode 100644
index 0000000..3546cda
--- /dev/null
+++ b/build/pkgs/planarity/dependencies
@@ -0,0 +1,5 @@
+# no dependencies
+
+----------
+All lines of this file are ignored except the first.
+It is copied by SAGE_ROOT/build/make/install into SAGE_ROOT/build/make/Makefile.
diff --git a/build/pkgs/plantri/dependencies b/build/pkgs/plantri/dependencies
new file mode 100644
index 0000000..3546cda
--- /dev/null
+++ b/build/pkgs/plantri/dependencies
@@ -0,0 +1,5 @@
+# no dependencies
+
+----------
+All lines of this file are ignored except the first.
+It is copied by SAGE_ROOT/build/make/install into SAGE_ROOT/build/make/Makefile.
diff --git a/build/pkgs/polytopes_db/dependencies b/build/pkgs/polytopes_db/dependencies
new file mode 100644
index 0000000..3546cda
--- /dev/null
+++ b/build/pkgs/polytopes_db/dependencies
@@ -0,0 +1,5 @@
+# no dependencies
+
+----------
+All lines of this file are ignored except the first.
+It is copied by SAGE_ROOT/build/make/install into SAGE_ROOT/build/make/Makefile.
diff --git a/build/pkgs/rubiks/dependencies b/build/pkgs/rubiks/dependencies
new file mode 100644
index 0000000..3546cda
--- /dev/null
+++ b/build/pkgs/rubiks/dependencies
@@ -0,0 +1,5 @@
+# no dependencies
+
+----------
+All lines of this file are ignored except the first.
+It is copied by SAGE_ROOT/build/make/install into SAGE_ROOT/build/make/Makefile.
diff --git a/build/pkgs/rw/dependencies b/build/pkgs/rw/dependencies
new file mode 100644
index 0000000..3546cda
--- /dev/null
+++ b/build/pkgs/rw/dependencies
@@ -0,0 +1,5 @@
+# no dependencies
+
+----------
+All lines of this file are ignored except the first.
+It is copied by SAGE_ROOT/build/make/install into SAGE_ROOT/build/make/Makefile.
diff --git a/build/pkgs/saclib/dependencies b/build/pkgs/saclib/dependencies
new file mode 100644
index 0000000..3546cda
--- /dev/null
+++ b/build/pkgs/saclib/dependencies
@@ -0,0 +1,5 @@
+# no dependencies
+
+----------
+All lines of this file are ignored except the first.
+It is copied by SAGE_ROOT/build/make/install into SAGE_ROOT/build/make/Makefile.
diff --git a/build/pkgs/symmetrica/dependencies b/build/pkgs/symmetrica/dependencies
new file mode 100644
index 0000000..3546cda
--- /dev/null
+++ b/build/pkgs/symmetrica/dependencies
@@ -0,0 +1,5 @@
+# no dependencies
+
+----------
+All lines of this file are ignored except the first.
+It is copied by SAGE_ROOT/build/make/install into SAGE_ROOT/build/make/Makefile.
diff --git a/build/pkgs/sympow/dependencies b/build/pkgs/sympow/dependencies
new file mode 100644
index 0000000..3546cda
--- /dev/null
+++ b/build/pkgs/sympow/dependencies
@@ -0,0 +1,5 @@
+# no dependencies
+
+----------
+All lines of this file are ignored except the first.
+It is copied by SAGE_ROOT/build/make/install into SAGE_ROOT/build/make/Makefile.
diff --git a/build/pkgs/termcap/dependencies b/build/pkgs/termcap/dependencies
new file mode 100644
index 0000000..3546cda
--- /dev/null
+++ b/build/pkgs/termcap/dependencies
@@ -0,0 +1,5 @@
+# no dependencies
+
+----------
+All lines of this file are ignored except the first.
+It is copied by SAGE_ROOT/build/make/install into SAGE_ROOT/build/make/Makefile.
diff --git a/build/pkgs/valgrind/dependencies b/build/pkgs/valgrind/dependencies
new file mode 100644
index 0000000..3546cda
--- /dev/null
+++ b/build/pkgs/valgrind/dependencies
@@ -0,0 +1,5 @@
+# no dependencies
+
+----------
+All lines of this file are ignored except the first.
+It is copied by SAGE_ROOT/build/make/install into SAGE_ROOT/build/make/Makefile.
diff --git a/build/pkgs/zeromq/dependencies b/build/pkgs/zeromq/dependencies
new file mode 100644
index 0000000..3546cda
--- /dev/null
+++ b/build/pkgs/zeromq/dependencies
@@ -0,0 +1,5 @@
+# no dependencies
+
+----------
+All lines of this file are ignored except the first.
+It is copied by SAGE_ROOT/build/make/install into SAGE_ROOT/build/make/Makefile.
diff --git a/build/pkgs/zlib/dependencies b/build/pkgs/zlib/dependencies
new file mode 100644
index 0000000..3546cda
--- /dev/null
+++ b/build/pkgs/zlib/dependencies
@@ -0,0 +1,5 @@
+# no dependencies
+
+----------
+All lines of this file are ignored except the first.
+It is copied by SAGE_ROOT/build/make/install into SAGE_ROOT/build/make/Makefile.
diff --git a/build/sage_bootstrap/cmdline.py b/build/sage_bootstrap/cmdline.py
index c1dfe89..c08d958 100644
--- a/build/sage_bootstrap/cmdline.py
+++ b/build/sage_bootstrap/cmdline.py
@@ -167,11 +167,13 @@ class SageDownloadFileApplication(object):
def run(self):
progress = True
url = None
+ print_fastest_mirror = None
destination = None
for arg in sys.argv[1:]:
if arg.startswith('--print-fastest-mirror'):
- print(MirrorList().fastest)
- sys.exit(0)
+ url = ""
+ print_fastest_mirror = True
+ continue
if arg.startswith('--quiet'):
progress = False
continue
@@ -184,13 +186,31 @@ class SageDownloadFileApplication(object):
raise ValueError('too many arguments')
if url is None:
print(dedent(self.__doc__.format(SAGE_DISTFILES=SAGE_DISTFILES)))
- sys.exit(1)
- if url.startswith('http://') or url.startswith('https://') or url.startswith('ftp://'):
- Download(url, destination, progress=progress, ignore_errors=True).run()
- else:
- # url is a tarball name
- tarball = Tarball(url)
- tarball.download()
- if destination is not None:
- tarball.save_as(destination)
-
+ sys.exit(2)
+
+ try:
+ if url.startswith('http://') or url.startswith('https://') or url.startswith('ftp://'):
+ Download(url, destination, progress=progress, ignore_errors=True).run()
+ elif print_fastest_mirror:
+ url = "fastest mirror" # For error message
+ print(MirrorList().fastest)
+ else:
+ # url is a tarball name
+ tarball = Tarball(url)
+ tarball.download()
+ if destination is not None:
+ tarball.save_as(destination)
+ except BaseException:
+ try:
+ stars = '*' * 72 + '\n'
+ sys.stderr.write(stars)
+ try:
+ import traceback
+ traceback.print_exc(file=sys.stderr)
+ sys.stderr.write(stars)
+ except:
+ pass
+ sys.stderr.write("Error downloading %s\n"%(url,))
+ sys.stderr.write(stars)
+ finally:
+ sys.exit(1)
diff --git a/src/bin/sage-banner b/src/bin/sage-banner
index 3758480..4a95ae4 100644
--- a/src/bin/sage-banner
+++ b/src/bin/sage-banner
@@ -1,5 +1,5 @@
┌────────────────────────────────────────────────────────────────────┐
-│ SageMath Version 6.9.rc0, Release Date: 2015-09-25 │
+│ SageMath Version 6.10.beta0, Release Date: 2015-10-15 │
│ Type "notebook()" for the browser-based notebook interface. │
│ Type "help()" for help. │
└────────────────────────────────────────────────────────────────────┘
diff --git a/src/bin/sage-sdist b/src/bin/sage-sdist
index 6b08cec..69424b2 100755
--- a/src/bin/sage-sdist
+++ b/src/bin/sage-sdist
@@ -43,12 +43,10 @@ echo "Sage version $SAGE_VERSION, release date $SAGE_RELEASE_DATE"
TARGET="sage-$SAGE_VERSION"
sage-clone-source "$SAGE_ROOT" "$TMP_DIR/$TARGET"
-# Download and copy all upstream tarballs (the -B option to make forces
-# all targets to be built unconditionally)
+# Download and copy all upstream tarballs
cd "$SAGE_ROOT/build/make"
-SAGE_INSTALL_GCC=yes SAGE_SPKG_COPY_UPSTREAM="$TMP_DIR/$TARGET/upstream" \
-SAGE_INSTALL_FETCH_ONLY=yes \
-./install -B all-build
+export SAGE_SPKG_COPY_UPSTREAM="$TMP_DIR/$TARGET/upstream"
+$MAKE download-for-sdist
# Create source .tar.gz
cd "$TMP_DIR"
diff --git a/src/bin/sage-version.sh b/src/bin/sage-version.sh
index e5b60c9..b8eaf79 100644
--- a/src/bin/sage-version.sh
+++ b/src/bin/sage-version.sh
@@ -1,4 +1,4 @@
# Sage version information for shell scripts
# This file is auto-generated by the sage-update-version script, do not edit!
-SAGE_VERSION='6.9.rc0'
-SAGE_RELEASE_DATE='2015-09-25'
+SAGE_VERSION='6.10.beta0'
+SAGE_RELEASE_DATE='2015-10-15'
diff --git a/src/doc/en/developer/coding_in_python.rst b/src/doc/en/developer/coding_in_python.rst
index 30c65ff..d8b7419 100644
--- a/src/doc/en/developer/coding_in_python.rst
+++ b/src/doc/en/developer/coding_in_python.rst
@@ -503,7 +503,7 @@ documentation for more information on its behaviour and optional arguments.
def my_new_function():
...
- my_old_function = deprecated_function_alias(my_new_function)
+ my_old_function = deprecated_function_alias(666, my_new_function)
* **Moving an object to a different module:**
if you rename a source file or move some function (or class) to a
diff --git a/src/doc/en/reference/algebras/index.rst b/src/doc/en/reference/algebras/index.rst
index f802294..f07d5a3 100644
--- a/src/doc/en/reference/algebras/index.rst
+++ b/src/doc/en/reference/algebras/index.rst
@@ -4,6 +4,8 @@ Algebras
.. toctree::
:maxdepth: 2
+ sage/algebras/associated_graded
+
sage/algebras/catalog
sage/algebras/clifford_algebra
@@ -25,6 +27,8 @@ Algebras
sage/algebras/free_algebra_quotient
sage/algebras/free_algebra_quotient_element
+ sage/algebras/free_zinbiel_algebra
+
sage/algebras/group_algebra
sage/algebras/iwahori_hecke_algebra
diff --git a/src/doc/en/reference/categories/index.rst b/src/doc/en/reference/categories/index.rst
index 6ee9d20..518d9e6 100644
--- a/src/doc/en/reference/categories/index.rst
+++ b/src/doc/en/reference/categories/index.rst
@@ -63,6 +63,10 @@ Individual Categories
sage/categories/enumerated_sets
sage/categories/euclidean_domains
sage/categories/fields
+ sage/categories/filtered_algebras
+ sage/categories/filtered_algebras_with_basis
+ sage/categories/filtered_modules
+ sage/categories/filtered_modules_with_basis
sage/categories/finite_coxeter_groups
sage/categories/finite_crystals
sage/categories/finite_dimensional_algebras_with_basis
diff --git a/src/doc/en/reference/coding/index.rst b/src/doc/en/reference/coding/index.rst
index 004458e..6311e17 100644
--- a/src/doc/en/reference/coding/index.rst
+++ b/src/doc/en/reference/coding/index.rst
@@ -6,8 +6,10 @@ Coding Theory
.. toctree::
:maxdepth: 1
- sage/coding/channels_catalog
+ sage/coding/encoder
+ sage/coding/encoders_catalog
sage/coding/channel_constructions
+ sage/coding/channels_catalog
sage/coding/codes_catalog
sage/coding/linear_code
sage/coding/code_constructions
diff --git a/src/doc/en/reference/combinat/module_list.rst b/src/doc/en/reference/combinat/module_list.rst
index 4abd0e8..b2f82fd 100644
--- a/src/doc/en/reference/combinat/module_list.rst
+++ b/src/doc/en/reference/combinat/module_list.rst
@@ -35,6 +35,7 @@ Comprehensive Module list
sage/combinat/cluster_algebra_quiver/mutation_type
sage/combinat/cluster_algebra_quiver/quiver
sage/combinat/cluster_algebra_quiver/quiver_mutation_type
+ sage/combinat/colored_permutations
sage/combinat/combinat
sage/combinat/combinat_cython
sage/combinat/combination
@@ -162,6 +163,7 @@ Comprehensive Module list
sage/combinat/permutation_nk
sage/combinat/posets/__init__
sage/combinat/posets/all
+ sage/combinat/posets/cartesian_product
sage/combinat/posets/elements
sage/combinat/posets/hasse_diagram
sage/combinat/posets/incidence_algebras
diff --git a/src/doc/en/reference/data_structures/index.rst b/src/doc/en/reference/data_structures/index.rst
index 52e3280..90bf85e 100644
--- a/src/doc/en/reference/data_structures/index.rst
+++ b/src/doc/en/reference/data_structures/index.rst
@@ -7,5 +7,6 @@ Data Structures
sage/misc/binary_tree
sage/data_structures/bitset
sage/data_structures/bounded_integer_sequences
+ sage/data_structures/mutable_poset
.. include:: ../footer.txt
diff --git a/src/doc/en/reference/graphs/index.rst b/src/doc/en/reference/graphs/index.rst
index f71db68..a27c03f 100644
--- a/src/doc/en/reference/graphs/index.rst
+++ b/src/doc/en/reference/graphs/index.rst
@@ -91,6 +91,7 @@ Libraries of algorithms
sage/graphs/graph_latex
sage/graphs/graph_editor
sage/graphs/graph_list
+ sage/graphs/graph_input
sage/graphs/hyperbolicity
sage/graphs/tutte_polynomial
sage/graphs/generic_graph_pyx
diff --git a/src/doc/en/reference/index.rst b/src/doc/en/reference/index.rst
index 5972217..85c5201 100644
--- a/src/doc/en/reference/index.rst
+++ b/src/doc/en/reference/index.rst
@@ -78,6 +78,7 @@ Calculus
* :doc:`Symbolic Calculus <calculus/index>`
* :doc:`Mathematical Constants <constants/index>`
* :doc:`Elementary and Special Functions <functions/index>`
+* :doc:`Asymptotic Expansions <rings/asymptotic_expansions_index>` (experimental)
Geometry and Topology
---------------------
diff --git a/src/doc/en/reference/polynomial_rings/polynomial_rings_univar.rst b/src/doc/en/reference/polynomial_rings/polynomial_rings_univar.rst
index d84fd74..bd55ed8 100644
--- a/src/doc/en/reference/polynomial_rings/polynomial_rings_univar.rst
+++ b/src/doc/en/reference/polynomial_rings/polynomial_rings_univar.rst
@@ -35,6 +35,7 @@ whereas others have multiple bases.
sage/rings/polynomial/real_roots
sage/rings/polynomial/complex_roots
+ sage/rings/polynomial/refine_root
sage/rings/polynomial/ideal
sage/rings/polynomial/polynomial_quotient_ring
diff --git a/src/doc/en/reference/rings/asymptotic_expansions_index.rst b/src/doc/en/reference/rings/asymptotic_expansions_index.rst
index f6268e6..1271089 100644
--- a/src/doc/en/reference/rings/asymptotic_expansions_index.rst
+++ b/src/doc/en/reference/rings/asymptotic_expansions_index.rst
@@ -5,5 +5,6 @@ Asymptotic Expansions
sage/rings/asymptotic/growth_group
sage/rings/asymptotic/term_monoid
+ sage/rings/asymptotic/asymptotic_ring
.. include:: ../footer.txt
diff --git a/src/doc/en/reference/sat/index.rst b/src/doc/en/reference/sat/index.rst
index 3c86ef5..7f6314a 100644
--- a/src/doc/en/reference/sat/index.rst
+++ b/src/doc/en/reference/sat/index.rst
@@ -18,33 +18,36 @@ should be true, we write::
Solvers
-------
-Any SAT solver supporting the DIMACS input format is easily interfaced using the
-:class:`sage.sat.solvers.dimacs.DIMACS` blueprint. Sage ships with pre-written interfaces for *RSat*
-[RS]_ and *Glucose* [GL]_. Furthermore, Sage provides a C++ interface to the *CryptoMiniSat* [CMS]_ SAT
-solver which can be used interchangably with DIMACS-based solvers, but also provides advanced
-features. For this, the optional CryptoMiniSat package must be
-installed, this can be accomplished by typing the following in the
+By default, Sage solves SAT instances as an Integer Linear Program (see
+:mod:`sage.numerical.mip`), but any SAT solver supporting the DIMACS input
+format is easily interfaced using the :class:`sage.sat.solvers.dimacs.DIMACS`
+blueprint. Sage ships with pre-written interfaces for *RSat* [RS]_ and *Glucose*
+[GL]_. Furthermore, Sage provides a C++ interface to the *CryptoMiniSat* [CMS]_
+SAT solver which can be used interchangably with DIMACS-based solvers, but also
+provides advanced features. For this last solver, the optional CryptoMiniSat
+package must be installed, this can be accomplished by typing the following in the
shell::
sage -i cryptominisat sagelib
-Since by default Sage does not include any SAT solver, we demonstrate key features by instantiating
-a fake DIMACS-based solver. We start with a trivial example::
+We now show how to solve a simple SAT problem. ::
(x1 OR x2 OR x3) AND (x1 OR x2 OR (NOT x3))
In Sage's notation::
- sage: from sage.sat.solvers.dimacs import DIMACS
- sage: solver = DIMACS(command="sat-solver")
+ sage: solver = SAT()
sage: solver.add_clause( ( 1, 2, 3) )
sage: solver.add_clause( ( 1, 2, -3) )
+ sage: solver() # random
+ (None, True, True, False)
.. NOTE::
- :meth:`sage.sat.solvers.dimacs.DIMACS.add_clause` creates new variables when necessary. In
- particular, it creates *all* variables up to the given index. Hence, adding a literal involving
- the variable 1000 creates up to 1000 internal variables.
+ :meth:`~sage.sat.solvers.dimacs.DIMACS.add_clause` creates new variables
+ when necessary. When using CryptoMiniSat, it creates *all* variables up to
+ the given index. Hence, adding a literal involving the variable 1000 creates
+ up to 1000 internal variables.
DIMACS-base solvers can also be used to write DIMACS files::
@@ -76,14 +79,6 @@ Alternatively, there is :meth:`sage.sat.solvers.dimacs.DIMACS.clauses`::
These files can then be passed external SAT solvers.
-We demonstrate solving using CryptoMiniSat::
-
- sage: from sage.sat.solvers import CryptoMiniSat # optional - cryptominisat
- sage: cms = CryptoMiniSat() # optional - cryptominisat
- sage: cms.add_clause((1,2,-3)) # optional - cryptominisat
- sage: cms() # optional - cryptominisat
- (None, True, True, False)
-
Details on Specific Solvers
^^^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -92,6 +87,7 @@ Details on Specific Solvers
sage/sat/solvers/satsolver
sage/sat/solvers/dimacs
+ sage/sat/solvers/sat_lp
.. optional - cryptominisat
.. sage/sat/solvers/cryptominisat/cryptominisat
.. sage/sat/solvers/cryptominisat/solverconf
diff --git a/src/module_list.py b/src/module_list.py
index 7108872..d0a4821 100644
--- a/src/module_list.py
+++ b/src/module_list.py
@@ -1570,6 +1570,10 @@ ext_modules = [
sources = ['sage/rings/polynomial/real_roots.pyx'],
libraries=['mpfr']),
+ Extension('sage.rings.polynomial.refine_root',
+ sources = ['sage/rings/polynomial/refine_root.pyx'],
+ libraries=['gmp', 'mpfr', 'mpfi']),
+
Extension('sage.rings.polynomial.symmetric_reduction',
sources = ['sage/rings/polynomial/symmetric_reduction.pyx']),
diff --git a/src/sage/algebras/associated_graded.py b/src/sage/algebras/associated_graded.py
new file mode 100644
index 0000000..750cbe3
--- /dev/null
+++ b/src/sage/algebras/associated_graded.py
@@ -0,0 +1,341 @@
+r"""
+Associated Graded Algebras To Filtered Algebras
+
+AUTHORS:
+
+- Travis Scrimshaw (2014-10-08): Initial version
+"""
+
+#*****************************************************************************
+# Copyright (C) 2014 Travis Scrimshaw <tscrim at ucdavis.edu>
+#
+# Distributed under the terms of the GNU General Public License (GPL)
+# http://www.gnu.org/licenses/
+#*****************************************************************************
+
+from sage.misc.cachefunc import cached_method
+from copy import copy
+
+from sage.categories.modules_with_basis import ModulesWithBasis
+from sage.sets.family import Family
+from sage.combinat.free_module import CombinatorialFreeModule
+
+class AssociatedGradedAlgebra(CombinatorialFreeModule):
+ r"""
+ The associated graded algebra/module `\operatorname{gr} A`
+ of a filtered algebra/module with basis `A`.
+
+ Let `A` be a filtered module over a commutative ring `R`.
+ Let `(F_i)_{i \in I}` be the filtration of `A`, with `I` being
+ a totally ordered set. Define
+
+ .. MATH::
+
+ G_i = F_i / \sum_{j < i} F_j
+
+ for every `i \in I`, and then
+
+ .. MATH::
+
+ \operatorname{gr} A = \bigoplus_{i \in I} G_i.
+
+ There are canonical projections `p_i : F_i \to G_i` for
+ every `i \in I`. Moreover `\operatorname{gr} A` is naturally a
+ graded `R`-module with `G_i` being the `i`-th graded component.
+ This graded `R`-module is known as the *associated graded module*
+ (or, for short, just *graded module*) of `A`.
+
+ Now, assume that `A` (endowed with the filtration
+ `(F_i)_{i \in I}`) is not just a filtered `R`-module, but also
+ a filtered `R`-algebra.
+ Let `u \in G_i` and `v \in G_j`, and let `u' \in F_i` and
+ `v' \in F_j` be lifts of `u` and `v`, respectively (so that
+ `u = p_i(u')` and `v = p_j(v')`). Then, we define a
+ multiplication `*` on `\operatorname{gr} A` (not to be mistaken
+ for the multiplication of the original algebra `A`) by
+
+ .. MATH::
+
+ u * v = p_{i+j} (u' v').
+
+ The *associated graded algebra* (or, for short, just
+ *graded algebra*) of `A` is the graded algebra
+ `\operatorname{gr} A` (endowed with this multiplication).
+
+ Now, assume that `A` is a filtered `R`-algebra with basis.
+ Let `(b_x)_{x \in X}` be the basis of `A`,
+ and consider the partition `X = \bigsqcup_{i \in I} X_i` of
+ the set `X`, which is part of the data of a filtered
+ algebra with basis. We know (see
+ :class:`~sage.categories.filtered_modules_with_basis.FilteredModulesWithBasis`)
+ that `A` (being a filtered `R`-module with basis) is canonically
+ (when the basis is considered to be part of the data)
+ isomorphic to `\operatorname{gr} A` as an `R`-module. Therefore
+ the `k`-th graded component `G_k` can be identified with
+ the span of `(b_x)_{x \in X_k}`, or equivalently the
+ `k`-th homogeneous component of `A`. Suppose
+ that `u' v' = \sum_{k \leq i+j} m_k` where `m_k \in G_k` (which
+ has been identified with the `k`-th homogeneous component of `A`).
+ Then `u * v = m_{i+j}`. We also note that the choice of
+ identification of `G_k` with the `k`-th homogeneous component
+ of `A` depends on the given basis.
+
+ The basis `(b_x)_{x \in X}` of `A` gives rise to a basis
+ of `\operatorname{gr} A`. This latter basis is still indexed
+ by the elements of `X`, and consists of the images of the
+ `b_x` under the `R`-module isomorphism from `A` to
+ `\operatorname{gr} A`. It makes `\operatorname{gr} A` into
+ a graded `R`-algebra with basis.
+
+ In this class, the `R`-module isomorphism from `A` to
+ `\operatorname{gr} A` is implemented as
+ :meth:`to_graded_conversion` and also as the default
+ conversion from `A` to `\operatorname{gr} A`. Its
+ inverse map is implemented as
+ :meth:`from_graded_conversion`.
+ The projection `p_i : F_i \to G_i` is implemented as
+ :meth:`projection` ``(i)``.
+
+ INPUT:
+
+ - ``A`` -- a filtered module (or algebra) with basis
+
+ OUTPUT:
+
+ The associated graded module of `A`, if `A` is just a filtered
+ `R`-module.
+ The associated graded algebra of `A`, if `A` is a filtered
+ `R`-algebra.
+
+ EXAMPLES:
+
+ Associated graded module of a filtered module::
+
+ sage: A = Modules(QQ).WithBasis().Filtered().example()
+ sage: grA = A.graded_algebra()
+ sage: grA.category()
+ Category of graded modules with basis over Rational Field
+ sage: x = A.basis()[Partition([3,2,1])]
+ sage: grA(x)
+ Bbar[[3, 2, 1]]
+
+ Associated graded algebra of a filtered algebra::
+
+ sage: A = Algebras(QQ).WithBasis().Filtered().example()
+ sage: grA = A.graded_algebra()
+ sage: grA.category()
+ Category of graded algebras with basis over Rational Field
+ sage: x,y,z = map(lambda s: grA.algebra_generators()[s], ['x','y','z'])
+ sage: x
+ bar(U['x'])
+ sage: y * x + z
+ bar(U['x']*U['y']) + bar(U['z'])
+ sage: A(y) * A(x) + A(z)
+ U['x']*U['y']
+
+ We note that the conversion between ``A`` and ``grA`` is
+ the canonical ``QQ``-module isomorphism stemming from the
+ fact that the underlying ``QQ``-modules of ``A`` and
+ ``grA`` are isomorphic::
+
+ sage: grA(A.an_element())
+ bar(U['x']^2*U['y']^2*U['z']^3)
+ sage: elt = A.an_element() + A.algebra_generators()['x'] + 2
+ sage: grelt = grA(elt); grelt
+ bar(U['x']^2*U['y']^2*U['z']^3) + bar(U['x']) + 2*bar(1)
+ sage: A(grelt) == elt
+ True
+
+ .. TODO::
+
+ The algebra ``A`` must currently be an instance of (a subclass of)
+ :class:`CombinatorialFreeModule`. This should work with any
+ filtered algebra with a basis.
+
+ .. TODO::
+
+ Implement a version of associated graded algebra for
+ filtered algebras without a distinguished basis.
+
+ REFERENCES:
+
+ - :wikipedia:`Filtered_algebra#Associated_graded_algebra`
+ """
+ def __init__(self, A, category=None):
+ """
+ Initialize ``self``.
+
+ EXAMPLES::
+
+ sage: A = Algebras(QQ).WithBasis().Filtered().example()
+ sage: grA = A.graded_algebra()
+ sage: TestSuite(grA).run(elements=[prod(grA.algebra_generators())])
+ """
+ if A not in ModulesWithBasis(A.base_ring().category()).Filtered():
+ raise ValueError("the base algebra must be filtered and with basis")
+ self._A = A
+
+ base_ring = A.base_ring()
+ base_one = base_ring.one()
+
+ category = A.category().Graded().or_subcategory(category)
+ try:
+ opts = copy(A.print_options())
+ if not opts['prefix'] and not opts['bracket']:
+ opts['bracket'] = '('
+ opts['prefix'] = opts['prefix'] + 'bar'
+ except AttributeError:
+ opts = {'prefix': 'Abar'}
+
+ CombinatorialFreeModule.__init__(self, base_ring, A.basis().keys(),
+ category=category, **opts)
+
+ # Setup the conversion back
+ phi = self.module_morphism(diagonal=lambda x: base_one, codomain=A)
+ self._A.register_conversion(phi)
+
+ def _repr_(self):
+ """
+ Return a string representation of ``self``.
+
+ EXAMPLES::
+
+ sage: A = Algebras(QQ).WithBasis().Filtered().example()
+ sage: A.graded_algebra()
+ Graded Algebra of An example of a filtered algebra with basis:
+ the universal enveloping algebra of Lie algebra of RR^3
+ with cross product over Rational Field
+ """
+ from sage.categories.algebras_with_basis import AlgebrasWithBasis
+ if self in AlgebrasWithBasis:
+ return "Graded Algebra of {}".format(self._A)
+ return "Graded Module of {}".format(self._A)
+
+ def _latex_(self):
+ r"""
+ Return a latex representation of ``self``.
+
+ EXAMPLES::
+
+ sage: A = Algebras(QQ).WithBasis().Filtered().example()
+ sage: latex(A.graded_algebra())
+ \operatorname{gr} ...
+ """
+ from sage.misc.latex import latex
+ return "\\operatorname{gr} " + latex(self._A)
+
+ def _element_constructor_(self, x):
+ r"""
+ Construct an element of ``self`` from ``x``.
+
+ If ``self`` `= \operatorname{gr} A` for a filtered algebra
+ `A` with basis, and if ``x`` is an element of `A`, then
+ this returns the image of `x` under the canonical `R`-module
+ isomorphism `A \to \operatorname{gr} A`. (In this case,
+ this is equivalent to calling
+ ``self.to_graded_conversion()(x)``.)
+
+ EXAMPLES::
+
+ sage: A = Algebras(QQ).WithBasis().Filtered().example()
+ sage: grA = A.graded_algebra()
+ sage: grA(A.an_element())
+ bar(U['x']^2*U['y']^2*U['z']^3)
+ sage: grA(A.an_element() + A.algebra_generators()['x'] + 2)
+ bar(U['x']^2*U['y']^2*U['z']^3) + bar(U['x']) + 2*bar(1)
+ """
+ if isinstance(x, CombinatorialFreeModule.Element):
+ if x.parent() is self._A:
+ return self._from_dict(dict(x))
+ return super(AssociatedGradedAlgebra, self)._element_constructor_(x)
+
+ def gen(self, *args, **kwds):
+ """
+ Return a generator of ``self``.
+
+ EXAMPLES::
+
+ sage: A = Algebras(QQ).WithBasis().Filtered().example()
+ sage: grA = A.graded_algebra()
+ sage: grA.gen('x')
+ bar(U['x'])
+ """
+ try:
+ x = self._A.gen(*args, **kwds)
+ except AttributeError:
+ x = self._A.algebra_generators()[args[0]]
+ return self(x)
+
+ @cached_method
+ def algebra_generators(self):
+ """
+ Return the algebra generators of ``self``.
+
+ This assumes that the algebra generators of `A` provided by
+ its ``algebra_generators`` method are homogeneous.
+
+ EXAMPLES::
+
+ sage: A = Algebras(QQ).WithBasis().Filtered().example()
+ sage: grA = A.graded_algebra()
+ sage: grA.algebra_generators()
+ Finite family {'y': bar(U['y']), 'x': bar(U['x']), 'z': bar(U['z'])}
+ """
+ G = self._A.algebra_generators()
+ return Family(G.keys(), lambda x: self(G[x]), name="generator")
+
+ def degree_on_basis(self, x):
+ """
+ Return the degree of the basis element indexed by ``x``.
+
+ EXAMPLES::
+
+ sage: A = Algebras(QQ).WithBasis().Filtered().example()
+ sage: grA = A.graded_algebra()
+ sage: all(A.degree_on_basis(x) == grA.degree_on_basis(x)
+ ....: for g in grA.algebra_generators() for x in g.support())
+ True
+ """
+ return self._A.degree_on_basis(x)
+
+ @cached_method
+ def one_basis(self):
+ """
+ Return the basis index of the element `1` of
+ `\operatorname{gr} A`.
+
+ This assumes that the unity `1` of `A` belongs to `F_0`.
+
+ EXAMPLES::
+
+ sage: A = Algebras(QQ).WithBasis().Filtered().example()
+ sage: grA = A.graded_algebra()
+ sage: grA.one_basis()
+ 1
+ """
+ return self._A.one_basis()
+
+ def product_on_basis(self, x, y):
+ """
+ Return the product on basis elements given by the
+ indices ``x`` and ``y``.
+
+ EXAMPLES::
+
+ sage: A = Algebras(QQ).WithBasis().Filtered().example()
+ sage: grA = A.graded_algebra()
+ sage: G = grA.algebra_generators()
+ sage: x,y,z = G['x'], G['y'], G['z']
+ sage: x * y # indirect doctest
+ bar(U['x']*U['y'])
+ sage: y * x
+ bar(U['x']*U['y'])
+ sage: z * y * x
+ bar(U['x']*U['y']*U['z'])
+ """
+ ret = self._A.product_on_basis(x, y)
+ deg = self._A.degree_on_basis(x) + self._A.degree_on_basis(y)
+ return self.sum_of_terms([(i,c) for i,c in ret
+ if self._A.degree_on_basis(i) == deg],
+ distinct=True)
+
diff --git a/src/sage/algebras/catalog.py b/src/sage/algebras/catalog.py
index da06202..262e811 100644
--- a/src/sage/algebras/catalog.py
+++ b/src/sage/algebras/catalog.py
@@ -16,6 +16,7 @@ Let ``<tab>`` indicate pressing the tab key. So begin by typing
- :class:`algebras.FiniteDimensional
<sage.algebras.finite_dimensional_algebras.finite_dimensional_algebra.FiniteDimensionalAlgebra>`
- :class:`algebras.Free <sage.algebras.free_algebra.FreeAlgebraFactory>`
+- :class:`algebras.FreeZinbiel <sage.algebras.free_zinbiel_algebra.FreeZinbielAlgebra>`
- :class:`algebras.PreLieAlgebra <sage.combinat.free_prelie_algebra.FreePreLieAlgebra>`
- :func:`algebras.GradedCommutative
<sage.algebras.commutative_dga.GradedCommutativeAlgebra>`
@@ -48,6 +49,7 @@ from sage.algebras.weyl_algebra import DifferentialWeylAlgebra as DifferentialWe
from sage.misc.lazy_import import lazy_import
lazy_import('sage.algebras.nil_coxeter_algebra', 'NilCoxeterAlgebra', 'NilCoxeter')
+lazy_import('sage.algebras.free_zinbiel_algebra', 'FreeZinbielAlgebra', 'FreeZinbiel')
lazy_import('sage.algebras.hall_algebra', 'HallAlgebra', 'Hall')
lazy_import('sage.algebras.jordan_algebra', 'JordanAlgebra', 'Jordan')
lazy_import('sage.algebras.shuffle_algebra', 'ShuffleAlgebra', 'Shuffle')
diff --git a/src/sage/algebras/clifford_algebra.py b/src/sage/algebras/clifford_algebra.py
index b419d98..bb88f5e 100644
--- a/src/sage/algebras/clifford_algebra.py
+++ b/src/sage/algebras/clifford_algebra.py
@@ -18,8 +18,7 @@ from sage.structure.unique_representation import UniqueRepresentation
from copy import copy
from sage.categories.algebras_with_basis import AlgebrasWithBasis
-from sage.categories.graded_algebras_with_basis import GradedAlgebrasWithBasis
-from sage.categories.graded_hopf_algebras_with_basis import GradedHopfAlgebrasWithBasis
+from sage.categories.hopf_algebras_with_basis import HopfAlgebrasWithBasis
from sage.modules.with_basis.morphism import ModuleMorphismByLinearity
from sage.categories.poor_man_map import PoorManMap
from sage.rings.all import ZZ
@@ -423,6 +422,14 @@ class CliffordAlgebra(CombinatorialFreeModule):
canonical isomorphism. The inclusion `i` is commonly used to
identify `V` with a vector subspace of `Cl(V)`.
+ The Clifford algebra `Cl(V, Q)` is a `\ZZ_2`-graded algebra
+ (where `\ZZ_2 = \ZZ / 2 \ZZ`); this grading is determined by
+ placing all elements of `V` in degree `1`. It is also an
+ `\NN`-filtered algebra, with the filtration too being defined
+ by placing all elements of `V` in degree `1`. The :meth:`degree` gives
+ the `\NN`-*filtration* degree, and to get the super degree use instead
+ :meth:`~sage.categories.super_modules.SuperModules.ElementMethods.is_even_odd`.
+
The Clifford algebra also can be considered as a covariant functor
from the category of vector spaces equipped with quadratic forms
to the category of algebras. In fact, if `(V, Q)` and `(W, R)`
@@ -465,7 +472,8 @@ class CliffordAlgebra(CombinatorialFreeModule):
sage: Q = QuadraticForm(ZZ, 3, [1,2,3,4,5,6])
sage: Cl = CliffordAlgebra(Q)
sage: Cl
- The Clifford algebra of the Quadratic form in 3 variables over Integer Ring with coefficients:
+ The Clifford algebra of the Quadratic form in 3 variables
+ over Integer Ring with coefficients:
[ 1 2 3 ]
[ * 4 5 ]
[ * * 6 ]
@@ -480,11 +488,6 @@ class CliffordAlgebra(CombinatorialFreeModule):
a*d
sage: d*c*b*a + a + 4*b*c
a*b*c*d + 4*b*c + a
-
- .. WARNING::
-
- The Clifford algebra is not graded, but instead filtered. This
- will be changed once :trac:`17096` is finished.
"""
@staticmethod
def __classcall_private__(cls, Q, names=None):
@@ -520,6 +523,9 @@ class CliffordAlgebra(CombinatorialFreeModule):
sage: Q = QuadraticForm(ZZ, 3, [1,2,3,4,5,6])
sage: Cl = CliffordAlgebra(Q)
+ sage: Cl.category()
+ Category of finite dimensional super algebras with basis
+ over (euclidean domains and infinite enumerated sets)
sage: TestSuite(Cl).run()
TESTS:
@@ -536,8 +542,7 @@ class CliffordAlgebra(CombinatorialFreeModule):
"""
self._quadratic_form = Q
R = Q.base_ring()
- if category is None:
- category = GradedAlgebrasWithBasis(R)
+ category = AlgebrasWithBasis(R.category()).Super().Filtered().or_subcategory(category)
indices = SubsetsSorted(range(Q.dim()))
CombinatorialFreeModule.__init__(self, R, indices, category=category)
self._assign_names(names)
@@ -550,7 +555,8 @@ class CliffordAlgebra(CombinatorialFreeModule):
sage: Q = QuadraticForm(ZZ, 3, [1,2,3,4,5,6])
sage: CliffordAlgebra(Q)
- The Clifford algebra of the Quadratic form in 3 variables over Integer Ring with coefficients:
+ The Clifford algebra of the Quadratic form in 3 variables
+ over Integer Ring with coefficients:
[ 1 2 3 ]
[ * 4 5 ]
[ * * 6 ]
@@ -826,7 +832,7 @@ class CliffordAlgebra(CombinatorialFreeModule):
sage: Q = QuadraticForm(ZZ, 3, [1,2,3,4,5,6])
sage: Cl.<x,y,z> = CliffordAlgebra(Q)
sage: Cl.quadratic_form()
- Quadratic form in 3 variables over Integer Ring with coefficients:
+ Quadratic form in 3 variables over Integer Ring with coefficients:
[ 1 2 3 ]
[ * 4 5 ]
[ * * 6 ]
@@ -837,19 +843,8 @@ class CliffordAlgebra(CombinatorialFreeModule):
r"""
Return the degree of the monomial indexed by ``m``.
- This degree is a nonnegative integer, and should be interpreted
- as a residue class modulo `2`, since we consider ``self`` to be
- `\ZZ_2`-graded (not `\ZZ`-graded, although there is a natural
- *filtration* by the length of ``m``). The degree of the monomial
- ``m`` in this `\ZZ_2`-grading is defined to be the length of ``m``
- taken mod `2`.
-
- .. WARNING:
-
- On the :class:`ExteriorAlgebra` class (which inherits from
- :class:`CliffordAlgebra`), the :meth:`degree_on_basis`
- method is overridden to return an actual `\NN`-degree. So
- don't count on this method always returning `0` or `1` !!
+ We are considering the Clifford algebra to be `\NN`-filtered,
+ and the degree of the monomial ``m`` is the length of ``m``.
EXAMPLES::
@@ -858,9 +853,22 @@ class CliffordAlgebra(CombinatorialFreeModule):
sage: Cl.degree_on_basis((0,))
1
sage: Cl.degree_on_basis((0,1))
- 0
+ 2
"""
- return len(m) % ZZ(2)
+ return ZZ(len(m))
+
+ def graded_algebra(self):
+ """
+ Return the associated graded algebra of ``self``.
+
+ EXAMPLES::
+
+ sage: Q = QuadraticForm(ZZ, 3, [1,2,3,4,5,6])
+ sage: Cl.<x,y,z> = CliffordAlgebra(Q)
+ sage: Cl.graded_algebra()
+ The exterior algebra of rank 3 over Integer Ring
+ """
+ return ExteriorAlgebra(self.base_ring(), self.variable_names())
@cached_method
def free_module(self):
@@ -1051,7 +1059,7 @@ class CliffordAlgebra(CombinatorialFreeModule):
remove_zeros=True )
for i in x)
return Cl.module_morphism(on_basis=f, codomain=self,
- category=GradedAlgebrasWithBasis(self.base_ring()))
+ category=AlgebrasWithBasis(self.base_ring()).Super())
def lift_isometry(self, m, names=None):
r"""
@@ -1116,7 +1124,7 @@ class CliffordAlgebra(CombinatorialFreeModule):
remove_zeros=True )
for i in x)
return self.module_morphism(on_basis=f, codomain=Cl,
- category=GradedAlgebrasWithBasis(self.base_ring()))
+ category=AlgebrasWithBasis(self.base_ring()).Super())
# This is a general method for finite dimensional algebras with bases
# and should be moved to the corresponding category once there is
@@ -1339,7 +1347,7 @@ class ExteriorAlgebra(CliffordAlgebra):
`Q(v) = 0` for all vectors `v \in V`. See :class:`CliffordAlgebra`
for the notion of a Clifford algebra.
- The exterior algebra of an `R`-module `V` is a `\ZZ`-graded connected
+ The exterior algebra of an `R`-module `V` is a connected `\ZZ`-graded
Hopf superalgebra. It is commutative in the super sense (i.e., the
odd elements anticommute and square to `0`).
@@ -1353,10 +1361,6 @@ class ExteriorAlgebra(CliffordAlgebra):
Hopf superalgebra with the odd-degree components forming the odd
part. So use Hopf-algebraic methods with care!
- .. TODO::
-
- Add a category for Hopf superalgebras (perhaps part of :trac:`16513`).
-
INPUT:
- ``R`` -- the base ring, *or* the free module whose exterior algebra
@@ -1417,9 +1421,13 @@ class ExteriorAlgebra(CliffordAlgebra):
EXAMPLES::
sage: E.<x,y,z> = ExteriorAlgebra(QQ)
+ sage: E.category()
+ Category of finite dimensional super hopf algebras with basis
+ over Rational Field
sage: TestSuite(E).run()
"""
- CliffordAlgebra.__init__(self, QuadraticForm(R, len(names)), names, GradedHopfAlgebrasWithBasis(R))
+ cat = HopfAlgebrasWithBasis(R).Super()
+ CliffordAlgebra.__init__(self, QuadraticForm(R, len(names)), names, cat)
# TestSuite will fail if the HopfAlgebra classes will ever have tests for
# the coproduct being an algebra morphism -- since this is really a
# Hopf superalgebra, not a Hopf algebra.
@@ -1563,7 +1571,7 @@ class ExteriorAlgebra(CliffordAlgebra):
f = lambda x: E.prod(E._from_dict( {(j,): phi[j,i] for j in range(n)},
remove_zeros=True )
for i in x)
- return self.module_morphism(on_basis=f, codomain=E, category=GradedAlgebrasWithBasis(R))
+ return self.module_morphism(on_basis=f, codomain=E, category=AlgebrasWithBasis(R).Super())
def volume_form(self):
"""
diff --git a/src/sage/algebras/free_zinbiel_algebra.py b/src/sage/algebras/free_zinbiel_algebra.py
new file mode 100644
index 0000000..9c00304
--- /dev/null
+++ b/src/sage/algebras/free_zinbiel_algebra.py
@@ -0,0 +1,253 @@
+"""
+Free Zinbiel Algebras
+
+AUTHORS:
+
+- Travis Scrimshaw (2015-09): initial version
+"""
+
+#*****************************************************************************
+# Copyright (C) 2015 Travis Scrimshaw <tscrimsh at umn.edu>
+#
+# Distributed under the terms of the GNU General Public License (GPL)
+# http://www.gnu.org/licenses/
+#*****************************************************************************
+
+from sage.misc.cachefunc import cached_method
+from sage.categories.magmatic_algebras import MagmaticAlgebras
+from sage.categories.rings import Rings
+from sage.combinat.free_module import CombinatorialFreeModule
+from sage.combinat.words.words import Words
+from sage.combinat.words.alphabet import Alphabet
+from sage.sets.family import Family
+
+class FreeZinbielAlgebra(CombinatorialFreeModule):
+ r"""
+ The free Zinbiel algebra on `n` generators.
+
+ Let `R` be a ring. A *Zinbiel algebra* is a non-associative
+ algebra with multiplication `\circ` that satisfies
+
+ .. MATH::
+
+ a \circ (b \circ c) = a \circ (b \circ c) + a \circ (c \circ b).
+
+ Zinbiel algebras were first introduced by Loday as the Koszul
+ dual to Leibniz algebras (hence the name coined by Lemaire).
+
+ Zinbiel algebras are divided power algebras, in that for
+
+ .. MATH::
+
+ x^{\circ n} = \bigl(x \circ (x \circ \cdots \circ( x \circ x) \cdots
+ ) \bigr)
+
+ we have
+
+ .. MATH::
+
+ x^{\circ m} \circ x^{\circ n} = \binom{n+m-1}{m} x^{n+m}
+
+ and
+
+ .. MATH::
+
+ \underbrace{\bigl( ( x \circ \cdots \circ x \circ (x \circ x) \cdots
+ ) \bigr)}_{n+1 \text{ times}} = n! x^n.
+
+ .. NOTE::
+
+ This implies that Zinbiel algebras are not power associative.
+
+ To every Zinbiel algebra, we can construct a corresponding commutative
+ associative algebra by using the symmetrized product:
+
+ .. MATH::
+
+ a * b = a \circ b + b \circ a.
+
+ The free Zinbiel algebra on `n` generators is isomorphic as `R`-modules
+ to the reduced tensor algebra `\bar{T}(R^n)` with the product
+
+ .. MATH::
+
+ (x_0 x_1 \cdots x_p) \circ (x_{p+1} x_{p+2} \cdots x_{p+q})
+ = \sum_{\sigma \in S_{p,q}} x_0 (x_{\sigma(1)} x_{\sigma(2)}
+ \cdots x_{\sigma(p+q)},
+
+ where `S_{p,q}` is the set of `(p,q)`-shuffles.
+
+ The free Zinbiel algebra is free as a divided power algebra. Moreover,
+ the corresponding commutative algebra is isomorphic to the (non-unital)
+ shuffle algebra.
+
+ INPUT:
+
+ - ``R`` -- a ring
+ - ``n`` -- (optional) the number of generators
+ - ``names`` -- the generator names
+
+ .. WARNING::
+
+ Currently the basis is indexed by all words over the variables,
+ incuding the empty word. This is a slight abuse as it is suppose
+ to be the indexed by all non-empty words.
+
+ EXAMPLES:
+
+ We create the free Zinbiel algebra and check the defining relation::
+
+ sage: Z.<x,y,z> = algebras.FreeZinbiel(QQ)
+ sage: (x*y)*z
+ Z[xyz] + Z[xzy]
+ sage: x*(y*z) + x*(z*y)
+ Z[xyz] + Z[xzy]
+
+ We see that the Zinbiel algebra is not associative, nor even
+ power associative::
+
+ sage: x*(y*z)
+ Z[xyz]
+ sage: x*(x*x)
+ Z[xxx]
+ sage: (x*x)*x
+ 2*Z[xxx]
+
+ We verify that it is a divided powers algebra::
+
+ sage: (x*(x*x)) * (x*(x*(x*x)))
+ 15*Z[xxxxxxx]
+ sage: binomial(3+4-1,4)
+ 15
+ sage: (x*(x*(x*x))) * (x*(x*x))
+ 20*Z[xxxxxxx]
+ sage: binomial(3+4-1,3)
+ 20
+ sage: ((x*x)*x)*x
+ 6*Z[xxxx]
+ sage: (((x*x)*x)*x)*x
+ 24*Z[xxxxx]
+
+ REFERENCES:
+
+ - :wikipedia:`Zinbiel_algebra`
+
+ .. [Loday95] Jean-Louis Loday.
+ *Cup-product for Leibniz cohomology and dual Leibniz algebras*.
+ Math. Scand., pp. 189--196 (1995).
+ http://www.math.uiuc.edu/K-theory/0015/cup_product.pdf
+ .. [LV12] Jean-Louis Loday and Bruno Vallette. *Algebraic Operads*.
+ Springer-Verlag Berlin Heidelberg (2012).
+ :doi:`10.1007/978-3-642-30362-3`.
+ """
+ @staticmethod
+ def __classcall_private__(cls, R, n=None, names=None):
+ """
+ Standardize input to ensure a unqiue representation.
+
+ TESTS::
+
+ sage: Z1.<x,y,z> = algebras.FreeZinbiel(QQ)
+ sage: Z2.<x,y,z> = algebras.FreeZinbiel(QQ, 3)
+ sage: Z3 = algebras.FreeZinbiel(QQ, 3, 'x,y,z')
+ sage: Z4.<x,y,z> = algebras.FreeZinbiel(QQ, 'x,y,z')
+ sage: Z1 is Z2 and Z1 is Z3 and Z1 is Z4
+ True
+ """
+ if isinstance(n, (list,tuple)):
+ names = n
+ n = len(names)
+ elif isinstance(n, str):
+ names = n.split(',')
+ n = len(names)
+ elif isinstance(names, str):
+ names = names.split(',')
+ elif n is None:
+ n = len(names)
+ return super(FreeZinbielAlgebra, cls).__classcall__(cls, R, n, tuple(names))
+
+ def __init__(self, R, n, names):
+ """
+ Initialize ``self``.
+
+ EXAMPLES::
+
+ sage: Z.<x,y,z> = algebras.FreeZinbiel(QQ)
+ sage: TestSuite(Z).run()
+ """
+ if R not in Rings:
+ raise TypeError("argument R must be a ring")
+ indices = Words(Alphabet(n, names=names))
+ cat = MagmaticAlgebras(R).WithBasis()
+ self._n = n
+ CombinatorialFreeModule.__init__(self, R, indices, prefix='Z',
+ category=cat)
+ self._assign_names(names)
+
+ def _repr_term(self, t):
+ """
+ Return a string representation of the basis element indexed by ``t``.
+
+ EXAMPLES::
+
+ sage: Z.<x,y,z> = algebras.FreeZinbiel(QQ)
+ sage: Z._repr_term(Z._indices('xyzxxy'))
+ 'Z[xyzxxy]'
+ """
+ return "{!s}[{!s}]".format(self._print_options['prefix'], repr(t)[6:])
+
+ def _repr_(self):
+ """
+ Return a string representation of ``self``.
+
+ EXAMPLES::
+
+ sage: Z.<x,y,z> = algebras.FreeZinbiel(QQ)
+ sage: Z
+ Free Zinbiel algebra on generators (Z[x], Z[y], Z[z]) over Rational Field
+ """
+ return "Free Zinbiel algebra on generators {} over {}".format(
+ self.gens(), self.base_ring())
+
+ @cached_method
+ def algebra_generators(self):
+ """
+ Return the algebra generators of ``self``.
+
+ EXAMPLES::
+
+ sage: Z.<x,y,z> = algebras.FreeZinbiel(QQ)
+ sage: list(Z.algebra_generators())
+ [Z[x], Z[y], Z[z]]
+ """
+ A = self.variable_names()
+ return Family( A, lambda g: self.monomial(self._indices(g)) )
+
+ @cached_method
+ def gens(self):
+ """
+ Return the generators of ``self``.
+
+ EXAMPLES::
+
+ sage: Z.<x,y,z> = algebras.FreeZinbiel(QQ)
+ sage: Z.gens()
+ (Z[x], Z[y], Z[z])
+ """
+ return tuple(self.algebra_generators())
+
+ def product_on_basis(self, x, y):
+ """
+ Return the product of the basis elements indexed by ``x`` and ``y``.
+
+ EXAMPLES::
+
+ sage: Z.<x,y,z> = algebras.FreeZinbiel(QQ)
+ sage: (x*y)*z # indirect doctest
+ Z[xyz] + Z[xzy]
+ """
+ if not x:
+ return self.monomial(y)
+ x0 = self._indices(x[0])
+ return self.sum_of_monomials(x0 + sh for sh in x[1:].shuffle(y))
+
diff --git a/src/sage/algebras/weyl_algebra.py b/src/sage/algebras/weyl_algebra.py
index 366b6bd..d94fbd3 100644
--- a/src/sage/algebras/weyl_algebra.py
+++ b/src/sage/algebras/weyl_algebra.py
@@ -434,6 +434,23 @@ class DifferentialWeylAlgebraElement(AlgebraElement):
return sorted(self.__monomials.items(),
key=lambda x: (-sum(x[0][1]), x[0][1], -sum(x[0][0]), x[0][0]) )
+ def support(self):
+ """
+ Return the support of ``self``.
+
+ EXAMPLES::
+
+ sage: W.<x,y,z> = DifferentialWeylAlgebra(QQ)
+ sage: dx,dy,dz = W.differentials()
+ sage: elt = dy - (3*x - z)*dx + 1
+ sage: elt.support()
+ [((0, 0, 0), (0, 1, 0)),
+ ((1, 0, 0), (1, 0, 0)),
+ ((0, 0, 0), (0, 0, 0)),
+ ((0, 0, 1), (1, 0, 0))]
+ """
+ return self.__monomials.keys()
+
# This is essentially copied from
# sage.combinat.free_module.CombinatorialFreeModuleElement
def __div__(self, x, self_on_left=False):
@@ -527,6 +544,11 @@ class DifferentialWeylAlgebra(Algebra, UniqueRepresentation):
sage: W.<a,b> = DifferentialWeylAlgebra(QQ); W
Differential Weyl algebra of polynomials in a, b over Rational Field
+
+ .. TODO::
+
+ Implement the :meth:`graded_algebra` as a polynomial ring once
+ they are considered to be graded rings (algebras).
"""
@staticmethod
def __classcall__(cls, R, names=None):
@@ -567,7 +589,12 @@ class DifferentialWeylAlgebra(Algebra, UniqueRepresentation):
raise ValueError("variable names cannot differ by a leading 'd'")
# TODO: Make this into a filtered algebra under the natural grading of
# x_i and dx_i have degree 1
- Algebra.__init__(self, R, names, category=AlgebrasWithBasis(R).NoZeroDivisors())
+ # Filtered is not included because it is a supercategory of super
+ if R.is_field():
+ cat = AlgebrasWithBasis(R).NoZeroDivisors().Super()
+ else:
+ cat = AlgebrasWithBasis(R).Super()
+ Algebra.__init__(self, R, names, category=cat)
def _repr_(self):
r"""
@@ -661,6 +688,24 @@ class DifferentialWeylAlgebra(Algebra, UniqueRepresentation):
and self.base_ring().has_coerce_map_from(R.base_ring()) )
return super(DifferentialWeylAlgebra, self)._coerce_map_from_(R)
+ def degree_on_basis(self, i):
+ """
+ Return the degree of the basis element indexed by ``i``.
+
+ EXAMPLES::
+
+ sage: W.<a,b> = DifferentialWeylAlgebra(QQ)
+ sage: W.degree_on_basis( ((1, 3, 2), (0, 1, 3)) )
+ 10
+
+ sage: W.<x,y,z> = DifferentialWeylAlgebra(QQ)
+ sage: dx,dy,dz = W.differentials()
+ sage: elt = y*dy - (3*x - z)*dx
+ sage: elt.degree()
+ 2
+ """
+ return sum(i[0]) + sum(i[1])
+
def polynomial_ring(self):
"""
Return the associated polynomial ring of ``self``.
diff --git a/src/sage/all.py b/src/sage/all.py
index 95e0c36..3ddfe08 100644
--- a/src/sage/all.py
+++ b/src/sage/all.py
@@ -106,6 +106,7 @@ from sage.modules.all import *
from sage.monoids.all import *
from sage.algebras.all import *
from sage.modular.all import *
+from sage.sat.all import *
from sage.schemes.all import *
from sage.graphs.all import *
from sage.groups.all import *
diff --git a/src/sage/categories/algebras.py b/src/sage/categories/algebras.py
index 5e81cee..8e1c4f9 100644
--- a/src/sage/categories/algebras.py
+++ b/src/sage/categories/algebras.py
@@ -109,7 +109,9 @@ class Algebras(CategoryWithAxiom_over_base_ring):
return self & SemisimpleAlgebras(self.base_ring())
Commutative = LazyImport('sage.categories.commutative_algebras', 'CommutativeAlgebras', at_startup=True)
+ Filtered = LazyImport('sage.categories.filtered_algebras', 'FilteredAlgebras')
Graded = LazyImport('sage.categories.graded_algebras', 'GradedAlgebras')
+ Super = LazyImport('sage.categories.super_algebras', 'SuperAlgebras')
WithBasis = LazyImport('sage.categories.algebras_with_basis', 'AlgebrasWithBasis')
#if/when Semisimple becomes an axiom
Semisimple = LazyImport('sage.categories.semisimple_algebras', 'SemisimpleAlgebras')
diff --git a/src/sage/categories/algebras_with_basis.py b/src/sage/categories/algebras_with_basis.py
index d4b6382..a490faf 100644
--- a/src/sage/categories/algebras_with_basis.py
+++ b/src/sage/categories/algebras_with_basis.py
@@ -117,8 +117,10 @@ class AlgebrasWithBasis(CategoryWithAxiom_over_base_ring):
from sage.categories.examples.algebras_with_basis import Example
return Example(self.base_ring(), alphabet)
+ Filtered = LazyImport('sage.categories.filtered_algebras_with_basis', 'FilteredAlgebrasWithBasis')
FiniteDimensional = LazyImport('sage.categories.finite_dimensional_algebras_with_basis', 'FiniteDimensionalAlgebrasWithBasis')
Graded = LazyImport('sage.categories.graded_algebras_with_basis', 'GradedAlgebrasWithBasis')
+ Super = LazyImport('sage.categories.super_algebras_with_basis', 'SuperAlgebrasWithBasis')
class ParentMethods:
diff --git a/src/sage/categories/bialgebras.py b/src/sage/categories/bialgebras.py
index e78f080..e779d8a 100644
--- a/src/sage/categories/bialgebras.py
+++ b/src/sage/categories/bialgebras.py
@@ -11,6 +11,7 @@ Bialgebras
from sage.categories.category_types import Category_over_base_ring
from sage.categories.all import Algebras, Coalgebras
+from sage.categories.super_modules import SuperModulesCategory
class Bialgebras(Category_over_base_ring):
"""
@@ -56,8 +57,6 @@ class Bialgebras(Category_over_base_ring):
"""
return None
- class ParentMethods:
+ class Super(SuperModulesCategory):
pass
- class ElementMethods:
- pass
diff --git a/src/sage/categories/cartesian_product.py b/src/sage/categories/cartesian_product.py
index 3e00652..70cbbf3 100644
--- a/src/sage/categories/cartesian_product.py
+++ b/src/sage/categories/cartesian_product.py
@@ -12,9 +12,11 @@ AUTHORS:
# http://www.gnu.org/licenses/
#*****************************************************************************
+from sage.misc.lazy_import import lazy_import
from sage.categories.covariant_functorial_construction import CovariantFunctorialConstruction, CovariantConstructionCategory
+from sage.categories.pushout import MultivariateConstructionFunctor
-class CartesianProductFunctor(CovariantFunctorialConstruction):
+class CartesianProductFunctor(CovariantFunctorialConstruction, MultivariateConstructionFunctor):
"""
A singleton class for the Cartesian product functor.
@@ -105,17 +107,19 @@ class CartesianProductFunctor(CovariantFunctorialConstruction):
_functor_category = "CartesianProducts"
symbol = " (+) "
-cartesian_product = CartesianProductFunctor()
-"""
-The cartesian product functorial construction.
-
-See :class:`CartesianProductFunctor` for more information.
+ def __init__(self):
+ r"""
+ Constructor. See :class:`CartesianProductFunctor` for details.
-EXAMPLES::
+ TESTS::
- sage: cartesian_product
- The cartesian_product functorial construction
-"""
+ sage: from sage.categories.cartesian_product import CartesianProductFunctor
+ sage: CartesianProductFunctor()
+ The cartesian_product functorial construction
+ """
+ CovariantFunctorialConstruction.__init__(self)
+ from sage.categories.sets_cat import Sets
+ MultivariateConstructionFunctor.__init__(self, Sets(), Sets())
class CartesianProductsCategory(CovariantConstructionCategory):
"""
@@ -171,3 +175,17 @@ class CartesianProductsCategory(CovariantConstructionCategory):
Integer Ring
"""
return self.base_category().base_ring()
+
+# Moved to avoid circular imports
+lazy_import('sage.categories.sets_cat', 'cartesian_product')
+"""
+The cartesian product functorial construction
+
+See :class:`CartesianProductFunctor` for more information
+
+EXAMPLES::
+
+ sage: cartesian_product
+ The cartesian_product functorial construction
+"""
+
diff --git a/src/sage/categories/category_with_axiom.py b/src/sage/categories/category_with_axiom.py
index f7c23c2..6fe7f5c 100644
--- a/src/sage/categories/category_with_axiom.py
+++ b/src/sage/categories/category_with_axiom.py
@@ -2260,6 +2260,8 @@ class CategoryWithAxiom(Category):
result = result.replace(" over ", " with basis over ", 1)
elif axiom == "Connected" and "graded " in result:
result = result.replace("graded ", "graded connected ", 1)
+ elif axiom == "Connected" and "filtered " in result:
+ result = result.replace("filtered ", "filtered connected ", 1)
elif axiom == "Endset" and "homsets" in result:
# Without the space at the end to handle Homsets().Endset()
result = result.replace("homsets", "endsets", 1)
diff --git a/src/sage/categories/coalgebras.py b/src/sage/categories/coalgebras.py
index a4ebc8f..a5fdc49 100644
--- a/src/sage/categories/coalgebras.py
+++ b/src/sage/categories/coalgebras.py
@@ -13,6 +13,7 @@ from category_types import Category_over_base_ring
from sage.categories.all import Modules
from sage.categories.tensor import TensorProductsCategory, tensor
from sage.categories.dual import DualObjectsCategory
+from sage.categories.super_modules import SuperModulesCategory
from sage.categories.realizations import RealizationsCategory
from sage.categories.with_realizations import WithRealizationsCategory
from sage.misc.abstract_method import abstract_method
@@ -50,19 +51,6 @@ class Coalgebras(Category_over_base_ring):
# # Will declare the coproduct of self to the coercion mechanism when it exists
# pass
- @cached_method
- def tensor_square(self):
- """
- Returns the tensor square of ``self``
-
- EXAMPLES::
-
- sage: A = HopfAlgebrasWithBasis(QQ).example()
- sage: A.tensor_square()
- An example of Hopf algebra with basis: the group algebra of the Dihedral group of order 6 as a permutation group over Rational Field # An example of Hopf algebra with basis: the group algebra of the Dihedral group of order 6 as a permutation group over Rational Field
- """
- return tensor([self, self])
-
@abstract_method
def counit(self, x):
"""
@@ -192,6 +180,31 @@ class Coalgebras(Category_over_base_ring):
from sage.categories.algebras import Algebras
return [Algebras(self.base_category().base_ring())]
+ class Super(SuperModulesCategory):
+ def extra_super_categories(self):
+ """
+ EXAMPLES::
+
+ sage: Coalgebras(ZZ).Super().extra_super_categories()
+ [Join of Category of graded modules over Integer Ring
+ and Category of coalgebras over Integer Ring]
+ sage: Coalgebras(ZZ).Super().super_categories()
+ [Category of super modules over Integer Ring,
+ Category of coalgebras over Integer Ring]
+
+ Compare this with the situation for bialgebras::
+
+ sage: Bialgebras(ZZ).Super().extra_super_categories()
+ []
+ sage: Bialgebras(ZZ).Super().super_categories()
+ [Category of super algebras over Integer Ring,
+ Category of super coalgebras over Integer Ring]
+
+ The category of bialgebras does not occur in these results,
+ since super bialgebras are not bialgebras.
+ """
+ return [self.base_category().Graded()]
+
class WithRealizations(WithRealizationsCategory):
class ParentMethods:
diff --git a/src/sage/categories/coalgebras_with_basis.py b/src/sage/categories/coalgebras_with_basis.py
index 0b9ff24..ddcaad1 100644
--- a/src/sage/categories/coalgebras_with_basis.py
+++ b/src/sage/categories/coalgebras_with_basis.py
@@ -13,6 +13,7 @@ from sage.misc.abstract_method import abstract_method
from sage.misc.lazy_attribute import lazy_attribute
from sage.categories.category_with_axiom import CategoryWithAxiom_over_base_ring
from sage.categories.all import ModulesWithBasis, tensor, Hom
+from sage.categories.super_modules import SuperModulesCategory
class CoalgebrasWithBasis(CategoryWithAxiom_over_base_ring):
"""
@@ -129,3 +130,5 @@ class CoalgebrasWithBasis(CategoryWithAxiom_over_base_ring):
class ElementMethods:
pass
+ class Super(SuperModulesCategory):
+ pass
diff --git a/src/sage/categories/covariant_functorial_construction.py b/src/sage/categories/covariant_functorial_construction.py
index cc2ea36..47ed9d8 100644
--- a/src/sage/categories/covariant_functorial_construction.py
+++ b/src/sage/categories/covariant_functorial_construction.py
@@ -201,7 +201,7 @@ class CovariantFunctorialConstruction(UniqueRepresentation, SageObject):
"""
return "The %s functorial construction"%self._functor_name
- def __call__(self, args):
+ def __call__(self, args, **kwargs):
"""
Functorial construction application
@@ -220,7 +220,7 @@ class CovariantFunctorialConstruction(UniqueRepresentation, SageObject):
args = tuple(args) # a bit brute force; let's see if this becomes a bottleneck later
assert(all( hasattr(arg, self._functor_name) for arg in args))
assert(len(args) > 0)
- return getattr(args[0], self._functor_name)(*args[1:])
+ return getattr(args[0], self._functor_name)(*args[1:], **kwargs)
class FunctorialConstructionCategory(Category): # Should this be CategoryWithBase?
"""
diff --git a/src/sage/categories/examples/filtered_algebras_with_basis.py b/src/sage/categories/examples/filtered_algebras_with_basis.py
new file mode 100644
index 0000000..9e7765a
--- /dev/null
+++ b/src/sage/categories/examples/filtered_algebras_with_basis.py
@@ -0,0 +1,178 @@
+r"""
+Examples of filtered algebra with basis
+"""
+#*****************************************************************************
+# Copyright (C) 2014 Travis Scrimshaw <tscrim at ucdavis.edu>
+#
+# Distributed under the terms of the GNU General Public License (GPL)
+# http://www.gnu.org/licenses/
+#*****************************************************************************
+
+from sage.categories.filtered_algebras_with_basis import FilteredAlgebrasWithBasis
+from sage.combinat.free_module import CombinatorialFreeModule
+from sage.monoids.indexed_free_monoid import IndexedFreeAbelianMonoid
+from sage.sets.family import Family
+
+class PBWBasisCrossProduct(CombinatorialFreeModule):
+ r"""
+ This class illustrates an implementation of a filtered algebra
+ with basis: the universal enveloping algebra of the Lie algebra
+ of `\RR^3` under the cross product.
+
+ The Lie algebra is generated by `x,y,z` with brackets defined by
+ `[x, y] = z`, `[y, z] = x`, and `[x, z] = -y`. The universal enveloping
+ algebra has a (PBW) basis consisting of monomials `x^i y^j z^k`.
+ Despite these monomials not commuting with each other, we
+ nevertheless label them by the elements of the free abelian monoid
+ on three generators.
+
+ INPUT:
+
+ - ``R`` -- base ring
+
+ The implementation involves the following:
+
+ - A set of algebra generators -- the set of generators `x,y,z`.
+
+ - The index of the unit element -- the unit element in the monoid
+ of monomials.
+
+ - A product -- this is given on basis elements by using
+ :meth:`product_on_basis`.
+
+ - A degree function -- this is determined on the basis elements
+ by using :meth:`degree_on_basis` which returns the sum of exponents
+ of the monomial.
+ """
+ def __init__(self, base_ring):
+ """
+ EXAMPLES::
+
+ sage: A = AlgebrasWithBasis(QQ).Filtered().example()
+ sage: x,y,z = A.algebra_generators()
+ sage: TestSuite(A).run(elements=[x*y+z])
+ """
+ I = IndexedFreeAbelianMonoid(['x', 'y', 'z'], prefix='U')
+ gen_cmp = lambda x,y: cmp((-len(x), x.to_word_list()), (-len(y), y.to_word_list()))
+ CombinatorialFreeModule.__init__(self, base_ring, I, bracket=False, prefix='',
+ generator_cmp=gen_cmp,
+ category=FilteredAlgebrasWithBasis(base_ring))
+
+ def _repr_(self):
+ """
+ Return a string representation of ``self``.
+
+ EXAMPLES::
+
+ sage: AlgebrasWithBasis(QQ).Filtered().example()
+ An example of a filtered algebra with basis:
+ the universal enveloping algebra of
+ Lie algebra of RR^3 with cross product over Rational Field
+ """
+ return "An example of a filtered algebra with basis: the universal enveloping algebra of Lie algebra of RR^3 with cross product over {}".format(self.base_ring())
+
+ def algebra_generators(self):
+ """
+ Return the algebra generators of ``self``.
+
+ EXAMPLES::
+
+ sage: A = AlgebrasWithBasis(QQ).Filtered().example()
+ sage: list(A.algebra_generators())
+ [U['x'], U['y'], U['z']]
+ """
+ G = self._indices.monoid_generators()
+ I = sorted(G.keys())
+ return Family(I, lambda x: self.monomial(G[x]))
+
+ def one_basis(self):
+ """
+ Return the index of the unit of ``self``.
+
+ EXAMPLES::
+
+ sage: A = AlgebrasWithBasis(QQ).Filtered().example()
+ sage: A.one_basis()
+ 1
+ """
+ return self._indices.one()
+
+ def degree_on_basis(self, m):
+ """
+ The degree of the basis element of ``self`` labelled by ``m``.
+
+ INPUT:
+
+ - ``m`` -- an element of the free abelian monoid
+
+ OUTPUT: an integer, the degree of the corresponding basis element
+
+ EXAMPLES::
+
+ sage: A = AlgebrasWithBasis(QQ).Filtered().example()
+ sage: x = A.algebra_generators()['x']
+ sage: A.degree_on_basis((x^4).leading_support())
+ 4
+ sage: a = A.an_element(); a
+ U['x']^2*U['y']^2*U['z']^3
+ sage: A.degree_on_basis(a.leading_support())
+ 7
+ """
+ return len(m)
+
+ # TODO: This is a general procedure of expanding multiplication defined
+ # on generators to arbitrary monomials and could likely be factored out
+ # and be useful elsewhere.
+ def product_on_basis(self, s, t):
+ """
+ Return the product of two basis elements indexed by ``s`` and ``t``.
+
+ EXAMPLES::
+
+ sage: A = AlgebrasWithBasis(QQ).Filtered().example()
+ sage: G = A.algebra_generators()
+ sage: x,y,z = G['x'], G['y'], G['z']
+ sage: A.product_on_basis(x.leading_support(), y.leading_support())
+ U['x']*U['y']
+ sage: y*x
+ U['x']*U['y'] - U['z']
+ sage: x*y*x
+ U['x']^2*U['y'] - U['x']*U['z']
+ sage: z*y*x
+ U['x']*U['y']*U['z'] - U['x']^2 + U['y']^2 - U['z']^2
+ """
+ if len(s) == 0:
+ return self.monomial(t)
+ if len(t) == 0:
+ return self.monomial(s)
+ if s.trailing_support() <= t.leading_support():
+ return self.monomial(s*t)
+
+ if len(t) == 1:
+ if len(s) == 1:
+ # Do the product of the generators
+ a = s.leading_support()
+ b = t.leading_support()
+ cur = self.monomial(s*t)
+ if a <= b:
+ return cur
+ if a == 'z':
+ if b == 'y':
+ return cur - self.monomial(self._indices.gen('x'))
+ # b == 'x'
+ return cur + self.monomial(self._indices.gen('y'))
+ # a == 'y' and b == 'x'
+ return cur - self.monomial(self._indices.gen('z'))
+
+ cur = self.monomial(t)
+ for a in reversed(s.to_word_list()):
+ cur = self.monomial(self._indices.gen(a)) * cur
+ return cur
+
+ cur = self.monomial(s)
+ for a in t.to_word_list():
+ cur = cur * self.monomial(self._indices.gen(a))
+ return cur
+
+Example = PBWBasisCrossProduct
+
diff --git a/src/sage/categories/examples/filtered_modules_with_basis.py b/src/sage/categories/examples/filtered_modules_with_basis.py
new file mode 100644
index 0000000..9954d6a
--- /dev/null
+++ b/src/sage/categories/examples/filtered_modules_with_basis.py
@@ -0,0 +1,151 @@
+r"""
+Examples of filtered modules with basis
+"""
+#*****************************************************************************
+# Copyright (C) 2013 Frederic Chapoton <fchapoton2@gmail.com>
+#
+# Distributed under the terms of the GNU General Public License (GPL)
+# http://www.gnu.org/licenses/
+#*****************************************************************************
+
+from sage.categories.filtered_modules_with_basis import FilteredModulesWithBasis
+from sage.combinat.free_module import CombinatorialFreeModule
+from sage.combinat.partition import Partitions
+
+
+class FilteredPartitionModule(CombinatorialFreeModule):
+ r"""
+ This class illustrates an implementation of a filtered module
+ with basis: the free module on the set of all partitions.
+
+ INPUT:
+
+ - ``R`` -- base ring
+
+ The implementation involves the following:
+
+ - A choice of how to represent elements. In this case, the basis
+ elements are partitions. The algebra is constructed as a
+ :class:`CombinatorialFreeModule
+ <sage.combinat.free_module.CombinatorialFreeModule>` on the
+ set of partitions, so it inherits all of the methods for such
+ objects, and has operations like addition already defined.
+
+ ::
+
+ sage: A = ModulesWithBasis(QQ).Filtered().example()
+
+ - If the algebra is called ``A``, then its basis function is
+ stored as ``A.basis``. Thus the function can be used to
+ find a basis for the degree `d` piece: essentially, just call
+ ``A.basis(d)``. More precisely, call ``x`` for
+ each ``x`` in ``A.basis(d)``.
+
+ ::
+
+ sage: [m for m in A.basis(4)]
+ [P[4], P[3, 1], P[2, 2], P[2, 1, 1], P[1, 1, 1, 1]]
+
+ - For dealing with basis elements: :meth:`degree_on_basis`, and
+ :meth:`_repr_term`. The first of these defines the degree of any
+ monomial, and then the :meth:`degree
+ <FilteredModules.Element.degree>` method for elements --
+ see the next item -- uses it to compute the degree for a linear
+ combination of monomials. The last of these determines the
+ print representation for monomials, which automatically produces
+ the print representation for general elements.
+
+ ::
+
+ sage: A.degree_on_basis(Partition([4,3]))
+ 7
+ sage: A._repr_term(Partition([4,3]))
+ 'P[4, 3]'
+
+ - There is a class for elements, which inherits from
+ :class:`CombinatorialFreeModuleElement
+ <sage.combinat.free_module.CombinatorialFreeModuleElement>`. An
+ element is determined by a dictionary whose keys are partitions and whose
+ corresponding values are the coefficients. The class implements
+ two things: an :meth:`is_homogeneous
+ <FilteredModules.Element.is_homogeneous>` method and a
+ :meth:`degree <FilteredModules.Element.degree>` method.
+
+ ::
+
+ sage: p = A.monomial(Partition([3,2,1])); p
+ P[3, 2, 1]
+ sage: p.is_homogeneous()
+ True
+ sage: p.degree()
+ 6
+ """
+ def __init__(self, base_ring):
+ """
+ EXAMPLES::
+
+ sage: A = ModulesWithBasis(QQ).Filtered().example(); A
+ An example of a filtered module with basis: the free module on partitions over Rational Field
+ sage: TestSuite(A).run()
+ """
+ CombinatorialFreeModule.__init__(self, base_ring, Partitions(),
+ category=FilteredModulesWithBasis(base_ring))
+
+ # FIXME: this is currently required, because the implementation of ``basis``
+ # in CombinatorialFreeModule overrides that of GradedModulesWithBasis
+ basis = FilteredModulesWithBasis.ParentMethods.__dict__['basis']
+
+ # This could be a default implementation
+ def degree_on_basis(self, t):
+ """
+ The degree of the basis element indexed by the partition ``t``
+ in this filtered module.
+
+ INPUT:
+
+ - ``t`` -- the index of an element of the basis of this module,
+ i.e. a partition
+
+ OUTPUT: an integer, the degree of the corresponding basis element
+
+ EXAMPLES::
+
+ sage: A = ModulesWithBasis(QQ).Filtered().example()
+ sage: A.degree_on_basis(Partition((2,1)))
+ 3
+ sage: A.degree_on_basis(Partition((4,2,1,1,1,1)))
+ 10
+ sage: type(A.degree_on_basis(Partition((1,1))))
+ <type 'sage.rings.integer.Integer'>
+ """
+ return t.size()
+
+ def _repr_(self):
+ """
+ Print representation of ``self``.
+
+ EXAMPLES::
+
+ sage: ModulesWithBasis(QQ).Filtered().example() # indirect doctest
+ An example of a filtered module with basis: the free module on partitions over Rational Field
+ """
+ return "An example of a filtered module with basis: the free module on partitions over %s" % self.base_ring()
+
+ def _repr_term(self, t):
+ """
+ Print representation for the basis element represented by the
+ partition ``t``.
+
+ This governs the behavior of the print representation of all elements
+ of the algebra.
+
+ EXAMPLES::
+
+ sage: A = ModulesWithBasis(QQ).Filtered().example()
+ sage: A._repr_term(Partition((4,2,1)))
+ 'P[4, 2, 1]'
+ """
+ return 'P' + t._repr_()
+
+Example = FilteredPartitionModule
+
diff --git a/src/sage/categories/examples/graded_modules_with_basis.py b/src/sage/categories/examples/graded_modules_with_basis.py
index ebd0558..e0f9588 100644
--- a/src/sage/categories/examples/graded_modules_with_basis.py
+++ b/src/sage/categories/examples/graded_modules_with_basis.py
@@ -9,6 +9,7 @@ Examples of graded modules with basis
#*****************************************************************************
from sage.categories.graded_modules_with_basis import GradedModulesWithBasis
+from sage.categories.filtered_modules_with_basis import FilteredModulesWithBasis
from sage.combinat.free_module import CombinatorialFreeModule
from sage.combinat.partition import Partitions
@@ -20,7 +21,7 @@ class GradedPartitionModule(CombinatorialFreeModule):
INPUT:
- - ``R`` - base ring
+ - ``R`` -- base ring
The implementation involves the following:
@@ -106,7 +107,7 @@ class GradedPartitionModule(CombinatorialFreeModule):
# FIXME: this is currently required, because the implementation of ``basis``
# in CombinatorialFreeModule overrides that of GradedModulesWithBasis
- basis = GradedModulesWithBasis.ParentMethods.__dict__['basis']
+ basis = FilteredModulesWithBasis.ParentMethods.__dict__['basis']
# This could be a default implementation
def degree_on_basis(self, t):
diff --git a/src/sage/categories/filtered_algebras.py b/src/sage/categories/filtered_algebras.py
new file mode 100644
index 0000000..321dd60
--- /dev/null
+++ b/src/sage/categories/filtered_algebras.py
@@ -0,0 +1,62 @@
+r"""
+Filtered Algebras
+"""
+#*****************************************************************************
+# Copyright (C) 2014 Travis Scrimshaw <tscrim at ucdavis.edu>
+#
+# Distributed under the terms of the GNU General Public License (GPL)
+# http://www.gnu.org/licenses/
+#******************************************************************************
+
+from sage.misc.abstract_method import abstract_method
+from sage.categories.filtered_modules import FilteredModulesCategory
+
+class FilteredAlgebras(FilteredModulesCategory):
+ r"""
+ The category of filtered algebras.
+
+ An algebra `A` over a commutative ring `R` is *filtered* if
+ `A` is endowed with a structure of a filtered `R`-module
+ (whose underlying `R`-module structure is identical with
+ that of the `R`-algebra `A`) such that the indexing set `I`
+ (typically `I = \NN`) is also an additive abelian monoid,
+ the unity `1` of `A` b