Получение ошибки "Выпущенные кубиты не находятся в нулевом состоянии" в наборе Q# Quantum Dev
При запуске следующей простой квантовой программы для применения строба Адамара к одному кубиту:
operation ApplyHadamard():()
{
body
{
using (qubits = Qubit[1])
{
H(qubits[0]);
}
}
}
Я получаю следующую ошибку:
Microsoft.Quantum.Simulation.Simulators.Exceptions.ReleasedQubitsAreNotInZeroState: "Выпущенные кубиты не находятся в нулевом состоянии".
Я использую учебник Microsoft, и в нем нет упоминания о чем-либо еще, что необходимо для работы такой программы.
Я ценю, что Q# все еще находится в режиме релиза, но было бы здорово, если бы кто-нибудь нашел решение для этого.
2 ответа
Документация содержит эту информацию несколькими разделами позже, в разделе Работа с кубитами.
Целевые машины ожидают, что кубиты находятся в состоянии |0⟩ непосредственно перед освобождением, поэтому их можно использовать повторно и предлагать другим
using
блоки для размещения.
Рассмотрите возможность запуска программы на квантовом компьютере: количество кубитов очень ограничено, и вы хотите повторно использовать освобожденные кубиты в других частях программы. Если к тому времени они не будут в нулевом состоянии, они потенциально могут быть все еще запутаны с кубитами, которые еще не освобождены, поэтому выполняемые с ними операции могут повлиять на состояние других частей программы.
Сброс кубитов в нулевое состояние автоматически, когда они выходят за рамки их using
Блок также опасен: если они запутались с другими, измерение их для их сброса может повлиять на состояние невыпущенных кубитов и, таким образом, изменить результаты программы - и разработчик не заметит этого.
Требование, чтобы кубиты находились в нулевом состоянии, прежде чем они могут быть освобождены, нацелено на то, чтобы напомнить разработчику дважды проверить, что вся необходимая информация была должным образом извлечена из кубитов, и что они больше не запутаны с неизданными кубитами.
Обратите внимание, что с помощью Reset
или же ResetAll
перед выпуском кубитов не является жестким требованием. Например, в алгоритме Дойча-Йосса последний шаг алгоритма состоит в измерении всех кубитов, кроме последнего. Это означает, что для каждого из этих кубитов вы уже знаете, что их состояние равно |0⟩ или |1⟩, и вы можете применить X-вентиль к кубитам в состоянии |1⟩, чтобы преобразовать их в |0⟩ без вызова Reset
чтобы измерить их снова. Известно, что последний кубит находится в состоянии |-⟩, и вы можете преобразовать его в |0⟩, применив вентили H и X.
Я нашел решение этого здесь.
Оказывается мне нужно выпустить вызов кубита Reset(qubits[0])
,
Согласно документации Reset()
делает следующее:
Учитывая один кубит, измеряет его и гарантирует, что он находится в
|0⟩
заявить, что он может быть безопасно выпущен
Таким образом, по-видимому, прежде чем квантовая операция завершится, все кубиты, используемые в операции, должны быть в |0>
государство.