№ 1797Квантовые вычисленияУровень 3

Квантовый оракул одного дизъюнкта 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);
    }        
}