@@ -8,13 +8,20 @@ export S_x, S_y, S_z, S_plus, S_min
88export u_plus_u_min, d_plus_d_min
99export u_min_u_plus, d_min_d_plus
1010export u_min_d_min, d_min_u_min
11- export e_plus_e_min, e_min_e_plus, singlet_min, e_hopping
11+ export u_plus_d_plus, d_plus_u_plus
12+ export u_min_u_min, d_min_d_min
13+ export u_plus_u_plus, d_plus_d_plus
14+ export e_plus_e_min, e_min_e_plus, e_hopping
15+ export singlet_plus, singlet_min
1216export S_plus_S_min, S_min_S_plus, S_exchange
1317
1418export n, nꜛ, nꜜ, nꜛꜜ
1519export Sˣ, Sʸ, Sᶻ, S⁺, S⁻
16- export u⁺u⁻, d⁺d⁻, u⁻u⁺, d⁻d⁺, u⁻d⁻, d⁻u⁻
17- export e⁺e⁻, e⁻e⁺, singlet⁻, e_hop
20+ export u⁺u⁻, d⁺d⁻, u⁻u⁺, d⁻d⁺
21+ export u⁻d⁻, d⁻u⁻, u⁺d⁺, d⁺u⁺
22+ export u⁻u⁻, u⁺u⁺, d⁻d⁻, d⁺d⁺
23+ export e⁺e⁻, e⁻e⁺, e_hop
24+ export singlet⁺, singlet⁻
1825export S⁻S⁺, S⁺S⁻
1926
2027"""
@@ -590,6 +597,21 @@ function u_min_d_min(elt::Type{<:Number}, ::Type{U1Irrep}, ::Type{SU2Irrep})
590597end
591598const u⁻d⁻ = u_min_d_min
592599
600+ @doc """
601+ u_plus_d_plus(elt::Type{<:Number}, particle_symmetry::Type{<:Sector}, spin_symmetry::Type{<:Sector})
602+ u⁺d⁺(elt::Type{<:Number}, particle_symmetry::Type{<:Sector}, spin_symmetry::Type{<:Sector})
603+
604+ Return the two-body operator ``e†_{1,↑} e†_{2,↓}`` that annihilates a spin-up particle at the first site and a spin-down particle at the second site.
605+ """ u_plus_d_plus
606+ function u_plus_d_plus (P:: Type{<:Sector} , S:: Type{<:Sector} )
607+ return u_plus_d_plus (ComplexF64, P, S)
608+ end
609+ function u_plus_d_plus (elt:: Type{<:Number} , particle_symmetry:: Type{<:Sector} ,
610+ spin_symmetry:: Type{<:Sector} )
611+ return - copy (adjoint (u_min_d_min (elt, particle_symmetry, spin_symmetry)))
612+ end
613+ const u⁺d⁺ = u_plus_d_plus
614+
593615@doc """
594616 d_min_u_min(elt::Type{<:Number}, particle_symmetry::Type{<:Sector}, spin_symmetry::Type{<:Sector})
595617 d⁻u⁻(elt::Type{<:Number}, particle_symmetry::Type{<:Sector}, spin_symmetry::Type{<:Sector})
@@ -633,19 +655,162 @@ function d_min_u_min(elt::Type{<:Number}, ::Type{U1Irrep}, ::Type{SU2Irrep})
633655end
634656const d⁻u⁻ = d_min_u_min
635657
658+ @doc """
659+ d_plus_u_plus(elt::Type{<:Number}, particle_symmetry::Type{<:Sector}, spin_symmetry::Type{<:Sector})
660+ d⁺u⁺(elt::Type{<:Number}, particle_symmetry::Type{<:Sector}, spin_symmetry::Type{<:Sector})
661+
662+ Return the two-body operator ``e†_{1,↓} e†_{2,↑}`` that creates a spin-down particle at the first site and a spin-up particle at the second site.
663+ """ d_plus_u_plus
664+ function d_plus_u_plus (P:: Type{<:Sector} , S:: Type{<:Sector} )
665+ return d_plus_u_plus (ComplexF64, P, S)
666+ end
667+ function d_plus_u_plus (elt:: Type{<:Number} , particle_symmetry:: Type{<:Sector} ,
668+ spin_symmetry:: Type{<:Sector} )
669+ return - copy (adjoint (d_min_u_min (elt, particle_symmetry, spin_symmetry)))
670+ end
671+ const d⁺u⁺ = d_plus_u_plus
672+
673+ @doc """
674+ u_min_u_min(elt::Type{<:Number}, particle_symmetry::Type{<:Sector}, spin_symmetry::Type{<:Sector})
675+ u⁻u⁻(elt::Type{<:Number}, particle_symmetry::Type{<:Sector}, spin_symmetry::Type{<:Sector})
676+
677+ Return the two-body operator ``e_{1,↑} e_{2,↑}`` that annihilates a spin-up particle at both sites.
678+ The nonzero matrix elements are
679+ ```
680+ -|0,0⟩ ↤ |↑,↑⟩, -|0,↓⟩ ↤ |↑,↑↓⟩
681+ +|↓,0⟩ ↤ |↑↓,↑⟩, +|↓,↓⟩ ↤ |↑↓,↑↓⟩
682+ ```
683+ """ u_min_u_min
684+ function u_min_u_min (P:: Type{<:Sector} , S:: Type{<:Sector} )
685+ return u_min_u_min (ComplexF64, P, S)
686+ end
687+ function u_min_u_min (elt:: Type{<:Number} , :: Type{Trivial} , :: Type{Trivial} )
688+ t = two_site_operator (elt, Trivial, Trivial)
689+ I = sectortype (t)
690+ t[(I (0 ), I (0 ), dual (I (1 )), dual (I (1 )))][1 , 1 , 1 , 1 ] = - 1
691+ t[(I (0 ), I (1 ), dual (I (1 )), dual (I (0 )))][1 , 2 , 1 , 2 ] = - 1
692+ t[(I (1 ), I (0 ), dual (I (0 )), dual (I (1 )))][2 , 1 , 2 , 1 ] = 1
693+ t[(I (1 ), I (1 ), dual (I (0 )), dual (I (0 )))][2 , 2 , 2 , 2 ] = 1
694+ return t
695+ end
696+ function u_min_u_min (elt:: Type{<:Number} , :: Type{U1Irrep} , :: Type{<:Sector} )
697+ throw (ArgumentError (" `u_min_u_min` is not symmetric under `U1Irrep` particle symmetry" ))
698+ end
699+ function u_min_u_min (elt:: Type{<:Number} , :: Type{<:Sector} , :: Type{U1Irrep} )
700+ throw (ArgumentError (" `u_min_u_min` is not symmetric under `U1Irrep` spin symmetry" ))
701+ end
702+ function u_min_u_min (elt:: Type{<:Number} , :: Type{<:Sector} , :: Type{SU2Irrep} )
703+ throw (ArgumentError (" `u_min_u_min` is not symmetric under `SU2Irrep` spin symmetry" ))
704+ end
705+ function u_min_u_min (elt:: Type{<:Number} , :: Type{U1Irrep} , :: Type{U1Irrep} )
706+ throw (ArgumentError (" `u_min_u_min` is not symmetric under `U1Irrep` particle symmetry or under `U1Irrep` particle symmetry" ))
707+ end
708+ function u_min_u_min (elt:: Type{<:Number} , :: Type{U1Irrep} , :: Type{SU2Irrep} )
709+ throw (ArgumentError (" `u_min_u_min` is not symmetric under `U1Irrep` particle symmetry or under `SU2Irrep` particle symmetry" ))
710+ end
711+ const u⁻u⁻ = u_min_u_min
712+
713+ @doc """
714+ u_plus_u_plus(elt::Type{<:Number}, particle_symmetry::Type{<:Sector}, spin_symmetry::Type{<:Sector})
715+ u⁺u⁺(elt::Type{<:Number}, particle_symmetry::Type{<:Sector}, spin_symmetry::Type{<:Sector})
716+
717+ Return the two-body operator ``e†_{1,↑} e†_{2,↑}`` that creates a spin-up particle at both sites.
718+ """ u_plus_u_plus
719+ function u_plus_u_plus (P:: Type{<:Sector} , S:: Type{<:Sector} )
720+ return u_plus_u_plus (ComplexF64, P, S)
721+ end
722+ function u_plus_u_plus (elt:: Type{<:Number} , particle_symmetry:: Type{<:Sector} ,
723+ spin_symmetry:: Type{<:Sector} )
724+ return - copy (adjoint (u_min_u_min (elt, particle_symmetry, spin_symmetry)))
725+ end
726+ const u⁺u⁺ = u_plus_u_plus
727+
728+ @doc """
729+ d_min_d_min(elt::Type{<:Number}, particle_symmetry::Type{<:Sector}, spin_symmetry::Type{<:Sector})
730+ d⁻d⁻(elt::Type{<:Number}, particle_symmetry::Type{<:Sector}, spin_symmetry::Type{<:Sector})
731+
732+ Return the two-body operator ``e_{1,↓} e_{2,↓}`` that annihilates a spin-down particle at both sites.
733+ The nonzero matrix elements are
734+ ```
735+ -|0,0⟩ ↤ |↓,↓⟩, +|0,↑⟩ ↤ |↓,↑↓⟩
736+ -|↑,0⟩ ↤ |↑↓,↓⟩, +|↑,↑⟩ ↤ |↑↓,↑↓⟩
737+ ```
738+ """ d_min_d_min
739+ function d_min_d_min (P:: Type{<:Sector} , S:: Type{<:Sector} )
740+ return d_min_d_min (ComplexF64, P, S)
741+ end
742+ function d_min_d_min (elt:: Type{<:Number} , :: Type{Trivial} , :: Type{Trivial} )
743+ t = two_site_operator (elt, Trivial, Trivial)
744+ I = sectortype (t)
745+ t[(I (0 ), I (0 ), dual (I (1 )), dual (I (1 )))][1 , 1 , 2 , 2 ] = - 1
746+ t[(I (0 ), I (1 ), dual (I (1 )), dual (I (0 )))][1 , 1 , 2 , 2 ] = 1
747+ t[(I (1 ), I (0 ), dual (I (0 )), dual (I (1 )))][1 , 1 , 2 , 2 ] = - 1
748+ t[(I (1 ), I (1 ), dual (I (0 )), dual (I (0 )))][1 , 1 , 2 , 2 ] = 1
749+ return t
750+ end
751+ function d_min_d_min (elt:: Type{<:Number} , :: Type{U1Irrep} , :: Type{<:Sector} )
752+ throw (ArgumentError (" `d_min_d_min` is not symmetric under `U1Irrep` particle symmetry" ))
753+ end
754+ function d_min_d_min (elt:: Type{<:Number} , :: Type{<:Sector} , :: Type{U1Irrep} )
755+ throw (ArgumentError (" `d_min_d_min` is not symmetric under `U1Irrep` spin symmetry" ))
756+ end
757+ function d_min_d_min (elt:: Type{<:Number} , :: Type{<:Sector} , :: Type{SU2Irrep} )
758+ throw (ArgumentError (" `d_min_d_min` is not symmetric under `SU2Irrep` spin symmetry" ))
759+ end
760+ function d_min_d_min (elt:: Type{<:Number} , :: Type{U1Irrep} , :: Type{U1Irrep} )
761+ throw (ArgumentError (" `d_min_d_min` is not symmetric under `U1Irrep` particle symmetry or under `U1Irrep` particle symmetry" ))
762+ end
763+ function d_min_d_min (elt:: Type{<:Number} , :: Type{U1Irrep} , :: Type{SU2Irrep} )
764+ throw (ArgumentError (" `d_min_d_min` is not symmetric under `U1Irrep` particle symmetry or under `SU2Irrep` particle symmetry" ))
765+ end
766+ const d⁻d⁻ = d_min_d_min
767+
768+ @doc """
769+ d_plus_d_plus(elt::Type{<:Number}, particle_symmetry::Type{<:Sector}, spin_symmetry::Type{<:Sector})
770+ d⁺d⁺(elt::Type{<:Number}, particle_symmetry::Type{<:Sector}, spin_symmetry::Type{<:Sector})
771+
772+ Return the two-body operator ``e†_{1,↓} e†_{2,↓}`` that creates a spin-down particle at both sites.
773+ The nonzero matrix elements are
774+ """ d_plus_d_plus
775+ function d_plus_d_plus (P:: Type{<:Sector} , S:: Type{<:Sector} )
776+ return d_plus_d_plus (ComplexF64, P, S)
777+ end
778+ function d_plus_d_plus (elt:: Type{<:Number} , particle_symmetry:: Type{<:Sector} ,
779+ spin_symmetry:: Type{<:Sector} )
780+ return - copy (adjoint (d_min_d_min (elt, particle_symmetry, spin_symmetry)))
781+ end
782+ const d⁺d⁺ = d_plus_d_plus
783+
784+ @doc """
785+ singlet_plus(elt, particle_symmetry::Type{<:Sector}, spin_symmetry::Type{<:Sector})
786+ singlet⁺(elt, particle_symmetry::Type{<:Sector}, spin_symmetry::Type{<:Sector})
787+
788+ Return the two-body singlet operator ``(e^†_{1,↑} e^†_{2,↓} - e^†_{1,↓} e^†_{2,↑}) / sqrt(2)``,
789+ which creates the singlet state when acting on vaccum.
790+ """ singlet_plus
791+ function singlet_plus (P:: Type{<:Sector} , S:: Type{<:Sector} )
792+ return singlet_plus (ComplexF64, P, S)
793+ end
794+ function singlet_plus (elt:: Type{<:Number} , particle_symmetry:: Type{<:Sector} ,
795+ spin_symmetry:: Type{<:Sector} )
796+ return (u_plus_d_plus (elt, particle_symmetry, spin_symmetry) -
797+ d_plus_u_plus (elt, particle_symmetry, spin_symmetry)) / sqrt (2 )
798+ end
799+ const singlet⁺ = singlet_plus
800+
636801@doc """
637802 singlet_min(elt, particle_symmetry::Type{<:Sector}, spin_symmetry::Type{<:Sector})
638803 singlet⁻(elt, particle_symmetry::Type{<:Sector}, spin_symmetry::Type{<:Sector})
639804
640- Return the two-body singlet operator ``(e_{1,↓} e_{2,↑} - e_{1,↓} e_{2,↑}) / sqrt(2)``.
805+ Return the adjoint of `singlet_plus` operator, which is
806+ ``(-e_{1,↑} e_{2,↓} + e_{1,↓} e_{2,↑}) / sqrt(2)``
641807""" singlet_min
642808function singlet_min (P:: Type{<:Sector} , S:: Type{<:Sector} )
643809 return singlet_min (ComplexF64, P, S)
644810end
645811function singlet_min (elt:: Type{<:Number} , particle_symmetry:: Type{<:Sector} ,
646812 spin_symmetry:: Type{<:Sector} )
647- return (u_min_d_min (elt, particle_symmetry, spin_symmetry) -
648- d_min_u_min (elt, particle_symmetry, spin_symmetry)) / sqrt (2 )
813+ return copy (adjoint (singlet_plus (elt, particle_symmetry, spin_symmetry)))
649814end
650815const singlet⁻ = singlet_min
651816
0 commit comments