Введение в Q# — язык Microsoft для квантовых вычислений

vvedenie v q — yazyk microsoft dlya kvantovyh vychislenij?v=1656626298

В этой статье я познакомлю вас с Q# — на новом языке программирования от Microsoft для квантовых вычислений. Рассмотрим типы данных Q#, выражения и операторы с помощью фрагментов кода.

Предпосылки

Для осмотра квантовых вычислений посетите мою предыдущую статью: Введение в квантовые вычисления. Там я также описываю, как установить Quantum Development Kit (QDK) в Visual Studio 2017.

Что такое Q#?

По данным Microsoft:

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

Итак, что на самом деле означают эти термины? Давайте погрузимся в детали.

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

Начало работы с разработкой Q#

В этой статье предполагается, что вы уже установили QDK для Visual Studio 2017. Если нет, то вы можете просмотреть инструкции в моей предыдущей статье.

После того, как вы успешно установили QDK, нам нужно проверить, имеет ли Visual Studio 2017 все необходимые зависимости для разработки Q#. Для этого мы клонируем и выполним квантовые образцы программ GitHub, предоставленные Microsoft.

Откройте VS 2017 и перейдите к Команда >> Управление подключениями.

изображение-24

Выберите «Клонировать» в разделе «Локальные репозитории Git», введите URL-адрес: и нажмите «Клонировать».

krnmAb5hG5Aor-xiXb8QtQztnovD28z8vzPo

Репозиторий будет клонирован на локальном компьютере, а Visual Studio перейдет на Solution Explorer. Он отобразит все клонированные библиотеки и образцы.

d6Yc06IIXElFdgcFtm9Rbh90KGe51XTk6WYE

Теперь откройте QsharpLibraries.sln решение.

Если вам будет предложено «Установить отсутствующие функции во всплывающем окне нажмите «Установить», чтобы разрешить установку необходимых функций. Это загрузит и установит F# и другие инструменты, используемые в некоторых образцах. Убедитесь, что вы подключены к Интернету.

изображение-25

Чтобы запустить образец программы, щелкните правой кнопкой мыши Образец телепортации проект в “Samples > 0.Introduction folder” из QsharpLibraries решение, а затем нажмите «Установить как проект запуска» и нажмите F5.

изображение-26

Если вы видите экран вывода, подобный приведенному ниже, поздравляем, ваш VS 2017 готов к разработке Q#.

изображение-27

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

Модель типа Q#

Давайте поймем, какие разные модели типов предоставляет Q#:

Примитивный тип

  • Int: — Он представляет 64-разрядное целое число со знаком. Обратите внимание на обширный регистр «I». Это в отличие от междунар в C# с нижним регистром «i».
  • Double: — представляет число с плавающей запятой двойной точности. В отличии от двойной в C#.
  • Bool: — Он представляет логический тип и может принимать два значения — правда или ошибочный.
  • Qubit: – Это представляет бит Quantum. Кубит — это фундаментальная единица обработки информации в квантовых компьютерах, подобная a бит в классических компьютерах.
  • Паули: — Этот тип используется для обозначения базовой операции для вращения и определения основания измерения.
  • Результат: это результат измерения. Это может принимать два возможных значения Нулевой или один
  • Диапазон: это последовательность целых чисел.
  • Строка: — Он представляет последовательность символов Unicode.

Тип массива

Мы можем создать тип массива любого допустимого примитивного типа Q#. Q# не поддерживает прямоугольные многомерные массивы. Он поддерживает только зубчатые массивы.

Int[], Qubit[][]

По умолчанию все переменные Q# неизменны. Их значения не могут изменяться после их связывания. Итак, чтобы создать массив, значение которого можно установить, мы будем использовать mutable ключевое слово:

mutable myArr = new Int [5];

Это создаст целый массив myArr Размером 5. Элементы нового массива инициализируются значением по умолчанию, которое зависит от типа. В этом случае это будет 0, значение по умолчанию для целого типа.

