Различить четыре двухкубитные операции
Вход — операция на двух кубитах, реализующая либо тождественное преобразование $I\otimes I$, либо CNOT с одним кубитом в роли управления и другим в роли цели, либо SWAP.
Напишите операцию на языке Q#, возвращающую 0 для $I\otimes I$, 1 для $CNOT_{12}$, 2 для $CNOT_{21}$, 3 для SWAP. В обозначении $CNOT_{ij}$ кубит $i$ управляет кубитом $j$. Операция принимает массив ровно из двух кубитов; при пустом массиве, одном кубите или более чем двух кубитах она завершится ошибкой.
Для операции определены обратный вариант Adjoint и управляемый вариант Controlled. Разрешено суммарно не более двух обращений к переданной операции или её вариантам.
Заготовка Q#:
namespace Kata {
operation DistinguishTwoQubitUnitaries (unitary : (Qubit[] => Unit is Adj + Ctl)) : Int {
// Implement your solution here...
return -1;
}
}