Изучение суперпозиции с помощью Q#

Завершено

В предыдущих уроках вы узнали о суперпозиции и нотации Dirac. Это достаточно теории на данный момент! Давайте рассмотрим суперпозицию в Q#, написав код.

В этом уроке вы создадите квантовую суперпозицию и изучите вероятности с помощью DumpMachine функции Q#. Функция DumpMachine дампирует сведения о текущем состоянии квантовой системы в точке ее вызова.

Создание файла Q#

  1. Откройте Visual Studio Code.
  2. В Visual Studio Code выберите "Создать текстовый файл" > и сохраните файл в качестве Main.qs.
  3. Выберите представление —> палитра команд и тип Q#: задайте целевой профиль QIR Azure Quantum. Нажмите ВВОД.
  4. Выберите Q#: Неограниченно.

Начало работы с суперпозицией

Начнем с простой программы, которая создает случайный бит с помощью кубита в суперпозиции. Функция будет использоваться DumpMachine для просмотра состояния кубита в разных точках программы.

  1. Добавьте следующий код в файл Main.qs :

    import Microsoft.Quantum.Diagnostics.*;
    
    operation Main() : Result {
        use q = Qubit();
        Message("Initialized qubit:");
        DumpMachine(); // First dump
        Message(" ");
        H(q);
        Message("Qubit after applying H:");
        DumpMachine(); // Second dump
        Message(" ");
        let randomBit = M(q);
        Message("Qubit after the measurement:");
        DumpMachine(); // Third dump
        Message(" ");
        Reset(q);
        Message("Qubit after resetting:");
        DumpMachine(); // Fourth dump
        Message(" ");
        return randomBit;
    }
    

    Здесь вы вызываете DumpMachine четыре раза:

    • После выделения кубита.
    • После размещения кубита в суперпозиции.
    • После измерения состояния кубита.
    • После сброса кубита.

    Вы разделили операцию MResetZ на две операции: M и Reset. Это необходимо для проверки состояния после измерения.

  2. Чтобы запустить программу на встроенном симуляторе, нажмите кнопку "Выполнить над Main операцией" или нажмите клавиши CTRL+F5. Выходные данные будут отображаться в консоли отладки.

  3. Функция DumpMachine создает таблицу со сведениями, описывающими состояние регистра кубитов. В частности, она дает амплитуду вероятности, вероятность и фазу в радианах для каждого базисного состояния.

  4. После завершения работы программы в качестве результата вы получите Zero или One. Давайте рассмотрим каждый этап.

    1. Инициализированная кубита: каждый кубит, выделенный с use помощью инструкции, начинается в состоянии $|0\rangle$. Поэтому DumpMachine выдает сведения, соответствующие однокубитному регистру в состоянии $|0\rangle$.

      Initialized qubit:
      
      DumpMachine:
      
       Basis | Amplitude      | Probability | Phase
       -----------------------------------------------
         |0⟩ |  1.0000+0.0000𝑖 |   100.0000% |   0.0000
      
    2. Кубит после применения H: после применения Hмы подготовим кубитов в состоянии суперпозиции $|\psi\rangle=\frac1{\sqrt2} |0\rangle + \frac1{\sqrt2} |1\rangle$.

      Qubit after applying H:
      
      DumpMachine:
      
       Basis | Amplitude      | Probability | Phase
       -----------------------------------------------
         |0⟩ |  0.7071+0.0000𝑖 |    50.0000% |   0.0000
         |1⟩ |  0.7071+0.0000𝑖 |    50.0000% |   0.0000
      
    3. Кубит после измерения: после измерения и хранения результата, который может быть Zero или One. Например, если итоговое состояние Oneравно, состояние регистров свернуто до $|1\rangle$ и больше не находится в суперпозиции.

      Qubit after the measurement:
      
      DumpMachine:
      
       Basis | Amplitude      | Probability | Phase
       -----------------------------------------------
         |1⟩ |  1.0000+0.0000𝑖 |   100.0000% |   0.0000
      
    4. Кубит после сброса: операция Reset сбрасывает кубит в состояние $|0\rangle$. Помните, что для любой операции Q# вам всегда нужно оставлять кубит в состоянии $|0\rangle$, чтобы его можно было использовать в других операциях.

      Qubit after resetting:
      
      DumpMachine:
      
       Basis | Amplitude      | Probability | Phase
       -----------------------------------------------
         |0⟩ |  1.0000+0.0000𝑖 |   100.0000% |   0.0000
      

    Примечание.

    Выходные данные могут отличаться, так как генератор случайных чисел является вероятностным. Вероятности результатов не детерминируются.

