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

Честно говоря, я никогда не думал, что мои знания физики пригодятся при программировании квантовых компьютеров. И я был прав - этого никогда не было.

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

Я наткнулся на квантовые вычисления через социальные сети. Как и все остальные, я слышал о квантовых компьютерах Google и Deepwave, но никогда особо не задумывался о программировании. Так было до тех пор, пока я не прочитал об инициативах Microsoft и IBM в области квантовых вычислений. И хотя квантовые компьютеры могут показаться ошеломляющими, я могу заверить вас, что такие вещи, как то, что вы видите на стоковых изображениях, обычно представляют собой трубопроводы охлаждающей жидкости, тяжелые экранированные провода для передачи данных и питания, а также прославленный металлический корпус.

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

SDK - пакет Microsoft Quantum Development Kit

Программирование квантовых компьютеров никогда не было таким простым.
С Microsoft (QDK), где вы можете запускать собственное квантовое моделирование на настольном компьютере, ноутбуке, Raspberry Pi или даже в своей микроволновой печи IoT, которая отправляет вам DM в Twitter, когда вам кажется одиноко по ночам.

Вам не нужна докторская степень. чтобы заполучить QDK, который работает вместе с основной средой Microsoft .NET. Что еще лучше, его можно использовать как с C #, так и с Python. И я покажу вам, как с помощью всего двух строк кода вы можете написать свой собственный проект квантовых вычислений.

Это происходит примерно так.

// Allocate a qubit.
using (q = Qubit())  {  
  H(q); // Put the qubit to superposition. 
        //It now has a 50% chance of being 0 or 1.
  return MResetZ(q);  // Measure the qubit value and reset it
}

Строка 0: выделение кубита.

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

Теперь кубит или квантовый бит - это квантово-механическое представление классического бита. Подобно компьютерным битам, кубиты имеют представление двух значений и добавленной суперпозиции. В каком состоянии кубит может согласованно принимать оба значения одновременно. Это свойство является фундаментальным в квантовых вычислениях и является одной из основных причин, по которой квантовые компьютеры превосходят в приложениях, где классические компьютеры терпят неудачу.

Чтобы начать использовать кубиты, нам сначала нужно выделить один.

q = Qubit()

Здесь мы выделили кубит с именем переменной q. Следует иметь в виду, что все инициализированные кубиты необходимо утилизировать. По этой причине мы инициализируем его внутри оператора using, который освобождает кубит за нас.

using (q = Qubit()) { };

Строка 1: Размещение кубита в суперпозиции

Наш следующий шаг - поместить кубит в суперпозицию с помощью операции H ():

H(q);  // Initializes the qubit into a state of superposition

Оператор H (q) берет выделенный нами ранее кубит и переводит его в состояние суперпозиции. Другими словами, наш кубит имеет одинаковую вероятность дать нам состояние 0 или 1 при измерении.

Строка 2: Измерьте

return MResetZ(q); // Collapses the qubit when taking a measurement

MResetZ (q) выполняет несколько функций, но для наших целей давайте просто скажем, что он берет и возвращает измерение и определяет, свернулся ли кубит в состояние 0 или 1. И мы говорим «свернутый», потому что кубит при измерении может иметь любое значение между 0 и 1, когда он находится в суперпозиции. Когда мы проводим измерение, мы снимаем показание и нормализуем его до ближайшего значения от 0 до 1.

С помощью этих операций мы можем смоделировать кубит и измерить его, чтобы получить показания со значением 0 или 1. Это немного, но это основа истинных случайно сгенерированных криптографических шифров, используемых в шифровании. И в этом смысле генератор случайных чисел на основе квантовых вычислений был бы прекрасным инструментом для надстройки.

Собираем все вместе

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

Если вы когда-либо писали ассемблер, то знаете, что все компьютерное программирование в некотором смысле перемещает выделенную память с одного адреса на другой. И для квантовых компьютеров это не так уж и много (пока вы не начнете запутывать кубиты). Программирование кубитов на самом деле не сильно отличается от сборки и написания наборов команд ЦП. Вы просто заменяете классические операции квантовыми.

Суровая реальность такова, что, конечно, вам понадобится немного больше кода, чтобы на самом деле превратить такое простое явление в вариант использования. Здесь мы будем использовать его для генерации случайных значений. Это выглядит примерно так:

//Q# code
namespace QuantumEncryptionSeed {
    open Microsoft.Quantum.Convert;
    open Microsoft.Quantum.Math;
    open Microsoft.Quantum.Measurement;
    open Microsoft.Quantum.Canon;
    open Microsoft.Quantum.Intrinsic;
    
    @EntryPoint()
    operation RandomQuantumBitGenerator() : Result {
        using (q = Qubit())  {  // Allocate a qubit.
            H(q);               // Put the qubit to superposition. 
                                //It now has a 50% chance of being 0 or 1.
            return MResetZ(q);  // Measure the qubit value and reset it 
                                //to it's initial state. 
        }
    }

}

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

Реальная обработка кода выполняется в нашем обработчике C # ниже:

namespace QuantumEncryptionSeed
{
    class Driver
    {
        static string bitgenerator(){
             using (var sim = new QuantumSimulator())
            {                
                var output = RandomQuantumBitGenerator.Run(sim).Result == Result.One ? "1" : "0";
                return output;  // Return the result          
            }
        }
static string bitstring() {
            string bits = "";
            for (int i=0; i<=128; i++){
                bits += bitgenerator();
            }
            Console.WriteLine(bits);
            return bits;
        }
private static byte[] GetBytes(string bitString)
        {
             byte[] result = Enumerable.Range(0, bitString.Length / 8).
                 Select(pos => Convert.ToByte(
                   bitString.Substring(pos * 8, 8), 2)).ToArray();
List<byte> myByteArray = new List<byte>();
                      for (int i = result.Length - 1; i >= 0; i--)
                      {
                       myByteArray.Add(result[i]);
                      }
return myByteArray.ToArray();
        }
      
        static void Main(string[] args)
        {
     Console.WriteLine(Convert.ToBase64String(GetBytes(bitstring())));   
         }
      }
    }

В нашем перегруженном нами классе Driver () я инициализировал метод bitgenerator (), который запускает моделирование на квантовом компьютере и инициализирует кубит в нашем коде Q #. Каждый раз, когда мы вызываем этот метод, мы возвращаем либо 0, либо 1 с псевдо / смоделированными истинно-случайными интервалами.

Другие методы, bitstring () и GetBytes (), соответственно, берут 0 и 1 и объединяют их в битовую строку, а затем упорядочивают их в массив byte []. Мы используем байтовые массивы, потому что они хранят байты в группе смежных (бок о бок) байтов в памяти, что упрощает работу с этим типом данных и их потоковую передачу в различные реализации кода шифрования.

Для удобства и поскольку мы ничего не делаем с сгенерированным 128-битным шифром, мы распечатываем его с помощью метода Main (), а также преобразуем его в строку с базой 64. Позже эту строку или информацию в массиве байтов можно использовать по-разному: генерировать истинные случайные соли для хеш-строк, помогать в алгоритмах генерации ключей и т. Д.

Вот и все. Есть ли у вас какие-нибудь идеи, по которым вы могли бы реализовать немного квантовых вычислений в своих собственных проектах? Дайте нам знать.

Чтобы узнать больше о квантовых вычислениях с помощью пакета Microsoft Quantum Development Kit, посетите: Документация Microsoft QDK

Проект Github, на основе этой статьи: Генератор семян квантовых вычислений