import marimo as mo
import numpy as np
from qiskit import QuantumCircuit, transpile
from qiskit_aer import StatevectorSimulator
INFO:qiskit.passmanager.base_tasks:Pass: UnrollCustomDefinitions - 0.15211 (ms) INFO:qiskit.passmanager.base_tasks:Pass: BasisTranslator - 0.03934 (ms)

test_change_of_basis_circuit v0.0.0

This notebook has been successfully created and is ready for you to start working. To learn how to edit and run it, check out the marimo documentation. Whether you're analyzing data, testing algorithms, or exploring new ideas, this is your space. Once you're done, don’t forget to click the Publish button to share your work. Happy coding! πŸš€

Test of a circuit to build state ∣ΦI0β€²(ΞΈ,Ο•,ψ)⟩I∈{A,B,C}{\ket{\Phi^{0 \prime}_{\mathrm{I}}(\theta, \phi, \psi)}}_{I \in \{\mathrm{A}, \mathrm{B}, \mathrm{C}\}} after change of basis from reference states ∣ΦA0⟩=∣00010011⟩\ket{\Phi^{0}_{\mathrm{A}}}=\ket{00010011}, ∣ΦB0⟩=∣00010101⟩\ket{\Phi^{0}_{\mathrm{B}}}=\ket{00010101}, ∣ΦC0⟩=∣00011001⟩\ket{\Phi^{0}_{\mathrm{C}}}=\ket{00011001} in the context of H4+_4^+

circuit_selector = mo.ui.dropdown(
    options={
        "Circuit Phi_A": "circuit_a",
        "Circuit Phi_B": "circuit_b",
        "Circuit Phi_C": "circuit_c"
    },
    value="Circuit Phi_A",
    label="Change of basis circuit",
    full_width=True,
)

theta_selector = mo.ui.slider(
    start=0.0,
    stop=3.14159,
    step=0.01,
    value=0.5,
    label="ΞΈ"
)

phi_selector = mo.ui.slider(
    start=0.0,
    stop=np.pi,
    step=0.01,
    value=0.0,
    label="Ο†"
)

psi_selector = mo.ui.slider(
    start=0.0,
    stop=np.pi,
    step=0.01,
    value=0.0,
    label="ψ"
)

mo.vstack([
    circuit_selector,
     mo.vstack([theta_selector, phi_selector, psi_selector]),
], gap="1rem")
def rotate_x(theta):
    return np.array([[1, 0, 0],
                     [0, np.cos(theta), -np.sin(theta)],
                     [0, np.sin(theta), np.cos(theta)]])

def rotate_y(psi):
    return np.array([[np.cos(psi), 0, np.sin(psi)],
                     [0, 1, 0],
                     [-np.sin(psi), 0, np.cos(psi)]])

def rotate_z(phi):
    return np.array([[np.cos(phi), -np.sin(phi), 0],
                     [np.sin(phi), np.cos(phi), 0],
                     [0, 0, 1]])

def rotate_x_z_y(theta, phi, psi):
    return rotate_x(theta) @ rotate_z(phi) @ rotate_y(psi)
def print_result(circuit, theta, phi, psi, index):
    output = ""

    output += "Quantum Circuit to build state |Phi_C^0'(theta, phi, psi)> after change of basis\n"
    output += "Basis states:\n"
    output += "  |Phi_A^0> = |00010011>\n"
    output += "  |Phi_B^0> = |00010101>\n"
    output += "  |Phi_C^0> = |00011001>\n\n"

    output += "Quantum Circuit:\n"
    output += str(circuit)

    simulator = StatevectorSimulator()
    circuit = transpile(circuit, simulator)
    result = simulator.run(circuit).result()
    statevector = result.get_statevector(circuit)
    statevector_dictionnary = statevector.to_dict()
    rotation_matrix = rotate_x_z_y(theta, phi, psi)

    output += "\n\nAmplitude comparison:\n"

    for i, state in enumerate(['00010011', '00010101', '00011001']):
        theoretical_amplitude = rotation_matrix[i, index]
        circuit_amplitude = statevector_dictionnary.get(state, 0.0)

        output += f"\nState: {state}\n"
        output += f"Theoretical amplitude: {theoretical_amplitude}\n"
        output += f"Circuit amplitude: {circuit_amplitude}\n"
        output += f"Absolute error: {abs(theoretical_amplitude-circuit_amplitude):.3e}\n"

    return mo.md(f"```\n{output}\n```")
    
