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

Фазовый оракул шаблона без дополнительных кубитов

Входы — регистр запроса из $N$ кубитов в произвольном состоянии $|x\rangle$ и массив pattern из $N$ логических значений, представляющий базисное состояние: true соответствует $|1\rangle$, false — $|0\rangle$.

Напишите операцию на языке Q#, меняющую знак входного базисного состояния, если оно совпадает с pattern. Вспомогательные кубиты использовать нельзя.

Примеры: для $|010\rangle$ и pattern=[false,true,false] измените знак; для $|1001\rangle$ и pattern=[false,true,true,false] ничего не делайте.

Перед реализацией ответьте: это оракул инверсии цели или фазовый оракул? Подсказка источника: меняется фаза входного состояния по значению функции.

Ещё подсказка: можно ли преобразовать входной регистр по pattern так, чтобы затем менять знак только состояния $|1\ldots1\rangle$?

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

namespace Kata {
    import Std.Arrays.*;

    operation ArbitraryBitPattern_Oracle_Challenge(x : Qubit[], pattern : Bool[])
    : Unit is Adj + Ctl {
        // Implement your solution here...

    }
}

Предложить решение

Войти, чтобы отправить материал.