Как Квантовые Вычисления Могут Повлиять На Разработку Программного Обеспечения

Всем привет! Последние полгода издательство активно работает над темой квантовых вычислений и их практического применения.

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



Как квантовые вычисления могут повлиять на разработку программного обеспечения

Интерес к квантовым вычислениям значительно возрос за последние месяцы и годы.

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

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

Однако не все эти ожидания одинаково реалистичны.

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

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



Являются ли квантовые вычисления просто еще одним повышением производительности процессора?

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

На рисунке 1 этот процесс показан в простейшей форме: исходный код Java компилируется в независимый от платформы байт-код, который, в свою очередь, преобразуется в машинный код, специфичный для платформы.

Машинный код использует ряд простых операций (вентилей), выполняемых в памяти.

Основным аппаратным компонентом, используемым для этой цели, является широко известный транзистор.



Как квантовые вычисления могут повлиять на разработку программного обеспечения

Рис.

1. Трансляция языка программирования высокого уровня в операции, выполняемые на транзисторах .

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

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

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

Дело не только в различиях этих первичных элементов, но и в разной конструкции клапанов.

Таким образом, стек с рис.

1 неприменим в квантовых вычислениях.



Смогут ли квантовые вычисления разрушить весь вышеописанный стек вплоть до уровня Java?

Короче говоря, «не совсем».

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

Звучит знакомо, правда? Аналогичная ситуация наблюдается и при сравнении GPU и CPU. Хотя графические процессоры также используют транзисторы, они работают иначе, чем процессоры.

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

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

Например, именно такая ситуация возникает при использовании JavaFX или Deeplearning4j. Если вы пишете приложение пользовательского интерфейса с использованием JavaFX, вы работаете только с кодом Java (и, возможно, с некоторым FXML для объявления пользовательского интерфейса).

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

2. Таким образом, вам не нужно беспокоиться о том, какие части сцены JavaFX необходимо отобразить на экране.

код лучше подходит для процессора, а какой нет. с графическим процессором.



Как квантовые вычисления могут повлиять на разработку программного обеспечения

Рис.

2. JavaFX делегирует работу графическому процессору и центральному процессору.

Как показано на рис.

2, код реализации JavaFX делегирует работу графическому процессору и центральному процессору.

Хотя эти операции скрыты от разработчика (не доступны через API), некоторые знания о графическом процессоре часто бывают полезны, когда дело доходит до разработки более производительных приложений JavaFX. При использовании Deeplearning4j возникает аналогичная ситуация.

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

Однако вам, как конечному разработчику, не имеет значения, какую мощность будет использовать ваш код — CPU или GPU. Кажется, что квантовые компьютеры будут превосходны в решении задач, которые имеют тенденцию расти экспоненциально по мере роста размера проблемы и, следовательно, которые трудно или почти невозможно решить с помощью классических компьютеров.

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

Как система может выполнять квантовый код?

Сегодня аппаратное обеспечение квантовых компьютеров все еще находится на стадии эксперимента.

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

Но когда он появляется, его форма может быть другой:

  • Квантовый сопроцессор может быть интегрирован с центральным процессором системы.

  • Квантовые задачи можно делегировать квантовым облачным системам.

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

На их основе можно создать квантовые симуляторы , реализуя ожидаемое поведение.

Поэтому квантовый симулятор — идеальный инструмент для такой разработки.

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



Каковы основные строительные блоки квантовых вычислений?

Часто важно сравнивать классические вычисления с квантовыми вычислениями.

В классических вычислениях у нас есть биты и вентили.

Бит содержит один бит информации, и его значение может быть 0 или 1. Вентиль действует и может работать с одним или несколькими битами.

Например, вентиль НЕ, показанный на рисунке 3, меняет значение бита.

Если на входе 0, то на выходе вентиля НЕ будет 1, и наоборот.

Как квантовые вычисления могут повлиять на разработку программного обеспечения

Рис.

3. НЕ клапан В квантовых вычислениях мы имеем эквиваленты битов и вентилей.

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

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

