
    Ed                         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dS )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S )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    =lib/python3.11/site-packages/sympy/physics/quantum/fermion.pynamezFermionOp.name'   s    y|    c                 6    t          | j        d                   S )N   )boolr   r   s    r   is_annihilationzFermionOp.is_annihilation+   s    DIaL!!!r   c                     dS )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|R  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   s    4yyF" 	JADHIIIt99> 	$GQU#Dt99> 	/GWT!W--.D+d++++r   c                 6    d|v r|d         rt           j        S d S )Nindependentr   Zeror   otherr%   s      r   _eval_commutator_FermionOpz$FermionOp._eval_commutator_FermionOp?   s'    E! 	eM&: 	6Mtr   c                     | j         |j         k    r| j        s|j        rt          j        S nd|v r|d         rd| z  |z  S d S )Nr'   r   )r   r   r   r"   r*   s      r   _eval_anticommutator_FermionOpz(FermionOp._eval_anticommutator_FermionOpF   s]    9
" 	$' E,A ue# 	$m(< 	$t8e##tr   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	    vr   c                 R    t          t          | j                  | j                   S r2   )r
   strr   r   r   s    r   _eval_adjointzFermionOp._eval_adjointY   s     TYT-A)ABBBr   c                 l    | j         rdt          | j                  z  S dt          | j                  z  S )Nz{%s}z{{%s}^\dagger}r   r5   r   r   printerr   s      r   _print_contents_latexzFermionOp._print_contents_latex\   s3     	6S^^++$s49~~55r   c                 l    | j         rdt          | j                  z  S dt          | j                  z  S )Nz%sz
Dagger(%s)r8   r9   s      r   _print_contentszFermionOp._print_contentsb   s3     	23ty>>)) 3ty>>11r   c                 n    ddl m}  |j        | j        d         g|R  }| 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   sX    ??????ty|3d333 	3L**\2222r   N)__name__
__module____qualname____doc__propertyr   r   classmethodr   r#   r,   r.   r0   r3   r6   r;   r=   rC   r   r   r   r
   r
      s         *   X " " X"   [
, 
, 
,  
 
 
       C C C6 6 62 2 23 3 3 3 3r   r
   c                   f    e Zd ZdZd Zed             Zed             Zed             Z	d Z
d ZdS )	r   zxFock state ket for a fermionic mode.

    Parameters
    ==========

    n : Number
        The Fock state number.

    c                 R    |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? 	1/000{3"""r   c                     | j         d         S r   labelr   s    r   rN   zFermionFockKet.n       z!}r   c                     t           S r2   )r   r   s    r   
dual_classzFermionFockKet.dual_class       r   c                     t                      S r2   )r   )r$   rR   s     r   _eval_hilbert_spacez"FermionFockKet._eval_hilbert_space   s    ~~r   c                 6    t          | j        |j                  S r2   )r	   rN   )r   brar%   s      r   !_eval_innerproduct_FermionFockBraz0FermionFockKet._eval_innerproduct_FermionFockBra   s    dfce,,,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   rN   r   r   r)   )r   opoptionss      r   _apply_operator_FermionOpz(FermionFockKet._apply_operator_FermionOp   sS     		v{ %a(((vv{ %a(((vr   N)rD   rE   rF   rG   r#   rH   rN   rI   rU   rX   r[   r_   r   r   r   r   r   q   s         # # #
   X   [   [- - -
 
 
 
 
r   r   c                   D    e Zd ZdZd Zed             Zed             ZdS )r   zxFock state bra for a fermionic mode.

    Parameters
    ==========

    n : Number
        The Fock state number.

    c                 R    |dvrt          d          t          j        | |          S rL   )r!   r   r#   rM   s     r   r#   zFermionFockBra.__new__   rO   r   c                     | j         d         S r   rQ   r   s    r   rN   zFermionFockBra.n   rS   r   c                     t           S r2   )r   r   s    r   rU   zFermionFockBra.dual_class   rV   r   N)	rD   rE   rF   rG   r#   rH   rN   rI   rU   r   r   r   r   r      sc         # # #
   X   [  r   r   N)rG   sympy.core.numbersr   sympy.core.singletonr   sympy.physics.quantumr   r   r   r   (sympy.functions.special.tensor_functionsr	   __all__r
   r   r   r   r   r   <module>ri      s   " " & & & & & & " " " " " " * * * * * * 8 8 8 8 8 8 8 8 8 8 C C C C C C  ]3 ]3 ]3 ]3 ]3 ]3 ]3 ]3@) ) ) ) )S ) ) )X    S     r   