CNOT
Оператор (вентиль, гейт) CNOT приймає 2 входи і 2 виходи. Цей вентиль називають контрольованим запереченням (Controlled NOT).
CNOT інвертує другий (керований) кубіт тільки, якщо на перший (керуючий) кубіт подано 1:
До | Після | ||
---|---|---|---|
Керуючий кубіт | Керований кубіт | Керуючий кубіт | Керований кубіт |
0 | 0 | 0 | 0 |
0 | 1 | 0 | 1 |
1 | 0 | 1 | 1 |
1 | 1 | 1 | 0 |
Робота оператора схожа на оператор XOR, якщо не враховувати перший біт на виході:
XOR | ||
---|---|---|
Вхід 1 | Вхід 2 | Виіхід |
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
Приклад реалізації в Strange
Program program = new Program(8);
Step step0=new Step();
Step step1=new Step();
step0.addGate(new X(3));
step0.addGate(new X(4));
step0.addGate(new X(6));
step0.addGate(new X(7));
step1.addGate(new Cnot(0,1));
step1.addGate(new Cnot(2,3));
step1.addGate(new Cnot(4,5));
step1.addGate(new Cnot(6,7));
program.addStep(step0);
program.addStep(step1);
QuantumExecutionEnvironment qee =
new SimpleQuantumExecutionEnvironment();
Result result = qee.runProgram(program);
Qubit[] qubits = result.getQubits();
for (Qubit qubit:qubits){
System.out.println(qubit.measure());
}
Renderer.renderProgram(program);
Ця програма демонструє застосування CNOT до всіх можливих пар входів: |00>, |01>, |10>, |11>. Вентиль Х використовується для переворення квантового нуля в квантову одиницю. В роботі програми простіше розібратися за допомогою візуалізації:
Квантова заплутаність
Вентиль контрольованого заперечення можна використати для створення квантової заплутаності. Для цього перший вхідний кубіт достатньо перевести в стан суперпозиції за допомогою вентиля Адамара.
Розглянемо невелику програму:
Program program = new Program(2);
Step step0=new Step();
Step step1=new Step();
step0.addGate(new Hadamard(0));
step1.addGate(new Cnot(0,1));
program.addStep(step0);
program.addStep(step1);
QuantumExecutionEnvironment qee =
new SimpleQuantumExecutionEnvironment();
Result result = qee.runProgram(program);
Qubit[] qubits = result.getQubits();
for (Qubit qubit:qubits){
System.out.println(qubit.measure());
}
Renderer.renderProgram(program);
Візуалізація програми:
Як бачимо, кожен із виходів знаходиться в стані суперпозиції. Але при запуску програми неможливо отримати результат 01 або 10. Лише 00 або 11. Тобто ці 2 кубіти є заплутаними і не можуть приймати різні значення. Для демонстрації цього можна додати в програму такий рядок:
Renderer.showProbabilities(program, 1000);
Програма запуститься 1000 разів на виконання і буде пораховано частоту кожного із можливих виходів та побудовано відповідну візуалізацію. Як бачимо, приблизно в 50% запусків результат 00, а інша частина припадає на 11:
Коментарі
Дописати коментар