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

Квантовый оракул правильной раскраски вершин

Входы:

1. Число вершин V, V≤6.
2. Массив edges из E пар целых индексов начала и конца ребра, E≤12. Вершины имеют номера от 0 до V−1.
3. Регистр x из 2V кубитов в произвольном состоянии, задающий четыре возможных цвета (nBits=2). Цвет вершины i хранится в x[2i],x[2i+1] со старшим разрядом первым: 00,01,10,11 означают 0,1,2,3.
4. Целевой кубит y в произвольном состоянии.

Пример: граф 0—1—2 имеет V=3, edges=[(0,1),(1,2)]. Раскраска задаётся 6 кубитами. Допустимы $|000110\rangle$ (цвета [0,1,2]) и $|011001\rangle$ (цвета [1,2,1]).

Напишите на языке Q# оракул, инвертирующий y, если раскраска правильная: у каждой пары вершин, соединённых ребром, цвета различаются.

Восстановите исходные значения регистра x после вычисления. Решение должно работать на суперпозициях; измерения запрещены. Полные вспомогательные операции из предыдущих упражнений даны в заготовке.

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

namespace Kata {
    operation Oracle_VertexColoring(V : Int, edges: (Int, Int)[], 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_ColorEquality(x0 : Qubit[], x1 : Qubit[], y : Qubit) : Unit is Adj + Ctl {
        within {
            for i in 0..Length(x0) - 1 {
                CNOT(x0[i], x1[i]);
            }
        } apply {
            ApplyControlledOnInt(0, X, x1, y);
        }
    }
}