0

我试图多次运行量子电路,每次都使用不同的随机状态 - 单个量子位,即 |\psi>= a|0> + b|1> 具有不同的 a 和 b。一旦每个量子位通过电路,我将保存最终状态的状态向量,并通过计算 \theta 和 \phi 将其转换为球坐标。我将每个 \theta 和 \phi 值附加到一个列表中,然后将它们绘制在直方图上(下面省略)。

虽然这可行,但对于大型“num_states”来说它非常慢,所以我想知道在执行电路时是否有办法使用“shots”功能,因为你可以写:

job = execute(qc, backend, shots=1000)

我试着玩弄这个,但发现在生成初始随机状态后,它以相同的状态重复了电路的射击次数,而不是每次都做不同的状态。我想使用镜头功能,因为我相信这会更快,因为 OpenMP 内置在 Qiskit 中。

任何关于我如何能够在每次使用镜头时实现不同状态的想法都将不胜感激:)

import numpy as np
from qiskit import(
    QuantumCircuit,
    execute,
    Aer)

from math import pi

from qiskit.quantum_info import random_statevector


#----------------------------------------------------------------------#
backend = Aer.get_backend('statevector_simulator')


def simulate_states(num_states):
    qc = QuantumCircuit(1)

    theta_vals = []
    phi_vals = []
    
    for i in range(num_states):
        
        random_state = random_statevector(2).data
        
        qc.initialize(random_state, 0)
        qc.z(0)
        job = execute(qc, backend)
        result = job.result()
        out_state = result.get_statevector()
    
        theta, phi, alpha_r, alpha_i, beta_r, beta_i = state_coords(out_state)
        theta += pi/2
        
        theta_vals.append(theta)
        phi_vals.append(phi)
        
    return theta_vals, phi_vals

def state_coords(statevector):
    """
    determines the spherical coordinates of a state on the Bloch sphere i.e. calculates \theta and \phi.
    """
    alpha = statevector[0]
    alpha_r = alpha.real
    alpha_i = alpha.imag

    beta = statevector[1]
    beta_r = beta.real
    beta_i = beta.imag

    theta = np.arcsin(2*((alpha_r*beta_r) - (alpha_i*beta_i)))
    phi = 2*np.arccos(2*((alpha_r**2)+(beta_r**2))-1)   
    
    return theta, phi, alpha_r, alpha_i, beta_r, beta_i
4

0 回答 0