Использование квантовых вентилей в библиотеке Qiskit на Python, часть первая

Всем привет! Меня зовут Сергей Ширкин, это моя первая публикация на vc.ru. Немного о себе: моя основная деятельность связана с математикой, машинным обучением и искусственным интеллектом.

Я работаю дата сайентистом в Dentsu Aegis, а также являюсь деканом факультетов Искусственного интеллекта и Аналитики Big Data в GeekUniversity на образовательном портале GeekBrains.

С этой статьи я начинаю рассказ про то, как работать с квантовыми вычислениями на Python, используя библиотеку Qiskit. Этот цикл статей рассчитан на аудиторию, которая уже знает в общих чертах, что такое квантовые вычисления, а также владеет математикой на уровне первого курса вуза (в основном потребуется линейная алгебра и комплексные числа) и умеет программировать на Python. Здесь не будет научпопа и новостей, только квантовые вычисления в чистом виде. Если все пойдет хорошо, то также мы начнем изучать квантовое машинное обучение, библиотеку PennyLane и многое другое.

Итак, начинаем.

Квантовые вентили (quantum gates) в квантовых вычислениях играют примерно такую же роль, как логические операторы (НЕ, И, ИЛИ и т.д.) в вычислениях, выполняемых с помощью классических компьютеров. В частности, практически аналогично логическому оператору НЕ действует квантовый вентиль X: кубит, на который он воздействует, меняет свое значение на противоположное:

Использование квантовых вентилей в библиотеке Qiskit на Python, часть первая

То же самое действие можно привести в векторной форме:

Использование квантовых вентилей в библиотеке Qiskit на Python, часть первая

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

from qiskit import QuantumCircuit, ClassicalRegister, QuantumRegister from qiskit import execute # Создание квантового регистра q = QuantumRegister(1) # Создание классического регистра c = ClassicalRegister(1) # Создание схемы circuit = QuantumCircuit(q, c) # Применение квантового вентиля X circuit.x(q[0]) # Измерение кубита circuit.measure(q, c) # Запуск операций на квантовом симуляторе result = execute(circuit , ’local qasm simulator’).result() print(result.get_counts())

Как известно, состояния кубита (квантового бита), в отличие от классического бита, помимо базисных состояний 0 и 1 (для кубита используются обозначения |0⟩ и |1⟩), может включать в себя также и сочетание этих состояний, взятых с определенной амплитудой. Такое явление, когда кубит находится сразу в двух состояниях с разной вероятностью (до измерения кубита его состояние не может быть точно установлено), называется суперпозицией. Амплитуда может быть не только положительной, но и отрицательной, а в общем случае она является комплексным числом. Квадрат модуля амплитуды равен вероятности состояния.

В данном примере кубит переходит в состояние суперпозиции - в этом случае такой, что вероятность возникновения состояний |0⟩ и |1⟩ равна 50% (несмотря на то, что их амплитуды противоположны по знаку). Для получения суперпозиции используется оператор Адамара:

Использование квантовых вентилей в библиотеке Qiskit на Python, часть первая

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

Использование квантовых вентилей в библиотеке Qiskit на Python, часть первая
q = QuantumRegister(1) c = ClassicalRegister(1) circuit = QuantumCircuit(q, c) # получение состояния |1⟩ из состояния |0⟩ circuit.x(q[0]) # Применение оператора Адамара circuit.h(q[0]) # Измерение состояния кубита circuit.measure(q, c) # Запуск операций на квантовом симуляторе result = execute(circuit , ’local qasm simulator’).result() print(result.get_counts())

Состояние кубита, которое мы получили до измерения, соответствует одному из базисных векторов базиса Адамара, который обозначается как |-⟩. Получить из него другой базисный вектор |+⟩ можно с помощью квантового вентиля Z:

Использование квантовых вентилей в библиотеке Qiskit на Python, часть первая

В коде применение вентиля Z выглядит так:

circuit.z(q[0])

Если производить измерение такого кубита в базисе векторов |0⟩ и |1⟩, то примерно в половине случаев будет получаться состояние |0⟩, а в другой половине |1⟩.

Мы рассмотрели применение простейших квантовых вентилей к однокубитной системе.

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

2626
3 комментария

Хабр переехал на vc?

9
Ответить

Я бы ожидал такое прочесть на хабре

3
Ответить

Очень обрадовался когда увидел в названии Qiskit, но почему-то пропало желание читать после упоминания GeekBrains.

2
Ответить