Closed AniTrivedi closed 2 months ago
All gates have their form as matrix, which can be found in various literature (for example M. A. Nielsen and I. L. Chuang, Quantum Computation and Quantum Information ) or directly in Qiskit package.
To transform Hamiltonian into circuit you have to rewrite it as combination of some gates. For kicked top (to be precise for 3 qubit circuit) a solution is combination of 3 single rotation gate ( typically RY) and 3 coupled rotation gate (in Qiskit it is RZZ gate).
RZZ seems a little bit tricky, but it can be easily decomposed as
As you decompose them, some CNOTs cancel each other, so to optimise program you should not consider them into computation. And such optimized circuit is implemented in my code.
Some implementation can be also found in: Neill, C., Roushan, P., Fang, M. et al. Ergodic dynamics and thermalization in an isolated quantum system A.Anand, S. Srivasta, S. Gangopadhyay, S. Ghose, Simulating quantum chaos on a quantum computer
This final rotation is just for the purpose of graphical presentation. If you switch program to create a plot it will draw a probability map of qubit vector state. Theta and phi are spherical coordinates of vector, which is projected onto evolved by QKT starting vector.
Heyyyy, thank you so much for answering my questions. I understand it much better now. Just one last question, why are we recording only the '000' state? What is special about it?
I don't know if i understand your question correctly, but '000' is not only our starting state. In the beginning of the circuit there is a set of 3 RY and 3 RZ gates with theta0 and phi0 parameter. It corresponds to rotating our initial vector '000' to |theta, phi> state in spherical coordinates. And those |theta, phi> states are our staring states ready to be evolved by QKT Hamiltonian.
In the code, you are appending resultlist with probability of 000 state when it is present, otherwise you are appending 0 for other states. So basically, recording only the probabilities of 000 state in each circuit. Why is that?
for i, job in enumerate(jobs): for circuit in circuits: counts = job.result().get_counts(circuit) if '000' in counts.keys(): resultlist.append(counts['000']/shots) else: resultlist.append(0)
Well what I measure in code is basically a probability of $|<\theta, \phi|U^n|\theta_0, \phi_0>|^2
$, where $U$ is a floquet operator, $|\theta_0, \phi_0>$ is a starting state and $<\theta, \phi|$ is a vector used to plot the evolved state.
In other words first the code is evolving $n$ times our starting state $|\theta_0, \phi_0>$ and then project such evolved vector onto various $<\theta, \phi|$ states. The probability of '000' state is basically a probability that evolved state $U^n|\theta_0, \phi_0>$ is in this $<\theta, \phi|$ state. If there is no probability of such case (number of counts are 0) then my program is returning a 0 probability.
By projecting our evolved vector onto grid of evenly spaced $<\theta, \phi|$ states on entire sphere, we aquire probability map that can be somehow interpreted as Bloch sphere for 3 qubits.
Ahh now I understand. Thank you so much for clearing my doubts, this was really helpful!
In your 'quantum-simulation.py' file you have made "kick" circuit which describe the evolution of the Hamiltonian (floquet operator of the kicked top essentially). I know the equation for that, but I don't know how to transform it into quantum circuit (with rotational and cnot gates). Can you tell me how it is supposed to be done and any references for the same? To be specific, I didn't understand implementation of cnot and Rz gates together. It would really help me in my own project related to quantum kicked top.
Also, I didn't understand what is the purpose of the final rotations after all the kicks in the "qc" circuit? Any references for the same would be really helpful too. Thank you so much.