I think we should put this on the docs page of the diophantine.

Alternatively it should be possible to provide the symbols directly:
>
> sol, = diophantine(x + y + z, [t_0, t_1])
>

If the user does not have any idea about the number of parameters in the
solution,
this won't work.

Thanks
Faisal

On Fri, Jul 17, 2020 at 6:53 PM Oscar Benjamin <[email protected]>
wrote:

> On Fri, 17 Jul 2020 at 13:42, Faisal Riyaz <[email protected]>
> wrote:
> >
> > How can I get a single solution of a diophantine equation when the
> solution is returned
> > in terms of independent parameters?
> >
> > >>> from sympy.abc import x, y, z, t
> > >>> from sympy import diophantine, Symbols
> > >>> diophantine(x + y + z, t)
> > {(t_0, t_1, -t_0 - t_1)}
> > >>> x, y, z = _.pop()
> >
> > Substitution does not work:
> > >>> t_0, t_1 = Symbols('t_0 t_1')
> > >>> x.subs(t_0, 1)
> > t_0
> > >>> y.subs(t_1, 1)
> > t_1
> > >>> z.subs({t_0: 1, t_1: 1})
> > -t_0 - t_1
>
> This is because symbols in sympy only match if they have the same
> assumptions:
>
> In [23]: (x, y, z), = diophantine(x + y + z, t)
>
> In [24]: x
> Out[24]: t₀
>
> In [25]: type(x)
> Out[25]: sympy.core.symbol.Symbol
>
> In [26]: x.name
> Out[26]: 't_0'
>
> In [28]: x.assumptions0
> Out[28]:
> {'integer': True,
>  'complex': True,
>  'commutative': True,
>  'rational': True,
>  'algebraic': True,
>  'extended_real': True,
>  'imaginary': False,
>  'real': True,
>  'irrational': False,
>  'hermitian': True,
>  'finite': True,
>  'infinite': False,
>  'transcendental': False,
>  'noninteger': False}
>
> In [29]: x == Symbol('t_0')
> Out[29]: False
>
> In [30]: x == Symbol('t_0', integer=True)
> Out[30]: True
>
>
> If we use integer=True then the substitution will work:
>
> In [31]: t_0, t_1 = symbols('t_0, t_1', integer=True)
>
> In [32]: tuple(s.subs({t_0:0, t_1:0}) for s in (x, y, z))
> Out[32]: (0, 0, 0)
>
>
> Note that this kind of situation was discussed in a recent thread and
> you can use free symbols:
>
> In [1]: sol, = diophantine(x + y + z, t)
>
> In [2]: sol
> Out[2]: (t₀, t₁, -t₀ - t₁)
>
> In [3]: syms = Tuple(*sol).free_symbols
>
> In [4]: rep = {s: 0 for s in syms}
>
> In [5]: tuple(s.subs(rep) for s in sol)
> Out[5]: (0, 0, 0)
>
>
> Personally I think it's a poor API that inserts new symbols without
> also returning the list of those symbols and it would be better if it
> was like:
>
> (sol, params), = diophantine(x + y + z, t)
>
> Here params would directly return (t_0, t_1) for further use.
>
> Alternatively it should be possible to provide the symbols directly:
>
> sol, = diophantine(x + y + z, [t_0, t_1])
>
>
> Oscar
>
> --
> 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 on the web visit
> https://groups.google.com/d/msgid/sympy/CAHVvXxRgbgxzfP8AU-Ak9rdy53fgPQQx2kYKA3L4yqyeMb2pjQ%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 on the web visit 
https://groups.google.com/d/msgid/sympy/CAEe-xqT8itQMpfBHAhMF8_QSOL19qHJ0u5WzayrYhJHq9_fUBA%40mail.gmail.com.

Reply via email to