РУКОВОДСТВО

Призрачные изображения и кубиты: новый способ визуализации квантовой суперпозиции

Исследуйте тайны квантовых вычислений!

Я всегда любил создавать игры

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

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

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

Невероятный кубит

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

Когда кубит находится в суперпозиции, он функционирует в квантовом состоянии. Это делает его мощным!

Экспоненциальная вычислительная мощность

Классический компьютер с одним битом может обрабатывать один бит информации (0 или 1). Напротив, квантовый компьютер с одним кубитом может обрабатывать два бита информации (0 и 1).

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

В конечном итоге это позволяет квантовому компьютеру с n-кубитами обрабатывать 2^n битов информации — и все это за один цикл процессора.

Удивительно, но квантовый компьютер всего с 55 кубитами может обработать почти 5 петабайт (2^55 бит) информации за один цикл.

Это может быть вся база данных вашего любимого веб-сайта социальной сети, обработанная в одно мгновение!

Это много!

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

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

Конечно, для нашего проекта нам понадобится всего один кубит.

Кубиты на классическом компьютере

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

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

Поскольку измеренный кубит теперь можно интерпретировать как значение 0 или 1, мы можем использовать кубит так же, как вы использовали бы классический компьютер.

Имейте это в виду, так как здесь начинается самое интересное!

Единороги и гремлины

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

Тем не менее, я хотел попробовать что-то более веселое!

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

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

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

Призрачные изображения

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

Кубит в суперпозиции по существу случаен.

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

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

Когда Х-гейта недостаточно

Кубиты можно инвертировать из значения 0 в 1 или наоборот с помощью X-gate.

X-гейт похож на оператор НЕ классического компьютера. Он просто переворачивает значение кубита.

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

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

Трехмерный кубит

Кубит содержит три оси, которые влияют на его поведение при измерении. К ним относятся оси X, Y и Z.

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

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

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

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

Представляем U-ворота

U-ворота — это специальные ворота, которые принимают три аргумента. К ним относятся тета, фи и лам. Аргументы позволяют модифицировать углы Эйлера кубита, чтобы вращаться вокруг сферы Блоха.

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

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

Как оказалось, изменение аргумента тета позволяет нам исказить вероятность того, что кубит будет измерять 0 или 1 именно так, как мы ищем!

Игра с U-воротом

Значение U-ворота для тета обычно находится в диапазоне от -1,5 до 1,5.

В нижней части диапазона измерения кубитов будут ближе к нулю. На верхнем конце диапазона измерения будут ближе к единице. Любое значение между ними приведет к перекосу в сторону 0 или 1.

Например, мы можем настроить кубит так, чтобы он имел 20-процентную вероятность измерения как 0 и 80-процентную вероятность измерения как 1, установив угол тета для U-ворота равным 0,8.

Регулировка степени инверсии

Продолжая настраивать значения U-затвора, мы можем видеть, как измерения кубитов приводят к различным шансам удержания 0 или 1 в зависимости от тета значения U-затвора.

Поскольку диапазон для тета, который мы будем использовать, составляет от -1,5 до 1,5, если мы установим коэффициент для тета равным 0,0, мы увидим традиционную вероятность 50/50 измерение 0 или 1. Однако, если мы установим значение для theta равным -0,6, мы увидим искаженное поведение, в результате чего вероятность измерения 0 будет гораздо выше, чем измерения 1.

Точно так же, если мы установим theta до -1,5, у нас будет почти 100% вероятность всегда измерять 0. Аналогично, установка значения 1,5 приведет к измерению 1.

Отбросив механику, давайте составим нашу программу вместе!

Наш план атаки

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

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

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

Создание квантовой программы

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

# Create a quantum circuit with 1 qubit.
qc = QuantumCircuit(1)

# Initialize the simulator.
simulator = Aer.get_backend('aer_simulator')

# Place the qubit into superposition.
qc.h(0)

