CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutSign UpSign In
Avatar for Support and Testing.

CoCalc Runs Your Jupyter Notebooks and Linux Terminals using Powerful CPUs and GPUs!

| Download
Views: 627
Image: ubuntu2204-dev

Sage 10.0 was released on May 20, 2023.

Here is an overview of some of the main changes in this version.

You can edit/execute the code directly below. The original release tour is here.


The built HTML documentation of the current development version is now available with a stable URL.

Here are shortcuts to: Reference Manual  •  Developer Guide  •  Installation Guide, which are embedded permanently in the wiki home.

The developer guide has been updated with the new workflow on GitHub.

Code blocks in the HTML documentation now have a copy button in the top right corner, thanks to executablebooks/sphinx-copybutton. It is configured so that it strips away prompts, comments, and output from doctests, making it more convenient to try out an example. #35304


Camera positioning for 3D graphics

Now the camera is positioned such that the line from the camera to the center of the bounding sphere of the 3D graphics objects makes an angle of 60 degrees with x-axis and an angle of 30 degrees with z-axis and the field of view of the camera looking at the center has an angle of 45 degrees. Thus 3D graphics does not get out of the bounding box while you rotate it, anymore! #34822

For an example, try to rotate this

var('x,y,z') implicit_plot3d((sqrt(x*x+y*y)-3)^2 + z*z - 1, (x,-4,4), (y,-4,4), (z,-1,1), plot_points=10)

Linear programming and extensions

CVXPY is an open source Python-embedded modeling language for disciplined convex optimization and extensions. It is under active development and includes well-maintained interfaces to a wide range of solver backends. CVXPY also supports differentiable programming.

It is now available in Sage as the optional package cvxpy. There is a new backend (middle-end?) for the MixedIntegerLinearProgram class, activated using the keyword solver="CVXPY". #34251

To have CVXPY use a specific solver backend, you can use the following keywords:

When cylp is installed, the MixedIntegerLinearProgram backend "CVXPY/CBC" becomes the default, replacing "GLPK" (unless Gurobi or CPLEX are available via the optional packages sage_numerical_backends_gurobi, sage_numerical_backends_cplex, which take precedence). This is a replacement for the similar functionality of the CBC backend provided by the optional package sage_numerical_backend_coin, which is going to be removed soon.


A bijectionist's toolkit

This toolbox allows to list all possible bijections S:ABS: A\to B between two finite sets AA and BB of the same cardinality under various constraints, or all possible 'statistics', i.e., functions s:AZs: A\to Z to some other set ZZ which are equidistributed with a given statistic τ:BZ\tau: B\to Z. For example, suppose we are looking for a bijection between Dyck paths and binary trees that sends concatenation of paths to attaching the second binary tree as a right child of the rightmost node of the first binary tree. Then we could proceed as follows:

N = 4 A = [dyck_word for n in range(1, N) for dyck_word in DyckWords(n)] B = [binary_tree for n in range(1, N) for binary_tree in BinaryTrees(n)] concat_path = lambda D1, D2: DyckWord(list(D1) + list(D2)) concat_tree = lambda B1, B2: concat_path(B1.to_dyck_word(), B2.to_dyck_word()).to_binary_tree() bij = Bijectionist(A, B) bij.set_intertwining_relations((2, concat_path, concat_tree)) for D in sorted(bij.minimal_subdistributions_iterator(), key=lambda x: (len(x[0][0]), x)): print(ascii_art(D))

This package is particularly useful as a partner of FindStat:

# This requires internet access, so breaks on public share server: # findmap(list(bij.minimal_subdistributions_iterator()))

Plane partition symmetry classes

There are a number of symmetries that can be imposed on plane partitions. Sage can now handle various combinations of the most common symmetries. #35037

[PlanePartitions([2*n,2*n,2*n], symmetry='TSSCPP').cardinality() for n in range(1,8)]
[AlternatingSignMatrices(n).cardinality() for n in range(1,8)]

Specht modules for diagrams

One construction of irreducble representations for the symmetric group SnS_n is given by Specht, where for a partition λ\lambda, the irreducible representation V(λ)V(\lambda) is given in terms of row symmetrizers and column asymmetrizers. This was then generalized for arbitrary diagrams. This provides an implementation of these modules, as well as being able to compute, e.g., their Frobenius character. #35036

S = Partition([3,2,1]).specht_module(QQ) S.frobenius_image()
s = SymmetricFunctions(QQ).s() s(S.frobenius_image())
from sage.combinat.diagram import Diagram D = Diagram([(0,0), (1,1), (2,2), (2,3)]) SM = D.specht_module(QQ) s = SymmetricFunctions(QQ).s() s(SM.frobenius_image())