Изучение других типов состояний суперпозиции

Теперь, когда вы знаете, как проверить состояние регистра, вы увидите больше операций, которые изменяют состояние кубитов и помещают их в суперпозицию.

Текущий генератор случайных чисел с вероятностью 50 % создает состояние Zero либо One. Рассмотрим второй пример, в котором случайные числа создаются с разной вероятностью.

Асимметричный генератор случайных битов

Предположим, вы хотите создать случайный генератор битов, который сложен, то есть вероятность получения Zero отличается от вероятности получения One.

Например, вы хотите получить результат Zero с вероятностью $P$ и результатом One с вероятностью $1-P$. Ниже приведено допустимое состояние кубита, которое создает такой случайный генератор битов:

$$|\psi\rangle=\sqrt{P}|0\rangle+\sqrt{1-P}|1\rangle$$

Здесь $\alpha=\sqrt{P}$ и $\beta=\sqrt{1-P}$ являются амплитудами базовых состояний $|0\rangle$ и $|1\rangle$, соответственно.

Это состояние можно получить путем последовательного применения оператора $R_y(2\arccos\sqrt{P})$ к кубите в состоянии $|0\rangle.$ Вы можете достичь этого результата в Q# с помощью операции Ry в стандартной библиотеке.

Совет

Чтобы узнать больше о математических операциях с одним кубитом, ознакомьтесь с руководством по однокубитным шлюзам в Quantum Katas.

  1. Измените Main.qs , как в следующем примере, и сохраните файл. В этом примере выбирается $\alpha$ значение $\frac13$.

    import Microsoft.Quantum.Diagnostics.*;
    import Microsoft.Quantum.Math.*;
    
    operation Main() : Result {
        use q = Qubit();
        let P = 0.333333; // P is 1/3
        Ry(2.0 * ArcCos(Sqrt(P)), q);
        Message("The qubit is in the desired state.");
        Message("");
        DumpMachine(); // Dump the state of the qubit 
        Message("");
        Message("Your skewed random bit is:");
        let skewedrandomBit = M(q);
        Reset(q);
        return skewedrandomBit;
    }
    
  2. Чтобы запустить программу на встроенном симуляторе, нажмите кнопку "Выполнить над Main операцией" или нажмите клавиши CTRL+F5. Выходные данные будут отображаться в консоли отладки.

  3. Вы можете увидеть, как функция DumpMachine отображает ожидаемое состояние после применения операций, а также отображает связанные вероятности. Обратите внимание, что вероятность получения Zero составляет около 33,33%, а вероятность получения One составляет около 66,67%. Таким образом, генератор случайных битов искажен.

    The qubit is in the desired state.
    
    DumpMachine:
    
     Basis | Amplitude      | Probability | Phase
     -----------------------------------------------
       |0⟩ |  0.5773+0.0000𝑖 |    33.3333% |   0.0000
       |1⟩ |  0.8165+0.0000𝑖 |    66.6667% |   0.0000
    
    
    Your skewed random bit is:
    Result: "One"
    

    Примечание.

    Выходные данные могут отличаться, так как генератор случайных чисел является вероятностным. Вероятности результатов не детерминируются.

Суперпозиция нескольких кубитов

Теперь давайте рассмотрим суперпозицию регистра, включающего несколько кубитов. Например, если регистр состоит из трех кубитов, то возможны восемь базисных состояний:

$$|000\rangle,|001\rangle,|010\rangle,|011\rangle,|100\rangle,|101\rangle, |110\rangle,|111\rangle $$

Так что можно выразить произвольное состояние трех кубитов в виде:

$$|\psi\rangle=\alpha_0|000\rangle+\alpha_1|001\rangle+\alpha_2|010\rangle+\alpha_3|011\rangle+\alpha_4|100\rangle+\alpha_5|101\rangle+\alpha_6 |110\rangle+\alpha_7|111\rangle$$

