
    sgw                         d Z ddl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 g dZ G d d	e      Z G d
 de      Z G d de	      Zy)zFermionic quantum operators.    )IntegerS)Operator)HilbertSpaceKetBra)KroneckerDelta)	FermionOpFermionFockKetFermionFockBrac                   |    e Zd ZdZed        Zed        Zed        Zd Z	d Z
d Zd Zd	 Zd
 Zd Zd Zd Zd Zy)r   a"  A fermionic operator that satisfies {c, Dagger(c)} == 1.

    Parameters
    ==========

    name : str
        A string that labels the fermionic mode.

    annihilation : bool
        A bool that indicates if the fermionic operator is an annihilation
        (True, default value) or creation operator (False)

    Examples
    ========

    >>> from sympy.physics.quantum import Dagger, AntiCommutator
    >>> from sympy.physics.quantum.fermion import FermionOp
    >>> c = FermionOp("c")
    >>> AntiCommutator(c, Dagger(c)).doit()
    1
    c                      | j                   d   S Nr   )argsselfs    P/var/www/html/venv/lib/python3.12/site-packages/sympy/physics/quantum/fermion.pynamezFermionOp.name'   s    yy|    c                 2    t        | j                  d         S )N   )boolr   r   s    r   is_annihilationzFermionOp.is_annihilation+   s    DIIaL!!r   c                      y)N)cT r   s    r   default_argszFermionOp.default_args/   s    r   c                     t        |      dvrt        d|z        t        |      dk(  r|d   t        j                  f}t        |      dk(  r|d   t	        |d         f}t        j                  | g| S )N)r      z"1 or 2 parameters expected, got %sr   r   r    )len
ValueErrorr   Oner   r   __new__)clsr   hintss      r   r$   zFermionOp.__new__3   st    4yF"ADHIIt9>GQUU#Dt9>GWT!W-.D+d++r   c                 6    d|v r|d   rt         j                  S y )Nindependentr   Zeror   otherr&   s      r   _eval_commutator_FermionOpz$FermionOp._eval_commutator_FermionOp?   s    E!eM&:66Mr   c                     | j                   |j                   k(  r)| j                  s|j                  rt        j                  S y d|v r|d   rd| z  |z  S y )Nr(   r    )r   r   r   r#   r+   s      r   _eval_anticommutator_FermionOpz(FermionOp._eval_anticommutator_FermionOpF   sT    99

"''E,A,Auu 	 e#m(<t8e##r   c                     d| z  |z  S )Nr    r   r+   s      r   _eval_anticommutator_BosonOpz&FermionOp._eval_anticommutator_BosonOpR   s    4x%r   c                 "    t         j                  S Nr)   r+   s      r   _eval_commutator_BosonOpz"FermionOp._eval_commutator_BosonOpV   s    vvr   c                 V    t        t        | j                        | j                         S r3   )r   strr   r   r   s    r   _eval_adjointzFermionOp._eval_adjointY   s     TYYT-A-A)ABBr   c                 z    | j                   rdt        | j                        z  S dt        | j                        z  S )Nz{%s}z{{%s}^\dagger}r   r6   r   r   printerr   s      r   _print_contents_latexzFermionOp._print_contents_latex\   s1    S^++$s499~55r   c                 z    | j                   rdt        | j                        z  S dt        | j                        z  S )Nz%sz
Dagger(%s)r9   r:   s      r   _print_contentszFermionOp._print_contentsb   s1    3tyy>)) 3tyy>11r   c                     ddl m}  |j                  | j                  d   g| }| j                  r|S | |d      z  S )Nr   )
prettyFormu   †) sympy.printing.pretty.stringpictr@   _printr   r   )r   r;   r   r@   pforms        r   _print_contents_prettyz FermionOp._print_contents_prettyh   s@    ?tyy|3d3L*\222r   c                     ddl m} |dk(  r|j                  S |dk(  r| S |dkD  dk(  r|j                  dk(  r|j                  S |dk  dk(  s|j                  dk(  rt        d      t        j                  | |      S )Nr   r   r   TFzBFermionic operators can only be raised to a positive integer power)sympy.core.singletonr   r#   
is_integerr*   r"   r   _eval_power)r   expr   s      r   rH   zFermionOp._eval_powerp   s}    *!855LAXKAg$3>>T#966MAg$#..E"9 * + +##D#..r   N)__name__
__module____qualname____doc__propertyr   r   classmethodr   r$   r-   r/   r1   r4   r7   r<   r>   rD   rH   r   r   r   r   r      sv    *   " "  
,
 C623/r   r   c                   R    e Zd ZdZd Zed        Zed        Zed        Z	d Z
d Zy)	r   zxFock state ket for a fermionic mode.

    Parameters
    ==========

    n : Number
        The Fock state number.

    c                 L    |dvrt        d      t        j                  | |      S N)r   r   zn must be 0 or 1)r"   r   r$   r%   ns     r   r$   zFermionFockKet.__new__   &    F?/00{{3""r   c                      | j                   d   S r   labelr   s    r   rT   zFermionFockKet.n       zz!}r   c                     t         S r3   )r   r   s    r   
dual_classzFermionFockKet.dual_class       r   c                     t               S r3   )r   )r%   rX   s     r   _eval_hilbert_spacez"FermionFockKet._eval_hilbert_space   s
    ~r   c                 B    t        | j                  |j                        S r3   )r
   rT   )r   brar&   s      r   !_eval_innerproduct_FermionFockBraz0FermionFockKet._eval_innerproduct_FermionFockBra   s    dffcee,,r   c                     |j                   r*| j                  dk(  rt        d      S t        j                  S | j                  dk(  rt        d      S t        j                  S )Nr   r   )r   rT   r   r   r*   )r   opoptionss      r   _apply_from_right_to_FermionOpz-FermionFockKet._apply_from_right_to_FermionOp   sI    vv{%a((vvvv{%a((vvr   N)rJ   rK   rL   rM   r$   rN   rT   rO   r[   r^   ra   re   r   r   r   r   r   }   sR    #
      -
r   r   c                   6    e Zd ZdZd Zed        Zed        Zy)r   zxFock state bra for a fermionic mode.

    Parameters
    ==========

    n : Number
        The Fock state number.

    c                 L    |dvrt        d      t        j                  | |      S rR   )r"   r	   r$   rS   s     r   r$   zFermionFockBra.__new__   rU   r   c                      | j                   d   S r   rW   r   s    r   rT   zFermionFockBra.n   rY   r   c                     t         S r3   )r   r   s    r   r[   zFermionFockBra.dual_class   r\   r   N)	rJ   rK   rL   rM   r$   rN   rT   rO   r[   r   r   r   r   r      s4    #
    r   r   N)rM   sympy.core.numbersr   rF   r   sympy.physics.quantumr   r   r   r	   (sympy.functions.special.tensor_functionsr
   __all__r   r   r   r   r   r   <module>rn      sI    " & " * 8 8 Cj/ j/X)S )XS r   