§
    OŠtjŽ&  ã                   ó@  — 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 dS )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                 óê   ‡‡— | j         s| S d}t          }t          j        gŠ| j        D ]FŠ|€4‰j        r-t          ‰|¦  «        rd}‰j        }ˆfd„‰j        D ¦   «         ŠŒ8ˆfd„‰D ¦   «         ŠŒG |‰Ž S )zB
    Expand the first Add containing a simple KroneckerDelta.
    NTc                 ó&   •— g | ]}‰d          |z  ‘ŒS )r   © )Ú.0ÚtÚtermss     €úR/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/sympy/concrete/delta.pyú
<listcomp>z!_expand_delta.<locals>.<listcomp>#   s!   ø€ Ð0Ð0Ð0 A�U˜1”X˜a‘ZÐ0Ð0Ð0ó    c                 ó   •— g | ]}|‰z  ‘ŒS r   r   )r   r   Úhs     €r   r   z!_expand_delta.<locals>.<listcomp>%   s   ø€ Ð(Ð(Ð(˜Q�Q�q‘SÐ(Ð(Ð(r   )Úis_Mulr   r	   ÚOneÚargsÚis_AddÚ_has_simple_deltaÚfunc)ÚexprÚindexÚdeltar#   r   r   s       @@r   Ú_expand_deltar'      s£   øø€ ð
 Œ;ð ØˆØ€EÝ€DÝŒUˆG€EØŒYð )ð )ˆØˆ=˜QœXˆ=Õ*;¸A¸uÑ*EÔ*Eˆ=ØˆEØ”6ˆDØ0Ð0Ð0Ð0¨¬Ð0Ñ0Ô0ˆEˆEà(Ð(Ð(Ð( %Ð(Ñ(Ô(ˆEˆEØˆ4�ˆ<Ðr   c                 ó$  — t          | |¦  «        sd| fS t          | t          ¦  «        r| t          j        fS | j        st          d¦  «        ‚d}g }| j        D ],}|€t          ||¦  «        r|}Œ| 	                    |¦  «         Œ-| | 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àŒyð ð ˆØˆ=Õ-¨c°5Ñ9Ô9ˆ=ØˆEˆEà�LŠL˜ÑÔÐÐØ�9�4”9˜eÐ$Ð%Ð%r   c                 ó¼   ‡— |                       t          ¦  «        r@t          | ‰¦  «        rdS | j        s| j        r t          ˆfd„| j        D ¦   «         ¦  «        S dS )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   ó8   •K  — | ]}t          |‰¦  «        V — Œd S )N)r"   )r   r-   r%   s     €r   ú	<genexpr>z$_has_simple_delta.<locals>.<genexpr>g   s.   øè è € ÐJÐJ¸Õ(¨¨eÑ4Ô4ÐJÐJÐJÐJÐJÐJr   F)Úhasr   r+   r!   r   Úanyr    )r$   r%   s    `r   r"   r"   \   sp   ø€ ð ‡x‚x•ÑÔð KÝ˜D %Ñ(Ô(ð 	Ø�4ØŒ;ð 	K˜$œ+ð 	KÝÐJÐJÐJÐJÀÄ	ÐJÑJÔJÑJÔJÐJØˆ5r   c                 óê   — t          | t          ¦  «        r]|                      |¦  «        rH| j        d         | j        d         z
                       |¦  «        }|r|                     ¦   «         dk    S dS )zu
    Returns True if ``delta`` is a KroneckerDelta and is nonzero for a single
    value of the index ``index``.
    r   r   F)r)   r   r2   r    Úas_polyÚdegree)r&   r%   Úps      r   r+   r+   k   sl   € õ �%�Ñ(Ô(ð #¨U¯YªY°uÑ-=Ô-=ð #ØŒZ˜Œ]˜UœZ¨œ]Ñ*×3Ò3°EÑ:Ô:ˆØð 	#Ø—8’8‘:”: ’?Ð"Øˆ5r   c                 ól  — | j         r/ | j        t          t          t          | j        ¦  «        ¦  «        Ž S | j        s| S g }g }| j        D ][}t          |t          ¦  «        r/| 	                    |j        d         |j        d         z
  ¦  «         ŒF| 	                    |¦  «         Œ\|s| S t          |d¬¦  «        }t          |¦  «        dk    rt          j        S t          |¦  «        dk    rF|d„ |d                              ¦   «         D ¦   «         z  } | j        |Ž }| |k    rt	          |¦  «        S | S )z0
    Evaluate products of KroneckerDelta's.
    r   r   T©Údictc                 ó4   — g | ]\  }}t          ||¦  «        ‘ŒS r   ©r   )r   ÚkÚvs      r   r   z*_remove_multiple_delta.<locals>.<listcomp>Ž   s&   € ÐFÐFÐF©T¨Q°•N 1 aÑ(Ô(ÐFÐFÐFr   )r!   r#   ÚlistÚmapÚ_remove_multiple_deltar    r   r)   r   r,   r   Úlenr	   ÚZeroÚitems)r$   ÚeqsÚnewargsr-   ÚsolnsÚexpr2s         r   rA   rA   x   s?  € ð
 „{ð HØˆtŒy�$�sÕ#9¸4¼9ÑEÔEÑFÔFÐGÐGØŒ;ð ØˆØ
€CØ€GØŒyð  ð  ˆÝ�c�>Ñ*Ô*ð 	 Ø�JŠJ�s”x ”{ S¤X¨a¤[Ñ0Ñ1Ô1Ð1Ð1à�NŠN˜3ÑÔÐÐØð ØˆÝ�#˜DÐ!Ñ!Ô!€EÝ
ˆ5�z„z�Q‚€ÝŒvˆÝ	ˆU‰Œ�qŠˆØÐFÐF°U¸1´X·^²^Ñ5EÔ5EÐFÑFÔFÑFˆØ�”	˜7Ð#ˆØ�5Š=ˆ=Ý)¨%Ñ0Ô0Ð0Ø€Kr   c                 ó(  — t          | t          ¦  «        r|	 t          | j        d         | j        d         z
  d¬¦  «        }|r>t	          |¦  «        dk    r+t          d„ |d                              ¦   «         D ¦   «         Ž S n# t          $ r Y nw xY w| S )zB
    Rewrite a KroneckerDelta's indices in its simplest form.
    r   r   Tr9   c                 ó*   — g | ]\  }}t          ||fŽ ‘ŒS r   r<   )r   ÚkeyÚvalues      r   r   z#_simplify_delta.<locals>.<listcomp>ž   s5   € ð ?ð ?ð ?Ù *  Uõ ,¨c°5¨\Ð:ð ?ð ?ð ?r   )r)   r   r   r    rB   r   rD   ÚNotImplementedError)r$   Úslnss     r   Ú_simplify_deltarO   •   s²   € õ
 �$�Ñ'Ô'ð ð	Ý˜œ 1œ¨¬	°!¬Ñ4¸4Ð@Ñ@Ô@ˆDØð @�˜D™	œ	 Qš˜Ýð ?ð ?Ø.2°1¬g¯mªm©o¬oð?ñ ?ô ?ð @ð @øøå"ð 	ð 	ð 	ØˆDð	øøøà€Ks   —A)B Â