Здесь $\alpha_i$ — это сложные числа, удовлетворяющие $\sum|\alpha_i|^2=1$.

Например, кубиты можно поместить в однородную суперпозицию, применяя H к каждому кубите. Вы можете использовать равномерную суперпозицию для создания разных версий квантового генератора случайных чисел, который генерирует трехбитовые числа путем измерения трех кубитов в суперпозиции вместо измерения одного кубита трижды.

База Число
$\ket{000}$ 0
$\ket{001}$ 1
$\ket{010}$ 2
$\ket{011}$ 3
$\ket{100}$ 4
$\ket{101}$ 5
$\ket{110}$ 6
$\ket{111}$ 7
  1. Измените Main.qs , как в следующем примере, и сохраните файл.

    import Microsoft.Quantum.Diagnostics.*;
    import Microsoft.Quantum.Math.*;
    import Microsoft.Quantum.Convert.*;
    import Microsoft.Quantum.Arrays.*;
    
    operation Main() : Int {
        use qubits = Qubit[3];
        ApplyToEach(H, qubits);
        Message("The qubit register in a uniform superposition: ");
        DumpMachine();
        let result = ForEach(M, qubits);
        Message("Measuring the qubits collapses the superposition to a basis state.");
        DumpMachine();
        ResetAll(qubits);
        return BoolArrayAsInt(ResultArrayAsBoolArray(result));
    }
    

    Здесь вы увидите три понятия:

    • Переменная qubits представляет массив Qubit длиной 3.
    • Операции ApplyToEach и полезны для измерения и ForEach действия на нескольких кубитах, и они используют меньше кода. Библиотеки Q# предлагают множество видов операций и функций, которые повышают эффективность написания квантовых программ.
    • Функции BoolArrayAsInt из Microsoft.Quantum.Convert библиотеки преобразуют двоичный Result массив, возвращаемый целым числом ForEach(M, qubits) ResultArrayAsBoolArray.
  2. Чтобы запустить программу, нажмите кнопку "Выполнить над операцией" или нажмите клавиши CTRL+F5Main. Выходные данные будут отображаться в консоли отладки.

  3. С помощью функции DumpMachine вы можете посмотреть, как при измерении трех кубитов состояние регистра вырождается до одного из восьми возможных базисных состояний. Например, если вы получите результат 3, это означает, что состояние регистра свернуто до $|110\rangle$.

    The qubit register in a uniform superposition:
    
    DumpMachine:
    
     Basis | Amplitude      | Probability | Phase
     -----------------------------------------------
     |000⟩ |  0.3536+0.0000𝑖 |    12.5000% |   0.0000
     |001⟩ |  0.3536+0.0000𝑖 |    12.5000% |   0.0000
     |010⟩ |  0.3536+0.0000𝑖 |    12.5000% |   0.0000
     |011⟩ |  0.3536+0.0000𝑖 |    12.5000% |   0.0000
     |100⟩ |  0.3536+0.0000𝑖 |    12.5000% |   0.0000
     |101⟩ |  0.3536+0.0000𝑖 |    12.5000% |   0.0000
     |110⟩ |  0.3536+0.0000𝑖 |    12.5000% |   0.0000
     |111⟩ |  0.3536+0.0000𝑖 |    12.5000% |   0.0000
    
    Measuring the qubits collapses the superposition to a basis state.
    
    DumpMachine:
    
     Basis | Amplitude      | Probability | Phase
     -----------------------------------------------
     |110⟩ |  1.0000+0.0000𝑖 |   100.0000% |   0.0000
    
    Result: "3"
    

    Примечание.

    Выходные данные могут отличаться, так как генератор случайных чисел является вероятностным. Вероятности результатов не детерминируются.

  4. Операция ForEach(M, qubit) измеряет каждый кубит поочередно, пошагово приходя к вырожденному состоянию. Вы также можете дампа промежуточных состояний после каждого измерения. Для этого измените Main.qs , как в следующем примере, и сохраните файл.

    import Microsoft.Quantum.Diagnostics.*;
    import Microsoft.Quantum.Measurement.*;
    import Microsoft.Quantum.Math.*;
    import Microsoft.Quantum.Convert.*;
    
    operation Main() : Int {
        use qubits = Qubit[3];
        ApplyToEach(H, qubits);
        Message("The qubit register in a uniform superposition: ");
        DumpMachine();
        mutable results = [];
        for q in qubits {
            Message(" ");
            set results += [M(q)];
            DumpMachine();
        }
        Message(" ");
        Message("Your random number is: ");
        ResetAll(qubits);
        return BoolArrayAsInt(ResultArrayAsBoolArray(results));
    }
    
  5. Здесь цикл for используется для последовательного воздействия на каждый кубит. Q# имеет классические возможности управления потоками, такие как for циклы и if операторы, которые можно использовать для управления потоком программы.

  6. Чтобы запустить программу, нажмите кнопку "Выполнить " из списка команд над Main операцией или нажмите клавиши CTRL+F5.

  7. Вы можете увидеть, как последовательные измерения изменяют квантовое состояние и, следовательно, вероятность получения каждого результата. Например, если результат равен 5, вы получите следующие выходные данные. Давайте вкратце рассмотрим каждый этап.

    1. Подготовка состояния. После применения H к каждому кубиту регистра мы получаем равномерную суперпозицию.

      The qubit register in a uniform superposition: 
      
      DumpMachine:
      
       Basis | Amplitude      | Probability | Phase
       -----------------------------------------------
       |000⟩ |  0.3536+0.0000𝑖 |    12.5000% |   0.0000
       |001⟩ |  0.3536+0.0000𝑖 |    12.5000% |   0.0000
       |010⟩ |  0.3536+0.0000𝑖 |    12.5000% |   0.0000
       |011⟩ |  0.3536+0.0000𝑖 |    12.5000% |   0.0000
       |100⟩ |  0.3536+0.0000𝑖 |    12.5000% |   0.0000
       |101⟩ |  0.3536+0.0000𝑖 |    12.5000% |   0.0000
       |110⟩ |  0.3536+0.0000𝑖 |    12.5000% |   0.0000
       |111⟩ |  0.3536+0.0000𝑖 |    12.5000% |   0.0000
      
    2. Первое измерение. При первом измерении был получен результат One. Таким образом, все амплитуды состояний, крайний правый кубит которых содержал Zero, отсутствуют. Это амплитуды $|0\rangle=|000\rangle, |2\rangle=|010\rangle, |4\rangle=|100\rangle$ и $|6\rangle= |110\rangle$. Остальные амплитуды увеличиваются, чтобы удовлетворять условию нормализации.

      DumpMachine:
      
       Basis | Amplitude      | Probability | Phase
       -----------------------------------------------
       |001⟩ |  0.5000+0.0000𝑖 |    25.0000% |   0.0000
       |011⟩ |  0.5000+0.0000𝑖 |    25.0000% |   0.0000
       |101⟩ |  0.5000+0.0000𝑖 |    25.0000% |   0.0000
       |111⟩ |  0.5000+0.0000𝑖 |    25.0000% |   0.0000
      
    3. Второе измерение. При втором измерении был получен результат Zero. Таким образом, все амплитуды состояний, у которых второй крайний правый (средний) кубит равен One, обращаются в нуль. Это амплитуды $|3\rangle=|011\rangle$ и $|7\rangle=|111\rangle$. Остальные амплитуды увеличиваются, чтобы удовлетворять условию нормализации.

      DumpMachine:
      
       Basis | Amplitude      | Probability | Phase
       -----------------------------------------------
       |001⟩ |  0.7071+0.0000𝑖 |    50.0000% |   0.0000
       |101⟩ |  0.7071+0.0000𝑖 |    50.0000% |   0.0000
      
    4. Третье измерение. При третьем измерении был получен результат One. Таким образом, все амплитуды состояний, слева Zero от которых ясно. Единственное совместимое состояние — $|5\rangle=|101\rangle$. Это состояние возвращает вероятность амплитуды $1$.

      DumpMachine:
      
       Basis | Amplitude      | Probability | Phase
       -----------------------------------------------
       |101⟩ |  1.0000+0.0000𝑖 |   100.0000% |   0.0000
      
      
      Your random number is: 
      Result: "5"
      

    Примечание.

    Выходные данные могут отличаться, так как генератор случайных чисел является вероятностным. Вероятности результатов не детерминируются.