# PartialOperator

PartialOperator(op,indices,mode) takes an operator and a list of indices and depending on mode removes or keeps specific terms.

Mode “include” keeps all terms whereby at least one of the creation or annihilation operators acts on the orbitals included in the list indices.

Mode “exclude” removes all terms whereby at least one of the creation or annihilation operators acts on the orbitals included in the list indices.

Mode “conserve” removes all terms that do not keep the occupation conserved from the orbitals listed in the table indices. In this case the table indices is allowed to include tables. In the latter case the sum of the occupation all orbitals in the list needs to be conserved

## Input

• op : An Operator.
• indices : A list of indices.
• mode : either “include”, “exclude”, or “conserve”

## Output

• partialOp : The operator with a subset of terms of the original operator.

## Example

### Input

Example.Quanty
NF = 3
NB = 0

opp1cr = NewOperator(NF,NB, {{ 0,1},{ 1,1},{ 2,1}})
opp1an = NewOperator(NF,NB, {{-0,1},{-1,1},{-2,1}})
opp2 = opp1cr * opp1an
opp3 = opp1an * opp2
opp4 = opp1cr * opp3

opp = 1 + opp1cr + opp1an + opp2 + opp3 + opp4

-- The operatore contains strings of creation and annihilation operators of length 0 to 4
-- l=0  1 term
-- l=1  6 terms (3 creation, 3 annihilation)
-- l=2  9 terms (3 creation * 3 annihilation)
-- l=3  9 terms (cr an an) note that an0 an1 = - an1 an0
-- l=4  9 terms
-- the full operator is
print("================ opp =============")
print(opp)

-- We only keep terms that at least act once on orbital 1
print("================ PartialOperator  {1} include =============")
print(PartialOperator(opp,{1},"include"))

-- We only keep terms that at least act once on orbital 0 or at orbital 1
print("================ PartialOperator  {0,2} include =============")
print(PartialOperator(opp,{0,2},"include"))

-- We remove all terms that act on orbital 1
print("================ PartialOperator  {1} exclude =============")
print(PartialOperator(opp,{1},"exclude"))

-- We exclude all terms that act on orbital 0 and we exclude all terms that act on orbital 2
print("================ PartialOperator  {0,2} exclude =============")
print(PartialOperator(opp,{0,2},"exclude"))

-- We only keep the terms that keep the occupation of orbital 1 conserved
print("================ PartialOperator  {1} conserve =============")
print(PartialOperator(opp,{1},"conserve"))

-- We only keep the terms that keep the occupation of orbital 0 conserved and that keep
-- the occupation of orbital 2 conserved
print("================ PartialOperator  {0,2} conserve =============")
print(PartialOperator(opp,{0,2},"conserve"))

-- We only keep those terms that keep the sum of the occupation of orbital 0 and 2 conserved
print("================ PartialOperator  {{0,2}} conserve =============")
print(PartialOperator(opp,{{0,2}},"conserve"))

### Result

================ opp =============

Operator: Operator
QComplex         =          0 (Real==0 or Complex==1 or Mixed==2)
MaxLength        =          4 (largest number of product of lader operators)
NFermionic modes =          3 (Number of fermionic modes (site, spin, orbital, ...) in the one particle basis)
NBosonic modes   =          0 (Number of bosonic modes (phonon modes, ...) in the one particle basis)

Operator of Length   0
QComplex      =          0 (Real==0 or Complex==1)
N             =          1 (number of operators of length   0)
|  1.00000000000000E+00

Operator of Length   1
QComplex      =          0 (Real==0 or Complex==1)
N             =          6 (number of operators of length   1)
C  0 |  1.00000000000000E+00
C  1 |  1.00000000000000E+00
C  2 |  1.00000000000000E+00
A  0 |  4.00000000000000E+00
A  1 |  4.00000000000000E+00
A  2 |  4.00000000000000E+00

Operator of Length   2
QComplex      =          0 (Real==0 or Complex==1)
N             =          9 (number of operators of length   2)
C  0 A  0 |  4.00000000000000E+00
C  1 A  0 |  4.00000000000000E+00
C  2 A  0 |  4.00000000000000E+00
C  0 A  1 |  4.00000000000000E+00
C  1 A  1 |  4.00000000000000E+00
C  2 A  1 |  4.00000000000000E+00
C  0 A  2 |  4.00000000000000E+00
C  1 A  2 |  4.00000000000000E+00
C  2 A  2 |  4.00000000000000E+00

Operator of Length   3
QComplex      =          0 (Real==0 or Complex==1)
N             =          9 (number of operators of length   3)
C  0 A  1 A  0 |  0.00000000000000E+00
C  0 A  2 A  0 |  0.00000000000000E+00
C  1 A  1 A  0 |  0.00000000000000E+00
C  1 A  2 A  0 |  0.00000000000000E+00
C  2 A  1 A  0 |  0.00000000000000E+00
C  2 A  2 A  0 |  0.00000000000000E+00
C  0 A  2 A  1 |  0.00000000000000E+00
C  1 A  2 A  1 |  0.00000000000000E+00
C  2 A  2 A  1 |  0.00000000000000E+00