4:

Как квантовые вычисления могут повлиять на разработку программного обеспечения

Рис.

4. Равенство, когда кубит находится в суперпозиции.

Обратите внимание: кубиты часто записываются в обозначение бюстгальтера , где имя переменной помещается между символами "|" и «> ».

Выражение на рис.

4 сообщает, что кубит x находится в суперпозиции состояний |0> и |1> .

Это не означает, что он находится в состоянии |0> ИЛИ состоянии |1> ; это означает, что его нынешнее состояние нам неизвестно.

По сути, он находится в обоих состояниях одновременно, и в таком виде им можно манипулировать.

Однако когда мы измеряем кубит, он оказывается в одном состоянии: |0> или |1> .

В приведенном выше выражении есть еще одно ограничение: a^2 + b^2 = 1. Значения a и b являются вероятностными: существует вероятность a^2 того, что когда мы измеряем кубит |x> , он будет содержать значение |0> , и вероятность b^2 того, что измеренный кубит будет содержать значение |1> .

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

Значение кубита может быть 0 или 1. В расчетах кубит в суперпозиции может соответствовать как 0, так и 1 (с разными вероятностями).

Если у нас есть два кубита, то с их помощью мы можем представить четыре состояния (00, 01, 10 и 11), опять же, с разными вероятностями.

Здесь мы добираемся до сути мощи квантовых компьютеров.

С помощью восьми классических битов вы можете представлять ровно одно число в диапазоне от 0 до 255. Каждый из восьми битов будет иметь значение 0 или 1. С помощью восьми кубитов вы можете одновременно представлять все числа от 0 до 255.

Какой смысл в суперпозиции, если можно измерить только одно состояние?

Часто результат алгоритма прост («да» или «нет»), но для его получения требуется множество параллельных вычислений.

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

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

Затем во многих квантовых алгоритмах наступает следующий важный шаг: связать выходные данные алгоритма с измерением, которое дает значимый результат. Часто учитывается интерференция: интересные результаты конструктивно перекрывают друг друга, а неинтересные нейтрализуют друг друга (деструктивная интерференция).



Как кубит можно «преобразовать» в состояние суперпозиции?

Точно так же, как классические вентили манипулируют битами, квантовые вентили манипулируют кубитами.

Некоторые квантовые ворота напоминают классические; например, вентиль Паули-X переводит кубит из состояния a|0> + b|1> в состояние b|0| + a|1> , что аналогично принципу работы классического вентиля НЕ.

Действительно, когда a = 1 и b = 0, кубит изначально находился в состоянии |0> .

После воздействия вентиля Паули-Х этот кубит перейдет в состояние |1> , как показано на рис.

5.

Как квантовые вычисления могут повлиять на разработку программного обеспечения

Рис.

5. Результат использования клапана Pauli-X. В этом контексте очень интересен клапан Адамара.

Он переводит кубит в состоянии |0> в суперпозицию: 1/sqrt(2)* (|0> + |1> ), как показано на рис.

6.

Как квантовые вычисления могут повлиять на разработку программного обеспечения

Рис.

6. Результат использования вентиля Адамара.

Как только мы применим вентиль Адамара к кубиту и измерим кубит, существует 50%-ная вероятность того, что значение кубита будет равно 0, и 50%-ная вероятность того, что значение кубита будет равно 1. Пока кубит не будет измерен, он останется в состояние суперпозиции.



Как все это возможно?

Если вас действительно интересует ответ на этот вопрос, вам придется подробно изучить квантовую физику.

Но, к счастью, не обязательно понимать всю теоретическую основу этих явлений.

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

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

Стоит ли подождать несколько лет, а затем повнимательнее присмотреться к квантовым вычислениям?

Нет. В этом случае вы опоздаете.

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

Однако все концепции уже более-менее понятны, и уже можно писать квантовые симуляторы на популярных языках, включая Java, C#, Python и другие.

Эти симуляторы затем можно использовать для работы над квантовыми алгоритмами.

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

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

