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

Оракул шаблона по выбранным позициям

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

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

$f(x)=1$, если $x_{a_j}=r_j$ для всех $j=0,\ldots,K-1$, и 0 иначе. Значения false и true соответствуют $|0\rangle$ и $|1\rangle$.

Например, при $N=3$ шаблону [false,true] в позициях [0,2] соответствуют состояния $|001\rangle$ и $|011\rangle$.

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

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

namespace Kata {
    import Std.Arrays.*;

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

    }
}