Ë
    7^(hŽ&  ã                   ó  — d Z ddlmZ ddlmZmZ ddlmZmZm	Z	m
Z
 ddlmZ ddlmZ ddlmZmZmZ dd	lmZ dd
lmZ ddlmZ ed„ «       Zed„ «       Zed„ «       Zed„ «       Zed„ «       Zed„ «       Zed„ «       Zedd„«       Z y)z¥
This module implements sums and products containing the Kronecker Delta function.

References
==========

.. [1] https://mathworld.wolfram.com/KroneckerDelta.html

é   )Úproduct)ÚSumÚ	summationé    )ÚAddÚMulÚSÚDummy)Úcacheit)Údefault_sort_key)ÚKroneckerDeltaÚ	PiecewiseÚpiecewise_fold)Úfactor)ÚInterval)Úsolvec                 óD  — | j                   s| S d}t        }t        j                  g}| j                  D ]\  }|€F|j
                  r:t        ||«      r.d}|j                  }|j                  D �cg c]
  }|d   |z  ‘Œ }}ŒK|D �cg c]  }||z  ‘Œ	 }}Œ^  ||Ž S c c}w c c}w )zB
    Expand the first Add containing a simple KroneckerDelta.
    NTr   )Úis_Mulr   r	   ÚOneÚargsÚis_AddÚ_has_simple_deltaÚfunc)ÚexprÚindexÚdeltar   ÚtermsÚhÚts          úR/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/sympy/concrete/delta.pyÚ_expand_deltar!      s¥   € ð
 �;Š;ØˆØ€EÜ€DÜ�U‰UˆG€EØ�Y‰Yò )ˆØˆ=˜QŸXšXÔ*;¸A¸uÔ*EØˆEØ—6‘6ˆDØ)*¯©Ö0 A�U˜1‘X˜a“ZÐ0ˆEÑ0à"'Ö(˜Q�Q�q“SÐ(ˆEÑ(ð)ñ �ˆ<Ðùò 1ùâ(s   Á-BÂBc                 ó$  — t        | |«      sd| fS t        | t        «      r| t        j                  fS | j
                  st        d«      ‚d}g }| j                  D ]$  }|€t        ||«      r|}Œ|j                  |«       Œ& | | j                  |Ž fS )a”  
    Extract a simple KroneckerDelta from the expression.

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

    Returns the tuple ``(delta, newexpr)`` where:

      - ``delta`` is a simple KroneckerDelta expression if one was found,
        or ``None`` if no simple KroneckerDelta expression was found.

      - ``newexpr`` is a Mul containing the remaining terms; ``expr`` is
        returned unchanged if no simple KroneckerDelta expression was found.

    Examples
    ========

    >>> from sympy import KroneckerDelta
    >>> from sympy.concrete.delta import _extract_delta
    >>> from sympy.abc import x, y, i, j, k
    >>> _extract_delta(4*x*y*KroneckerDelta(i, j), i)
    (KroneckerDelta(i, j), 4*x*y)
    >>> _extract_delta(4*x*y*KroneckerDelta(i, j), k)
    (None, 4*x*y*KroneckerDelta(i, j))

    See Also
    ========

    sympy.functions.special.tensor_functions.KroneckerDelta
    deltaproduct
    deltasummation
    NzIncorrect expr)r   Ú
