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

Квантовое преобразование Фурье регистра

Вход — регистр из $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]));
        }
    }
}