# How to construct singlet state under QN conservation?

+1 vote

Hi

Consider a two-particle singlet state (UpDn-DnUp)/sqrt(2), it evolves under QN conservation and "Sz=0" is conserved. But according to the latest comment, QN conserving ITensors are only for working with tensors that have well-defined quantum numbers of various types. "Sz" is not a good quantum number for (UpDn-DnUp)/sqrt(2). How should I do if I want to conserve "Sz=0"?

Thanks a lot!

+1 vote

Hi, so here is some example code below that shows you how to construct a singlet state as an ITensor. Please let me know if you are instead wanting to construct this state as an MPS.

Before showing the code, let me point out that in the comment you are referencing, what I said was that the state (Up+Dn) is not a state with well-defined Sz. However, the state (UpDn-DnUp) is a different state from that one, and does have a well-defined Sz of zero. So it's not correct to say that (UpDn-DnUp) does not have Sz as a good quantum number; it does.

The easiest way to make this state with ITensor is to obtain a set of indices corresponding to spins. I assume you are interested in spin-half (S=1/2) spins.

auto N = 2;
auto s = SpinHalf(N,{"ConserveQNs=",true});
Print(s(1));
Print(s(2));

auto psi = ITensor(s(1),s(2));

psi.set(s(1)(1),s(2)(2), 1.0/Sqrt2);
psi.set(s(1)(2),s(2)(1), -1.0/Sqrt2);

PrintData(psi);

Print(flux(psi)); //here flux is total Sz

commented by (46.8k points)
Note: since the latest version of ITensor, you must include the header #include "itensor/util/print_macro.h" to get the macro Print used in the above code.
commented by (160 points)
Hi Miles,

Thank you very much! I think I mixed them by mistakes.

Please allow me to make a further comment. In your example code, QN is automatically detected as "Sz=0" by writting down "{"ConserveQNs=",true}" and its evolution will satisfy QN({"Sz",0}). Do I get the correct understanding?

Thanks!

Eric
commented by (46.8k points)
Hi Eric, that's a good question, but your understanding is not quite correct. Here is the correct understanding:

1. setting {"ConserveQNs=",true} produces a set of Index objects stored in sites which carry QN information. This QN information does not yet specify that Sz=0, as indeed there are not yet even any tensors which have been created. What it does do is record that the quantum number of the states of an individual spin correspond to Sz=+1 for spin up and Sz=-1 for spin down. (We use units of +1 in ITensor corresponding to +1/2 in physics so we can store quantum numbers as integers.)

2. when the ITensor psi is made, it still doesn't have a well-defined quantum number because it starts out as being zero

3. finally, when setting the first non-zero element of the ITensor psi, (the line psi.set(s(1)(1),s(2)(2), 1.0/Sqrt2); ), it is detected that this element is in a block that corresponds to a total Sz=0 combination of the indices of psi. So from that point onward, psi has a QN "flux" of QN("Sz",0) and only elements which preserve or conserve that same QN flux are allowed to be set to a non-zero value.

So it is really in step 3 above (the .set command to set elements of psi) that a QN value is automatically detected.

Yes, evolving tensors with a specific total QN (total flux) will preserve the total to be Sz=0 if by evolving you mean acting with operators which themselves are zero flux. One example of operators which are always zero flux are unitary operators. Another example is a Hamiltonian which conserves Sz, or exponentials of individual terms of that Hamiltonian.

Hope that helps!

Miles
commented by (160 points)
Hi Miles,

Thank you for your clear explanation!

Eric