zeroonvac

◼ zeroonvac[expr] drops parts of expr which annihilate the vacuum state.

◼ isannihilation is used to determine if the final operator in the operator string annihilates the vacuum. The result depends on the ordering type of the operators involved.

◼ zeroonvac is useful for manipulating basis states in the creation operator representation.

◼ zeroonvac should be considered as a simplification function that drops unnecessary parts of states in the creation operator representation. It relies on the automatic reordering of operators into the normal ordered form. For ordering=SEA, it might happen that the operator expression for generic indexes is not actually normal ordered, therefore zeroonvac will retain terms than do, in fact, annihilate the vacuum.

◼ See also: ordering, VACUUM, isannihilation, iscreation, vev, vevwick.

Further examples

Load sneg and declare some quantities

<< sneg`sneg`;
snegfermionoperators[c, d];
ordering[d] = SEA;
snegfreeindexes[k, σ, k1, k2];

These are all zero

zeroonvac[c[AN]] == 0
zeroonvac[c[AN, 1]] == 0
zeroonvac[c[AN, k]] == 0
zeroonvac[c[AN, k, σ]] == 0
zeroonvac[nc[c[CR], c[AN]]] == 0
zeroonvac[nc[c[CR], c[AN, 1]]] == 0
zeroonvac[nc[c[CR], c[AN, k]]] == 0
zeroonvac[nc[c[CR], c[AN, k, σ]]] == 0

We can shown in an alternative way that these operators do indeed annihilate the vacuum

c[AN]·VACUUM == 0
c[AN, 1]·VACUUM == 0
c[AN, k]·VACUUM == 0
c[AN, k, σ]·VACUUM == 
      0
nc[c[CR], c[AN]]·VACUUM == 0
nc[c[CR], c[AN, 1]]·VACUUM == 0
nc[c[CR], c[AN, k]]·VACUUM == 0
nc[c[CR], c[AN, k, σ]]·VACUUM == 0

These are returned unchanged

zeroonvac[c[CR]]
zeroonvac[c[CR, k]]
zeroonvac[c[CR, k, σ]]
zeroonvac[c[CR, k, UP]]

An alternative approach

c[CR]·VACUUM
c[CR, k]·VACUUM
c[CR, k, σ]·VACUUM
c[CR, k, UP]·VACUUM

Drop parts that annihilate vacuum

c[AN, σ]·c[CR, σ]
zeroonvac[%]
%%·VACUUM
c[AN, UP]·c[CR, DO]
zeroonvac[%] == 0
%%·VACUUM == 0

For ordering=SEA, the result depends on the value of the indexes.

zeroonvac[d[CR]]
zeroonvac[d[CR, k]]
zeroonvac[d[CR, k, σ]]
zeroonvac[d[AN]]
zeroonvac[d[AN, k]]
zeroonvac[d[AN, k, σ]]

In the alternative approach, the expressions are returned unevaluated.

d[CR]·VACUUM
d[CR, k]·VACUUM
d[CR, k, σ]·VACUUM
d[AN]·VACUUM
d[AN, k]·VACUUM
d[AN, k, σ]·VACUUM

snegAssuming may be used to temporarily specify the sign of the momentum index.

snegAssuming[k /: k > 0 = True, zeroonvac[d[AN, k]]] == 
      0
snegAssuming[k /: k < 0 = True, zeroonvac[d[CR, k]]] == 
      0

snegAssuming[k /: k > 0 = True, d[AN, k]·VACUUM] == 
      0
snegAssuming[k /: k < 0 = True, d[CR, k]·VACUUM] == 
      0

Both zeroonvac and the alternative approach fail to simplify op to zero, even though it annihilates the vacuum irrespective of the value of k2.

op = d[AN, k1]·d[AN, k2]
snegAssuming[{k1 /: k1 > 0 = True}, 
      zeroonvac[op]]
snegAssuming[{k1 /: k1 > 0 = True}, op·VACUUM]

If both k1 and k2 are specified, the simplification can be performed, since the annihilation operator  (Subscript[d, k1])is anticommuted to the right. Notice the use of snegAssumingHoldForm.

snegAssumingHoldForm[{k1 /: k1 > 0 = True, 
k2 /: 
          k2 < 0 = True}, op]

    
snegAssuming[{k1 /: k1 > 0 = True, 
k2 /: k2 < 0 = 
            True}, zeroonvac[op]] == 0
snegAssuming[{k1 /: k1 > 0 = True, 
k2 /: k2 < 0 = 
            True}, op·VACUUM] == 
      0

snegAssuming[{k1 /: k1 > 0 = True, 
k2 /: k2 > 0 = 
            True}, zeroonvac[op]] == 0
snegAssuming[{k1 /: k1 > 0 = True, 
k2 /: k2 > 0 = 
            True}, op·VACUUM] == 0