BÂBc                 óH  ‡‡‡	— ‰d         ‰d         z
  dk     dk    rt           j        S |                      t          ¦  «        st	          | ‰¦  «        S | j        �r¾dŠg }t          | j        t          ¬¦  «        D ]2}‰€t          |‰d         ¦  «        r|ŠŒ| 
                    |¦  «         Œ3 | j        |Ž Š	t          dd¬¦  «        }t          ‰d         t          ¦  «        r�t          ‰d         t          ¦  «        rft          ‰	‰¦  «        t!          ˆˆˆ	fd	„t#          t          ‰d         ¦  «        t          ‰d         dz   ¦  «        ¦  «        D ¦   «         ¦  «        z   }n¦t          ‰	‰¦  «        t%          t          ‰	‰d         ‰d         |dz
  f¦  «        ‰                     ‰d         |¦  «        z  t          ‰	‰d         |dz   ‰d         f¦  «        z  |‰d         ‰d         ft          ‰	‰d         ¦  «        ¬
¦  «        z   }t)          |¦  «        S t+          | ‰d         ¦  «        \  Š}‰sjt-          | ‰d         ¦  «        }| |k    r>	 t/          t          |‰¦  «        ¦  «        S # t0          $ r t          |‰¦  «        cY S w xY wt	          | ‰¦  «        S t)          |                      ‰d         ‰d         ¦  «        t          ‰d         ‰d         ¦  «        z  ¦  «        t           j        t3          t          ‰d         ‰d         dz
  ¦  «        ¦  «        z  z   S )zÅ
    Handle products containing a KroneckerDelta.

    See Also
    ========

    deltasummation
    sympy.functions.special.tensor_functions.KroneckerDelta
    sympy.concrete.products.product
    é   r   r   TN)rK   Úkprime)Úintegerc           	   3   óÜ   •K  — | ]f}t          ‰‰d          ‰d         |dz
  f¦  «        ‰                     ‰d          |¦  «        z  t          ‰‰d          |dz   ‰d         f¦  «        z  V — ŒgdS )r   r   rQ   N)ÚdeltaproductÚsubs)r   Úikr&   ÚlimitÚnewexprs     €€€r   r1   zdeltaproduct.<locals>.<genexpr>Ã   sœ   øè è € ð 8ð 8àHJõ 9EÀWÈuÐUVÌxÐY^Ð_`ÔYaÐceÐhiÑciÐNjÑ8kÔ8kØ—
’
˜5 œ8 RÑ(Ô(ñ9)å˜W u¨Q¤x°°a±¸¸q¼Ð&BÑCÔCñ9Dð 8ð 8ð 8ð 8ð 8ð 8r   )Úno_piecewise)r	   r   r2   r   r   r!   Úsortedr    r   r"   r,   r#   r
   r)   ÚintrU   ÚsumÚrangeÚdeltasummationrV   rA   r.   r'   r   ÚAssertionErrorrO   )
ÚfrX   r   r-   r=   ÚresultÚ_Úgr&   rY   s
    `      @@r   rU   rU   ¥   sG  øøø€ ð 
