Оракул существования периода битовой строки
Входы — регистр запроса из $N$ кубитов в произвольном состоянии $|x\rangle$ и целевой кубит в произвольном состоянии $|y\rangle$.
Напишите на языке Q# квантовый оракул для следующей функции.
$f(x)=1$, если существует положительный период $P<N$, для которого $x_j=x_{j+P}$ при всех $j=0,\ldots,N-P-1$, и 0 иначе.
Например, при $N=3$ строка [false,true,false] имеет период 2, поэтому она периодична.
В заготовке дана полная вспомогательная операция проверки конкретного периода.
На каждом базисном состоянии инвертируйте целевой кубит тогда и только тогда, когда $f(x)=1$, то есть реализуйте $|x\rangle|y\rangle\mapsto|x\rangle|y\oplus f(x)\rangle$. Регистр запроса должен сохранить исходное состояние. Решение должно работать на суперпозициях; измерения запрещены.
Заготовка Q#:
namespace Kata {
operation Oracle_Periodic (x : Qubit[], y : Qubit) : Unit is Adj + Ctl {
// Implement your solution here...
}
// You might find this helper operation from an earlier task useful.
operation Oracle_PeriodicGivenPeriod (x : Qubit[], y : Qubit, p : Int) : Unit is Adj + Ctl {
let n = Length(x);
within {
for i in 0 .. n - p - 1 {
CNOT(x[i + p], x[i]);
}
} apply {
ApplyControlledOnInt(0, X, x[... n - p - 1], y);
}
}
}Сообщить об ошибке
Войти, чтобы отправить материал.