Квантовый оракул одного дизъюнкта SAT
Входы — N кубитов в произвольном состоянии $|x\rangle$ и целевой кубит в произвольном состоянии $|y\rangle$.
Литерал — переменная x_j или её отрицание. Пара (j,true) означает x_j, (j,false) — отрицание x_j. Дизъюнкт — логическое ИЛИ литералов, формула — логическое И дизъюнктов.
Третий вход — массив clause из пар (Int,Bool), задающий один дизъюнкт. Например, $x_0\vee\neg x_1$ задаётся [(0,true),(1,false)].
Реализуйте на языке Q# оракул, вычисляющий clause(x): инвертируйте y тогда и только тогда, когда дизъюнкт истинен. В заготовке дан вспомогательный оракул ИЛИ.
Восстановите исходные значения входного регистра. Решение должно работать на суперпозициях; измерения запрещены.
Заготовка Q#:
namespace Kata {
import Std.Arrays.*;
operation Oracle_SATClause(x : Qubit[], y : Qubit, clause : (Int, Bool)[]) : Unit is Adj + Ctl {
// Implement your solution here...
}
// You might find this helper operation from an earlier task useful.
operation Oracle_Or(x : Qubit[], y : Qubit) : Unit is Adj + Ctl {
ApplyControlledOnInt(0, X, x, y);
X(y);
}
}