ˆqŒ�E˜!”HÑ	 Ò! dÒ*Ð*ÝŒuˆà�5Š5•Ñ Ô ð !Ý�q˜%Ñ Ô Ð à„xñ .àˆØˆÝ˜!œ&Õ&6Ð7Ñ7Ô7ð 	"ð 	"ˆCØˆ}Õ!2°3¸¸a¼Ñ!AÔ!Aˆ}Ø��à—’˜SÑ!Ô!Ð!Ð!Ø�!”&˜%�.ˆÝ�( DÐ)Ñ)Ô)ˆÝ�e˜A”h¥Ñ$Ô$ð 	­°E¸!´H½cÑ)BÔ)Bð 	Ý! '¨5Ñ1Ô1µCð 8ð 8ð 8ð 8ð 8ð 8åNSÕTWÐX]Ð^_ÔX`ÑTaÔTaÕcfÐglÐmnÔgoÐrsÑgsÑctÔctÑNuÔNuð8ñ 8ô 8ñ 5ô 5ñ ˆFˆFõ
 " '¨5Ñ1Ô1µNÝ˜W u¨Q¤x°°q´¸1¸q¹5Ð&AÑBÔBØ—
’
˜5 œ8 QÑ'Ô'ñ(å˜W u¨Q¤x°°Q±¸¸a¼Ð&AÑBÔBñCð �E˜!”H˜e AœhÐ'Ý.¨w¸¸a¼ÑAÔAð5ñ 5ô 5ñ ˆFõ & fÑ-Ô-Ð-å˜a  q¤Ñ*Ô*�H€Eˆ1àð !Ý˜!˜U 1œXÑ&Ô&ˆØ�Š6ˆ6ð.Ý�l¨1¨eÑ4Ô4Ñ5Ô5Ð5øÝ!ð .ð .ð .Ý# A uÑ-Ô-Ð-Ð-Ð-ð.øøøå�q˜%Ñ Ô Ð å! !§&¢&¨¨q¬°5¸´8Ñ"<Ô"<½^ÈEÐRSÌHÐV[Ð\]ÔV^Ñ=_Ô=_Ñ"_Ñ`Ô`Ý	Œ�o�n¨U°1¬X°u¸Q´xÀ!±|ÑDÔDÑEÔEÑEñFð Fs   ÉI. É.JÊ
JFc                 ó²  ‡‡— ‰d         ‰d         z
  dk     dk    rt           j        S |                      t          ¦  «        st	          | ‰¦  «        S ‰d         }t          | |¦  «        }|j        r)t           |j        ˆˆfd„|j	        D ¦   «         Ž ¦  «        S t          ||¦  «        \  }}|�9|j        �2|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k    rt          | ‰¦  «        S |	d         }