Массивы, передаваемые как аргументы, неизменны. Все массивы в Q# основаны на нуле. То есть первый элемент массива arr есть всегда arr[0].

Тип кортежа

Тип кортежа представляет собой кортеж значений любого примитивного заданного типа. Она представлена ​​как (T1, T2, T3,…) где T1, T2, T3 являются простыми типами. Кортеж Q# неизменен. Мы не можем изменить содержимое кортежа после его создания.

Выражение кортежа может содержать несколько примитивных типов. Итак, кортеж типа (Int, Double, Result) является действительным кортежем.

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

Например, (2) является однотонным кортежем типа Intно оно считается эквивалентным целому числу 2.

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

Определенный пользователем тип является подтипом. base типа. Это означает, что его можно использовать где угодно значение base ожидается тип.

Тип операции

AQ# операция является вызванной подпрограммой, содержащей код Q# для выполнения квантовой операции. Операция является основной единицей квантового выполнения Q#. The операция может принимать только одно значение как вход в виде кортежа. Он возвращает единственное значение в виде вывода, указанное после двоеточия, и может быть кортежем.

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

Обратитесь к примеру операции ниже:

operation AddInteger(a: Int, b: Int): Int {  
    body {  
        mutable c = 0;  
        set c = a + b;  
        return (c);  
    }  
}

Вот у нас операция AddInteger принимающий кортеж (Int, Int) как входные данные Он возвращает результат типа Int после выполнения операций сложение над входными целыми числами.

Тип функции

Функция AQ# — классическая подпрограмма, используемая в алгоритме Quantum и может содержать только классический код (но не квантовые операции). Подобно операциям Q#, функция принимает одно значение как входные данные и возвращает одно значение как выход. Оба они могут быть кортежами. Функции не могут выделять кубиты или вызвать операции.

Давайте рассмотрим образец функции.

function ProductNumber(a: Double, b: Double): Double {  
    mutable c = 0.0;  
    set c = a * b;  
    return (c);  
}

Здесь мы определили функцию ProductNumberпринимающий кортеж (Double, Double) как входные данные и возвращает результат типа Double после выполнения произведения входных значений. Также обратите внимание, что а функция не имеет участок тела, как в случае an операция.

Выражения в Q#

Давайте посмотрим на разные выражения, представленные в Q#.

Числовые выражения

Существует два типа числовых выражений Q#:

  • Целые числа: они представлены Int
  • Числа с плавающей запятой: представлены Double

Чтобы представить шестнадцатеричное целое число, мы используем префикс «0x».

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

Кроме двоичных операций, числовые выражения также поддерживают операции модуля, мощности, поразрядного И, поразрядного ИЛИ, поразрядного XOR и побитового дополнения.

Кубитные выражения

Кубитные выражения – это символы, которые привязаны к значениям кубитов или элементов массива кубитов. Q# не оказывает поддержки кубитных литералов.

Выражения Паули

Как мы уже говорили ранее, примитивный тип Pauli может принимать четыре возможных значения: PauliI, PauliX, PauliY и PauliZ. Все это действительные выражения Паули. Мы также можем создать массив типов Паули и элементы массива рассматриваются как действительные выражения Паули.

Два возможных значения результата Zero и One являются действительными выражениями результата. Важно заметить, что One не то же, что целое число 1, и Zero не то же, что целое число 0. Кроме того, между ними нет прямого преобразования.

Это в отличие от C#, где, булево true считается таким же, как целое число 1 и логическое значение false считается таким же, как целое число 0.

Выражения диапазона

Выражение диапазона представляется в виде start..step..stop где start, step, stop все целые числа. Выражение диапазона может принимать значение как start, start+step, start+step+step и так далее, пока stop проходит.

Если только start и stop упоминаются в выражении диапазона, то он неявно примет значение шага, установленное на 1.

