Skip to content

Release Notes for 1.14

Oscar Benjamin edited this page Apr 27, 2025 · 194 revisions

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

SymPy 1.14 was release on 27th April 2025.

This version of SymPy has been tested on Python 3.9, 3.10, 3.11, 3.12, 3.13 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.14 (see below).

Backwards compatibility breaks and deprecations

Changes

  • assumptions

    • Now ask(Q.integer(x/y), Q.integer(x) & Q.integer(y)) gives None instead of wrongly giving True. (#27741 by @krishnavbajoria02 and @TiloRC)

    • Now ask(Q.integer(1/x), Q.integer(x)) gives None instead of wrongly giving True. (#27741 by @krishnavbajoria02 and @TiloRC)

    • Bug Fix: Now ask(Q.real(1/Abs(x))) correctly returns None instead of incorrectly returning True. (#27693 by @krishnavbajoria02 and @TiloRC)

    • Bug fix: ask(Q.integer(Abs(x)), ~Q.integer(x)) now correctly returns None instead of False. (#27685 by @krishnavbajoria02)

    • Bug fix: Now ask(Q.finite(x**-1), Q.real(x)) correctly returns None instead of True. (#27708 by @krishnavbajoria02 and @TiloRC)

    • Make ask(Q.integer(x**y), Q.integer(x) & Q.integer(y)) give None instead of wrongly giving True. (#27555 by @krishnavbajoria02)

    • ask(Q.infinite(I*oo)) now returns True instead of None. (#27666 by @krishnavbajoria02 and @TiloRC)

    • Make Q.finite(Mul(...)) return None when a finite argument’s nonzero status is indeterminate instead of False. (#27524 by @Jatinbhardwaj-093 and @TiloRC)

    • Make ask(Q.prime(x**y),Q.integer(x) & Q.integer(y)) give None instead of incorrectly giving False . (#27512 by @krishnavbajoria02)

    • Fixed a bug in the ask function where Q.algebraic queries did not handle three-valued logic correctly. This ensures the behavior is consistent when handling cases with undefined truth values. (#27511 by @krishnavbajoria02)

    • Make ask(Q.real(n**p), Q.positive(p) & Q.negative(n)) give None instead of incorrectly giving False (#27489 by @GaganMishra305)

    • Fixed incorrect output for ask(Q.composite(x), Q.integer(y) & Q.positive(y) & ~Q.prime(y)), making sure that a non-prime positive integer is not necessarily composite. (#27463 by @anandkaranubc)

    • Make ask(Q.negative(S.NaN)) give None instead of wrongly giving False . (#27520 by @guptapratykshh)

  • codegen

    • new classes mapping to numpy's functions: amin, amax, minimum, maximum (#27481 by @bjodah)

    • Added isinf in .codegen.cfunctions. (#26794 by @bjodah)

  • combinatorics

  • concrete

    • Gives evaluated result when lower limit > upper limit in summation, especially in case if either of them is infinite (following Karr convention) (#27894 by @Harikrishna-Srinivasan)

    • Fix Ratio test to check if limit ratio is NaN. (#26980 by @anutosh491)

  • core

    • DEPRECATION: The gcd parameter for Rational is now deprecated. This parameter is used to create "unevaluated rationals" but those are impossible to represent if SymPy uses any more efficient implementation of rational numbers (e.g. from gmpy2 or python-flint). This parameter is deprecated and using it will likely become a hard error much quicker than usual deprecation timelines because keeping this behaviour even with a deprecation warning prevents making Rational much faster. (#27949 by @oscarbenjamin)

    • The output of igcdex(0, 0) has been changed from (0, 1, 0) to (0, 0, 0). (#27884 by @haru-44)

    • Fixed a bug where Mod(1, n) evaluates to 1 - n when n is a positive integer. (#27803 by @haru-44)

    • Added handling for tan functions of complex numbers in evalf (#27732 by @AlexGarciaPrada)

    • A bug in Relational was fixed. Previously operations involving an expression like Eq(y < 1, True) might raise an exception. (#27541 by @bjodah)

    • Changed adjoint of a commutative expression to be the same as conjugate (and transpose is the same as the original) (#27422 by @akhmerov)

    • Fixed rewrite(abs) to call rewrite(Abs), ensuring consistent behavior. (#27325 by @Ytemiloluwa)

    • Fixed a bug with sympify when infinite floats are passed. For example: sympify(np.float32('inf')). (#27287 by @solvedbiscuit71)

    • Cache hashable_content in symbol (#27251 by @isuruf)

    • Type hints have been added to improve type inference for code that uses sympy expressions. This should improve code completion and help tips for end users using an editor such as vscode that typically uses the pyright language server. (#25103 by @oscarbenjamin)

    • Floats are no longer extracted from a power of an Add e.g. an expression like (x**2 + 10.0)**2 will be kept as is. Previously a float was extracted to 100.0*(0.1*x**2 + 1)**2. This reverts gh-16762 that introduced this change in SymPy 1.5. (#27196 by @oscarbenjamin)

    • BREAKING CHANGE: In SymPy 1.7 Basic.match and Basic.replace were changed to treat bound symbols in a pattern as wild cards. This change is now reverted so that patterns are matched structurally without distinguishing between free and bound symbols. This means that e.g. Integral(x, (x, 0, 1)).match(Integral(y, (y, 0, 1))) no longer matches if y is an ordinary symbol. Matching bound symbols was redundant since a Wild symbol can be used in place of any bound symbol in the pattern e.g. Integral(x, (x, 0, 1)).match(Integral(w, (w, 0, 1))) where w = Wild('w'). This change to match fixes a bug in replace where matches involving expressions with bound symbols would give incorrect expressions involving Dummy symbols. (#27175 by @oscarbenjamin)

    • Fixed a bug with Float. Formerly, ZeroDivisionError as using python built-in types caused result to be zero in the denominator (#27173 by @MostafaGalal1)

    • Fixed type-checking issue in decompose_power_rat by ensuring non-rational exponents are handled properly. (#27162 by @BorekSaheli)

    • Cache assumption canonicalization in SymPy. (#27136 by @isuruf)

    • 0*f(zoo) is no longer 0 (it is nan) (#27053 by @smichr)

    • Mul.as_base_exp no longer allows (x**z*y**z) -> (x*y)**z unless z is an integer. Previously this could lead to incorrect results if the bases are not positive and the exponent is not an integer. (#26965 by @hanspi42, @oscarbenjamin, and @sympy)

    • Comparisons like Integer(0) == Float(0) now always return False. Previously this behaviour was inconsistent depending on the order of the operands e.g. Float(0)==Integer(0) gave False but Integer(0)==Float(0) gave True. (#26910 by @oscarbenjamin)

    • Pow.as_base_exp for positive Rationals: (2/3)**x->(3/2,-x) is not done ant more. This reverts a change in SymPy 1.12 to restore SymPy 1.11 behaviour. (#26884 by @oscarbenjamin)

    • Print the expression when you cannot determine truth value of relational (#26679 by @ezyang)

  • functions

    • Added caching to speed up harmonic number computation. (#27838 by @vprayag2005)

    • Fixed inconsistent behavior of the primitive method for the zero polynomial. (#27593 by @guptapratykshh)

    • Removed Poly.unit which has same functionality as Poly.one. (#27611 by @guptapratykshh)

    • Fixed a bug in dmp_shift to handle zero elements correctly. (#27506 by @leomanga)

    • Fixed and improved some inequality simplifications for floor and ceiling (#27388 by @kjakatter)

    • Optimize quadratic_congruence (#27241 by @Mivik)

    • The issue where partition(n) would fail for large values of n in situations where both python-flint and gmpy2 are available has been resolved. (#27212 by @haru-44)

    • Ramanujan's congruences have been implemented. The expression partition(5*n+4) % 5 evaluates to zero. (#27208 by @haru-44)

    • Implemented besselk series expansion for non-integer order (#25664 by @Kishore96in)

    • besselk: fixed calculation of leading term for non-integer negative orders (#25664 by @Kishore96in)

    • create a function in test_integral file for handling issue (#27025 by @bharatAmeria and @smichr)

    • Fixed a bug in _eval_nseries method of Pow class to better handle the operation of negating the constant term from the expression. (#26036 by @arnabnandikgp and @smichr)

    • _eval_aseries method was added for modified bessel functions. (#26298 by @arnabnandikgp)

    • Fixed a bug that caused LambertW to hang on specific inputs. (#26840 by @haru-44)

    • removed instance of nsimplify from log _eval_nseries (#26693 by @arnabnandikgp)

  • integrals

    • Added a regression test for a specific floating-point Definite integral variant #27231 to prevent future discrepancies in evaluation. (#27258 by @Ytemiloluwa)

    • rules containing sqrt(a*t) and sqrt(a/t) and their test cases have been removed from the rule-based laplace_transform method, they will be re-instated after a mathematical investigation into the validity of the respective table entries in Bateman54 (#26965 by @hanspi42, @oscarbenjamin, and @sympy)

    • Fixed incorrect inverse laplace transforms of polynomials in s. (#26779 by @hanspi42)

  • interactive

    • Fixed an issue where init_printing did not pass settings specific to the user-provided pretty printer. For example, when using init_printing(use_latex=False, pretty_printer=my_pretty_printer, applied_func_with_no_args=False), the custom option applied_func_with_no_args is now correctly propagated to the custom pretty printer. (#26997 by @sylee957)
  • logic

    • Fixed hanging issue with satisfiable queries involving complex expressions where use_lra_theory is True. (#27735 by @TiloRC)
  • matrices

    • Fixed Matrix.is_hermitian for matrices of quantum operators. (#27904 by @mathiscr)

    • Added fraction-free LU Decomposition method for DomainMatrix. (#27423 by @Ytemiloluwa)

    • A regression in Matrix.inv_mod was fixed. In versions before 1.12 inv_mod could compute the inverse of a matrix modulo a composite number if it exists. This would potentially fail in 1.12 and 1.13 due to the inverse algorithm encountering zero divisors even if the inverse matrix does exist. Now if the determinant is invertible mod m then the inverse of the matrix mod m is always computed. (#27664 by @oscarbenjamin)

    • Fixed adjoint of a matrix containing operators to apply adjoint to the operators instead of conjugate. (#27422 by @akhmerov)

    • Fixed the LU solver to correctly handle noncommutative matrix entries (#27437 by @akhmerov)

    • Added qr method for DomainMatrix to compute the QR decomposition. (#27352 by @Ytemiloluwa)

    • Added a Division-based qr method for DDM to handle domain-aware QR decomposition. (#27352 by @Ytemiloluwa)

    • SparseMatrix reshaping is now more efficient (#27100 by @smichr)

    • domain matrix no longer modifies instantiating list of lists (#27085 by @smichr)

    • Handle matrices of zero columns correctly in the Matrix constructor. In SymPy 1.12 these produced empty matrices of the wrong shape and in 1.13 they resulted in an error. Now Matrix([[], []]).shape == (2,0). (#27065 by @oscarbenjamin)

    • Add smith_normal_decomp that returns the smith normal form and the matrices that decomposes the matrix into the smith normal form. (#17451 by @isuruf and @oscarbenjamin)

    • Matrix.inv() now uses exact rational coefficients internally for matrices of polynomials or rational functions if the matrix has symbolic expressions with float coefficients. This fixes an issue first seen in SymPy 1.13.0 where unnecessarily large floats were present in the expressions for the matrix inverse (gh-26821) and likely also prevents Matrix.inv from returning some inaccurate results for some matrices containing floats. (#26822 by @oscarbenjamin)

    • Flint's matrix types nmod_mat or fmpz_mod_mat are used by DomainMatrix for dense matrices over GF(p) when the ground types are set to "flint". This makes many operations with matrices over GF(p) much faster. (#25940 by @oscarbenjamin)

    • A bug (gh-24947) in matrix multiplcation with Order expressions was fixed. Previously RuntimeError was raised when multiplying matrices with certain expressions that do not behave as expected under multiplication by zero. (#26746 by @oscarbenjamin)

    • Two new Matrix methods iter_values and iter_items are added for lazy iteration over the nonzero elements of a Matrix. A Matrix method from_dok is added for efficient direct construction of sparse matrices. Some basic matrix operations are made faster by using these methods. (#26058 by @oscarbenjamin)

  • ntheory

    • The output of qs is a set of factors of N, but until now, their product could exceed N. We have fixed it to ensure that it does not exceed N. (#27644 by @haru-44)

    • We have implemented a new function, qs_factor. Like the existing qs, it performs prime factorization using the quadratic sieve. However, the difference is that qs_factor returns the results as a dictionary. (#27644 by @haru-44)

    • Resolved an issue in the Quadratic Sieve (QS) where factor 2 was not fully removed from N, causing a NoneType error in factor base generation. (#27635 by @vprayag2005)

    • The factor_cache has been added to store the results of prime factorization. Results from factorint are automatically cached, and users can also add their own entries to the cache. (#27193 by @haru-44)

    • perfect_power returns an odd exponent, if possible, for negative n and respects key words when dealing with non-Integers (#27239 by @aasim-maverick and @smichr)

    • New Mersenne prime added to MERSENNE_PRIME_EXPONENTS. (#27184 by @haru-44)

    • Improved the performance of the prime(n) function. (#27051 by @aasim-maverick)

    • Speed up _primepi (#26710 by @haru-44)

  • parsing

    • Fixed an issue for lark parser that factorials with multiplication is parsed with ambiguity. For example, $12! \times 12!$. (#27540 by @sylee957)

    • Fixed an issue that parse_expr with evaluate=False did not handle chained equation or inequality comparisons. For example, parse_expr("0 < x < 100", evaluate=False) should now work. (#27102 by @sylee957)

    • Introduced matrix and literal complex number parsing. (#26098 by @8vasu)
  • physics.biomechanics

    • Moved files in the API Reference to Explanation (#26727 by @eh111eh)
  • physics.continuum_mechanics

    • Added examples 12 and 13 to the documentation, demonstrating the use of apply_support(), apply_rotation_hinge(), and apply_sliding_hinge(loc). (#27099 by @BorekSaheli)
  • physics.control

  • physics.mechanics

    • Add a redirect to the top level explanation page from the old url in the reference section. (#27500 by @moorepants)

    • KanesMethod requires linear speed constraints, but it does not check whether they indeed are linear. Using linear_eq_to_matrix instead of the Jacobian serves two purposes: 1) it makes solving the constraints faster and 2) it will raise an error in the speed constraints are not linear. (#26900 by @Peter230655)

    • Updated the bicycle model example in the documentation to produce correct results and improve the explanation and formatting. (#26921 by @moorepants)

    • Introduced CoulombKineticFriction to include Coulomb kinetic friction with Stribeck and viscous effect. (#26412 by @eh111eh)

    • Moved files in the API Reference to Explanation and Tutorials (#26727 by @eh111eh)

  • physics.quantum

    • Removed custom __mul__ and __pow__ methods from quantum classes. This logic has been replaced by _constructor_postprocessor_mapping based transforms that are more complete and consistent. (#27407 by @ellisonbg)

    • Created kinds for bras, kets and operators, with kind dispatch resolution. (#27407 by @ellisonbg)

    • All combinations of bras and kets are now consistently identified as inner/outer products, with inner products taking taking the highest priority when there is ambiguity. (#27407 by @ellisonbg)

    • TypeError is raised when trying to build tensor products using *, such as Ket()*Ket() or Bra()*Bra(). (#27407 by @ellisonbg)

    • Breaking change: tensor_product_simp and its helper functions have been deprecated as the transformations they apply are now handled automatically using _constructor_postprocessor_mapping. (#27407 by @ellisonbg)

    • Breaking change: The IdentityOperator class in sympy.physics.quantum has been deprecated. Please use S.One in the future as the multiplicative identity for quantum operators and states. (#27397 by @ellisonbg)

    • All quantum expressions (operators and states) now have a proper free_symbols property, which is needed for them to work with Sum. (#27395 by @ellisonbg)

    • qapply now handles Sum instances in quantum expressions. (#27395 by @ellisonbg)

    • A bug in Qubit.measure_all_oneshot was fixed. Previously measuring measure_all_oneshot(Qubit(0)) would return incorrectly |01>. Now Qubit.measure_all_oneshot(Qubit(0)) returns correct results |0> (#27105 by @groncarolo)

  • physics.secondquant

  • physics.vector

    • Add a redirect to the top level explanation page from the old url in the reference section. (#27500 by @moorepants)

    • A bug in pretty printing of vectors was fixed. Previously an exception would be raised when printing the zero vector. (#26801 by @oscarbenjamin)

    • Moved files in the API Reference to Explanation (#26727 by @eh111eh)

  • physics.wigner

  • polys

    • Fixed a bug where primitive_element returned non-canonical minimal polynomials. (#27809 by @ForeverHaibara)

    • New rs_asinh function in ring_series module to compute arcsinh Taylor series at x=0. (#27764 by @Jatinbhardwaj-093)

    • Fix TypeError in rs_series by ensuring prec is always an integer when handling rational exponents. (#27702 by @Jatinbhardwaj-093)

    • A memory leak caused by using many polynomial rings is fixed by not "caching" all rings permanently in memory. Elements of polynomial rings no longer use dynamically created classes. (#27577 by @oscarbenjamin)

    • A new PuiseuxRing type is added that can represent "polynomials" with negative or fractional exponents. These are used in the ring_series module to represent truncated Puiseux series. (#27577 by @oscarbenjamin)

    • BREAKING CHANGE: Using polynomial rings with the ring_series module now only works for series that have nonnegative integer exponents. For series with negative or fractional exponents the PuiseuxRing type must be used instead. (#27577 by @oscarbenjamin)

    • BREAKING CHANGE: True division like a / b with elements of polynomial rings now computes an exact division (exquo) rather than floor division. For floor division use a // b. (#27577 by @oscarbenjamin)

    • Added a unit check for the constant term in _series_inversion1 function of ring_series to ensure valid series inversion. (#27637 by @Jatinbhardwaj-093)
    • Enhanced GroebnerBasis.reduce method to accept Poly objects instead of just Expr objects. (#27598 by @aasim-maverick)

    • Added new factor_system function to find all possible factor combinations that satisfy a system of equations. (#27169 by @aasim-maverick)

    • minpoly no longer errors on unevaluate exp numbers (via import _is_surd_sum) (#27075 by @smichr)

    • cancel can accept a tuple or Tuple but it must now be of length 2; any other length will raise an error (#27098 by @smichr)

    • Implement gcdex for Field and GaussianIntegerRing (#26983 by @isuruf)

    • Set ZZ_I.is_PID to be true (#26983 by @isuruf)

    • duplicate factors are now collected by factor_list (#24665 by @Ishanned and @smichr)

    • It is now possible to compute the roots of polynomials with algebraic coefficients as RootOf using real_roots(p, extension=True) or all_roots(p, extension=True). (#26945 by @mmaaz-git)

    • fixed minpoly to not return -x**2 instead of x for an unsimplified value of 0 comprised of a difference of square roots (#26919 by @oscarbenjamin and @smichr)

    • The RR and CC domains now use mpmath's mpf and mpc types directly rather than making custom subclasses of mpf, mpc and PythonMPContext. This ensures that only mpmath's public interface is used. This also means that elements of RR and CC no longer have a .parent attribute (as is also the case for ZZ , QQ and GF(p)). A bug causing all RealField domains to share a global precision setting was also fixed. The tolerance parameter of RealField and ComplexField is also removed. (#26861 by @oscarbenjamin)

    • BREAKING CHANGE: The elements of RR and CC no longer have a .parent() method. This is because they are no plain mpmath mpf and mpc instances rather than subclasses. (#26861 by @oscarbenjamin)

    • A bug in count_roots for polynomials over real algebraic extension fields was fixed. Previously incorrect results were returned when counting roots over a domain like QQ.algebraic_field(sqrt(2)). (#26813 by @oscarbenjamin)

    • Elements of algebraic numberfields are converted to simpler expressions in many cases when converted back to ordinary expressions. This can lead to big simplifications of expressions generated when using algebraic fields with multiple generators of types like RootOf that do not simplify automatically in the Expr representation. (#26816 by @oscarbenjamin)

    • The Poly.lift() method has been improved to use resultants. Previously it would fail with an exception in some cases. It now can return lower degree polynomials in many cases as well. (#26812 by @oscarbenjamin)

    • RootOf.is_algebraic now returns True. This means that Poly(..., extension=True) can correctly construct extension fields when RootOf are in the coefficients. (#26806 by @oscarbenjamin and @smichr)

    • Flint's univariate nmod_poly or fmpz_mod_poly types are used by Poly/DMP for polynomials over GF(p) when the ground types are set to "flint". This makes many operations with univariate polynomials over GF(p) much faster. (#25940 by @oscarbenjamin)

    • A bug in poly(expr) involving mixed integer and rational coefficients was fixed. This indirectly fixes some other things like solve for some inputs where previously an exception was raised. (#26666 by @oscarbenjamin)

  • printing

    • Breaking change: The aesaracode in sympy.printing has been deprecated. (#27935 by @vprayag2005)

    • Updates the rust printer to reflect the reserved words in the 2024 edition. (#27919 by @RCoder01)

    • Add disable_split_super_sub option to print_mathml to stop symbol names being split into name, superscript, and subscript parts. (#27849 by @dbrnz)

    • Added new PyTorch printer module for lambdify (#27760 by @clayton-r and @synthetic-tensors)

    • Fixed a bug with printing of sympy.sign in Rust. Formerly, the printed expression returned +-1 for arguments of 0, which does not match the definition of sympy.sign. (#27736 by @aaron-skydio)

    • CmathPrinter was implemented to print cmath functions correctly in lambdified code. (#27552 by @krishnavbajoria02)

    • Fixed missing space in translation of 'Not' in pycode printer. (#27462 by @kletzi)

    • Fixed the printing of Julia sinc expressions (#27308 by @kjakatter)

    • Fixed the argument order when printing a two-argument ArcTan Mathematica expression (#27307 by @kjakatter)

    • Fixed handling of LaTeX-style symbols in test_lambdify_LaTeX_symbols_issue_23374 by accounting for possible substitution with Dummy symbols during lambdify. (#27269 by @Ytemiloluwa)

    • Added log10 to the list of C89 functions (#27243 by @kjakatter)

    • Fixed errors of NumPyPrinter from printing Array with more than 2 dimensions. For example, NumPyPrinter().doprint(Array([[[1, 2, 3]]])). (#27153 by @sylee957)

    • Fixed issues that NumPyPrinter prints arrays with wrong shape for Array with some 0 in the shape. For example, NumPyPrinter().doprint(Array([], (0, 1))) (#27153 by @sylee957)

    • Fixed issues that sstr gives errors for Array with some 0 in the shape. For example, sstr(Array([], (0, 1))). (#27153 by @sylee957)

    • Replaced deprecated mfenced for MathML printer. (#27137 by @sylee957)

    • Replaced deprecated fraktur attribute for MathML printer. (#27137 by @sylee957)

    • Implemented LaTeX printing of DotProduct for matrix expressions. (#27135 by @sylee957)

    • dps can now be passed as a keyword for StrPrinter to control the number of digits shown (#27043 by @VectorNd)

    • Subclasses of CodePrinter can now customize printing of Derivative instances by implementing e.g. _print_Derivative_zeta(args, deriv_orders). This allows lambdify to work with expressions involving unexpanded Derivative instances. (#26678 by @bjodah)

    • Rust codegen now automatically casts integers to floats in mixed expressions to prevent compilation errors (#26882 by @gfrlv)

    • A bug in the LaTeX printer causing an infinite recursion for some inputs was fixed. (#26884 by @oscarbenjamin)
  • series

  • simplify

    • Refactored forward_jacobian function to be private and handle dynamicsymbols. (#26773 by @brocksam and @ricdigi)

    • Optimized DAG to canonical expression tree transformations. (#26773 by @brocksam and @ricdigi)

    • Added a new class, CseExpr for expressions that have undergone common subexpression elimination. (#24649 by @brocksam)

    • Updated the cse function to return a (backwards compatible) instance of CseExpr. (#24649 by @brocksam)

    • Made radsimp handle non-Expr arguments. (#26720 by @ForeverHaibara)

  • solvers

    • solve will now reject matrices with symbolic shape. Previously it would go into an infinite loop. (#27928 by @vprayag2005)

    • Added extension=True option to solve_triangulated for computing solutions in algebraic fields using CRootOf. (#27688 by @ForeverHaibara)

    • A new function factor_system() is added to factorize a system of equations into subsystems consisting of only irreducible factors. Functions factor_system_bool(), factor_system_cond and factor_system_poly are also added to express a factorized system of equations in disjunctive normal form while preserving all information about degenerate cases of any symbolic parameters. (#27303 by @aasim-maverick)
    • clarify wording in the docs that there are no current plans to remove solve (#27343 by @klmcwhirter)

    • better removal of redundant solutions from systems of equations (#27020 by @smichr)

    • positive-dimensional systems of polynomials which raised an error may now report a solution (#27020 by @smichr)

    • Added a new test for wrong result integral. (#27025 by @bharatAmeria and @smichr)

    • Now diophantine() only returns a trivial solution under assumptions. (#26796 by @zylipku)

    • Fix a bug with cornacchia(). Formerly diophantine() and diop_quadratic() may miss some solutions for quadratic equations. (#26780 by @zylipku)

  • stats

  • tensor

    • doit is no longer automatically called on the result of TensExpr.expand (#27103 by @Kishore96in)

    • Calling expand on TensMul whose coeff is an Add now results in a TensAdd (earlier, no expansion would be performed) (#27103 by @Kishore96in)

    • TensAdd.contract_delta no longer raises an error for non-TensExpr arguments (#27056 by @Kishore96in and @smichr)

    • Fix a bug where TensAdd( K(p) , - 2*K(p) ).canon_bp() would raise an error. (#27030 by @Kishore96in)

    • Internal calls to doit() are now always shallow. (#27015 by @Kishore96in)

    • For any TensMul instance A, ensure that A.coeff*A.nocoeff == A is always true. (#26476 by @Kishore96in)

    • Calling subs on TensMul no longer leads to index conflicts in some cases (#26878 by @Kishore96in)

    • Marks ArraySymbol as not iterable to allow lambdify to work with ArraySymbols (#26809 by @amosson)

    • Matching now works for TensAdd (#26721 by @Kishore96in)

    • Matching now works for TensMul whose arguments all commute. (#26615 by @Kishore96in)

  • utilities

    • Added PyTorch backend support to lambdify (#27760 by @clayton-r and @synthetic-tensors)

    • Enhanced lambdify to support Python's built-in cmath module. (#27552 by @krishnavbajoria02)

    • Improved documentation for the helpers parameter in autowrap() and ufuncify() functions to clarify parameter format, types, and provide more comprehensive examples, including use of helper functions with multiple arguments. (#27496) (#27496 by @pratykshg9999)

    • lambdify now maps Min and Max to the numpy functions minimum and maximum. (#27483 by @bjodah)

    • It is now possible to pickle expressions containing undefined functions (like Function('f')). Previously trying to pickle such expressions would fail with an exception. (#26881 by @oscarbenjamin)

    • Fix a memory leak from lambdifying too many functions. (#27223 by @asmeurer)
    • lambdify now generates correct code for Sum instances running over multiple summation indices (nested sums). (#27155 by @bjodah)

    • Added support for passing already-CSEd expressions to lambdify directly. (#25797 by @brocksam)

  • vector

  • other

Authors

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

Thanks to everyone who contributed to this release!

  • Zexuan Zhou (Bruce)*
  • Anton Akhmerov
  • Aasim Ali*
  • Karan Anand*
  • Jean-François B*
  • Krishnav Bajoria*
  • Oscar Benjamin
  • bharatAmeria*
  • Jatin Bhardwaj*
  • Anutosh Bhat
  • Anurag Bhat
  • Akshansh Bhatt
  • Francesco Bonazzi
  • Michael Boyle
  • João Bravo
  • Sam Brockie
  • David Brooks*
  • Mathis Cros*
  • Björn Dahlgren
  • dependabot[bot]*
  • Amir Ebrahimi*
  • Corbet Elkins*
  • Steven Esquea*
  • Isuru Fernando
  • ForeverHaibara
  • George Frolov*
  • Soumendra Ganguly*
  • Matthias Geier
  • Mark van Gelder
  • Riccardo Di Girolamo
  • Aaron Gokaslan
  • Kishore Gopalakrishnan
  • Brian E. Granger
  • Shiyao Guo*
  • Pratyksh Gupta*
  • Harshit Gupta*
  • Oscar Gustafsson
  • Au Huishan*
  • Jan Jancar
  • Rishabh Kamboj*
  • Hwayeon Kang
  • Kris Katterjohn*
  • Agriya Khetarpal*
  • KJaybhaye*
  • Lucas Kletzander*
  • Victoria Koval*
  • Abhishek Kumar
  • Shishir Kushwaha
  • Håkon Kvernmoen*
  • Davi Laerte*
  • Nicholas Laustrup*
  • S.Y. Lee
  • Zhuoyuan Li*
  • Nikhil Maan
  • Muhammad Maaz*
  • Marek Madejski*
  • Leonardo Mangani*
  • Kevin McWhirter*
  • Rushabh Mehta*
  • Ivan A. Melnikov*
  • Ovsk Mendov*
  • Aaron Meurer
  • Aaron Miller
  • Gagan Mishra*
  • Jason Moore
  • Andrew Mosson*
  • MostafaGalal1*
  • Arnav Mummineni*
  • Arnab Nandi
  • Matt Ord*
  • Ishan Pandhare
  • Praveen Perumal*
  • Alejandro García Prada*
  • Clayton Rabideau*
  • Tilo Reneau-Cardoso
  • Roelof Rietbroek*
  • Voaides Negustor Robert*
  • João Rodrigues*
  • Guido Roncarolo*
  • Borek Saheli*
  • Hanspeter Schmid
  • Thangaraju Sibiraj*
  • Paramjit Singh*
  • Chris Smith
  • Henrique Soares
  • Harikrishna Srinivasan*
  • Peter Stahlecker*
  • Timo Stienstra
  • Daiki Takahashi
  • Prashant Tandon*
  • James Titus*
  • Gonzalo Tornaría*
  • Matthew Treinish*
  • Prayag V*
  • Matt Wang
  • Edward Z. Yang*
  • Quek Zi Yao*
  • Temiloluwa Yusuf [email protected] ytemiloluwa*

SHA256 hashes

d3d3fe8df1e5a0b42f0e7bdf50541697dbe7d23746e894990c030e2b05e72517 sympy-1.14.0.tar.gz e091cc3e99d2141a0ba2847328f5479b05d94a6635cb96148ccb3f34671bd8f5 sympy-1.14.0-py3-none-any.whl 4ac70c68d2b644c0c02b388da9206fe6620451a8874c9d4b0b44676a4a1af0cc sympy-docs-html-1.14.0.zip 48351ac0b1349c040ccaf34d08177b477c3747a0e0e5ce7175a4551587273859 sympy-docs-pdf-1.14.0.pdf

Clone this wiki locally