‰r|                     ||
¦  «        S t!          |                     ||
¦  «        t#          ‰dd…         Ž                      |
¦  «        ft           j        df¦  «        S )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
    rQ   r   r   Tc                 ó2   •— g | ]}t          |‰‰¦  «        ‘ŒS r   )r_   )r   r   rX   rZ   s     €€r   r   z"deltasummation.<locals>.<listcomp>/  s%   ø€ ÐLÐLÐLÀ•^ A u¨lÑ;Ô;ÐLÐLÐLr   Né   )r	   rC   r2   r   r   r'   r!   r   r#   r    r.   Údelta_ranger   rB   r   rV   r   r   Úas_relational)ra   rX   rZ   Úxrd   r&   r$   ÚdinfÚdsuprG   rL   s    ``        r   r_   r_   à   sì  øø€ ðH 
ˆqŒ�E˜!”HÑ	 Ò! dÒ*Ð*ÝŒvˆà�5Š5•Ñ Ô ð #Ý˜˜EÑ"Ô"Ð"àˆaŒ€Aå�a˜ÑÔ€AØ„xð OÝØˆAŒFÐLÐLÐLÐLÐLÀQÄVÐLÑLÔLÐMñOô Oð 	Oõ !  AÑ&Ô&�K€Eˆ4àÐ Ô 1Ð =ØÔ&‰
ˆˆdØ�!ŒH�t‰O˜qÒ  TÒ)Ð)¨u°Q¬x¸$©À!Ò/CÈÒ.LÐ.LØˆLàð #Ý˜˜EÑ"Ô"Ð"å�%”*˜Q”- %¤*¨Q¤-Ñ/°Ñ3Ô3€EÝ
ˆ5�z„z�Q‚€ÝŒvˆÝ	ˆU‰Œ�qŠˆÝ�1�e‰}Œ}ÐØ�!ŒH€EØð #Ø�yŠy˜˜EÑ"Ô"Ð"ÝØ	�Š�1�eÑ	Ô	�h¨¨a°¨c¬
Ð3×AÒAÀ%ÑHÔHÐIÝ	
Œ�ˆñô ð r   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+   rA   rO   rU   r_   r   r   r   ú<module>rw      sÉ  ððð ð Ð Ð Ð Ð Ð Ø &Ð &Ð &Ð &Ð &Ð &Ð &Ð &Ø )Ð )Ð )Ð )Ð )Ð )Ð )Ð )Ð )Ð )Ð )Ð )Ø $Ð $Ð $Ð $Ð $Ð $Ø /Ð /Ð /Ð /Ð /Ð /Ø EÐ EÐ EÐ EÐ EÐ EÐ EÐ EÐ EÐ EØ (Ð (Ð (Ð (Ð (Ð (Ø $Ð $Ð $Ð $Ð $Ð $Ø 'Ð 'Ð 'Ð 'Ð 'Ð 'ð 	ðð ñ 	„ðð& 	ð/&ð /&ñ 	„ð/&ðd 	ðð ñ 	„ðð 	ð	ð 	ñ 	„ð	ð 	ðð ñ 	„ðð8 	ðð ñ 	„ðð 	ð7Fð 7Fñ 	„ð7Fðt 	ðfð fð fñ 	„ðfð fð fr   