Давайте разберемся в этом на примере:

  • 1..3 — это указывает на диапазон 1,2,3. Это дает 1, 1+1, 1+1+1
  • 1..2..6 указывает диапазон 1,3,5или 1, 1+2,1+2+2
  • 8..-2..3 указывает диапазон 8,6,4 или 8, 8+(-2), 8+(-2)+(-2)

Выражения массива

В Q# массив может быть представлен в виде набора выражений элементов, разделенных точкой с запятой и взятых в квадратные скобки. Как и в C#, все элементы массива в Q# должны иметь одинаковый тип.

Поэтому, [1;2;3] является действительным массивом, но [1;2.5;Zero] является недействительным массивом.

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

Поэтому, [2;4;6] + [8;10;12] дам [2;4;6;8;10;12] как выход.

Чтобы найти длину массива, мы используем Length встроенная функция.

Как пример, если myArr это целочисленный массив из 5 элементов Length(myArr) вернется 5 как выход.

Заявления Q#

Символы Q# могут быть переменными или неизменными.

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

let i=8;

Это свяжет символ i как целое число со значением 8. Если мы попытаемся сбросить значение постоянного выражения, мы получим ошибку времени компиляции.

Итак set i=10; даст ошибку в этом случае.

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

mutable i=8;

Это свяжет символ i как целое число со значением 8

Чтобы изменить значение изменяемого символа, мы используем set ключевое слово:

set i=10;

Это обновит значение переменной i до 10

циклы for

Q# позволяет циклу for выполнять итерацию в диапазоне целых чисел. Оператор for состоит из ключевого слова forза которым следует идентификатор, ключевое слово inвыражение диапазона и блок операторов.

Диапазон определяется первым и последним целыми числами в диапазоне, например: 1..5 представляет диапазон 1, 2, 3, 4 и 5. Если требуется шаг, отличный от +1, используются три целых числа из.. между ними.

Поэтому, 1..2..10 это диапазон 1, 3, 5, 7 и 9. Диапазон включает в себя оба конца.

for(num in 1..2..10)  
{  
   //Do something  
}

Как следует из названия, этот цикл будет повторяться до тех пор, пока не состоится успешная операция. Этот цикл основан на квантовой модели «повторяйте к успеху». Он состоит из ключевого слова repeat и его блок операторов, ключевое слово untilлогическое выражение, ключевое слово fixupи его блок операторов.

Оператор внутри блока повтора выполняется, а затем оценивается булевое условие. Если булевое условие имеет значение истины, то цикл завершается. В противном случае выполняется блок фиксации и цикл повторяется еще раз.

Блок исправления всегда нужен – даже если исправления не нужно делать – в этом случае он будет пуст.

repeat {  
    //do something  
}  
until boolean condition  
fixup {  
    // do something  
}

Q# поддерживает операторы if для условного выполнения подобно C#. Оператор if состоит из ключевого слова if, за которым следует логическое выражение и блок операторов. Блок if может иметь необязательный блок else, представленный ключевым словом else.

if (num % 2 == 0) {  
    return true;  
} else {  
    return false;  
}

Условный оператор может состоять из серии цепочек if-elseif-else. Предложение else-if представлено ключевым словом elif.

if (num == 1) {  
    //do something  
}  
elif(num == 2) {  
    //do something  
}  
else {  
    //do something  
}

Вывод

В этой статье мы ознакомились с основами языка программирования Q#. Мы также установили QDK и проверили среду выполнения Q# с помощью Visual Studio 2017. Пожалуйста, опубликуйте свои ценные отзывы в разделе комментариев и следите за обновлениями, чтобы узнать больше о квантовых вычислениях.

Вы всегда можете обратиться к моим предыдущим статьям здесь.

Вы также можете найти статью на C# Corner

Первоначально опубликовано на ankitsharmablogs.com 16 января 2018 года.

Добавить комментарий

Ваш адрес email не будет опубликован.