Квантовое преобразование Фурье регистра
Вход — регистр из $n$ кубитов в $|j_1\ldots j_n\rangle$. Напишите операцию на языке Q#, применяющую квантовое преобразование Фурье. Требуемое состояние — тензорное произведение множителей
$$\frac{|0\rangle+e^{2\pi i0.j_k\ldots j_n}|1\rangle}{\sqrt2}$$
в порядке $k=n,n-1,\ldots,1$. То есть первый множитель использует дробь $0.j_n$, второй — $0.j_{n-1}j_n$, последний — $0.j_1\ldots j_n$.
Регистр может находиться и в суперпозиции; действие определяется действием на базисные состояния и линейностью унитарного преобразования.
Реализация должна позволять получить обратное преобразование через Adjoint без написания дополнительного кода.
Подсказка источника: сначала подготовьте это произведение с обратным порядком кубитов, затем приведите порядок к нужному. Полная вспомогательная операция BinaryFractionQuantumInPlace дана в заготовке.
Заготовка Q#:
namespace Kata {
operation QuantumFourierTransform(j : Qubit[]) : Unit is Adj + Ctl {
// Implement your solution here...
}
// You might find this helper operation from an earlier task useful.
operation BinaryFractionQuantumInPlace(j : Qubit[]) : Unit is Adj + Ctl {
H(j[0]);
for ind in 1 .. Length(j) - 1 {
Controlled R1Frac([j[ind]], (2, ind + 1, j[0]));
}
}
}