Bug fixes

  • Skew tableaux are now hashable. #35138

  • Key polynomials now are a properly implemented graded ring. #35115

Linear Algebra


New algebras

  • qq-commuting Laurent polynomials are defined analogously to the qq-commuting polynomials and play an important role is quantum cluster algebras. #35054

  • The integer valued polynomials are the set of polynomials pp such that p(n)Zp(n) \in \mathbb{Z} for all nZn \in \mathbb{Z}. #34988


  • Lazy series will update their approximate order as appropriate when getting coefficients. #35265

  • The Weyl character ring (and corresponding fusion ring) know they are commutative with faster multiplication for style='coroots'. #35186

Elliptic Curves

Group Theory

  • AdditiveAbelianGroupWrapper now has a static from_generators() method to construct a group from not necessarily independent elements. #35270

Drinfeld Modules

  • Drinfeld Fq[T]\mathbb{F}_q[T]-modules are now implemented, see the documentation for all the new features. #35026

Package upgrades

GAP has been upgraded to 4.12.2. #35093

SciPy has been upgraded from 1.9.x to 1.10.1 (Release notes 1.10). #35082

polymake has been upgraded to 4.9 (Release notes 4.8, 4.9). #35085

msolve has been upgraded to 0.4.9. #35159

Normaliz has been upgraded to 3.10.0. #35140

For a list of all packages and their versions, see

New developer tools, modularization, deprecations

The new command sage --tox -e cython-lint -- FILES... checks Cython source files for common mistakes and style violations. #35385

A linter rule (sage --tox -e relint -- FILES...) now enforces that Sage library code should not use imports from sage.PAC.KAGE.all modules when sage.PAC.KAGE is an implicit namespace package.

A new tool for developers is available that assists with updating imports in the source code: sage --fiximports edits Python sources in a single file, directory, or in the whole source tree, replacing sage.PAC.KAGE.all imports by imports from the specific source module. #34945

Many more packages have been changed from ordinary packages to implicit namespace packages, and the corresponding imports from .all modules have been replaced accordingly. #35110 #35012 #35033 #35090 #35098 #35099 #35105 #35106 #35107 #35119 #35322 #35366 #35372

The functions is_Algebra, is_CommutativeAlgebra, is_FiniteField, as well as is_Polynomial, is_MPolynomial, is_NumberFieldElement have been deprecated; new abstract base classes are available for equivalent isinstance tests. #35076 #35100 #35253 #35240

Several new Features have been defined: Some indicate the presence of some standard packages in the Sage distribution, which may be missing in modularized deployments. Others indicate the presence of portions of the Sage library. They can be used for conditionalizing doctests via # optional directives. #35136 #35237 #35266 #35267 #35314

Sage 10.0 continues to support Python versions 3.8–3.11. Developers who need newer features for typing annotations can now use the backport package typing_extensions in the Sage library. #35203

Availability of Sage 10.0 and installation help


The Sage 10.0 source code is available in the Sage GitHub repository.

Sage builds successfully on the following platforms:

  • Linux 64-bit (x86_64)

  • Linux 32-bit (i386/i686)

    • ubuntu-bionic-gcc_8

    • debian-buster

  • macOS (Intel) (x86_64) - with Homebrew or without

    • macOS 11.x (Big Sur)

    • macOS 12.x (Monterey)

    • macOS 13.x (Ventura)

  • macOS (Apple Silicon, M1/M2) - with Homebrew or without

    • Make sure that /usr/local does not contain an old copy of homebrew (or other software) for x86_64 that you may have copied from an old machine. Homebrew for the M1/M2 is installed in /opt/homebrew, not /usr/local.

    • Be sure to follow the README and the instructions that the ./configure command issues regarding the installation of system packages from Homebrew or conda.

You can also build Sage on top of conda-forge on Linux and macOS.

Sage 10.0 does not support Cygwin; use Windows Subsystem for Linux instead. Because of unresolved problems with standard packages GIAC (#34269), ECL (#34127), Maxima (#30796), and the rebasing facility (#34223), Sage 10.0 does not support Cygwin. Users on Windows 10 and 11 can migrate to using WSL as described in our installation guide. A convenient way to use such an installation of Sage is via VS Code's WSL remote. #34301, #30484

Known problems and workarounds

  • On fedora-38-minimal, archlinux-minimal, opensuse-tumbleweed-minimal, building openblas fails (when not provided by the system). Fixed by #35371.

  • On GCC 13 platforms (e.g., fedora-38), the optional package 4ti2 fails to build. Fixed by #35570.


  • The easiest way to install Sage 10.0 on Linux is through a distribution that provides it, see sagemath. As of 2023-05-24, packages for Arch Linux, Gentoo, and nixpkgs (unstable) are already available.


See in the source distribution for installation instructions.

Visit sage-support for installation help.

More details