Operator of Length   4
QComplex      =          0 (Real==0 or Complex==1)
N             =          9 (number of operators of length   4)
C  1 C  0 A  1 A  0 |  0.00000000000000E+00
C  2 C  0 A  1 A  0 |  0.00000000000000E+00
C  1 C  0 A  2 A  0 |  0.00000000000000E+00
C  2 C  0 A  2 A  0 |  0.00000000000000E+00
C  2 C  1 A  1 A  0 |  0.00000000000000E+00
C  2 C  1 A  2 A  0 |  0.00000000000000E+00
C  1 C  0 A  2 A  1 |  0.00000000000000E+00
C  2 C  0 A  2 A  1 |  0.00000000000000E+00
C  2 C  1 A  2 A  1 |  0.00000000000000E+00

================ PartialOperator  {1} include =============

Operator:
QComplex         =          0 (Real==0 or Complex==1 or Mixed==2)
MaxLength        =          4 (largest number of product of lader operators)
NFermionic modes =          3 (Number of fermionic modes (site, spin, orbital, ...) in the one particle basis)
NBosonic modes   =          0 (Number of bosonic modes (phonon modes, ...) in the one particle basis)

Operator of Length   1
QComplex      =          0 (Real==0 or Complex==1)
N             =          2 (number of operators of length   1)
C  1 |  1.00000000000000E+00
A  1 |  4.00000000000000E+00

Operator of Length   2
QComplex      =          0 (Real==0 or Complex==1)
N             =          5 (number of operators of length   2)
C  1 A  0 |  4.00000000000000E+00
C  0 A  1 |  4.00000000000000E+00
C  1 A  1 |  4.00000000000000E+00
C  2 A  1 |  4.00000000000000E+00
C  1 A  2 |  4.00000000000000E+00

Operator of Length   3
QComplex      =          0 (Real==0 or Complex==1)
N             =          7 (number of operators of length   3)
C  0 A  1 A  0 |  0.00000000000000E+00
C  1 A  1 A  0 |  0.00000000000000E+00
C  1 A  2 A  0 |  0.00000000000000E+00
C  2 A  1 A  0 |  0.00000000000000E+00
C  0 A  2 A  1 |  0.00000000000000E+00
C  1 A  2 A  1 |  0.00000000000000E+00
C  2 A  2 A  1 |  0.00000000000000E+00

Operator of Length   4
QComplex      =          0 (Real==0 or Complex==1)
N             =          8 (number of operators of length   4)
C  1 C  0 A  1 A  0 |  0.00000000000000E+00
C  2 C  0 A  1 A  0 |  0.00000000000000E+00
C  1 C  0 A  2 A  0 |  0.00000000000000E+00
C  2 C  1 A  1 A  0 |  0.00000000000000E+00
C  2 C  1 A  2 A  0 |  0.00000000000000E+00
C  1 C  0 A  2 A  1 |  0.00000000000000E+00
C  2 C  0 A  2 A  1 |  0.00000000000000E+00
C  2 C  1 A  2 A  1 |  0.00000000000000E+00

================ PartialOperator  {0,2} include =============

Operator:
QComplex         =          0 (Real==0 or Complex==1 or Mixed==2)
MaxLength        =          4 (largest number of product of lader operators)
NFermionic modes =          3 (Number of fermionic modes (site, spin, orbital, ...) in the one particle basis)
NBosonic modes   =          0 (Number of bosonic modes (phonon modes, ...) in the one particle basis)

Operator of Length   1
QComplex      =          0 (Real==0 or Complex==1)
N             =          4 (number of operators of length   1)
C  0 |  1.00000000000000E+00
C  2 |  1.00000000000000E+00
A  0 |  4.00000000000000E+00
A  2 |  4.00000000000000E+00

Operator of Length   2
QComplex      =          0 (Real==0 or Complex==1)
N             =          8 (number of operators of length   2)
C  0 A  0 |  4.00000000000000E+00
C  1 A  0 |  4.00000000000000E+00
C  2 A  0 |  4.00000000000000E+00
C  0 A  1 |  4.00000000000000E+00
C  2 A  1 |  4.00000000000000E+00
C  0 A  2 |  4.00000000000000E+00
C  1 A  2 |  4.00000000000000E+00
C  2 A  2 |  4.00000000000000E+00