isinstancer   r	   r   r   Ú
ValueErrorr   Ú_is_simple_deltaÚappendr   )r   r   r   r   Úargs        r    Ú_extract_deltar(   )   s™   € ôD ˜T 5Ô)Ø�dˆ|ÐÜ�$œÔ'Ø”a—e‘eˆ}ÐØ�;Š;ÜÐ)Ó*Ð*Ø€EØ€Eà�y‰yò ˆØˆ=Ô-¨c°5Ô9Ø‰Eà�L‰L˜Õð	ð
 �9�4—9‘9˜eÐ$Ð%Ð%ó    c                 ó¶   ‡— | j                  t        «      rCt        | ‰«      ry| j                  s| j                  rt        ˆfd„| j                  D «       «      S y)zØ
    Returns True if ``expr`` is an expression that contains a KroneckerDelta
    that is simple in the index ``index``, meaning that this KroneckerDelta
    is nonzero for a single value of the index ``index``.
    Tc              3   ó6   •K  — | ]  }t        |‰«      –— Œ y ­w)N)r   )Ú.0r'   r   s     €r    ú	<genexpr>z$_has_simple_delta.<locals>.<genexpr>g   s   øè ø€ ÒJ¸Ô(¨¨e×4ÑJùs   ƒF)Úhasr   r%   r   r   Úanyr   )r   r   s    `r    r   r   \   sC   ø€ ð ‡x�x”ÔÜ˜D %Ô(ØØ�;Š;˜$Ÿ+š+ÜÓJÀÇ	Á	ÔJÓJÐJØr)   c                 óÌ   — t        | t        «      rT| j                  |«      rC| j                  d   | j                  d   z
  j	                  |«      }|r|j                  «       dk(  S y)zu
    Returns True if ``delta`` is a KroneckerDelta and is nonzero for a single
    value of the index ``index``.
    r   r   F)r#   r   r.   r   Úas_polyÚdegree)r   r   Úps      r    r%   r%   k   sT   € ô �%œÔ(¨U¯Y©Y°uÔ-=Ø�Z‰Z˜‰]˜UŸZ™Z¨™]Ñ*×3Ñ3°EÓ:ˆÙØ—8‘8“: ‘?Ð"Ør)   c           	      óŽ  — | j                   r0 | j                  t        t        t        | j
                  «      «      Ž S | j                  s| S g }g }| j
                  D ]R  }t        |t        «      r/|j                  |j
                  d   |j
                  d   z
  «       ŒB|j                  |«       ŒT |s| S t        |d¬«      }t        |«      dk(  rt        j                  S t        |«      dk(  rR||d   j                  «       D ��cg c]  \  }}t        ||«      ‘Œ c}}z  } | j                  |Ž }| |k7  rt	        |«      S | S c c}}w )z0
    Evaluate products of KroneckerDelta's.
    r   r   T©Údict)r   r   ÚlistÚmapÚ_remove_multiple_deltar   r   r#   r   r&   r   Úlenr	   ÚZeroÚitems)r   ÚeqsÚnewargsr'   ÚsolnsÚkÚvÚexpr2s           r    r9   r9   x   s  € ð
 ‡{‚{Øˆt�y‰yœ$œsÔ#9¸4¿9¹9ÓEÓFÐGÐGØ�;Š;ØˆØ
€CØ€GØ�y‰yò  ˆÜ�cœ>Ô*Ø�J‰J�s—x‘x ‘{ S§X¡X¨a¡[Ñ0Õ1à�N‰N˜3Õð	 ñ
 ØˆÜ�#˜DÔ!€EÜ
ˆ5ƒz�Q‚Ü�v‰vˆÜ	ˆU‹�qŠØ°U¸1±X·^±^Ó5E×F©T¨Q°”N 1 aÕ(ÓFÑFˆØ�—	‘	˜7Ð#ˆØ�5Š=Ü)¨%Ó0Ð0Ø€Kùó	 Gs   ÄEc           
      ó4  — t        | t        «      rq	 t        | j                  d   | j                  d   z
  d¬«      }|rBt	        |«      dk(  r4t        |d   j                  «       D ��cg c]  \  }}t        ||fŽ ‘Œ c}}Ž S | S | S c c}}w # t        $ r Y | S w xY w)zB
    Rewrite a KroneckerDelta's indices in its simplest form.
    r   r   Tr5   )r#   r   r   r   r:   r   r<   ÚNotImplementedError)r   ÚslnsÚkeyÚvalues       r    Ú_simplify_deltarH   •   s¤   € ô
 �$œÔ'ð	Ü˜Ÿ™ 1™¨¯	©	°!©Ñ4¸4Ô@ˆDÙœ˜D›	 QšÜØ.2°1©g¯m©m«o÷?Ù *  Uô ,¨c°5¨\Ò:ó ?ð @ð @ð €Kˆ4€Kùó	?øä"ò 	ØØ€Kð	ús$   ’AB
 Á'B
Á;B
 ÂB
 Â
	BÂBc                 óö  ‡‡‡	— ‰d   ‰d   z
  dk  dk(  rt         j                  S | j                  t        «      st	        | ‰«      S | j
                  �r_dŠg }t        | j                  t        ¬«      D ]'  }‰€t        |‰d   «      r|ŠŒ|j                  |«       Œ)  | j                  |Ž Š	t        dd¬«      }t        ‰d   t        «      rft        ‰d   t        «      rSt        ‰	‰«      t!        ˆˆˆ	fd	„t#        t        ‰d   «      t        ‰d   dz   «      «      D «       «      z   }t)        |«      S t        ‰	‰«      t%        t        ‰	‰d   ‰d   |dz
  f«      ‰j'                  ‰d   |«      z  t        ‰	‰d   |dz   ‰d   f«      z  |‰d   ‰d   ft        ‰	‰d   «      ¬