# Apply partial inversion to the qubit.
# If our range is 0.0 to 1.0, we can set: theta = rate * 3 - 1.5
qc.u(theta, 0, 0, 0)

# Measure the result.
qc.measure_all()

Создание метода инвертирования для установки прозрачности

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

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

Наконец, мы вернем полученные измерения кубитов.

def invert(rate):
    # Convert the rate of inversion from [0.0 to 1.0]
    # to a theta range of [-1.5 to 1.5] using the formula:
    # ((old_value - old_min) / (old_max - old_min)) * (new_max - new_min) + new_min
    theta = rate * 3 - 1.5

    # Create a circuit.
    qc = QuantumCircuit(1)

    # Initialize the simulator.
    simulator = Aer.get_backend('aer_simulator')

    # Place the qubit into superposition.
    qc.h(0)
    
    # Apply partial inversion to the qubit.
    qc.u(theta, 0, 0, 0)

    # Measure the result.
    qc.measure_all()

    # Execute the circuit.
    job = execute(qc, simulator)
    result = job.result()

    # Return the counts of 0 and 1.
    return result.get_counts()

Если мы вызовем метод invert() с коэффициентом 0,5, у нас будет тот же старый равный шанс 50/50 измерить 0 или 1.

Однако, если мы установим коэффициент равным 0,3, у нас будет 70-80% вероятность измерения 0 по сравнению с измерением 1, как показано в следующем результате.

{‘0’: 792, ‘1’: 232}

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

Битва за дисплей

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

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

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

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

Инициализация графики

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

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

def init():
    canvas = Canvas()
    display(canvas)

    canvas.fill_style = 'white'
    canvas.fill_rect(0, 0, 300, 300)

    canvas.fill_style = 'black'
    canvas.fill_rect(5, 295, 290, 28)

    return canvas

# Load sprites.
unicorn = Image.from_file("unicorn.jpg")
gremlin = Image.from_file("gremlin.jpg")

Смешивание изображений вместе — квантовый стиль

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

Мы можем сделать это, создав метод draw(), который принимает в качестве параметров два спрайта (единорога и гремлина) вместе с альфа-значением для смешивания.

Мы также создадим метод update(), который вызывает нашу программу квантовых вычислений, применяет частичную инверсию к кубиту и использует полученные значения счетчиков измерений, равные 0 и 1, для установки прозрачности смешанного изображения.

def draw(sprite1, sprite2, alpha):
    canvas.global_alpha = alpha
    canvas.draw_image(sprite1, 5, 5, 290, 290)

    canvas.global_alpha = 1 - alpha
    canvas.draw_image(sprite2, 5, 5, 290, 290)

    canvas.global_alpha = 1
    canvas.font = "20px arial"
    canvas.fill_style = '#00ff00'
    canvas.fill_text('Qubit inverted  ' + str(round(alpha, 1) * 100) + '%', 10, 316)

    return canvas

def update(sprite1, sprite2, rate):
    # Run the quantum program and obtain the qubit measurements.
    counts = invert(rate)

    # Get the counts for "unicorn" from the qubit measuring 0, and the gremlin for the qubit measuring 1.
    alpha = counts['0'] / 1024 if '0' in counts else 0

    draw(sprite1, sprite2, alpha)

Превращение единорогов в гремлинов

Наконец, давайте все вместе!

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

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

def animate(rate = 0):
    with hold_canvas():
        for i in range(10):
            show_unicorn = True

            for j in range(20*2):
                canvas.fill_style = 'black'
                canvas.fill_rect(5, 295, 290, 28)

                update(unicorn, gremlin, rate)
                rate += 0.05 if show_unicorn else -0.05
                if rate > 1:
                    show_unicorn = False
                elif rate < 0:
                    show_unicorn = True

                canvas.sleep(125)

canvas = init()
animate()

Вот — результаты нашего творения!

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

Вы можете скачать полный пример кода для программы unicorn gremlin здесь.

об авторе

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