def build_circuit_phi_a_prime(theta, phi, psi): 

    circuit = QuantumCircuit(8)
    circuit.x(0)
    circuit.x(4)
    circuit.ry(2 * psi, 2)
    circuit.cx(2, 1)
    circuit.x(1)
    circuit.cry(2 * phi, 1, 3)
    circuit.cx(3, 1)
    circuit.cx(2, 3)
    circuit.cx(3, 2)
    circuit.cry(2 * theta, 3, 2)
    circuit.cx(2, 3)
    circuit.z(3)

    return print_result(circuit, theta, phi, psi, 0)
def build_circuit_phi_b_prime(theta, phi, psi): 

    circuit = QuantumCircuit(8)
    circuit.x(0)
    circuit.x(4)
    circuit.ry(2 * phi ,1)
    circuit.cx(1, 2)
    circuit.x(2)
    circuit.cry(2 * theta, 2, 3)
    circuit.cx(3, 2)
    circuit.z(1)

    return print_result(circuit, theta, phi, psi, 1)
def build_circuit_phi_c_prime(theta, phi, psi): 


    circuit = QuantumCircuit(8)
    circuit.x(0)
    circuit.x(4)

    circuit.ry(2 * psi, 1)
    circuit.cx(1, 3)
    circuit.x(3)
    circuit.cry(2 * phi, 1, 2)
    circuit.cx(2, 1)
    circuit.cx(3, 2)
    circuit.cry(2 * theta, 2, 3)
    circuit.cx(3,2)
    
    return print_result(circuit, theta, phi, psi, 2)
    

Result

active_circuit = circuit_selector.value
theta_value = theta_selector.value
phi_value = phi_selector.value
psi_value = psi_selector.value

print(psi_value)
if active_circuit == "circuit_a":
      output = build_circuit_phi_a_prime(theta_value, phi_value, psi_value)
elif active_circuit  == "circuit_b":
      output = build_circuit_phi_b_prime(theta_value, phi_value, psi_value)
elif active_circuit  == "circuit_c":
      output = build_circuit_phi_c_prime(theta_value, phi_value, psi_value)


output
Quantum Circuit to build state |Phi_C^0'(theta, phi, psi)> after change of basis
Basis states:
  |Phi_A^0> = |00010011>
  |Phi_B^0> = |00010101>
  |Phi_C^0> = |00011001>

Quantum Circuit:
       β”Œβ”€β”€β”€β”                                                       
q_0: ─── X β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
       β””β”€β”€β”€β”˜  β”Œβ”€β”€β”€β”β”Œβ”€β”€β”€β”         β”Œβ”€β”€β”€β”                             
q_1: ────────── X β”œβ”€ X β”œβ”€β”€β”€β”€β– β”€β”€β”€β”€β”€ X β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
     β”Œβ”€β”€β”€β”€β”€β”€β”€β”β””β”€β”¬β”€β”˜β””β”€β”€β”€β”˜    β”‚    β””β”€β”¬β”€β”˜     β”Œβ”€β”€β”€β”β”Œβ”€β”€β”€β”€β”€β”€β”€β”          
q_2: ─ Ry(0) β”œβ”€β”€β– β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β– β”€β”€β”€ X β”œβ”€ Ry(1) β”œβ”€β”€β– β”€β”€β”€β”€β”€β”€β”€
     β””β”€β”€β”€β”€β”€β”€β”€β”˜          β”Œβ”€β”€β”€β”΄β”€β”€β”€β”  β”‚  β”Œβ”€β”΄β”€β”β””β”€β”¬β”€β”˜β””β”€β”€β”€β”¬β”€β”€β”€β”˜β”Œβ”€β”΄β”€β”β”Œβ”€β”€β”€β”
q_3: ──────────────────── Ry(0) β”œβ”€β”€β– β”€β”€β”€ X β”œβ”€β”€β– β”€β”€β”€β”€β”€β”€β– β”€β”€β”€β”€β”€ X β”œβ”€ Z β”œ
       β”Œβ”€β”€β”€β”            β””β”€β”€β”€β”€β”€β”€β”€β”˜     β””β”€β”€β”€β”˜              β””β”€β”€β”€β”˜β””β”€β”€β”€β”˜
