Различить две суперпозиции ровно одним измерением
Входы — массив из $N$ кубитов и два массива битовых строк bits1, bits2 типа Bool[][]. Их размеры равны $M_1\times N$ и $M_2\times N$; в общем случае $M_1\ne M_2$. Каждый список задаёт равновесную суперпозицию перечисленных в нём базисных векторов. Например, [[false, true, false], [false, true, true]] задаёт $(|010\rangle+|011\rangle)/\sqrt2$.
Гарантируется позиция $Q$, в которой все строки первого массива имеют одно и то же значение, все строки второго — также одно и то же, причём эти значения противоположны.
Напишите операцию на языке Q#, возвращающую 0 для суперпозиции первого списка и 1 для суперпозиции второго. Разрешено ровно одно измерение.
Например, для списков [[false, true, false], [false, true, true]] и [[true, false, true], [false, false, true]] состояния равны $(|010\rangle+|011\rangle)/\sqrt2$ и $(|101\rangle+|001\rangle)/\sqrt2$; их можно различить по второму кубиту.
Конечное состояние кубитов неважно.
Заготовка Q#:
namespace Kata {
import Std.Convert.*;
operation SuperpositionOneMeasurement(qs : Qubit[], bits1 : Bool[][], bits2 : Bool[][]) : Int {
// Implement your solution here...
return -1;
}
}