Квантовые алгоритмы требуют другого интеллектуального подхода, чем классические.

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

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

Рефакторинг программной системы в современной крупной компании — это не то, что можно осуществить в одночасье.

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

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



Как научиться работать с квантовыми алгоритмами на Java?

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

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

7. Первый кубит сначала пойдет к воротам Паули-X, а затем к воротам Адамара.

Вентиль Паули-Х переведет его из состояния |0&gt в |1&gt, а вентиль Адамара переведет в суперпозицию с равными вероятностями |0&gt и |1&gt. Следовательно, если мы прогоним всю последовательность 1000 раз и измерим первый кубит 1000 раз в конце этого цикла, то в среднем можно ожидать, что в 500 случаях он будет иметь значение 0, а в 500 случаях он будет иметь значение значение 1. Второй кубит еще проще.

Начнем с гейта Identity, который не меняет поведение кубита, а затем передаем его гейту Паули-X, который меняет свое значение с 0 на 1.

Как квантовые вычисления могут повлиять на разработку программного обеспечения

Рис.

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

  
  
  
  
  
   

public static void main(String[] args) { Program p = new Program(2); Step s = new Step(); s.addGate(new X(0)); p.addStep(s); Step t = new Step(); t.addGate(new Hadamard(0)); t.addGate(new X(1)); p.addStep(t); SimpleQuantumExecutionEnvironment sqee = new SimpleQuantumExecutionEnvironment(); Result res = sqee.runProgram(p); Qubit[] qubits = res.getQubits(); Arrays.asList(qubits).

forEach(q -> System.out.println("qubit with probability on 1 = "+q.getProbability()+", measured it gives "+ q.measure())); }

Это приложение создает квантовую программу с двумя кубитами:

Program p = new Program(2);

В рамках этой программы мы проходим два этапа.

Первый шаг — применить вентиль Паули-X к q[0].

Мы не применяем гейт к q[1] и, таким образом, подразумеваем, что он будет работать с гейтом идентичности.

Добавьте этот шаг в программу:

Step s = new Step(); s.addGate(new X(0)); p.addStep(s);

Затем мы переходим ко второму этапу, где применяем вентиль Адамара к q[0] и вентиль Паули-X к q[1]; добавьте этот шаг в программу:

Step t = new Step(); t.addGate(new Hadamard(0)); t.addGate(new X(1)); p.addStep(t);

Итак, наша программа готова.

Теперь давайте сделаем это.

У Strange есть встроенный квантовый симулятор, однако Strange также может использовать облачный сервис для запуска программ в каком-нибудь облаке, например.

Oracle Cloud .

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

SimpleQuantumExecutionEnvironment sqee = new SimpleQuantumExecutionEnvironment(); Result res = sqee.runProgram(p); Qubit[] qubits = res.getQubits();

Прежде чем мы измерим кубиты (и потеряем всю информацию), давайте отобразим вероятности.

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

Arrays.asList(qubits).

forEach(q -> System.out.println("qubit with probability on 1 = "+q.getProbability()+", measured it gives "+ q.measure()));

Запустив это приложение, мы получим следующий результат:

qubit with probability on 1 = 0.50, measured it gives 1 qubit with probability on 1 = 1, measured it gives 1

Обратите внимание, что первый кубит также может иметь значение 0, как мы и ожидали.

Если вы запустите эту программу много раз, значение первого кубита в среднем будет равно 0 в половине случаев и 1 в половине случаев.



Это все, что нужно знать о квантовых вычислениях?

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

Мы не рассказали о самых известных квантовых алгоритмах, в том числе об алгоритме Шора, позволяющем разлагать целые числа на простые множители.

Мы также проигнорировали ряд математических и физических фактов, в частности, не учли, что в суперпозиции |x> = a|0> + b|1> оба числа, a и b, могут быть комплексными.

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

Теги: #Квантовые технологии #квантовые вычисления #Компьютерное оборудование #java #oracle #аппаратное обеспечение #Квантовые вычисления

Вместе с данным постом часто просматривают: