Почему квантовый оценщик говорит, что я не использую кубиты в 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
используются для описания классических частей алгоритма телепортации.