«      z   }t)        |«      S t+        | ‰d   «      \  Š}‰s6t-        | ‰d   «      }| |k7  r	 t/        t        |‰«      «      S t	        | ‰«      S t)        | j'                  ‰d   ‰d   «      t        ‰d   ‰d   «      z  «      t         j                  t3        t        ‰d   ‰d   dz
  «      «      z  z   S # t0        $ r t        |‰«      cY S w xY w)zÅ
    Handle products containing a KroneckerDelta.

    See Also
    ========

    deltasummation
    sympy.functions.special.tensor_functions.KroneckerDelta
    sympy.concrete.products.product
    é   r   r   TN)rF   Úkprime)Úintegerc           	   3   ó¬   •K  — | ]K  }t        ‰‰d    ‰d   |dz
  f«      ‰j                  ‰d    |«      z  t        ‰‰d    |dz   ‰d   f«      z  –— ŒM y­w)r   r   rJ   N)ÚdeltaproductÚsubs)r,   Úikr   ÚlimitÚnewexprs     €€€r    r-   zdeltaproduct.<locals>.<genexpr>Ã   su   øè ø€ ò 8àHJô 9EÀWÈuÐUVÉxÐY^Ð_`ÑYaÐceÐhiÑciÐNjÓ8kØ—
‘
˜5 ™8 RÓ(ñ9)ä˜W u¨Q¡x°°a±¸¸q¹Ð&BÓCõ9Dñ 8ùs   ƒAA)Úno_piecewise)r	   r   r.   r   r   r   Úsortedr   r   r   r&   r   r
   r#   ÚintrN   ÚsumÚrangeÚdeltasummationrO   r9   r(   r!   r   ÚAssertionErrorrH   )
ÚfrQ   r   r'   r@   ÚresultÚ_Úgr   rR   s
    `      @@r    rN   rN   ¥   s—  ú€ ð 
ˆq‰�E˜!‘HÑ	 Ñ! dÒ*Ü�u‰uˆà�5‰5”Ô Ü�q˜%Ó Ð à‡xƒxàˆØˆÜ˜!Ÿ&™&Ô&6Ô7ò 	"ˆCØˆ}Ô!2°3¸¸a¹Ô!AØ‘à—‘˜SÕ!ð		"ð
 �!—&‘&˜%�.ˆÜ�( DÔ)ˆÜ�e˜A‘h¤Ô$¬°E¸!±H¼cÔ)BÜ! '¨5Ó1´Cõ 8äNSÔTWÐX]Ð^_ÑX`ÓTaÔcfÐglÐmnÑgoÐrsÑgsÓctÓNuô8ó 5ñ ˆFô & fÓ-Ð-ô " '¨5Ó1´NÜ˜W u¨Q¡x°°q±¸1¸q¹5Ð&AÓBØ—
