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

Оракул произведения с отрицанием битов

Входы — регистр запроса из $N$ кубитов в произвольном состоянии $|x\rangle$ и целевой кубит в произвольном состоянии $|y\rangle$. Также дан битовый вектор $r$ длины $N$ в виде Bool[].

Напишите на языке Q# квантовый оракул для следующей функции.

$$f(x)=\bigoplus_{i=0}^{N-1}\bigl(r_ix_i\oplus(1-r_i)(1-x_i)\bigr).$$

Подсказка источника: каждое сложение выполняется по модулю 2, поэтому слагаемые можно обрабатывать независимо.

На каждом базисном состоянии инвертируйте целевой кубит тогда и только тогда, когда $f(x)=1$, то есть реализуйте $|x\rangle|y\rangle\mapsto|x\rangle|y\oplus f(x)\rangle$. Регистр запроса должен сохранить исходное состояние. Решение должно работать на суперпозициях; измерения запрещены.

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

namespace Kata {
    operation Oracle_ProductWithNegation(x : Qubit[], y : Qubit, r : Bool[]) : Unit is Adj + Ctl {
        // Implement your solution here...

    }
}