Получение ошибки "Выпущенные кубиты не находятся в нулевом состоянии" в наборе 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> государство.

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