№ 1616Квантовая теория информацииУровень 3

Эксперименты с игрой CHSH

В игре CHSH Алиса получает бит $X$, Боб — $Y$, и без общения возвращают $A,B$. Победа означает $X\land Y=A\oplus B$.

В приведённой программе игрокам готовят пару Белла $(|00\rangle+|11\rangle)/\sqrt2$. Алиса измеряет свой кубит в $Z$ или $X$, Боб — в базисе $\pi/8$ или $-\pi/8$ по собственному входному биту. Передача кубитов виртуальна: каждый игрок должен действовать только на своём кубите. После измерений кубиты возвращаются в $|0\rangle$, а ответы игроков сравниваются с условием победы. Пример сравнивает долю побед классической и квантовой стратегий.

Измените исходный код и проверьте, меняется ли результат в следующих случаях:

1. Судья выбирает входные биты не случайно. Как судье минимизировать вероятность победы Алисы и Боба?
2. Кубит Боба измеряется первым.
3. Алиса и Боб получают незапутанную пару кубитов.

Все три пункта относятся к одному авторскому эксперименту. Полный исходный пример приведён ниже.

Заготовка Q#:

namespace Quantum.Kata.CHSHGame {
    import Std.Random.*;
    import Std.Math.*;
    import Std.Convert.*;

    function WinCondition(x : Bool, y : Bool, a : Bool, b : Bool) : Bool {
        return (x and y) == (a != b);
    }

    function AliceClassical(x : Bool) : Bool {
        return false;
    }

    function BobClassical(y : Bool) : Bool {
        return false;
    }

    operation AliceQuantum(bit : Bool, qubit : Qubit) : Bool {
        if bit {
            return MResetX(qubit) == One;
        }
        return MResetZ(qubit) == One;
    }

    operation BobQuantum(bit : Bool, qubit : Qubit) : Bool {
        let angle = 2.0 * PI() / 8.0;
        Ry(not bit ? -angle | angle, qubit);
        return M(qubit) == One;
    }

    @EntryPoint()
    operation CHSH_GameDemo() : Unit {
        use (aliceQubit, bobQubit) = (Qubit(), Qubit());
        mutable classicalWins = 0;
        mutable quantumWins = 0;
        let iterations = 1000;
        for _ in 1..iterations {
            H(aliceQubit);
            CNOT(aliceQubit, bobQubit);
            let (x, y) = (DrawRandomBool(0.5), DrawRandomBool(0.5));
            if WinCondition(x, y, AliceClassical(x), BobClassical(y)) {
                set classicalWins += 1;
            }
            if WinCondition(x, y, AliceQuantum(x, aliceQubit), BobQuantum(y, bobQubit)) {
                set quantumWins += 1;
            }
            ResetAll([aliceQubit, bobQubit]);
        }
        Message($"Percentage of classical wins is {100.0 * IntAsDouble(classicalWins) / IntAsDouble(iterations)}%");
        Message($"Percentage of quantum wins is {100.0 * IntAsDouble(quantumWins) / IntAsDouble(iterations)}%");
    }
}

Решения пока нет.

Сообщить об ошибке

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