Release Notes for 1.12 - sympy/sympy GitHub Wiki

These are the release notes for SymPy 1.12. You can also find release notes for previous versions.

SymPy 1.12 was released on 10th May 2023.

This version of SymPy has been tested on Python 3.8, 3.9, 3.10, 3.11, and PyPy. See our Python version support policy for more information on when we plan to drop support for older Python versions.

Install SymPy with

pip install -U sympy

or if you use Anaconda

conda install sympy

Highlights

There are many changes in 1.12 (see below).

Backwards compatibility breaks and deprecations

The deprecated arguments parent_axis and child_axis are replaced parent_interframe, child_interframe and joint_axis. Also the deprecated arguments parent_joint_pos and child_joint_pos are replaced by parent_point and child_point. Both of these deprecations apply for the joints: PinJoint and PrismaticJoint in the physics.mechanics module.

Luschny's Dream

This version of SymPy is the first to include some of the generalised functions described in Peter Luschny's An introduction to the Bernoulli function. This generalised behaviour, based on the Hurwitz zeta function, requires bernoulli(1) = +1/2. See the discussion at #23866 and the implementing PRs at #23926.

Existing code assuming bernoulli(1) = -1/2 can be updated by replacing bernoulli(n) with (-1)**n * bernoulli(n) and simplifying afterwards.

