Новости

15.09.2020

Книга «Программирование квантовых компьютеров. Базовые алгоритмы и примеры кода»

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

Эрик Джонстон, Ник Хэрриган и Мерседес Химено-Сеговиа помогают развить необходимые навыки и интуицию, а также освоить инструментарий, необходимый для создания квантовых приложений. Вы поймете, на что способны квантовые компьютеры и как это применить в реальной жизни. Книга состоит из трех частей: — Программирование QPU: основные концепции программирования квантовых процессоров, выполнение операций с кубитами и квантовая телепортация. — Примитивы QPU: алгоритмические примитивы и методы, усиление амплитуды, квантовое преобразование Фурье и оценка фазы. — Практика QPU: решение конкретных задач с помощью примитивов QPU, методы квантового поиска и алгоритм разложения Шора.

Реальные данные


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

  1. Как представить сложные типы данных в регистре QPU? Положительное целое число можно представить в простой двоичной кодировке. Но что делать с иррациональными числами или даже с составными типами данных вроде векторов или матриц? Этот вопрос обретает новую глубину, если учесть, что суперпозиция и относительная фаза могут предоставить новые квантовые варианты кодирования таких типов данных.
  2. Как прочитать данные, хранящиеся в регистре QPU? До сих пор мы инициализировали свои входные регистры вручную, используя операции WRITE для ручной инициализации кубитов регистра нужными двоичными числами. Если вы собираетесь применять квантовые приложения с большими массивами данных, эти данные нужно будет прочитать в регистры QPU из памяти. Это нетривиальное требование, так как, возможно, регистр QPU нужно будет инициализировать суперпозицией значений, а для этого традиционная оперативная память не приспособлена.


Начнем с первого вопроса. При описании представлений QPU для типов данных возрастающей сложности мы придем к введению полноценных квантовых структур данных и концепции квантовой оперативной памяти (QRAM). Квантовая оперативная память является критическим ресурсом для многих практических применений QPU.

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

Нецелые данные


Как закодировать нецелые числовые данные в регистре QPU? Два стандартных способа представления таких значений в двоичной форме — представления с фиксированной точкой и с плавающей точкой. Хотя представление с плавающей точкой обладает большей гибкостью (и способностью адаптироваться к диапазону значений, которые требуется представить с определенным количеством битов), из-за высокой ценности кубитов и нашего стремления к простоте представление с фиксированной точкой лучше подойдет для начала работы.

Числа с фиксированной точкой часто описываются в Q-записи (к сожалению, Q в данном случае не означает «квантовый»). Это помогает избавиться от неоднозначности относительно того, в какой позиции регистра кончаются биты дробной части и начинаются биты целой части. Запись Qn.m обозначает n-разрядный регистр, m разрядов которого предназначены для дробной части (а следовательно, оставшиеся (n – m) содержат целую часть). Конечно, при помощи той же записи можно указать, как регистр QPU должен использоваться для кодирования числа с фиксированной точкой. Например, на рис. 9.1 изображен восьмикубитный регистр QPU, в котором закодировано значение 3.640625 в представлении с фиксированной точкой Q8.6.

В приведенном примере выбранное число может быть точно закодировано в представлении с фиксированной точкой, потому что 3.640625 = image Конечно, такое везение встречается не всегда. Увеличение количества битов в целой части регистра с фиксированной точкой расширяет диапазон целочисленных значений, которые могут быть им представлены, а увеличение количества битов в дробной части повышает точность представления дробной части числа. Чем больше кубитов в дробной части, тем больше вероятность того, что некоторая комбинация image сможет точно представить заданное число.

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

QRAM


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

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

Если вы хотите инициализировать регистр QPU только одним традиционным значением (в дополнительном коде, в представлении с фиксированной точкой или в простой двоичной кодировке), то оперативная память прекрасно подойдет. Нужное значение просто хранится в памяти, а для его записи или чтения из регистра QPU используются операции write() и read(). Именно этот ограниченный механизм использовался кодом QCEngine JavaScript для взаимодействия с регистрами QPU до настоящего момента.

Так, пример кода из листинга 9.1, который получает массив a и реализует операцию a[2] += 1;, неявно извлекает этот массив значений из оперативной памяти для инициализации регистра QPU. Схема изображена на рис. 9.3.

Пример кода


Этот пример можно выполнить онлайн по адресу http://oreilly-qc.github.io?p=9-1.
Листинг 9.1. Использование QPU для увеличения числа в памяти

 

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

Хотя такое использование оперативной памяти позволяет инициализировать регистры QPU простыми двоичными значениями, у него есть серьезные ограничения. Что, если потребуется инициализировать регистр QPU суперпозицией хранимых значений? Например, предположим, что в оперативной памяти значение 3 (110) хранится по адресу 0x01, а значение 5 (111) — по адресу 0x11. Как подготовить входной регистр в суперпозиции этих двух значений?

С традиционной оперативной памятью и неуклюжей традиционной операцией write() это сделать не удастся. Квантовым процессорам, как и когда-то их ламповым предкам, понадобится принципиально новое оборудование памяти — квантовое по своей природе. Знакомьтесь: квантовая оперативная память (QRAM) позволяет читать и записывать данные на квантовом уровне. Уже есть несколько идей относительно того, как физически строить QRAM, но стоит заметить, что история вполне может повториться, и невероятно мощные квантовые процессоры могут появиться задолго до того, как появится работоспособное оборудование квантовой памяти.

Стоит чуть точнее объяснить, что же делает QRAM. Как и традиционная память, QRAM получает на входе два регистра: адресный регистр QPU для адреса памяти и выходной регистр QPU, в котором возвращается значение, хранящееся по заданному адресу. Для QRAM оба регистра состоят из кубитов. Это означает, что в адресном регистре можно задать суперпозицию ячеек памяти и как следствие получить в выходном регистре суперпозицию соответствующих значений (рис. 9.4).

Таким образом, QRAM фактически позволяет читать хранимые значения в суперпозиции. Точные комплексные амплитуды суперпозиции, которая будет получена в выходном регистре, определяются суперпозицией, предоставленной в адресном регистре. На рис. 9.2 показаны различия при выполнении той же операции инкремента в листинге 9.1 (рис. 9.5), но для обращения к данным используется QRAM вместо операций чтения/записи QPU. Буквой «A» обозначен регистр, в котором QRAM передается адрес (или суперпозиция). Буквой «D» обозначен регистр, в котором QRAM возвращает соответствующую суперпозицию хранимых значений (данных).

С полным содержанием статьи можно ознакомиться на сайте "Хабрахабр":

https://habr.com/ru/company/piter/blog/516492/


Комментарии: 0

Пока нет комментариев


Оставить комментарий






Все поля обязательны к заполнению.

Перед публикацией комментарии проходят модерацию.