o
    jgw                     @   s   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	 d	eZG d
d deZG dd de	ZdS )zFermionic quantum operators.    )IntegerS)Operator)HilbertSpaceKetBra)KroneckerDelta)	FermionOpFermionFockKetFermionFockBrac                   @   s   e Zd ZdZedd Zedd Zedd Zdd	 Z	d
d Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zd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                 C   
   | j d S Nr   )argsself r   U/var/www/html/zoom/venv/lib/python3.10/site-packages/sympy/physics/quantum/fermion.pyname'      
zFermionOp.namec                 C   s   t | jd S )N   )boolr   r   r   r   r   is_annihilation+   s   zFermionOp.is_annihilationc                 C   s   dS )N)cTr   r   r   r   r   default_args/      zFermionOp.default_argsc                 O   sd   t |dvrtd| 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   hintsr   r   r   r    3   s   zFermionOp.__new__c                 K   s   d|v r|d rt jS d S )Nindependentr   Zeror   otherr"   r   r   r   _eval_commutator_FermionOp?   s   z$FermionOp._eval_commutator_FermionOpc                 K   sB   | j |j kr| js|jrtjS d S d|v r|d rd|  | S d S )Nr#   r   )r   r   r   r   r&   r   r   r   _eval_anticommutator_FermionOpF   s   z(FermionOp._eval_anticommutator_FermionOpc                 K   s   d|  | S )Nr   r   r&   r   r   r   _eval_anticommutator_BosonOpR   s   z&FermionOp._eval_anticommutator_BosonOpc                 K   s   t jS Nr$   r&   r   r   r   _eval_commutator_BosonOpV   s   z"FermionOp._eval_commutator_BosonOpc                 C   s   t t| j| j S r+   )r
   strr   r   r   r   r   r   _eval_adjointY   s   zFermionOp._eval_adjointc                 G   "   | j r
dt| j S dt| j S )Nz{%s}z{{%s}^\dagger}r   r-   r   r   printerr   r   r   r   _print_contents_latex\      zFermionOp._print_contents_latexc                 G   r/   )Nz%sz
Dagger(%s)r0   r1   r   r   r   _print_contentsb   r4   zFermionOp._print_contentsc                 G   s:   ddl m} |j| jd g|R  }| jr|S ||d S )Nr   )
prettyFormu   †) sympy.printing.pretty.stringpictr6   _printr   r   )r   r2   r   r6   pformr   r   r   _print_contents_prettyh   s
   z FermionOp._print_contents_prettyc                 C   sl   ddl m} |dkr|jS |dkr| S |dkdkr!|jdkr!|jS |dk dks,|jdkr0tdt| |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   r   r   r   r=   p   s   zFermionOp._eval_powerN)__name__
__module____qualname____doc__propertyr   r   classmethodr   r    r(   r)   r*   r,   r.   r3   r5   r:   r=   r   r   r   r   r
      s$    


r
   c                   @   sL   e Zd ZdZdd Zedd Zedd Zedd	 Z	d
d Z
dd ZdS )r   zxFock state ket for a fermionic mode.

    Parameters
    ==========

    n : Number
        The Fock state number.

    c                 C      |dvrt dt| |S N)r   r   zn must be 0 or 1)r   r   r    r!   nr   r   r   r          zFermionFockKet.__new__c                 C   r   r   labelr   r   r   r   rH      r   zFermionFockKet.nc                 C      t S r+   )r   r   r   r   r   
dual_class   r   zFermionFockKet.dual_classc                 C   s   t  S r+   )r   )r!   rK   r   r   r   _eval_hilbert_space   s   z"FermionFockKet._eval_hilbert_spacec                 K   s   t | j|jS r+   )r	   rH   )r   brar"   r   r   r   !_eval_innerproduct_FermionFockBra   s   z0FermionFockKet._eval_innerproduct_FermionFockBrac                 K   s6   |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   rH   r   r   r%   )r   opoptionsr   r   r   _apply_from_right_to_FermionOp   s   

z-FermionFockKet._apply_from_right_to_FermionOpN)r?   r@   rA   rB   r    rC   rH   rD   rM   rN   rP   rS   r   r   r   r   r   }   s    



r   c                   @   s0   e Zd ZdZdd Zedd Zedd ZdS )	r   zxFock state bra for a fermionic mode.

    Parameters
    ==========

    n : Number
        The Fock state number.

    c                 C   rE   rF   )r   r   r    rG   r   r   r   r       rI   zFermionFockBra.__new__c                 C   r   r   rJ   r   r   r   r   rH      r   zFermionFockBra.nc                 C   rL   r+   )r   r   r   r   r   rM      r   zFermionFockBra.dual_classN)	r?   r@   rA   rB   r    rC   rH   rD   rM   r   r   r   r   r      s    

r   N)rB   sympy.core.numbersr   r;   r   sympy.physics.quantumr   r   r   r   (sympy.functions.special.tensor_functionsr	   __all__r
   r   r   r   r   r   r   <module>   s    l,