Other changes and deprecations

  • geometry

    • BREAKING: Removed the 'k' argument to Line3D.equation after following deprecation policy. (#24497 by @sylee957)
  • matrices

    • BREAKING: Removed the support of non row or column matrix in Matrix.dot after the deprecation cycle. Now Matrix([[1, 2], [3, 4]]).dot(Matrix([[5, 6], [7, 8]])) should not work. (#24498 by @sylee957)

    • BREAKING: Removed deprecated functions a2idx and classof from sympy.matrices. This had been deprecated and giving out DeprecationWarning since SymPy 1.3. (#24513 by @sylee957)

  • physics.units

    • BREAKING: Removed deprecated arguments dimension, scale_factor for Quantity. These have been deprecated and giving out DeprecationWarning since SymPy 1.3. (#24499 by @sylee957)
    • BREAKING: Removed deprecated methods set_dimension, set_scale_factor, get_dimensional_expr, collect_factor_and_dimension from Quantity. These have been deprecated and giving out DeprecationWarning since SymPy 1.5. (#24499 by @sylee957)
  • utilities

    • BREAKING: Removed deprecated source function. This had been deprecated and giving out DeprecationWarning since SymPy 1.3. (#24502 by @sylee957)

Changes

  • algebras

  • codegen

    • powm1 is now available for this enhanced precision math function. (#24300 by @bjodah)
  • combinatorics

    • Fix a bug in checking whether a PermutationGroup is cyclic. Previously this would return True incorrectly in some cases. (#24455 by @skieffer)

    • Fix a bug in forming a group homomorphism with PermutationGroup as domain. Previously this would raise ValueError incorrectly in some cases. (#24443 by @skieffer)

    • Provide PermutationGroup.is_dihedral property (#24384 by @skieffer)

  • concrete

    • Permitted expand to split sums and integrals with the force hint. (#24002 by @meganly)

    • Fixed expand to not split sums and integrals with infinite limits. (#23996 by @meganly)

    • The function of Sum and Product is now simplified when calling simplify. (#22278 by @oscargus)

  • core

    • A bug preventing the use of the old assumptions under evaluate(False) was fixed. (#24895 by @oscarbenjamin)

    • A rare bug from using Symbol in multithreaded code was fixed. Previously an exception might be raised when comparing two symbols while querying an assumption in a parallel thread. (#24893 by @oscarbenjamin)

    • Symbols with assumptions are now encoded more efficiently in pickles reducing the number of bytes needed for each symbol. (#24893 by @oscarbenjamin)

    • Basic no longer uses the ManagedProperties and BasicMeta metaclasses and is now just an ordinary class whose metaclass is type. (#24670 by @asmeurer and @oscarbenjamin)

    • DEPRECATION: The ManagedProperties metaclass is now deprecated. This used to be the metaclass for Basic but is no longer needed since Basic does not use metaclasses. Any code using this must be making metaclasses and should just subclass type instead of ManagedProperties. (#24670 by @asmeurer and @oscarbenjamin)

    • BREAKING CHANGE: The BasicMeta metaclass was removed. There has never been a good reason for downstream code to use this metaclass since ManagedProperties was the metaclass for Basic. Now Basic does not use any metaclasses so any downstream code that wants to use metaclasses should just use type rather than ManagedProperties. (#24670 by @asmeurer and @oscarbenjamin)

    • Fixed a bug where the core assumptions system would sometimes alter the random seed during assumptions queries. Now assumptions queries use a separate RNG. (#24521 by @jan-philipp-hoffmann)

    • Made rhs parameter from Eq required. It was optional before, but was deprecated after SymPy 1.5. (#24527 by @sylee957)
    • Assumptions queries on large Muls were made more efficient e.g. given m = Mul(*symbols('x:1000')) a first call to m.is_zero is around 10x faster. Assumptions queries often happen implicitly so this can have a broad effect on the speed of operations with large expressions. (#24485 by @oscarbenjamin)

    • Fixed with evaluate(False) not working with negation of addition. (#24303 by @sylee957)

    • Fixes incorrect results for Mod with float factors (#24250 by @praneethratna)

    • Import startup time by using pre-generated assumptions. (#23851 by @eendebakpt)

    • x**(a + b) will not expand unless a and b are both nonnegative or nonpositive or x is not zero (#23962 by @smichr)

    • expressions containing any illegal character as defined in numbers now gives expr.is_rational_function()->False (#23962 by @smichr)

    • Lazy loading of testing code is used to reduce the time taken for import sympy. (#23832 by @eendebakpt)

    • Pow.as_base_exp processing done for 1/Integer is now generalized for all positive Rationals: (2/3)**x->(3/2,-x) (#23921 by @smichr)

    • Calling subs with unsympifiable objects will now raise a SympifyError exception. The previous behaviour was to ignore any unsympifiable objects provided as arguments to subs. (#23887 by @oscarbenjamin)

    • Basic.has_xfree has been added. Like xreplace, it targets only full expression matching (#23821 by @smichr)

    • Fixed a bug where rational number is constructed wrong from the string. Now Rational('0.5', '100') correctly gives Rational(1, 200) (#24562 by @1e9abhi1e10)

  • functions

    • Fixed slowdown issues of initial run caused by evaluating cos(pi/257) eagerly even if it is not needed. Now, cos(x + pi/6).expand(trig=True) gives more faster result. (#24566 by @sylee957)
    • A bug in cos.is_zero was fixed. Previously is_zero would give incorrect results in some cases. (#24219 by @Ishanned)

    • polylog evaluates for a few more cases. (#23938 by @oscargus)

    • beta evaluates directly for more cases. (#23934 by @oscargus)

    • a bug selecting later expression when two successive conditions matched was fixed (#24076 by @smichr)

    • New andre function implementing the entire extension of OEIS A000111 described by Luschny. (#24024 by @Parcly-Taxel)

    • New hermite_prob function providing the probabilist's Hermite polynomials. (#24019 by @Parcly-Taxel)

    • polygamma() now accepts complex arguments, implementing the generalised polygamma function described in Espinosa and Moll (2004). (#24012 by @Parcly-Taxel)

    • BREAKING: As a result of using the Espinosa–Moll generalisation, polygamma(-1, x) now differs from loggamma(x) by a constant instead of being the same. (#24012 by @Parcly-Taxel)

    • dirichlet_eta() now accepts two complex arguments. (#23994 by @Parcly-Taxel)

    • euler() now accepts complex arguments, implementing the generalised Euler function described by Luschny. (#23992 by @Parcly-Taxel)

    • harmonic() now accepts complex arguments. (#23985 by @Parcly-Taxel)

    • genocchi() now accepts two complex arguments, implementing the generalised Genocchi function described by Luschny. (#23989 by @Parcly-Taxel)

    • BREAKING: bernoulli(1) is now 1/2 instead of -1/2 and genocchi(1) is now -1 instead of 1. (#23984 by @Parcly-Taxel)

    • bernoulli() now accepts complex arguments, implementing Luschny (2020). (#23984 by @Parcly-Taxel)

    • piecewise_fold is applied recursively to always fold fully. (#23987 by @oscargus)

    • BREAKING: zeta(s, a) now implements the analytically continued Hurwitz zeta function (Mathematica's HurwitzZeta[]), not Mathematica's Zeta[]. (#23973 by @Parcly-Taxel)

    • zeta() now simplifies for more sets of parameters. (#23973 by @Parcly-Taxel)

  • geometry

    • fixes memory leak caused by unnecessarily creating new Dummies (#24586 by @smichr)
    • BREAKING: Removed the 'k' argument to Line3D.equation after following deprecation policy. (#24497 by @sylee957)
  • integrals

    • The default of the hint simplify is changed to simplify=False in the Laplace transform and the inverse Laplace transform. (#24765 by @hanspi42)

    • The Laplace transform now has better rules for dealing with trigonometric functions and their products. (#24642 by @hanspi42 and @sylee957)

    • Time-derivative rule implemented for the inverse Laplace transform (#24628 by @hanspi42)

    • laplace_transform can now handle partial derivatives of functions with more than one argument. (#24623 by @hanspi42)

    • Introduces a rule engine for the inverse Laplace transform and rules for dealing with rational functions and time delays. Outputs containing DiracDelta will change a lot; this is because up to now many of those results were mathermatically incorrect. (#24579 by @hanspi42)

    • Improves the speed of simple rules in Laplace transform. (#24579 by @hanspi42)

    • Improved algorithm for the Laplace transform; noconds=False will now always return conditions. Several small errors were corrected, many convergence planes will change, and some results will change as well. May new rules have been added to improve the speed and completeness of computing Laplace transforms. (#24492 by @hanspi42)

    • BREAKING CHANGE: The LaplaceTransform.doit() method now default to noconds=True. This means that calling doit returns an expression for the transformed function rather than a tuple with the convergence conditions. This is a bug fix because having doit return a tuple breaks using an unevaluated LaplaceTransform as part of an expression (e.g. (2*LaplaceTransform(exp(t), t, s) - 1).doit() previously failed because of the tuple). Although this is a bug fix it would likely break any code that currently uses LaplaceTransform.doit() directly and depends on the default value of noconds. Explicitly setting noconds or using the laplace_transform function will work the same way as in previous versions of SymPy. (#24492 by @hanspi42)

    • BREAKING: manualintegrate internal data representation is changed (#24282 by @eagleoflqj)

    • corrected small errors in Laplace transform rules (#24296 by @hanspi42)

    • Support integral steps for nested pow like (c*(a+b*x)**d)**e (#23716 by @eagleoflqj)

    • A bug in the risch integration routine was fixed. Previously in certain conditions involving complicated integrands the routine would fail with AssertionError. (#23959 by @oscarbenjamin)

  • interactive

  • logic

    • simplify_logic now has a dontcare keyword argument for simplifying under don't care-conditions. (#23986 by @oscargus)
  • matrices

    • Fix RecursionError when differentiating a product with OneMatrix expression. (#24638 by @bsdz)

    • Implemented rot_givens to compute givens rotation matrix. (#24535 by @evbernardes)

    • Allowed creating of MatAdd, MatMul, MatPow, Inverse and HadamardProduct with more general matrix shape. For example, previously, MatrixSymbol('A', m, n)**2 for symbolic shape m, n didn't work. (#24168 by @sylee957)
    • Removed clear_cache, clear_subproduct keyword argument from is_diagonalizable which was deprecated after SymPy 1.4. (#24525 by @sylee957)

    • Removed rows, cols keyword argument from jordan_block which was deprecated after SymPy 1.4. (#24525 by @sylee957)

    • BREAKING: Removed deprecated functions a2idx and classof from sympy.matrices. This had been deprecated and giving out DeprecationWarning since SymPy 1.3. (#24513 by @sylee957)

    • BREAKING: Removed the support of non row or column matrix in Matrix.dot after the deprecation cycle. Now Matrix([[1, 2], [3, 4]]).dot(Matrix([[5, 6], [7, 8]])) should not work. (#24498 by @sylee957)

    • Made ShapeError messages more readable for users. (#24161 by @sylee957)

  • parsing

  • physics.continuum_mechanics

    • Added Symbolic Functions in the solve method for calculations instead of the math module (#24039 by @AdvaitPote)

    • Added a fully symbolic example to the Beam class (#24047 by @Davide-sd)

    • Added the solve_for_torsion method and the angular_deflection property in the Beam3D class. (#23868 by @AdvaitPote)

    • Added the solve method for solving a given truss for its reaction loads and internal forces. (#23755 by @AdvaitPote)

  • physics.control

    • Added bilinear, a function for the bilinear transform discretization of a continuous transfer function from Control API. (#24558 by @zolabar)
  • physics.hep

    • Fixed a bug in gamma_matrices.kahane_simplify() when there is more than one uncontracted gamma matrix before the first contracted gamma matrix. (#23824 by @glenn-horton-smith)

    • Fixed a bug in finding traces of sums of products of GammaMatrix mixed with other factors. (#13636) (#23786 by @glenn-horton-smith)

  • physics.mechanics

  • physics.quantum

    • Fixed a bug with power of hermitian operator that is also unitary. Power was incorrect if exponent was not an explicit integer. (#24603 by @Costor)

    • A missing argument has been fixed in the method _apply_operator_<ket>() of some operators (#24404 by @Costor)

    • For OrthogonalBra / OrthogonalKet computing their inner product returns a correctly sympified result now (#24403 by @Costor)

    • IdentityOperator applied more stringently in qapply and speed up of IdentityGate (#24237 by @Costor)

    • In certain cases qapply would evaluate Ket * Operator in expressions as Operator * Ket. This behavior could lead to incorrect results and has been removed. (#24164 by @Costor)

    • Fixed incomplete expansion of TensorProduct if summands have scalar factors (#24152 by @Costor)

  • physics.units

    • BREAKING: Removed deprecated arguments dimension, scale_factor for Quantity. These have been deprecated and giving out DeprecationWarning since SymPy 1.3. (#24499 by @sylee957)

    • BREAKING: Removed deprecated methods set_dimension, set_scale_factor, get_dimensional_expr, collect_factor_and_dimension from Quantity. These have been deprecated and giving out DeprecationWarning since SymPy 1.5. (#24499 by @sylee957)

  • physics.wigner

    • Added real_gaunt function to compute the integral of 3 real spherical harmonics. (#24070 by @AntiPhoton47)
  • plotting

  • polys

    • Add a galois_group() function, supporting polynomials up through degree 6. (#24420 by @skieffer)

    • Added the Lenstra–Lenstra–Lovász (LLL) lattice basis reduction algorithm. (#24572 by @erdos4d)

    • Added a PolyElement.symmetrize() method for sparse symmetrization. (#24541 by @skieffer)

    • Repaired a bug with PolyElement.as_expr(), so that it now accepts symbols. (#24539 by @skieffer)

    • symmetric_poly uses an explicit argument called polys (#24453 by @michelececcacci)

    • A bug that prevented printing elements of polynomial rings over the EX domain was fixed. (#24248 by @oscarbenjamin)

    • Made roots_quintic() accept quintics in general form (nonzero degree-4 coeff is now okay) (#24094 by @ForeverHaibara and @smichr)

    • New appellseqs module generating Appell sequences: Bernoulli, central Bernoulli, Genocchi, Euler and André polynomials. (#24014 by @Parcly-Taxel)

  • printing

    • Added support for Si(x) and Ci(x) for using lambdify() (#24571 by @sayan9800)

    • Fix str of sum involving negative quantities. (#24030 by @Ishanned)

    • Fixed latex printing of multiplication with evaluate(False). (#24091 by @cocolato)

    • Fix str of numerator consisting of a sum where a minus signs can be extracted. (#24111 by @oscargus)

    • Added a new printer for converting Sympy to SMTLib. (#23961 by @kunalsheth)

    • Better performance when passing user_functions to the printers. (#23841 by @bjodah)

  • series

    • Fixes limit at negative infinity considering odd or even power. (#24458 by @faze-geek)

    • Implemented leading term and nseries methods for the frac function (#24020 by @anutosh491)

    • Fixed series expansions for bessely functions where terms from series were missing. (#23844 by @anutosh491)

    • Implemented leading term and nseries methods for besseli and besselk functions. (#23844 by @anutosh491)

    • Refactored mrv_leadterm function of gruntz.py to use the leadterm method rather than the calculate_series method , which can further be deprecated. (#23844 by @anutosh491)

    • Implemented use cases of logx parameter in leading term methods of Ci and polygamma function. (#23844 by @anutosh491)

    • Fixed errors arising for limits at infinites other than oo/-oo. (#23844 by @anutosh491)

    • Removed calculate_series function from gruntz. (#23844 by @anutosh491)

    • Removed compute_leading_term function's usage through the codebase. (#23844 by @anutosh491)

    • Fixed few limits at infinites with respect to harmonic functions. (#23844 by @anutosh491)

    • Added test for trivial bounds on binomial coefficients (#23999 by @saicharan2804)

    • Added tests for limits of some discontinuous functions with undefined limits. (#23963 by @saicharan2804)

    • Fixed log._eval_nseries method to perform correctly while dealing with points on branch cuts. (#23798 by @anutosh491)

    • Implemented _eval_nseries method for all inverse hyperbolic functions along with atan, acot function. (#23798 by @anutosh491)

    • Refactored series method in expr.py to use the cdir parameter effectively. (#23798 by @anutosh491)

    • Fixed leading term method for floor and ceiling function to handle arguments of type AccumBounds. (#23798 by @anutosh491)

    • Implemented taylor_term method for asec, acsc, asech, acsch functions. (#23715 by @anutosh491)

    • Refactored leading term methods for all inverse hyperbolic functions. (#23715 by @anutosh491)

    • Fixes bi-directional limits for acot, asec, acsc, acoth, asech, acsch. (#23715 by @anutosh491)

    • Fixes Float handling for pow._eval_nseries. (#23715 by @anutosh491)

    • Fixes branch cut handling for pow._eval_as_leading_term and pow._eval_nseries method where new direction (ndir) being calculated with respect to base of the pow expression is real. (#23715 by @anutosh491)

  • sets

  • simplify

    • Fixed a bug with rebuilding of expressions that involve matrix expressions of matrices in CSE. (#24694 by @brocksam)

    • Improved performance of CSE of matrix expressions. (#24694 by @brocksam)

    • Added optimisations for collapsing nested multinary matrix operations with single operands. (#24694 by @brocksam)

    • fixed a comparison x < 0 to x.is_negative to avoid type error for non-real x (#24531 by @Costor)

    • Implemented inverse option for trigsimp (#24411 by @evbernardes)

  • solvers

    • Duplicate solutions are now filtered out more consistently by solve. (#24617 by @oscarbenjamin)

    • solveset automatically applies expand_log when generator is Rational**f(x) (#24413 by @smichr)

    • A bug in checksol was fixed. Previously in some cases exact incorrect solutions were reported as correct if substituting into the equation resulted in a small rational number. (#24179 by @NikhilSDate)

    • solve_undetermined_coeffs can identify coefficients in front of multivariate expressions (#23925 by @smichr)

    • specifying the independent variable is no longer mandatory when calling solve_undetermined_coeffs (#23925 by @smichr)

    • solve now only returns a bare dictionary when 1) solving a single expression (not in a list) for undetermined coefficients or 2) for a list of n linear equations in n unknowns when manual!=True (#23877 by @smichr)

    • when using solve to solve for undetermined coefficients, the solution is no longer simplified (because it is detected as having been solved as a polynomial system; and such systems are not simplified) (#23877 by @smichr)

    • solve now raises an error if duplicate symbols are given in the unknowns to be solved for such as solve(equations, [x, y, x]). (#23891 by @smichr)

    • linsolve no longer fully expands expressions so any nonlinear terms that would cancel after expansion now raise (#23821 by @smichr)

    • linear_coeffs is more efficient and can return results as a dictionary (which is more economical for sparse equations) (#23821 by @smichr)

    • linear_eq_to_matrix can now handle system expressed in terms of functions (#23821 by @smichr)

    • solve raises an error if duplicate symbols are provided (#23854 by @smichr)

    • corrected a case where set=True would send back an empty list of symbols; code which uses set=True and only tests whether the result is empty will now fail: s, sol = solve(..., set=True) will have empty sol if there is no solution. (#23854 by @smichr)

    • linsolve raises ValueError if duplicate symbols are detected (previously the wrong result was returned) (#23872 by @smichr)

    • automatic detection of undetermined coefficient solutions will only succeed when there is a single solution (#23827 by @smichr)

    • rsolve_poly will return results with contiguously numbered constants (#23837 by @smichr)

    • solve will always return a tuple (sym, sol) when set=True, even if sol is empty (#23840 by @smichr)

    • solutions for lists of nonlinear equations should no longer have duplicate solutions (#23826 by @smichr)

    • multiple solutions for nonlinear equations for which symbols have been specified should more consistently return as tuples (#23826 by @smichr)

    • dictionary solutions are sorted consistently by key not by item (#23826 by @smichr)

    • when using set=True, all symbols specified will be returned in the order given (or canonical order if unordered); if no symbols are given then only those symbols isolated will be included in the list of variables (#23826 by @smichr)

    • Fixed recursion limit exceeded in pow_rep_recursive (issue #23807 ) (#23808 by @grhkm21)

    • solve can return full tuple(s) containing values for all symbols by using tuple=True; set and dict output is ecomonical and does not report symbols that can have arbitrary values (#23699 by @smichr)

    • solve returns dict when solving single equation for one of several provided symbols (was formerly tuple) (#23699 by @smichr)

    • more efficient solving of an equation for several factors is implemented (#23699 by @smichr)

    • when passing a single polynomial expression in some variable x and desiring to find solutions for symbols that appear linearly as symbolic coefficients, use the flag match=True, e.g. solve(Eq(a*x**2 + b*x, 3*x**2), a, b, match=True) -> {a: 3, b: 0} otherwise a more general algebraic solution like [{a: -b/x + 3}] will be returned. (#23699 by @smichr)

    • solve_undetermined_coeffs now enforces that the coefficient system is linear in parameters; systems that are nonlinear in parameters will have to be created explicitly and passed to solve for a solution. (#23699 by @smichr)

  • strategies

    • Added type annotations for functions in strategies.core. (#24501 by @sylee957)
  • tensor

    • Fix index conflicts when using subs, xreplace, or doit on a TensMul (#24338 by @Kishore96in)

    • Added wildcard classes WildTensorHead and WildTensorIndex that can be used to match and replace tensor expressions. (#24321 by @Kishore96in)

    • Fixed bug in printing TensMul. (#24474 by @Kishore96in)

  • testing

  • utilities

    • Added a new parameter, docstring_limit, to lambdify that allows users to control the size of expressions that are included as fully rendered in the docstring. (#24754 by @brocksam)
    • BREAKING: Removed deprecated source function. This had been deprecated and giving out DeprecationWarning since SymPy 1.3. (#24502 by @sylee957)

    • Added sequence_partitions, sequence_partitions_empty for generic partitioning of sequence into bins, with the option to partition into empty sequence respectively. (#24437 by @sylee957)

    • Remove the use of the deprecated numpy.distutils in ufuncify. (#24361 by @asmeurer)

  • other

    • Fixed a lot of redirected and broken links in the SymPy docs. (#24702 by @theWiseAman)

    • A new, user-friendly page on solving a system of equations algebraically was added to the Guides section. (#23916 by @bertiewooster)

    • A new, user-friendly page on solving (finding the roots of) polynomial equations algebraically was added to the Guides section. (#24013 by @bertiewooster)

    • A new, user-friendly page on solving a matrix equation algebraically was added to the Guides section. (#23951 by @bertiewooster)

    • A new, user-friendly page on solving a Diophantine equation (finding integer solutions to a polynomial equation) algebraically was added to the Guides section. (#24051 by @bertiewooster)

    • A new, user-friendly page on solving a system of inequalities algebraically was added to the Guides section. (#23768 by @bertiewooster)
    • an addition to documentation about installation of pip on ubuntu before using pip. (#23943 by @metabiswadeep)
    • A new, user-friendly page on solving a system of equations algebraically was added to the Guides section. (#23802 by @bertiewooster)
    • The documentation now lists each function, class, and method in the right sidebar. (#24050 by @asmeurer)
    • Update ANTLR version to 4.11 (#24097 by @xhochy)

    • A new, user-friendly page on solving a system of equations numerically was added to the Guides section. (#23853 by @bertiewooster)

    • Add a glossary of common SymPy terminology to the documentation. (#23293 by @asmeurer)
    • added a "solve_output" explanation file to the documentation (#23699 by @smichr)

    • A new, user-friendly page on solving an equation algebraically was added to the Guides section. (#23638 by @bertiewooster)

Authors

The following people contributed at least one patch to this release (names are given in alphabetical order by last name). A total of 76 people contributed to this release. People with a * by their names contributed a patch for the first time for this release; 42 people contributed for the first time for this release.

Thanks to everyone who contributed to this release!

  • Jyn Spring 琴春*
  • anutosh491
  • Ayush Aryan*
  • Blair Azzopardi
  • Stefan Behnle*
  • Oscar Benjamin
  • Evandro Bernardes*
  • Anurag Bhat
  • Francesco Bonazzi
  • Sam Brockie*
  • Pontus von Brömssen*
  • Zach Carmichael
  • Michele Ceccacci*
  • cocolato
  • Costor*
  • Björn Dahlgren
  • Nikhil Date
  • Eric Demer*
  • Devansh*
  • Pieter Eendebak
  • ForeverHaibara*
  • Tim Gates
  • Aaron Gokaslan*
  • Kishore Gopalakrishnan*
  • Oscar Gustafsson
  • Charles Harris*
  • haru-44*
  • Jan-Philipp Hoffmann*
  • Glenn Horton-Smith*
  • Victor Immanuel*
  • Karan*
  • Chris Kerr*
  • Steve Kieffer
  • Uwe L. Korn*
  • Zoufiné Lauer-Baré*
  • S.Y. Lee
  • Andrey Lekar
  • Phil LeMaitre*
  • Qijia Liu
  • luzpaz
  • Megan Ly
  • Gareth Ma*
  • Aaron Meurer
  • Arthur Milchior*
  • Shreyash Mishra*
  • Sayan Mitra*
  • Jeremy Monat
  • Carlos García Montoro*
  • Jason Moore
  • NotWearingPants*
  • Julien Palard
  • Ishan Pandhare*
  • Abhishek Patidar*
  • Advait Pote
  • Mamidi Ratna Praneeth
  • Psycho-Pirate
  • Biswadeep Purkayastha*
  • Juha Remes
  • Klaus Rettinghaus*
  • Clément M.T. Robert*
  • Saicharan*
  • Tejaswini Sanapathi*
  • Davide Sandonà
  • Hanspeter Schmid
  • José Senart*
  • Kunal Sheth*
  • Aman Kumar Shukla*
  • Chris Smith
  • Paul Spiering
  • Timo Stienstra
  • Kalevi Suominen
  • Parcly Taxel*
  • Yves Tumushimire*
  • Eric Wieser
  • wookie184*
  • Zouhairoscar

SHA 256 hashes:

ebf595c8dac3e0fdc4152c51878b498396ec7f30e7a914d6071e674d49420fb8 sympy-1.12.tar.gz c3588cd4295d0c0f603d0f2ae780587e64e2efeedb3521e46b9bb1d08d184fa5 sympy-1.12-py3-none-any.whl c1249cd14c5bc2ad20ce8d5fd4884bc51062bc0eddb79537e0996b05befe1097 sympy-docs-html-1.12.zip 34455a55aece7dc38a090728b500e5f6bdebe588be93ed6fbc3262694d681ed6 sympy-docs-pdf-1.12.pdf

⚠️ **GitHub.com Fallback** ⚠️