On Fri, Nov 4, 2011 at 12:56 PM, Brian Granger <[email protected]> wrote:
> 2011/11/4 Uğur Güney <[email protected]>: > > Now, I can ask my second question. :-) > > Are the states and operators aware of their Hilbert spaces? For example, > > say, I'm working on a two particle system. I'm only looking at their spin > > states, described by qubits. First particle lives in Hilbert space H1, > and > > second one in H2. So the combined state lives in H1xH2. I want to apply > > projection operators which works on either H1 or H2 to this state. > > I tried this: > > All of the Hilbert space stuff is implicit, but you can still do what you > want. > > > H1=HilbertSpace() # Hilbert space for first particle > > H2=HilbertSpace() # Hilbert space for second particle > > qb1 = Qubit('0') # first particle's state > > qb2 = Qubit('1') # second particle's state > > state = TensorProduct(qb1,qb2) # state of combined system > > # state.hilbert_space # gave an error: no such attribute > > proj = qb2*qb2.dual # projection operator which works on H2 > > proj = TensorProduct(1, qb2*qb2.dual) > qapply(tensor_product_simp(proj*state)) > > The extra tensor_product_simp turns a product of TPs into a TP of products. > So, adding these lines to the code above qb1.hilbert_space = H1 qb2.hilbert_space = H2 can not make the system differentiate between two different Hilbert spaces. But I have to keep the order of the objects in the tensor products to indicate the space they belong, such as "1" operator on so-called "H1" and "proj" operator on "H2". I think this is a simple and robust solution. But, unforunately, when I tried "proj=TensorProduct(1,qb2*qb2.dual)" I got this error: AttributeError: 'int' object has no attribute 'is_commutative' I think 1 is an integer an does not behaved as an identity operator. Are there any identity operators in Sympy? vug > But the main point is that you have to be careful about creating > tensor products explicitly. This is another place where we tend to be > very sneaky when writing Dirac notation by hand. We keep track of > which Hilbert space each operator is acting in but don't express it in > our notation. As you can imagine, it was quite difficult to teach > SymPy Dirac notation and we have tried to strike a balance between > Mathematical accuracy and easy of use. > > Cheers, > > Brian > > > proj*state > > (proj*state).doit() > > qapply(proj*state) > > The result was: "|1><1|*|0>x|1>" Is it possible to convert this > expression > > into "|0>x(|1><1|1>)" which can be further simplified to "|0>x|1>"? > > vug > > 2011/11/4 Uğur Güney <[email protected]> > >> > >> Hi! > >> Thanks for the clear explanation! > >> > >> On Fri, Nov 4, 2011 at 1:27 AM, Brian Granger <[email protected]> > wrote: > >>> > >>> Ugur, > >>> > >>> Welcome! > >>> > >>> 2011/11/3 Uğur Güney <[email protected]>: > >>> > Dear Sympy users, > >>> > I'm a physics PhD student, doing research on differences between > >>> > classical > >>> > and quantum correlations. > >>> > I was in need of a simple calculator which works with quantum states > >>> > etc. > >>> > While searching for quantum simulators in Python I came to know that > >>> > there > >>> > is already a quantum module in SymPy. Because I couldn't find an > >>> > explicit > >>> > documentation I looked at the source files to understand how basic > >>> > calculations can be done using the quantum module. > >>> > >>> Great, currently this is the best way to learn about how it all works. > >>> > >>> > Can you please help me in applying a projection operator on a general > >>> > state. > >>> > This is the code that I tried: > >>> > from sympy import * > >>> > from sympy.physics.quantum import * > >>> > from sympy.physics.quantum.qubit import * > >>> > [c00,c01,c10,c11]=var('c00,c01,c10,c11') # coefficients > >>> > state = > c00*Qubit('00')+c01*Qubit('01')+c10*Qubit('10')+c11*Qubit('11') > >>> > # > >>> > most general two-qubit state > >>> > qbt=Qubit('01') # a qubit > >>> > proj = qbt*qbt.dual # projection operator > >>> > # proj*state # operator applied on the state > >>> > >>> The following will work: > >>> > >>> qapply(proj*state) > >>> > >>> The need for qapply ("quantum apply") is as follows. Because of how > >>> python/sympy handle multiplication, we are only able to detect inner > >>> products in very simple situations like Qubit('01').dual*Qubit('01'). > >>> For more complex situations, we just leave it as a general > >>> "multiplication" operation. The qapply function walks through a > >>> general quantum expression and does a couple of things: > >>> > >>> * Applies any operators to states. > >>> * Looks for <bra|*|ket> expressions and turns them into inner products. > >>> > >>> This is why you need to call qapply by hand after creating a general > >>> quantum expression. > >> > >> Now I realized that even the simplest calculation that is made with > pencil > >> and paper involves these kind of background processes that we > >> do unconsciously. Dirac notation is too intuitive for a computer. :-) > >>> > >>> Hope this helps. Also, we would love to know how you end up using > >>> this stuff. It is pretty new, so there is a ton left to do. Also, if > >>> you are looking at classical/quantum correlations, you may be > >>> interested in the work we have done on density matrices. That has not > >>> yet been merged into sympy's master branch, but we plan on doing > >>> that....always looking for help. > >> > >> Thanks! OK, I will inform the group about how and where I used Sympy. > I'll > >> definitely look at density matrices because I want to work on both pure > >> states and mixed states. > >> vug > >>> > >>> Cheers, > >>> > >>> Brian > >>> > >>> > # (proj*state).expand() operator applied on each term in the > expansion > >>> > print (proj*state).expand().doit() # try to do the inner-products > >>> > In the last step "doit()" did not work as I expected, it did not do > the > >>> > inner products. I suspect that the expression involving TensorProduct > >>> > is not > >>> > converted to InnerProduct automatically. But normally > >>> > "(Qubit('01').dual*Qubit('01')).doit()" and > >>> > "(Qubit('00').dual*Qubit('01')).doit()" work as expected and give 1 > and > >>> > 0. > >>> > I'll be happy if you can guide me how to use this beautiful tool. > >>> > Best, > >>> > ugur guney > >>> > > >>> > -- > >>> > You received this message because you are subscribed to the Google > >>> > Groups > >>> > "sympy" group. > >>> > To post to this group, send email to [email protected]. > >>> > To unsubscribe from this group, send email to > >>> > [email protected]. > >>> > For more options, visit this group at > >>> > http://groups.google.com/group/sympy?hl=en. > >>> > > >>> > >>> > >>> > >>> -- > >>> Brian E. Granger > >>> Cal Poly State University, San Luis Obispo > >>> [email protected] and [email protected] > >>> > >>> -- > >>> You received this message because you are subscribed to the Google > Groups > >>> "sympy" group. > >>> To post to this group, send email to [email protected]. > >>> To unsubscribe from this group, send email to > >>> [email protected]. > >>> For more options, visit this group at > >>> http://groups.google.com/group/sympy?hl=en. > >>> > >> > > > > -- > > You received this message because you are subscribed to the Google Groups > > "sympy" group. > > To post to this group, send email to [email protected]. > > To unsubscribe from this group, send email to > > [email protected]. > > For more options, visit this group at > > http://groups.google.com/group/sympy?hl=en. > > > > > > -- > Brian E. Granger > Cal Poly State University, San Luis Obispo > [email protected] and [email protected] > > -- > You received this message because you are subscribed to the Google Groups > "sympy" group. > To post to this group, send email to [email protected]. > To unsubscribe from this group, send email to > [email protected]. > For more options, visit this group at > http://groups.google.com/group/sympy?hl=en. > > -- You received this message because you are subscribed to the Google Groups "sympy" group. To post to this group, send email to [email protected]. To unsubscribe from this group, send email to [email protected]. For more options, visit this group at http://groups.google.com/group/sympy?hl=en.