‘
˜5 ™8 QÓ'ñ(ä˜W u¨Q¡x°°Q±¸¸a¹Ð&AÓBñCð �E˜!‘H˜e A™hÐ'Ü.¨w¸¸a¹ÓAô5ñ ˆFô & fÓ-Ð-ä˜a  q¡Ó*�H€Eˆ1áÜ˜!˜U 1™XÓ&ˆØ�Š6ð.Üœl¨1¨eÓ4Ó5Ð5ô �q˜%Ó Ð ä! !§&¡&¨¨q©°5¸±8Ó"<¼^ÈEÐRSÉHÐV[Ð\]ÑV^Ó=_Ñ"_Ó`Ü	�‰Œoœn¨U°1©X°u¸Q±xÀ!±|ÓDÓEÑEñFð Føô	 "ò .Ü# A uÓ-Ò-ð.ús   ÇI  É I8É7I8c                 óp  — |d   |d   z
  dk  dk(  rt         j                  S | j                  t        «      st	        | |«      S |d   }t        | |«      }|j                  r;t         |j                  |j                  D �cg c]  }t        |||«      ‘Œ c}Ž «      S t        ||«      \  }}|�9|j                  �-|j                  \  }}	|d   |z
  dk  dk(  r|d   |	z
  dk\  dk(  rd}|st	        | |«      S t        |j                  d   |j                  d   z
  |«      }
t        |
«      dk(  rt         j                  S t        |
«      dk7  rt        | |«      S |
d   }|r|j!                  ||«      S t#        |j!                  ||«      t%        |dd Ž j'                  |«      ft         j                  df«      S c c}w )aw  
    Handle summations containing a KroneckerDelta.

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

    The idea for summation is the following:

    - If we are dealing with a KroneckerDelta expression, i.e. KroneckerDelta(g(x), j),
      we try to simplify it.

      If we could simplify it, then we sum the resulting expression.
      We already know we can sum a simplified expression, because only
      simple KroneckerDelta expressions are involved.

      If we could not simplify it, there are two cases:

      1) The expression is a simple expression: we return the summation,
         taking care if we are dealing with a Derivative or with a proper
         KroneckerDelta.

      2) The expression is not simple (i.e. KroneckerDelta(cos(x))): we can do
         nothing at all.

    - If the expr is a multiplication expr having a KroneckerDelta term:

      First we expand it.

      If the expansion did work, then we try to sum the expansion.

      If not, we try to extract a simple KroneckerDelta term, then we have two
      cases:

      1) We have a simple KroneckerDelta term, so we return the summation.

      2) We did not have a simple term, but we do have an expression with
         simplified KroneckerDelta terms, so we sum this expression.

    Examples
    ========

    >>> from sympy import oo, symbols
    >>> from sympy.abc import k
    >>> i, j = symbols('i, j', integer=True, finite=True)
    >>> from sympy.concrete.delta import deltasummation
    >>> from sympy import KroneckerDelta
    >>> deltasummation(KroneckerDelta(i, k), (k, -oo, oo))
    1
    >>> deltasummation(KroneckerDelta(i, k), (k, 0, oo))
    Piecewise((1, i >= 0), (0, True))
    >>> deltasummation(KroneckerDelta(i, k), (k, 1, 3))
    Piecewise((1, (i >= 1) & (i <= 3)), (0, True))
    >>> deltasummation(k*KroneckerDelta(i, j)*KroneckerDelta(j, k), (k, -oo, oo))
    j*KroneckerDelta(i, j)
    >>> deltasummation(j*KroneckerDelta(i, j), (j, -oo, oo))
    i
    >>> deltasummation(i*KroneckerDelta(i, j), (i, -oo, oo))
    j

    See Also
    ========

    deltaproduct
    sympy.functions.special.tensor_functions.KroneckerDelta
    sympy.concrete.sums.summation
    rJ   r   r   Té   )r	   r;   r.   r   r   r!   r   r   r   r   rX   r(   Údelta_ranger   r:   r   rO   r   r   Úas_relational)rZ   rQ   rS   Úxr]   r   r   r   ÚdinfÚdsupr?   rG   s               r    rX   rX   à   s²  € ðH 
ˆq‰�E˜!‘HÑ	 Ñ! dÒ*Ü�v‰vˆà�5‰5”Ô Ü˜˜EÓ"Ð"àˆa‰€Aä�a˜Ó€AØ‡x‚xÜØˆA�F‰FÀQÇVÁVÖLÀ”^ A u¨lÕ;ÒLÐMóOð 	Oô !  AÓ&�K€Eˆ4àÐ × 1Ñ 1Ð =Ø×&Ñ&‰
ˆˆdØ�!‰H�t‰O˜qÑ  TÒ)¨u°Q©x¸$©À!Ñ/CÈÒ.LØˆLáÜ˜˜EÓ"Ð"ä�%—*‘*˜Q‘- %§*¡*¨Q¡-Ñ/°Ó3€EÜ
ˆ5ƒz�Q‚Ü�v‰vˆÜ	ˆU‹�qŠÜ�1�e‹}ÐØ�!‰H€EÙØ�y‰y˜˜EÓ"Ð"ÜØ	�‰�1�eÓ	œh¨¨a°¨
Ð3×AÑAÀ%ÓHÐIÜ	
�‰�ˆóð ùò+ Ms   Á?F3N)F)!Ú__doc__Úproductsr   Ú
summationsr   r   Ú
sympy.corer   r   r	   r
   Úsympy.core.cacher   Úsympy.core.sortingr   Úsympy.functionsr   r   r   Úsympy.polys.polytoolsr   Úsympy.sets.setsr   Úsympy.solvers.solversr   r!   r(   r   r%   r9   rH   rN   rX   © r)   r    ú<module>rp      sÓ   ðñõ ß &ß )Ó )Ý $Ý /ß EÑ EÝ (Ý $Ý 'ð 	ñó 	ðð& 	ñ/&ó 	ð/&ðd 	ñó 	ðð 	ñ	ó 	ð	ð 	ñó 	ðð8 	ñó 	ðð 	ñ7Fó 	ð7Fðt 	òfó 	ñfr)   