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

Оракул совпадения с произвольным шаблоном

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

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

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

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

Может пригодиться библиотечная операция ApplyControlledOnBitString.

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

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

    }
}