Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Grin_A_S_i_dr__Vvedenie_v_kvantovoe_program.docx
Скачиваний:
3
Добавлен:
01.07.2025
Размер:
102 Кб
Скачать
☆

2.2. Квантовое преобразование Фурье и квантовое сложение

Рекурсия. На языке Quipper можно писать функции, генерирующие квантовые схемы, которые рекурсивны по любому из параметров, значение которого известно на стадии генерации. Что замечательно, мы можем определять функции, которые рекурсивны над формой входных данных, такой как список кубитов. Например, представьте себе квантовое преобразование Фурье (КПФ), которое может быть оформлено в виде рекурсивного определения. Функция qft’ определена над списком кубитов. Для рекурсии мы предоставляем два базовых варианта. Если входной список пуст, то и квантовая схема пуста. Если входной список содержит только один кубит, то квантовая схема состоит из одного гейта Адамара. Для рекурсивного случая квантовая схема КПФ для (n + 1) кубита представляет собой квантовую схему КПФ для n кубитов, за которой следует набор вращений всех (n + 1) кубитов. Этот набор вращений также может быть определён при помощи рекурсивной функции, которую мы назовём rotations. Ну и функция rGate m представляет собой встроенный оператор языка Quipper, который представляет вращение вокруг оси z на .

qft' :: [Qubit] -> Circ [Qubit]

qft' [ ] = return []

qft' [x] = do

hadamard x

return [x]

qft' (x:xs) = do

xs' <- qft' xs

xs'' <- rotations x xs' (length xs')

x' <- hadamard x

return (x':xs'')

where

rotations :: Qubit -> [Qubit] -> Int -> Circ [Qubit]

rotations _ [] _ = return []

rotations c (q:qs) n = do

qs' <- rotations c qs n

let m = ((n + 1) - length qs)

q' <- rGate m q `controlled` c

return (q':qs')

Функция qft’ получает на вход список, в котором кубиты расположены от младшего к старшему (little-endian), а возвращает список с кубитами от старшего к младшему (big-endian). Поскольку это является сбивающим с толку, мы обернули эту функцию в другую — qft_big_endian, которая просто обращает порядок кубитов во входном списке. В языке Quipper это достигается не тем, что меняются местами провода на схеме, но тем, что меняется порядок ссылок на провода; и язык Quipper остаток квантовой цепи присоединит соответствующим образом.

qft_big_endian :: [Qubit] -> Circ [Qubit]

qft_big_endian qs = do

comment_with_label "ENTER: qft_big_endian" qs "qs"

qs <- qft' (reverse qs)

comment_with_label "EXIT: qft_big_endian" qs "qs"

return qs

Операции с квантовыми схемами. Большинство операторов, которые мы видели к настоящему моменту, работают на уровне гейтов, то есть их эффект применяется к гейту во время конструирования квантовой схемы. В языке Quipper также имеется идиома операторов на уровне квантовой схемы, то есть эффект этих операторов применяется к схеме в целом. одним примером является преобразование квантовой схемы в изображение, однако есть операторы, которые могут быть применены во время генерации схемы. Обычно такие операторы получают на вход функцию, генерирующую схему, а возвращают другую такую же функцию, которая может быть использована в том же порядке, как и любая иная генерирующая схему функция. Полезным примером является оператор reverse_generic_endo, который обращает всю квантовую схему целиком. Следующая функция возвращает обращение схемы КПФ:

inverse_qft_big_endian :: [Qubit] -> Circ [Qubit]

inverse_qft_big_endian = reverse_generic_endo qft_big_endian

Квантовый сумматор. В качестве применения схемы КПФ мы рассмотрим квантовую схему, которая производит сложение [7] без привлечения вспомогательных кубитов. Эта схема использует КПФ в качестве метода для изменения базиса. В конце вычислений применяется обращённое КПФ для возвращения базиса к исходному состоянию. Часть схемы, находящаяся между двумя КПФ, и которая, собственно, осуществляет сложение, также определена в виде рекурсивной функции.

qft_adder :: [Qubit] -> [Qubit] -> Circ ()

qft_adder _ [] = return ()

qft_adder as (b:bs) = do

qft_adder' as b 1

qft_adder (tail as) bs

where

qft_adder' :: [Qubit] -> Qubit -> Int -> Circ [Qubit]

qft_adder' [] _ _ = return []

qft_adder' (a:as) b n = do

b <- rGate n b `controlled` a

qft_adder' as b (n + 1)

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

qft_add_in_place :: [Qubit] -> [Qubit] -> Circ ([Qubit], [Qubit])

qft_add_in_place a b = do

label (a, b) ("a", "b")

with_computed (qft_big_endian b) $ \b' -> do

qft_adder a (reverse b')

label (a, b) ("a", "b")

return (a, b)

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

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

qft_add_in_place_boxed :: [Qubit] -> [Qubit] -> Circ ([Qubit], [Qubit])

qft_add_in_place_boxed a b = do

label (a, b) ("a", "b")

with_computed (box "QFT" qft_big_endian b) $ \b' -> do

qft_adder a (reverse b')

label (a, b) ("a", "b")

return (a, b)

Симуляция квантовых схем. В отличие от многих языков квантового программирования, описанных в литературе, язык Quipper был спроектирован не в качестве фронт-ендового языка для квантового симулятора, но для управления реальным (будущим) квантовым компьютером. Поэтому операции, не имеющие физического смысла, в языке Quipper отсутствуют. Несмотря на это во время разработки и тестирования (и в условиях отсутствия реального квантового компьютера) полезно иметь возможность запускать режим симуляции. Язык Quipper предоставляет три различных симулятора, которые используются в зависимости от того, какие гейты использованы в рамках квантовой схемы:

  • Классический симулятор — эффективно симулирует классические схемы.

  • Стабилизированный симулятор — эффективно симулирует схемы из группы Клиффорда [1].

  • Квантовый симулятор — симулирует произвольную схему (с экспоненциальным ростом затрат).

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]