Первые шаги в Q#. Алгорим Дойча

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

Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!

Квантовый компьютер на фотонах. Интерферометр Маха-Цендера
Квантовый компьютер на фотонах. Интерферометр Маха-Цендера

Алгоритм Дойча — алгоритм, разработанный Дойчем в 1985 году, и ставший одним из первых квантовых алгоритмов. В нём рассматривается функция булевая f(x) от одной переменной.

Постановка задачи

Пусть известно, что булевая функция f(x) является:

  1. либо постоянной (принимает одно и то же значение при любом значении аргумента)

  2. либо сбалансированной (то есть для половины значений аргумента она приминает значение 0, а для другой половины значений аргумента она принимает значение 1)

Требуется за минимальное количество обращений к оракулу определить является ли заданная функция постоянной или сбалансированной.

Что нам говорит Википедия?

Алгоритму Дойча — Йожи достаточно однократного обращения к квантовому оракулу для достоверного решения задачи.

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

Чтобы кодить на Q# нам потребуется QDK, что в принципе логично.

Сайт Майкрософт содержит подробные инструкции по установке QDK и под VS, и под VS Code и под много разное со всеми ссылками на нужные версии и т.д..

Но мы не ищем сложных/простых (нужное подчекнуть) путей и воспользуемся установкой под VS Code.

  • Шаг первый. Скачиваем и устанавливаем VS Code

  • Шаг второй. Запускаем VS Code, идём в настройку расширений и устанавливаем расширение Microsoft Quantum Development Kit for Visual Studio Code

  • Потом, когда нам предложат скачать .Net, перейдём по ссылке и установим .Net (на момент написания статьи для Q# требовался .Net 6.0)

  • Все остально расширение само докачает

Таким образом с развёртываением среды программирования и отладки покончено.

Как выглядит алгорим Дойча?

Всё просто - вот он:

Алгорим Дойча
Алгорим Дойча

Н - преобразование Адамара

Uf - оракул

M - измерение значения кубита

И если результат измерения:

  • |0> то функция постоянная

  • |1> то функция сбалансированная

Окей - кодим

В VS Code

  • Идём в меню Command Palette (Ctrl+Shift+P)

  • Выбираем "Q#: create new project"

  • В предложенном типе проектов выбираем standalone

  • Указываем папку для проекта

  • Заменяем в сгенерированном файле Program.qs код на следующий

namespace qq {

    open Microsoft.Quantum.Intrinsic;
    open Microsoft.Quantum.Measurement;
    
    operation SetQubitState(desired : Result, target : Qubit) : Unit {
        if desired != M(target) {
            X(target);
        }
    }

    // Алгоритм Дойча для булевая функции одного аргумента
    // Параметром передаётся оракул для произвольной булевой функции одного аргумента
    operation Deutsch(Oracle : (Qubit, Qubit) => Unit) : Result {

        // Аллокирование кубитов
        use (x,y) = (Qubit(), Qubit()); 

        // Задание начальных значений кубитов, согласно алгритму Дойча
        SetQubitState(Zero, x);
        SetQubitState(One, y);

        //  Применение преобразований Адамара к кубитам
        H(x);
        H(y);

        // Применение оракула
        Oracle(x,y);

        //  Применение преобразований Адамара к кубиту x
        H(x);

        // Измерение значения кубита x
        let result = M(x);  

        // Очиска значений кубитов перед высвобождением
        SetQubitState(Zero, x);
        SetQubitState(Zero, y);
        
        return result;
    }

    // Оракул булевой функции одного аргумента может быть одним из следующих
    operation Uf0(x:Qubit,y:Qubit): Unit {} // f(x)=0
    operation Uf1(x:Qubit,y:Qubit): Unit { X(y); } // f(x)=1
    operation Uf2(x:Qubit,y:Qubit): Unit { CNOT(x,y); } // f(x)=x
    operation Uf3(x:Qubit,y:Qubit): Unit { X(x); CNOT(x,y); X(x); } //f(x)=!x

    @EntryPoint()
    operation Main(): Unit {

        // Результат алгоритма Дойча
        // Значение |0> если булевая функции одного аргумента постоянна (то есть константа)
        // Значение |1> если булевая функции одного аргумента сбалансированная

        Message($"f(x)=0  : {Deutsch(Uf0)}");
        Message($"f(x)=1  : {Deutsch(Uf1)}");
        Message($"f(x)=x  : {Deutsch(Uf2)}");
        Message($"f(x)=!x : {Deutsch(Uf3)}");
    }
}

В терминале пишем

dotnet run

и получаем то что и ожидали

f(x)=0  : Zero
f(x)=1  : Zero
f(x)=x  : One
f(x)=!x : One

Успех! Работает машинка ...

Всем спасибо, до свидания.

Для тех кого волнует теория вопроса

Лично я послушал лекции на openedu.ru https://openedu.ru/course/spbu/QUANTUMCOMP/?session=spring_2021

и почитал на ИНТУИТ https://intuit.ru/studies/courses/3633/875/info (https://intuit.ru/verifydiplomas/101614264)

Источник: https://habr.com/ru/articles/759352/


Интересные статьи

Интересные статьи

На недавней встрече комитет C++ активно взялся за C++26. Уже есть первые новинки, которые нас будут ждать в готовящемся стандарте C++: улучшенный static_assert, переменная _, оптимизация и ул...
Ваши первые 30 дней в новой должности DevRel будут проходить в каждой компании по-разному, но есть несколько стандартных шагов, которые вы можете предпринять, чтобы заложить основу для успеха. Использ...
С недавних пор заинтересовался электронными книгами. Причина проста – экономия времени и места. Волею случаю ко мне попала электронная книга Onyx Boox Edison с довольно крупным сенсорным экраном диаго...
Мы в МТС Банке давно ждали релиза Jetpack Compose, чтобы использовать его в продакшне. В прошлом месяце такая возможность наконец появилась — мы решили обновить дизайн одного из экранов нашего приложе...
Будучи частью Британской империи, Восточная Африка смогла получить несколько компьютеров, которые в то время только-только появлялись на рынке. Какими были эти компьютеры и какова их судьба, ра...