def create_densop(): mat_1 = np.array([[0.75, 0.25], [0.25, 0.25]]) de_1 = DensOp(matrix=mat_1) de_ini = de_1.composite(num=4) de_1.free() return de_ini
def decoder(de_comp, id_all, theta, iperm_mat): qs_0 = QState(1) de_0 = DensOp(qstate=[qs_0]) de_fin = de_0.tenspro(de_comp) # add 1-qubit (|0>) de_fin.apply(iperm_mat) [de_fin.ry(i, phase=theta) for i in id_all] qs_0.free() de_0.free() return de_fin
dim = 2**qnum vec = np.array([0.0]*dim) vec[0] = 1.0 mat = unitary_group.rvs(dim) vec = np.dot(mat, vec) qs = QState(vector=vec) return qs if __name__ == '__main__': qnum_A = 2 qnum_B = 2 id_A = list(range(qnum_A)) id_B = [i+qnum_A for i in range(qnum_B)] qs = random_qstate(qnum_A+qnum_B) de = DensOp(qstate=[qs], prob=[1.0]) ent = de.entropy() ent_A = de.entropy(id_A) ent_B = de.entropy(id_B) print("** S(A,B) = {:.4f}".format(ent)) print("** S(A) = {:.4f}".format(ent_A)) print("** S(B) = {:.4f}".format(ent_B)) qs.free() de.free()
return densop_est if __name__ == '__main__': # settings qubit_num = 1 mixed_num = 2 shots = 100 # quantum state ensemble (original) qstate, prob = random_qstate_ensemble(qubit_num, mixed_num) # density operator (original) densop_ori = DensOp(qstate=qstate, prob=prob) # density operator estimation only from quantum state ensemble # (quantum state tomography) densop_est = estimate_densop(prob, qstate, shots) print("** density operator (original)") densop_ori.show() print("** density operator (estimated)") densop_est.show() print("** fidelity =", densop_ori.fidelity(densop_est)) for q in qstate: q.free() densop_ori.free() densop_est.free()
from qlazypy import QState, DensOp qs_pure = QState(1).h(0) # (|0> + |1>) / sqrt(2.0) de_pure = DensOp(qstate=[qs_pure], prob=[1.0]) qs_pure_1 = QState(1) # |0> qs_pure_2 = QState(1).x(0) # |1> de_mixed = DensOp(qstate=[qs_pure_1, qs_pure_2], prob=[0.5, 0.5]) print("== pure state ==") de_pure.show() print("* trace =", de_pure.trace()) print("* square trace =", de_pure.sqtrace()) print("") print("== mixed state ==") de_mixed.show() print("* trace =", de_mixed.trace()) print("* square trace =", de_mixed.sqtrace()) qs_pure.free() qs_pure_1.free() qs_pure_2.free() de_pure.free() de_mixed.free()
qs = QState(4) qs.h(0).h(1) # unitary operation for 0,1-system qs.x(2).z(3) # unitary operation for 2,3-system de1 = DensOp(qstate=[qs], prob=[1.0]) # product state de1_reduced = de1.patrace([0, 1]) # trace-out 0,1-system print("== partial trace of product state ==") print(" * trace = ", de1_reduced.trace()) print(" * square trace = ", de1_reduced.sqtrace()) qs.cx(1, 3).cx(0, 2) # entangle between 0,1-system and 2,3-system de2 = DensOp(qstate=[qs], prob=[1.0]) # entangled state de2_reduced = de2.patrace([0, 1]) # trace-out 0,1-system print("== partial trace of entangled state ==") print(" * trace = ", de2_reduced.trace()) print(" * square trace = ", de2_reduced.sqtrace()) print("== partial state of entangled state ==") qs.show([2, 3]) qs.free() de1.free() de2.free() de1_reduced.free() de2_reduced.free()