Operator of Length   3
QComplex      =          0 (Real==0 or Complex==1)
N             =          9 (number of operators of length   3)
C  0 A  1 A  0 |  0.00000000000000E+00
C  0 A  2 A  0 |  0.00000000000000E+00
C  1 A  1 A  0 |  0.00000000000000E+00
C  1 A  2 A  0 |  0.00000000000000E+00
C  2 A  1 A  0 |  0.00000000000000E+00
C  2 A  2 A  0 |  0.00000000000000E+00
C  0 A  2 A  1 |  0.00000000000000E+00
C  1 A  2 A  1 |  0.00000000000000E+00
C  2 A  2 A  1 |  0.00000000000000E+00

Operator of Length   4
QComplex      =          0 (Real==0 or Complex==1)
N             =          9 (number of operators of length   4)
C  1 C  0 A  1 A  0 |  0.00000000000000E+00
C  2 C  0 A  1 A  0 |  0.00000000000000E+00
C  1 C  0 A  2 A  0 |  0.00000000000000E+00
C  2 C  0 A  2 A  0 |  0.00000000000000E+00
C  2 C  1 A  1 A  0 |  0.00000000000000E+00
C  2 C  1 A  2 A  0 |  0.00000000000000E+00
C  1 C  0 A  2 A  1 |  0.00000000000000E+00
C  2 C  0 A  2 A  1 |  0.00000000000000E+00
C  2 C  1 A  2 A  1 |  0.00000000000000E+00

================ PartialOperator  {1} exclude =============

Operator:
QComplex         =          0 (Real==0 or Complex==1 or Mixed==2)
MaxLength        =          4 (largest number of product of lader operators)
NFermionic modes =          3 (Number of fermionic modes (site, spin, orbital, ...) in the one particle basis)
NBosonic modes   =          0 (Number of bosonic modes (phonon modes, ...) in the one particle basis)

Operator of Length   0
QComplex      =          0 (Real==0 or Complex==1)
N             =          1 (number of operators of length   0)
|  1.00000000000000E+00

Operator of Length   1
QComplex      =          0 (Real==0 or Complex==1)
N             =          4 (number of operators of length   1)
C  0 |  1.00000000000000E+00
C  2 |  1.00000000000000E+00
A  0 |  4.00000000000000E+00
A  2 |  4.00000000000000E+00

Operator of Length   2
QComplex      =          0 (Real==0 or Complex==1)
N             =          4 (number of operators of length   2)
C  0 A  0 |  4.00000000000000E+00
C  2 A  0 |  4.00000000000000E+00
C  0 A  2 |  4.00000000000000E+00
C  2 A  2 |  4.00000000000000E+00

Operator of Length   3
QComplex      =          0 (Real==0 or Complex==1)
N             =          2 (number of operators of length   3)
C  0 A  2 A  0 |  0.00000000000000E+00
C  2 A  2 A  0 |  0.00000000000000E+00

Operator of Length   4
QComplex      =          0 (Real==0 or Complex==1)
N             =          1 (number of operators of length   4)
C  2 C  0 A  2 A  0 |  0.00000000000000E+00

================ PartialOperator  {0,2} exclude =============

Operator:
QComplex         =          0 (Real==0 or Complex==1 or Mixed==2)
MaxLength        =          4 (largest number of product of lader operators)
NFermionic modes =          3 (Number of fermionic modes (site, spin, orbital, ...) in the one particle basis)
NBosonic modes   =          0 (Number of bosonic modes (phonon modes, ...) in the one particle basis)

Operator of Length   0
QComplex      =          0 (Real==0 or Complex==1)
N             =          1 (number of operators of length   0)
|  1.00000000000000E+00

Operator of Length   1
QComplex      =          0 (Real==0 or Complex==1)
N             =          2 (number of operators of length   1)
C  1 |  1.00000000000000E+00
A  1 |  4.00000000000000E+00

Operator of Length   2
QComplex      =          0 (Real==0 or Complex==1)
N             =          1 (number of operators of length   2)
C  1 A  1 |  4.00000000000000E+00

================ PartialOperator  {1} conserve =============

Operator:
QComplex         =          0 (Real==0 or Complex==1 or Mixed==2)
MaxLength        =          4 (largest number of product of lader operators)
NFermionic modes =          3 (Number of fermionic modes (site, spin, orbital, ...) in the one particle basis)
NBosonic modes   =          0 (Number of bosonic modes (phonon modes, ...) in the one particle basis)

Operator of Length   0
QComplex      =          0 (Real==0 or Complex==1)
N             =          1 (number of operators of length   0)
|  1.00000000000000E+00

Operator of Length   1
QComplex      =          0 (Real==0 or Complex==1)
N             =          4 (number of operators of length   1)
C  0 |  1.00000000000000E+00
C  2 |  1.00000000000000E+00
A  0 |  4.00000000000000E+00
A  2 |  4.00000000000000E+00

