# Qutip choi_to_kraus and to_kraus functions are not returning list of Kraus representation

I am trying to find my kraus representation from my process matrix. Suppose that, I have these process matrix:

proces_matrix =  [[ 1.     0.     0.     0.   ]
[-0.     0.537 -0.004 -0.005]
[ 0.023  0.014  0.635 -0.03 ]
[ 0.011 -0.009  0.017  0.883]]]


To find the kraus representation, I tried 2 methods.

1. I first tried to use to_kraus function in qutip. According to API documentation, to_kraus Converts a Qobj representing a quantum map to a list of quantum objects, each representing an operator in the Kraus decomposition of the given map. When I gave my process matrix to the function, as a result I got my process matrix back.

The code is pretty simple:

    q_proces_matrix = qutip.Qobj(proces_matrix)
kraus_rep = qutip.to_kraus(q_proces_matrix)

1. Then I thought, I am doing something wrong so I asked this question, and thanks to a the answer, I first find my Choi matrix with the function of to_choi in qutip and then I used choi_to_kraus function in qutip. The definition of the function is enter link description here It takes choi matrices and turns kraus representations However I got my process matrices as output instead of Kraus representations.

The code is again pretty simple:

q_proces_matrix = qutip.Qobj(proces_matrix)
choi = qutip.to_choi(q_proces_matrix)
kraus_rep = qutip.choi_to_kraus(choi)

1. AFter all, I just found the eigenvectors of my Choi matrices and It means the superket operation of my kraus representations. But I am quite confused what I did wrong with qutip function and I did not get my Kraus representations from the functions

Could someone explain me what I missed in qutip?

• it might be easier to answer the question is you add a working code snippet showing what exactly you did
– glS
Feb 3, 2022 at 11:27

In QuTiP, there are different Qobj types for operators and superoperators, and the function to_choi will only do what you expect it to if the input has type super. If you change qutip.Qobj(proces_matrix) to qutip.Qobj(proces_matrix, type='super'), everything should work.
The reason you get the same thing back otherwise is because QuTiP converts to type=oper by default with Qobj() and thus assumes your input is just an operator in the unvectorized convention, such as a single Kraus operator. Then with your code you ended up converting this to a Choi matrix and back to just a single Kraus operator.
• As a follow up, this should also work by just using the to_kraus function directly - no need to convert to Choi matrix. If the argument given to to_kraus has type super, it will give you the Kraus operators correctly. Feb 3, 2022 at 22:44