Thank you both for taking the time to give me some very helpful and interesting advice!
On Mon, 4 Aug 2025 at 20:51, Oscar Benjamin <[email protected]> wrote: > Also you can compute the Smith normal form or Hermite normal form > which can be used to check for the existence of solutions to a linear > system of diophantine equations: > > https://en.wikipedia.org/wiki/Diophantine_equation#System_of_linear_Diophantine_equations > > In [14]: A, b = linear_eq_to_matrix(eqnList, [h, l, m, n]) > > In [15]: dM = A.to_DM() > > In [16]: from sympy.matrices.normalforms import smith_normal_decomp > > In [17]: A > Out[17]: > ⎡0 1 0 -2⎤ > ⎢ ⎥ > ⎣2 1 -4 0 ⎦ > > In [18]: smith_normal_decomp(A) > Out[18]: > ⎛ ⎡0 1 2 -1⎤⎞ > ⎜ ⎢ ⎥⎟ > ⎜⎡1 0 0 0⎤ ⎡0 1⎤ ⎢1 -2 0 2 ⎥⎟ > ⎜⎢ ⎥, ⎢ ⎥, ⎢ ⎥⎟ > ⎜⎣0 2 0 0⎦ ⎣-1 1⎦ ⎢0 0 1 0 ⎥⎟ > ⎜ ⎢ ⎥⎟ > ⎝ ⎣0 0 0 1 ⎦⎠ > > In [19]: from sympy.matrices.normalforms import hermite_normal_form > > In [20]: hermite_normal_form(A) > Out[20]: > ⎡2 1⎤ > ⎢ ⎥ > ⎣0 1⎦ > > -- > Oscar > > On Mon, 4 Aug 2025 at 20:43, Oscar Benjamin <[email protected]> > wrote: > > > > The linsolve function does not check assumptions like integer=True. > > The solve function does but only as a final check. Neither of these > > really solves integer systems in the way that you would want here. > > > > The diophantine function is for integer equations but does not handle > > systems of equations so is also not what you want. > > > > I put some code that illustrates improvements to diophantine in this > issue: > > https://github.com/sympy/sympy/issues/20682 > > > > Using that code you have: > > > > In [9]: diop_new(eqnList, [h, l, m, n]) > > Out[9]: ∅ > > > > In [11]: diop_new([eqnList[0]], [h, l, m, n]) > > Out[11]: {((t₁, 2⋅t₀, t₂, t₀), (t₀, t₁, t₂), (ℤ, ℤ, ℤ))} > > > > In [13]: diop_new([eqnList[1]], [h, l, m, n]) > > Out[13]: {((t₀, 2⋅t₀ + 4⋅t₁ + 3, t₀ + t₁, t₂), (t₀, t₁, t₂), (ℤ, ℤ, ℤ))} > > > > That code is not well tested but you might find it useful. > > > > -- > > Oscar > > > > > > > > On Mon, 4 Aug 2025 at 15:06, Steve Collins <[email protected]> > wrote: > > > > > > Apologies if this is obvious, but I'm having trouble using solve to > find out if solutions exist or not (I don't really care what they are, just > whether or not there are any), for simultaneous equations with integer > variables. > > > > > > For the following example, which has no solutions, solve returns [] > (no solution), or a solution, depending on the order of the symbols given. > That is, it sometimes works but sometimes fails to realize that there is no > solution. > > > > > > For comparison, Mathematica seems to be correct, i.e. Reduce[l == 2 n > && 2 h + l - 4 m - 3 == 0, {h, l, n, m}, Integers] correctly returns > 'False'. Sympy linsolve, on the other hand, never gives a null result, so > it seems to do worse than solve. > > > > > > > > > Example Python code below. Any advice would be gratefully appreciated! > > > > > > from sympy import * > > > > > > (h, l, m, n) = symbols(['h', 'l', 'm', 'n'], integer = True) > > > > > > # these equations should have no solution as l must be both odd and > even > > > eqnList = [Eq(l, 2*n), Eq(2*h + l - 4*m - 3, 0)] > > > > > > # however, some orderings of the symbols to solve over fail to give no > solution (empty list) > > > print(solve(eqnList, [l, n, h, m] )) # returns [] - correct > > > print(solve(eqnList, [h, m, n, l] )) # returns {h: -l/2 + 2*m + 3/2, > n: l/2} - should give [] ? > > > > > > -- > > > You received this message because you are subscribed to the Google > Groups "sympy" group. > > > To unsubscribe from this group and stop receiving emails from it, send > an email to [email protected]. > > > To view this discussion visit > https://groups.google.com/d/msgid/sympy/0c23f1e5-15e8-4345-a961-f8be9728e127n%40googlegroups.com > . > > -- > You received this message because you are subscribed to the Google Groups > "sympy" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > To view this discussion visit > https://groups.google.com/d/msgid/sympy/CAHVvXxRgvFXM69Ko6ZWRJAw-JGfhh5nyhUwUWwcEn8oYu4rtZA%40mail.gmail.com > . > -- You received this message because you are subscribed to the Google Groups "sympy" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To view this discussion visit https://groups.google.com/d/msgid/sympy/CAMZ0ky5OjMCF9nUUODb9wVkKEc0c%2BuXrkBxrWdHc2nJcdZ1E3w%40mail.gmail.com.