Operator of Length   2
QComplex      =          0 (Real==0 or Complex==1)
N             =          5 (number of operators of length   2)
C  0 A  0 |  4.00000000000000E+00
C  2 A  0 |  4.00000000000000E+00
C  1 A  1 |  4.00000000000000E+00
C  0 A  2 |  4.00000000000000E+00
C  2 A  2 |  4.00000000000000E+00

Operator of Length   3
QComplex      =          0 (Real==0 or Complex==1)
N             =          4 (number of operators of length   3)
C  0 A  2 A  0 |  0.00000000000000E+00
C  1 A  1 A  0 |  0.00000000000000E+00
C  2 A  2 A  0 |  0.00000000000000E+00
C  1 A  2 A  1 |  0.00000000000000E+00

Operator of Length   4
QComplex      =          0 (Real==0 or Complex==1)
N             =          5 (number of operators of length   4)
C  1 C  0 A  1 A  0 |  0.00000000000000E+00
C  2 C  0 A  2 A  0 |  0.00000000000000E+00
C  2 C  1 A  1 A  0 |  0.00000000000000E+00
C  1 C  0 A  2 A  1 |  0.00000000000000E+00
C  2 C  1 A  2 A  1 |  0.00000000000000E+00

================ PartialOperator  {0,2} conserve =============

Operator:
QComplex         =          0 (Real==0 or Complex==1 or Mixed==2)
MaxLength        =          4 (largest number of product of lader operators)
NFermionic modes =          3 (Number of fermionic modes (site, spin, orbital, ...) in the one particle basis)
NBosonic modes   =          0 (Number of bosonic modes (phonon modes, ...) in the one particle basis)

Operator of Length   0
QComplex      =          0 (Real==0 or Complex==1)
N             =          1 (number of operators of length   0)
|  1.00000000000000E+00

Operator of Length   1
QComplex      =          0 (Real==0 or Complex==1)
N             =          2 (number of operators of length   1)
C  1 |  1.00000000000000E+00
A  1 |  4.00000000000000E+00

Operator of Length   2
QComplex      =          0 (Real==0 or Complex==1)
N             =          3 (number of operators of length   2)
C  0 A  0 |  4.00000000000000E+00
C  1 A  1 |  4.00000000000000E+00
C  2 A  2 |  4.00000000000000E+00

Operator of Length   3
QComplex      =          0 (Real==0 or Complex==1)
N             =          2 (number of operators of length   3)
C  0 A  1 A  0 |  0.00000000000000E+00
C  2 A  2 A  1 |  0.00000000000000E+00

Operator of Length   4
QComplex      =          0 (Real==0 or Complex==1)
N             =          3 (number of operators of length   4)
C  1 C  0 A  1 A  0 |  0.00000000000000E+00
C  2 C  0 A  2 A  0 |  0.00000000000000E+00
C  2 C  1 A  2 A  1 |  0.00000000000000E+00

================ PartialOperator  {{0,2}} conserve =============

Operator:
QComplex         =          0 (Real==0 or Complex==1 or Mixed==2)
MaxLength        =          4 (largest number of product of lader operators)
NFermionic modes =          3 (Number of fermionic modes (site, spin, orbital, ...) in the one particle basis)
NBosonic modes   =          0 (Number of bosonic modes (phonon modes, ...) in the one particle basis)

Operator of Length   0
QComplex      =          0 (Real==0 or Complex==1)
N             =          1 (number of operators of length   0)
|  1.00000000000000E+00

Operator of Length   1
QComplex      =          0 (Real==0 or Complex==1)
N             =          2 (number of operators of length   1)
C  1 |  1.00000000000000E+00
A  1 |  4.00000000000000E+00

Operator of Length   2
QComplex      =          0 (Real==0 or Complex==1)
N             =          5 (number of operators of length   2)
C  0 A  0 |  4.00000000000000E+00
C  2 A  0 |  4.00000000000000E+00
C  1 A  1 |  4.00000000000000E+00
C  0 A  2 |  4.00000000000000E+00
C  2 A  2 |  4.00000000000000E+00

Operator of Length   3
QComplex      =          0 (Real==0 or Complex==1)
N             =          4 (number of operators of length   3)
C  0 A  1 A  0 |  0.00000000000000E+00
C  2 A  1 A  0 |  0.00000000000000E+00
C  0 A  2 A  1 |  0.00000000000000E+00
C  2 A  2 A  1 |  0.00000000000000E+00

Operator of Length   4
QComplex      =          0 (Real==0 or Complex==1)
N             =          5 (number of operators of length   4)
C  1 C  0 A  1 A  0 |  0.00000000000000E+00
C  2 C  0 A  2 A  0 |  0.00000000000000E+00
C  2 C  1 A  1 A  0 |  0.00000000000000E+00
C  1 C  0 A  2 A  1 |  0.00000000000000E+00
C  2 C  1 A  2 A  1 |  0.00000000000000E+00