ó
    ‰*£hX,  ã                   óT   • S SK Jr  S SKJr  S SKJr   " S S\5      r " S S\5      rg)	é    )ÚExprWithLimits)ÚS)ÚEqc                   ó,   ^ • \ rS rSrSrU 4S jrSrU =r$ )ÚReorderErroré   z;
Exception raised when trying to reorder dependent limits.
c                 ó4   >• [         TU ]  U< SU< S35        g )Nz could not be reordered: Ú.)ÚsuperÚ__init__)ÚselfÚexprÚmsgÚ	__class__s      €Ú_/home/mande/repo/quber/.venv/lib/python3.13/site-packages/sympy/concrete/expr_with_intlimits.pyr   ÚReorderError.__init__	   s   ø€ Ü‰ÑÛ04³cÐ:õ	<ó    © )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r   Ú__static_attributes__Ú__classcell__)r   s   @r   r   r      s   ø† ñ÷<ó <r   r   c                   óH   • \ rS rSrSrSrS
S jrS rS rS r	\
S	 5       rSrg)ÚExprWithIntLimitsé   z¢
Superclass for Product and Sum.

See Also
========

sympy.concrete.expr_with_limits.ExprWithLimits
sympy.concrete.products.Product
sympy.concrete.summations.Sum
r   Nc                 ó(  • Uc  Un/ nU R                    GH6  nUS   U:X  Ga  UR                  U5      nUR                  5       S:w  a  [        S5      eUR	                  U5      nUR	                  [
        R                  5      nUR                  (       a  U[
        R                  :X  a&  UR                  X7US   -  U-   XuS   -  U-   45        M¹  U[
        R                  :X  a&  UR                  X7US   -  U-   XuS   -  U-   45        Mó  [        S5      eUR                  X7US   -  U-   XuS   -  U-   45        GM%  UR                  U5        GM9     U R                  R                  XW-
  W-  5      n	U	R                  X5      n	U R                  " U	/UQ76 $ )aw	  
Change index of a Sum or Product.

Perform a linear transformation `x \mapsto a x + b` on the index variable
`x`. For `a` the only values allowed are `\pm 1`. A new variable to be used
after the change of index can also be specified.

Explanation
===========

``change_index(expr, var, trafo, newvar=None)`` where ``var`` specifies the
index variable `x` to transform. The transformation ``trafo`` must be linear
and given in terms of ``var``. If the optional argument ``newvar`` is
provided then ``var`` gets replaced by ``newvar`` in the final expression.

Examples
========

>>> from sympy import Sum, Product, simplify
>>> from sympy.abc import x, y, a, b, c, d, u, v, i, j, k, l

>>> S = Sum(x, (x, a, b))
>>> S.doit()
-a**2/2 + a/2 + b**2/2 + b/2

>>> Sn = S.change_index(x, x + 1, y)
>>> Sn
Sum(y - 1, (y, a + 1, b + 1))
>>> Sn.doit()
-a**2/2 + a/2 + b**2/2 + b/2

>>> Sn = S.change_index(x, -x, y)
>>> Sn
Sum(-y, (y, -b, -a))
>>> Sn.doit()
-a**2/2 + a/2 + b**2/2 + b/2

>>> Sn = S.change_index(x, x+u)
>>> Sn
Sum(-u + x, (x, a + u, b + u))
>>> Sn.doit()
-a**2/2 - a*u + a/2 + b**2/2 + b*u + b/2 - u*(-a + b + 1) + u
>>> simplify(Sn.doit())
-a**2/2 + a/2 + b**2/2 + b/2

>>> Sn = S.change_index(x, -x - u, y)
>>> Sn
Sum(-u - y, (y, -b - u, -a - u))
>>> Sn.doit()
-a**2/2 - a*u + a/2 + b**2/2 + b*u + b/2 - u*(-a + b + 1) + u
>>> simplify(Sn.doit())
-a**2/2 + a/2 + b**2/2 + b/2

>>> P = Product(i*j**2, (i, a, b), (j, c, d))
>>> P
Product(i*j**2, (i, a, b), (j, c, d))
>>> P2 = P.change_index(i, i+3, k)
>>> P2
Product(j**2*(k - 3), (k, a + 3, b + 3), (j, c, d))
>>> P3 = P2.change_index(j, -j, l)
>>> P3
Product(l**2*(k - 3), (k, a + 3, b + 3), (l, -d, -c))

When dealing with symbols only, we can make a
general linear transformation:

>>> Sn = S.change_index(x, u*x+v, y)
>>> Sn
Sum((-v + y)/u, (y, b*u + v, a*u + v))
>>> Sn.doit()
-v*(a*u - b*u + 1)/u + (a**2*u**2/2 + a*u*v + a*u/2 - b**2*u**2/2 - b*u*v + b*u/2 + v)/u
>>> simplify(Sn.doit())
a**2*u/2 + a/2 - b**2*u/2 + b/2

However, the last result can be inconsistent with usual
summation where the index increment is always 1. This is
obvious as we get back the original value only for ``u``
equal +1 or -1.

See Also
========

sympy.concrete.expr_with_intlimits.ExprWithIntLimits.index,
reorder_limit,
sympy.concrete.expr_with_intlimits.ExprWithIntLimits.reorder,
sympy.concrete.summations.Sum.reverse_order,
sympy.concrete.products.Product.reverse_order
r   é   z"Index transformation is not linearé   z>Linear transformation results in non-linear summation stepsize)ÚlimitsÚas_polyÚdegreeÚ
ValueErrorÚcoeff_monomialr   ÚOneÚ	is_numberÚappendÚNegativeOneÚfunctionÚsubsÚfunc)
r   ÚvarÚtrafoÚnewvarr"   ÚlimitÚpÚalphaÚbetar+   s
             r   Úchange_indexÚExprWithIntLimits.change_index   sq  € ðr ‰>ØˆFàˆØ—[•[ˆEØ�Q‰x˜3ŒØ—M‘M #Ó&�Ø—8‘8“: “?Ü$Ð%IÓJÐJØ×(Ñ(¨Ó-�Ø×'Ñ'¬¯©Ó.�Ø—?—?Ø¤§¡“~ØŸ™ v°U¸1±X©~ÀÑ/DÀeÐRSÉHÁnÐW[ÑF[Ð&\Ö]Ø¤!§-¡-Ó/ØŸ™ v°U¸1±X©~ÀÑ/DÀeÐRSÉHÁnÐW[ÑF[Ð&\Ö]ä(Ð)iÓjÐjð —M‘M 6°°q±©>¸DÑ+@À%ÈaÉÁ.ÐSWÑBWÐ"X×Yà—‘˜e×$ñ% !ð( —=‘=×%Ñ% c°$©J¸Ñ+=Ó>ˆØ—=‘= Ó-ˆà�yŠy˜Ð+ FÒ+Ð+r   c                 ó¬   • U R                    Vs/ s H  o"S   PM	     nnUR                  U5      S:w  a  [        U S5      eUR                  U5      $ s  snf )a   
Return the index of a dummy variable in the list of limits.

Explanation
===========

``index(expr, x)``  returns the index of the dummy variable ``x`` in the
limits of ``expr``. Note that we start counting with 0 at the inner-most
limits tuple.

Examples
========

>>> from sympy.abc import x, y, a, b, c, d
>>> from sympy import Sum, Product
>>> Sum(x*y, (x, a, b), (y, c, d)).index(x)
0
>>> Sum(x*y, (x, a, b), (y, c, d)).index(y)
1
>>> Product(x*y, (x, a, b), (y, c, d)).index(x)
0
>>> Product(x*y, (x, a, b), (y, c, d)).index(y)
1

See Also
========

reorder_limit, reorder, sympy.concrete.summations.Sum.reverse_order,
sympy.concrete.products.Product.reverse_order
r   r    z0Number of instances of variable not equal to one)r"   Úcountr%   Úindex)r   Úxr1   Ú	variabless       r   r9   ÚExprWithIntLimits.index‘   sQ   € ð> ,0¯;ª;Ó7ª; %˜1”X©;ˆ	Ð7à�?‰?˜1Ó Ó"Ü˜TÐ#UÓVÐVà—?‘? 1Ó%Ð%ùò 8s   �Ac                 ó8  • U nU H‘  n[        U5      S:w  a  [        US5      eUS   nUS   n[        US   [        5      (       d  U R	                  US   5      n[        US   [        5      (       d  U R	                  US   5      nUR                  XE5      nM“     U$ )aò  
Reorder limits in a expression containing a Sum or a Product.

Explanation
===========

``expr.reorder(*arg)`` reorders the limits in the expression ``expr``
according to the list of tuples given by ``arg``. These tuples can
contain numerical indices or index variable names or involve both.

Examples
========

>>> from sympy import Sum, Product
>>> from sympy.abc import x, y, z, a, b, c, d, e, f

>>> Sum(x*y, (x, a, b), (y, c, d)).reorder((x, y))
Sum(x*y, (y, c, d), (x, a, b))

>>> Sum(x*y*z, (x, a, b), (y, c, d), (z, e, f)).reorder((x, y), (x, z), (y, z))
Sum(x*y*z, (z, e, f), (y, c, d), (x, a, b))

>>> P = Product(x*y*z, (x, a, b), (y, c, d), (z, e, f))
>>> P.reorder((x, y), (x, z), (y, z))
Product(x*y*z, (z, e, f), (y, c, d), (x, a, b))

We can also select the index variables by counting them, starting
with the inner-most one:

>>> Sum(x**2, (x, a, b), (x, c, d)).reorder((0, 1))
Sum(x**2, (x, c, d), (x, a, b))

And of course we can mix both schemes:

>>> Sum(x*y, (x, a, b), (y, c, d)).reorder((y, x))
Sum(x*y, (y, c, d), (x, a, b))
>>> Sum(x*y, (x, a, b), (y, c, d)).reorder((y, 0))
Sum(x*y, (y, c, d), (x, a, b))

See Also
========

reorder_limit, index, sympy.concrete.summations.Sum.reverse_order,
sympy.concrete.products.Product.reverse_order
r!   zInvalid number of argumentsr   r    )Úlenr%   Ú
isinstanceÚintr9   Úreorder_limit)r   ÚargÚnew_exprÚrÚindex1Úindex2s         r   ÚreorderÚExprWithIntLimits.reorder·   sœ   € ð\ ˆãˆAÜ�1‹v˜‹{Ü  Ð$AÓBÐBà�q‘TˆFØ�q‘TˆFä˜a ™d¤C×(Ñ(ØŸ™ A a¡DÓ)�Ü˜a ™d¤C×(Ñ(ØŸ™ A a¡DÓ)�à×-Ñ-¨fÓ=ŠHñ ð ˆr   c                 ó8  • U R                    Vs1 s H  o3S   iM	     nnU R                   U   nU R                   U   n[        [        US   R                  5      R	                  U5      5      S:X  Ga  [        [        US   R                  5      R	                  U5      5      S:X  aå  [        [        US   R                  5      R	                  U5      5      S:X  a±  [        [        US   R                  5      R	                  U5      5      S:X  a}  / n[        U R                   5       HF  u  pƒX�:X  a  UR                  U5        M  X‚:X  a  UR                  U5        M5  UR                  U5        MH     [        U 5      " U R                  /UQ76 $ [        U S5      es  snf )a}  
Interchange two limit tuples of a Sum or Product expression.

Explanation
===========

``expr.reorder_limit(x, y)`` interchanges two limit tuples. The
arguments ``x`` and ``y`` are integers corresponding to the index
variables of the two limits which are to be interchanged. The
expression ``expr`` has to be either a Sum or a Product.

Examples
========

>>> from sympy.abc import x, y, z, a, b, c, d, e, f
>>> from sympy import Sum, Product

>>> Sum(x*y*z, (x, a, b), (y, c, d), (z, e, f)).reorder_limit(0, 2)
Sum(x*y*z, (z, e, f), (y, c, d), (x, a, b))
>>> Sum(x**2, (x, a, b), (x, c, d)).reorder_limit(1, 0)
Sum(x**2, (x, c, d), (x, a, b))

>>> Product(x*y*z, (x, a, b), (y, c, d), (z, e, f)).reorder_limit(0, 2)
Product(x*y*z, (z, e, f), (y, c, d), (x, a, b))

See Also
========

index, reorder, sympy.concrete.summations.Sum.reverse_order,
sympy.concrete.products.Product.reverse_order
r   r    r!   z.could not interchange the two limits specified)
r"   r>   ÚsetÚfree_symbolsÚintersectionÚ	enumerater)   Útyper+   r   )	r   r:   Úyr1   r.   Úlimit_xÚlimit_yr"   Úis	            r   rA   ÚExprWithIntLimits.reorder_limitø   sJ  € ð@ &*§[¢[Ó1¢[˜E�QŒx¡[ˆÐ1Ø—+‘+˜a‘.ˆØ—+‘+˜a‘.ˆä”�G˜A‘J×+Ñ+Ó,×9Ñ9¸#Ó>Ó?À1ÔDÜ”�G˜A‘J×+Ñ+Ó,×9Ñ9¸#Ó>Ó?À1ÓDÜ”�G˜A‘J×+Ñ+Ó,×9Ñ9¸#Ó>Ó?À1ÓDÜ”�G˜A‘J×+Ñ+Ó,×9Ñ9¸#Ó>Ó?À1ÓDàˆFÜ% d§k¡kÖ2‘�Ø“6Ø—M‘M 'Ö*Ø“VØ—M‘M 'Ö*à—M‘M %Ö(ñ 3ô ˜”:˜dŸm™mÐ5¨fÒ5Ð5ä˜tÐ%UÓVÐVùò) 2s   �Fc                 ó�   • SnU R                    H,  nUS   US   -
  n[        US5      nUS:X  a    gUS:X  a  M*  SnM.     U(       a  gg)a¹  
Returns True if the Sum or Product is computed for an empty sequence.

Examples
========

>>> from sympy import Sum, Product, Symbol
>>> m = Symbol('m')
>>> Sum(m, (m, 1, 0)).has_empty_sequence
True

>>> Sum(m, (m, 1, 1)).has_empty_sequence
False

>>> M = Symbol('M', integer=True, positive=True)
>>> Product(m, (m, 1, M)).has_empty_sequence
False

>>> Product(m, (m, 2, M)).has_empty_sequence

>>> Product(m, (m, M + 1, M)).has_empty_sequence
True

>>> N = Symbol('N', integer=True, positive=True)
>>> Sum(m, (m, N, M)).has_empty_sequence

>>> N = Symbol('N', integer=True, negative=True)
>>> Sum(m, (m, N, M)).has_empty_sequence
False

See Also
========

has_reversed_limits
has_finite_limits

Fr    r!   TN)r"   r   )r   Úret_NoneÚlimÚdifÚeqs        r   Úhas_empty_sequenceÚ$ExprWithIntLimits.has_empty_sequence.  sX   € ðN ˆØ—;”;ˆCØ�a‘&˜3˜q™6‘/ˆCÜ�C˜“ˆBØ�T‹zÙØ�u“Ùà’ñ ö ØØr   )N)r   r   r   r   r   Ú	__slots__r5   r9   rG   rA   ÚpropertyrY   r   r   r   r   r   r      s<   † ñ	ð €Iôt,òn$&òL>òB4Wðl ñ3ó ó3r   r   N)	Úsympy.concrete.expr_with_limitsr   Úsympy.core.singletonr   Úsympy.core.relationalr   ÚNotImplementedErrorr   r   r   r   r   Ú<module>ra      s)   ðÝ :Ý "Ý $ô<Ð&ô <ôU˜õ Ur   