Почему квантовый оценщик говорит, что я не использую кубиты в Q#?

Вкратце, я пытаюсь реализовать в Q# неоднородное дискретное преобразование Фурье.

Мне удалось сделать это без ошибок классическим способом (не использовались квантовые элементы и кубиты), однако оценщик ресурсов говорит, что квантовые ресурсы не используются. Это заставляет меня верить, что Q# в бэкэнде, даже если у меня есть функция типа Операция, не использует какие-либо квантово-специфические операции. Поэтому я пытаюсь сделать это шаг за шагом и загрузить свои данные в кубиты (я думаю), а затем использовать любые потенциальные полезные элементы.

Проблема состоит в том, что мои данные состоят из 2 массивов, состоящих из двойных чисел, представляющих действительную и мнимую части комплексных чисел. Возможно, мне придется изменить это в массив сложных комплексных значений в будущем.

Но, по сути, проблема в том, как я могу загрузить комплексное число в один или несколько кубитов так, чтобы я мог затем обработать его и получить некоторые результаты?

Я не слишком заинтересован в том, чтобы делиться своим кодом, поскольку алгоритм - это то, чего раньше не пытались; но небольшие кусочки кода и особенно дальнейшие разъяснения, которые я готов предоставить.

1 ответ

Решение

Если я правильно понимаю ваше описание, оценщик ресурсов, предоставленный с Quantum Development Kit, точно сообщил, что в вашей операции не использовались кубиты или квантовые инструкции. Это связано с тем, что кубиты, используемые операцией Q#, - это те, которые явно используются с using или же borrowing операторы, плюс те, которые используются любыми другими вызываемыми операциями.

Например, если вы пишете операцию телепортации в Q#, вы можете сделать следующее:

operation PrepareEntangledPair(left : Qubit, right : Qubit) : Unit {
    body (...) {
        H(left);
        CNOT(left, right);
    }

    adjoint auto;
}

operation ApplyCorrection(here : Qubit, msg : Qubit, there : Qubit) : Unit {
    if (M(msg) == One)  { Z(there); }
    if (M(here) == One) { X(there); }
}

operation TeleportMessage(msg : Qubit, there : Qubit) : Unit {
    using (here = Qubit()) {
        // Create some entanglement that we can use to send our message.
        PrepareEntangledPair(here, there);

        // Move our message into the entangled pair by using a Bell
        // measurement.
        Adjoint PrepareEntangledPair(msg, here);

        // Measure out the entanglement.
        ApplyCorrection(here, msg, there);

        // Reset our "here" qubit before releasing it.
        Reset(here);
    }
}

operation TeleportClassicalFlag() : Unit {
    using ((msg, there) = (Qubit(), Qubit())) {
        X(msg);
        TeleportMessage(msg, there);
        ApplyToEach(Reset, [msg, there]);
    }
}

Выполнение оценки ресурсов в этом отчете об использовании трех кубитов (два TeleportClassicalFlag напрямую и по одному TeleportMessage который был вызван TeleportClassicalFlag):

Классическая логика, напротив, всегда остается классической. Это разработано, чтобы облегчить смешивание классической и квантовой логики, например, при реализации алгоритмов итеративной оценки фазы. В приведенном выше примере if заявления и == операторы, используемые в ApplyCorrection используются для описания классических частей алгоритма телепортации.

Другие вопросы по тегам