q_4: ─── X β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
       β””β”€β”€β”€β”˜                                                       
q_5: ──────────────────────────────────────────────────────────────

q_6: ──────────────────────────────────────────────────────────────

q_7: ──────────────────────────────────────────────────────────────


Amplitude comparison:

State: 00010011
Theoretical amplitude: 1.0
Circuit amplitude: (0.9999999999999999-6.800116025829082e-16j)
Absolute error: 6.890e-16

State: 00010101
Theoretical amplitude: 0.0
Circuit amplitude: 0.0
Absolute error: 0.000e+00

State: 00011001
Theoretical amplitude: 0.0
Circuit amplitude: 0.0
Absolute error: 0.000e+00
INFO:qiskit.passmanager.base_tasks:Pass: ContainsInstruction - 0.01121 (ms) INFO:qiskit.passmanager.base_tasks:Pass: UnitarySynthesis - 0.00620 (ms) INFO:qiskit.passmanager.base_tasks:Pass: HighLevelSynthesis - 0.00572 (ms) INFO:qiskit.passmanager.base_tasks:Pass: BasisTranslator - 0.04435 (ms) INFO:qiskit.passmanager.base_tasks:Pass: ElidePermutations - 0.00572 (ms) INFO:qiskit.passmanager.base_tasks:Pass: RemoveDiagonalGatesBeforeMeasure - 0.00834 (ms) INFO:qiskit.passmanager.base_tasks:Pass: RemoveIdentityEquivalent - 0.01192 (ms) INFO:qiskit.passmanager.base_tasks:Pass: InverseCancellation - 0.01383 (ms) INFO:qiskit.passmanager.base_tasks:Pass: ContractIdleWiresInControlFlow - 0.00191 (ms) INFO:qiskit.passmanager.base_tasks:Pass: CommutativeCancellation - 0.28324 (ms) INFO:qiskit.passmanager.base_tasks:Pass: ConsolidateBlocks - 0.24605 (ms) INFO:qiskit.passmanager.base_tasks:Pass: Split2QUnitaries - 0.00501 (ms) INFO:qiskit.passmanager.base_tasks:Pass: UnitarySynthesis - 0.00572 (ms) INFO:qiskit.passmanager.base_tasks:Pass: HighLevelSynthesis - 0.00620 (ms) INFO:qiskit.passmanager.base_tasks:Pass: BasisTranslator - 0.32902 (ms) INFO:qiskit.passmanager.base_tasks:Pass: TwoQubitPeepholeOptimization - 8.00967 (ms) INFO:qiskit.passmanager.base_tasks:Pass: Size - 0.00739 (ms) INFO:qiskit.passmanager.base_tasks:Pass: Depth - 0.00715 (ms) INFO:qiskit.passmanager.base_tasks:Pass: FixedPoint - 0.00978 (ms) INFO:qiskit.passmanager.base_tasks:Pass: FixedPoint - 0.00405 (ms) INFO:qiskit.passmanager.base_tasks:Pass: RemoveIdentityEquivalent - 0.00954 (ms) INFO:qiskit.passmanager.base_tasks:Pass: Optimize1qGatesDecomposition - 1.79434 (ms) INFO:qiskit.passmanager.base_tasks:Pass: CommutativeCancellation - 0.10347 (ms) INFO:qiskit.passmanager.base_tasks:Pass: ContractIdleWiresInControlFlow - 0.00381 (ms) INFO:qiskit.passmanager.base_tasks:Pass: GatesInBasis - 0.00978 (ms) INFO:qiskit.passmanager.base_tasks:Pass: Size - 0.00620 (ms) INFO:qiskit.passmanager.base_tasks:Pass: Depth - 0.00763 (ms) INFO:qiskit.passmanager.base_tasks:Pass: FixedPoint - 0.00834 (ms) INFO:qiskit.passmanager.base_tasks:Pass: FixedPoint - 0.00334 (ms) INFO:qiskit.passmanager.base_tasks:Pass: ContainsInstruction - 0.00691 (ms) INFO:qiskit.compiler.transpiler:Total Transpile Time - 101.42398 (ms) 0.0