№ 2110Основания квантовой механикиУровень 3

Тест Белла с ограниченным набором вентилей

Подготовьте два кубита так, чтобы вероятность различия X-выходов была больше 1/2, а вероятности различия остальных сочетаний X/Z — меньше 1/2. Затем выполните исходную программу оценки четырёх вероятностей и теста Белла.

Полное начало: A=q0,B=q1, состояние 00. Только X,H,Ry(+π/4) на любом кубите и симметричный CZ разрешены без ограничения; доступны также команды изображения Bloch. Отрицательный Ry, Z и CNOT не входят в исходный набор. Настройки run_puzzle(12) требуют 〈ZZ〉=〈ZX〉=〈XZ〉=+0.7071 и 〈XX〉=−0.7071, с допуском 0.1.

H-тип чтения — X-измерение, V-тип — Z-измерение. P[HH],P[HV],P[VH],P[VV] — вероятности различных битов при этих четырёх парах измерений. Их можно восстановить как (1−средняя корреляция)/2; фиолетовая линия обозначает вероятность 1. На 8192 запусках для каждой пары оцените эти вероятности и сравните каждую с суммой трёх остальных. Цель предложенной подготовки — нарушить классическую верхнюю границу для P[HH]. Вместо рекомендованной подготовки автор разрешает исследовать другие состояния, но конечный предложенный пункт и численные игровые цели сохранены.

Ниже сохранены точные исходные run_puzzle и весь код измерения. setup_variables читает программу игрока. Опыт по умолчанию использует локальный aer_simulator, а живое устройство лишь упоминается как необязательный вариант.

Исходная программа (сохранена без исполнения):

def bell_test(P):
    sum_P = sum(P.values())
    for hashes in P:
        
        bound = sum_P - P[hashes]
        
        print("The upper bound for P['"+hashes+"'] is "+str(bound))
        print("The value of P['"+hashes+"'] is "+str(P[hashes]))
        if P[hashes]<=bound:
            print("The upper bound is obeyed :)\n")
        else:
            if P[hashes]-bound < 0.1:
                print("This seems to have gone over the upper bound, "
                      "but only by a little bit :S\nProbably just rounding"
                      " errors or statistical noise.\n")
            else:
                print("This has gone well over the upper bound :O !!!!!\n")

from qiskit import QuantumRegister, ClassicalRegister, QuantumCircuit

def initialize_program():
    qubit = QuantumRegister(2)
    A = qubit[0]
    B = qubit[1]
    
    bit = ClassicalRegister(2)
    a = bit[0]
    b = bit[1]
    
    qc = QuantumCircuit(qubit, bit)
    
    return A, B, a, b, qc

def hash2bit(variable, hash_type, bit, qc):
    if hash_type == 'H':
        qc.h(variable)
    qc.measure(variable, bit)

puzzle = run_puzzle(12)

import numpy as np
def setup_variables(A, B, qc):
    for line in puzzle.program:
        eval(line)

shots = 8192
from qiskit import assemble, transpile

def calculate_P(backend):
    P = {}
    program = {}
    for hashes in ['VV','VH','HV','HH']:

        A, B, a, b, program[hashes] = initialize_program()

        setup_variables(A, B, program[hashes])

        hash2bit(A, hashes[0], a, program[hashes])
        hash2bit(B, hashes[1], b, program[hashes])
            
    # submit jobs
    t_qcs = transpile(list(program.values()), backend)
    qobj = assemble(t_qcs, shots=shots)
    job = backend.run(qobj)

    # get the results
    for hashes in ['VV','VH','HV','HH']:
        stats = job.result().get_counts(program[hashes])
        
        P[hashes] = 0
        for string in stats.keys():
            a = string[-1]
            b = string[-2]
            
            if a != b:
                P[hashes] += stats[string] / shots

    return P

puzzle.program

from qiskit import Aer
backend = Aer.get_backend('aer_simulator')

P = calculate_P(backend)
print(P)

bell_test(P)

Предложить решение

Войти, чтобы отправить материал.