+1 vote
asked by (160 points)


This question is linked with the comments here

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 Answer

+1 vote
answered by (46.8k points)

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});

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);


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?


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!

commented by (160 points)
Hi Miles,

Thank you for your clear explanation!

Welcome to ITensor Support Q&A, where you can ask questions and receive answers from other members of the community.

Formatting Tips:
  • To format code, indent by four spaces
  • To format inline LaTeX, surround it by @@ on both sides
  • To format LaTeX on its own line, surround it by $$ above and below
  • For LaTeX, it may be necessary to backslash-escape underscore characters to obtain proper formatting. So for example writing \sum\_i to represent a sum over i.
If you cannot register due to firewall issues (e.g. you cannot see the capcha box) please email Miles Stoudenmire to ask for an account.

To report ITensor bugs, please use the issue tracker.