Оракул наличия подстроки
Входы — регистр запроса из $N$ кубитов в произвольном состоянии $|x\rangle$ и целевой кубит в произвольном состоянии $|y\rangle$. Также дан битовый шаблон $r$ длины $K$ в виде Bool[], $1\le K\le N$.
Напишите на языке Q# квантовый оракул для следующей функции.
$f(x)=1$, если существует позиция $P$, в которой для всех $j=0,\ldots,K-1$ выполняется $r_j=x_{j+P}$, и 0 иначе.
Например, при $N=3$ строка [false,true,false] содержит шаблон [true,false], начинающийся в позиции 1.
В заготовке приведена полная вспомогательная операция проверки шаблона в конкретной позиции.
На каждом базисном состоянии инвертируйте целевой кубит тогда и только тогда, когда $f(x)=1$, то есть реализуйте $|x\rangle|y\rangle\mapsto|x\rangle|y\oplus f(x)\rangle$. Регистр запроса должен сохранить исходное состояние. Решение должно работать на суперпозициях; измерения запрещены.
Заготовка Q#:
namespace Kata {
operation Oracle_ContainsSubstring (x : Qubit[], y : Qubit, r : Bool[]) : Unit is Adj + Ctl {
// Implement your solution here...
}
// You might find this helper operation from an earlier task useful.
operation Oracle_ContainsSubstringAtPosition (x : Qubit[], y : Qubit, r : Bool[], p : Int) : Unit is Adj + Ctl {
ApplyControlledOnBitString(r, X, x[p .. p + Length(r) - 1], y);
}
}Предложить решение
Войти, чтобы отправить материал.