Пробуем квантовые вычисления
@m0n0x41dПривет Друзья!
Решил я посмотреть чуть ближе на квантовое программирование.
Не настолько близко, чтобы платить за вычисления на настоящем квантовом компьютере, но есть вполне себе эмуляторы-песочницы.
Зачем? Ну как минимум потому что – интересно, для общего развития! А это уже достаточная причина чтобы разобраться в теме хотя бы поверхностно.
Во-вторых, область квантовых вычислений не стоит на месте. Пока мы наслаждаемся плодами машинного обучения, "квантовые работы" вполне себе ведутся, а университеты и корпорации все больше денег и времени выделяют на соответствующие курсы, исследования и разработки.
За прошлую осень, когда я плотно сидел в Threads мне попадалось очень много будущих Microsoft Corporate Gurl которые много писали про квантовые вычисления, про то что "это круто! это будущее! Смотрите я учусь!"
Ну давайте разберемся что-ли что за кубиты, запутанность и суперпозиция!
Моя жена говорит, что суперпозиция это когда ты на диване лежишь с чайком, и ноут тепленький на животе с Симс 4. Затрудняюсь поспорить.
Алиса в стране кубитов
Вместо 1/0 битов в квантовом программировании мы имеем дело с кубитами (квантовые биты, ок?), которые находятся в суперпозиции и несут все значения от нуля до единицы. В какой то момент времени они могут принимать любое значение между ними, ну точнее мы их измеряем в момент времени.
Сейчас разберемся!
В общем и целом кубит на любой чих в сторону его состояния меняет свое значение случайным образом, прикидываясь то нулем то единицей. Состояния это скорее "условные", нам они нужны в онтологии только для того чтобы мы хоть что-то с этими кубитами могли делать.
Настоящие кубиты всегда в суперпозиции, и мы даже измерить их не можем без оказания на них воздействия.
Состояния кубитов в основном обозначаются в двух векторах:
- Кет-вектор как |0⟩ или |1⟩
- Бра-вектор как ⟨0| или ⟨1|
Но вы этим голову сильно не забивайте. Идем дальше.
В виду природы квантовых вычислений, системы работающие на них невозможно похакать, просто потому что нельзя незаметно скопировать кубит или как то его изменить – все сломается.
Итак, все крутится вокруг кубитов, которые изначально (до любого нашего "вмешательства") находятся в суперпозиции. Не понимаю насколько корректно тут использовать термины не-квантового программирования, вроде инициализация, поэтому остановимся на "изначально" :)
Суперпозиция, формально, это комбинация |0> и |1> состояний, к которым мы добавляем два комплексных числа (это те у которых действительные и мнимые части), А и B и получаем такую формулу:
Суммы квадратов А и B должны равняться единицы, это условие нормализации кубита. (к нему мы чуть позже еще вернемся)
Квадрат А обозначает вероятность перехода кубита после нашего вмешательства в состояние |0>, а квадрат B – в состояние |1> соответственно.
Разумеется, значения A и B для каждого перехода состояния кубита уникальные (в смысле значения предыдущего перехода стираются), они должны следовать некой "актуальной реальности", иначе было бы невозможно построить никакие вычисления.
Кубиты круты тем что с их помощью мы можем работать с намного большим количеством значений. Если в нашей привычной математике битов мы можем кодировать информацию линейно, то на кубитах количество кодируемой информации растет экспоненциально.
Так, один бит кодирует 2 значения, а один кубит сразу "кодирует" сразу четыре значения, но кодирует не совсем правильное слово.
Наши не-квантовые вычисления можно представить как бросок монеты, в том виде в котором мы его обычно воспринимаем – бросил, получил либо орел либо решку.
Если представить кубит как монету, то это будет такая монета которая после подбрасывания зависает в пространстве и постоянно крутится как очумелая. Мы считаем что она одновременно и орел и решка – так мы условились, она же все еще нами принимается как "монета с двумя сторонами".
Особенность квантовой монеты в том, что в нужный нам момент времени мы можем ее "измерить" и получить с разной вероятностью одно из двух значений. Можете представить это как ловлю чудо-монеты рукой в воздухе, после которого она на мгновение "лежит" какой то стороной в ладони, а потом опять взлетает на свое место и крутится дальше.
Таким образом, в системе в которой есть две обычные монеты мы можем закодировать четыре значения-комбинации:
- Орёл-Орёл
- Орёл-Решка
- Решка-Орёл
- Решка-Решка
Квантовые монеты могут быть во всех этих положениях одновременно, поэтому с двумя такими монетами их система описывается не 4 разными вариантами, а всеми возможными комбинациями этих четырех вариантов!
Проще говоря – с каждым новыми кубитом количество информации которой мы можем манипулировать удваивается.
Фишка квантовых компьютеров в том что они все эти варианты "перебирают" не просто быстро, а практически единомоментно.
Одновременно они вычисляются, потому что кубиты могут быть запутанны – некоторым образом "связанны" друг с другом. Это выражается в интересном поведении – когда один кубит меняет свое состояние, то другой кубит (или группа кубитов) тоже изменяются ненаблюдаемым образом.
Изначально кубиты не запутанны, они начинают работу в независимых состояниях. Запутывание кубитов – это одна из операций квантового программирования.
Группа запутанных кубитов называется квантовый регистр.
А операции допускаемые над кубитами в квантовом программировании называются гейты или вентили. Это равнозначные понятия – первое калька с английского, второе более распространено в рускоязычной среде.
Помните про нормализацию (сумма квадратов вероятностей перехода должна быть равна единице)?
Так вот эта нормализация – это ультимативное требования для любой операции над кубитом. Эта сумма всегда должна быть равна единице – и до применения квантовой операции, и после.
Вентилей довольно много, и как вы уже поняли, они по сути аналоги логических операций из нашего не-квантового программирования.
Есть "однокубитные" вентили, например отрицание NOT, которое работает как бинарный переключатель и переворачивает |0> в |1> или наоборот; Есть вентили более хитрые, которые крутят "фазу" кубита на какие то отношения, или вентили которые меняют только "знак", но не вероятности изменений.
И конечно есть многокубиные вентили, которые "принимают на вход" несколько кубитов и задают разные интересные правила, вроде вентилей CNOT – "Если первый кубит = |1⟩, то переверни второй кубит" и SWAP (понятно что делает, правда?) для двух кубитов; Или вентиля CCNOT для трех кубитов – "Если оба первых кубита = |1⟩, тогда переверни третий".
А еще измерения состояния, как в примере с монеткой, на самом деле тоже вентиль, которым мы заставляем кубит "выбрать" конкретное состояние.
Помните я в самом начале об этом говорил? Нельзя заставить кубит определить свое состояние не повлияв на него – чудо-монетка будет в суперпозиции, пока мы ее не поймаем.
Помогите, я запутался
Зачем вообще нужны эти квантовые вычисления к компьютеры?
Перспективы очень радужные, уже лишь на основании того что мы узнали выше можно попытаться представить как изменится наша обусловленная реальность, если мы сможем укротить, удешевить, и хотя бы в каком то смысле распространить квантовые вычисления.
Количество информации, скорость ее обработки, чрезвычайно устойчивые крипто-системы.
Тут надо помнить что крипто системы прошлого (нашего настоящего) квантовыми компьютерами пощелкаются моментально, и надо будет быстро быстро все переделывать на квантовые крипто системы
Ну и наконец по нашей любимой теме – искусственный интеллект. Если получится скрестить жабу с гадюкой, то вопрос о распространении квантовых вычислений, и вообще многие вопросы закроются и станут неактуальными, где жаба-с-гадюкой, это здоровенный "квантовый мозг" в котором будет крутиться, переобучаться и дообучаться Deus ex Machina.
Ладно, давайте отложим футуристку и вернемся к топику.
Если вы хотите чуть глубже разобраться, то есть как минимум десяток инструментов-симуляторов квантовых вычислений, можете прямо сегодня в Курсоре начать экспериментировать со своими "монетками", пусть и не настоящими!
Наверное самые зрелые и популярные песочницы это две python библиотеки – Qiskit от IBM и Гугловый Cirq. И еще есть отдельный квантовый язык программирования и целый QDK (quantum development kit) под него – Q# от Microsoft.
Я попробовал порешать депрекейтнутые каты на Q# локально... в целом не рекомендую такой опыт. Лучше воспользоваться вот этим бесплатным курсом от Microsoft, где код на Q# можно сразу запускать в браузере -> тык
Мой вывод
Квантовые вычисления это одновременно:
- Круто!
- Сложновато, не понятно (много математики и формальных штук если погружаться глубже)
- Концептуально-поверхностно – все понятно, и при этом не очень интересно – применяй вентиля да старайся правильно переходы предсказать
- Все еще очень перспективно, в плане если/когда/скорее-бы стабильные компы с кучей кубитов заведут то сразу экспоненциально быстро приближать новую теч. революцию.
Я вам желаю измерять себя в правильных и перспективных суперпозициях!