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

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

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

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

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

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

1 Ответ

2 голосов
/ 19 апреля 2019

Если я правильно понимаю ваше описание, оценщик ресурсов, поставляемый с 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):

enter image description here

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

...