Кубит на C# и C++ - где квантовое превосходство?
От: Shmj Ниоткуда  
Дата: 23.09.23 09:27
Оценка:
Как вы знаете, я немного поиграл с Amazon Braket, которые дают нам на нашу бедность аж целый час бесплатных квантовых симуляций. И у них все работает.

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

Вот что я сделал. Попросил GPT написать реализации этих операций на C# и C++ (может кому удобнее второе). Вот они: https://dotnetfiddle.net/AZ25DO и https://ideone.com/DWg4Ak

  бекап
using System.Numerics;

class Program
{
    class QBit
    {
        private Complex _alpha = new Complex(1, 0);  // |0>
        private Complex _beta = new Complex(0, 0);   // |1>

        private static Random random = new Random();

        // H: Hadamard gate
        public void H()
        {
            var newAlpha = (_alpha + _beta) / Math.Sqrt(2);
            var newBeta = (_alpha - _beta) / Math.Sqrt(2);

            _alpha = newAlpha;
            _beta = newBeta;
        }

        // X: Pauli-X gate or NOT gate
        public void X()
        {
            var temp = _alpha;
            _alpha = _beta;
            _beta = temp;
        }

        // Pauli-Y gate
        public void Y()
        {
            var newAlpha = Complex.ImaginaryOne * _beta;
            var newBeta = -Complex.ImaginaryOne * _alpha;

            _alpha = newAlpha;
            _beta = newBeta;
        }

        // Pauli-Z gate
        public void Z()
        {
            _beta = -_beta;
        }

        // S: Phase gate
        public void S()
        {
            _beta = Complex.ImaginaryOne * _beta;
        }

        // T: π/8 gate or T gate
        public void T()
        {
            _beta = Complex.Exp(Complex.ImaginaryOne * Math.PI / 4) * _beta;
        }

        // Measurement and Collapse!
        public bool M()
        {
            double probabilityZero = _alpha.Magnitude * _alpha.Magnitude;

            if (random.NextDouble() < probabilityZero)
            {
                CollapseToZero();
                return false;
            }
            else
            {
                CollapseToOne();
                return true;
            }
        }

        public void CollapseToZero()
        {
            _alpha = new Complex(1, 0);
            _beta = new Complex(0, 0);
        }

        public void CollapseToOne()
        {
            _alpha = new Complex(0, 0);
            _beta = new Complex(1, 0);
        }

        // SWAP: Swap gate
        public void Swap(QBit otherQBit)
        {
            var tempAlpha = _alpha;
            var tempBeta = _beta;

            _alpha = otherQBit._alpha;
            _beta = otherQBit._beta;

            otherQBit._alpha = tempAlpha;
            otherQBit._beta = tempBeta;
        }

        // CNOT: Controlled NOT gate or Controlled X gate
        public void CNot(QBit control)
        {
            if (control._beta.Magnitude * control._beta.Magnitude > 0.5)  // Control qubit is more likely in |1> state
            {
                X();
            }
        }

        // CCNOT: Double-controlled NOT gate or Toffoli gate
        public void CCNot(QBit control1, QBit control2)
        {
            double probabilityControl1One = control1._beta.Magnitude * control1._beta.Magnitude;
            double probabilityControl2One = control2._beta.Magnitude * control2._beta.Magnitude;

            if (probabilityControl1One > 0.5 && probabilityControl2One > 0.5)
            {
                X();
            }
        }
    }

    static void Main()
    {
        var q1 = new QBit();

        q1.H();

        Console.Write(q1.M());
    }
}


#include <iostream>
#include <complex>
#include <cmath>
#include <random>

# define M_PI           3.14159265358979323846

class QBit {
private:
    std::complex<double> _alpha{ 1, 0 };  // |0>
    std::complex<double> _beta{ 0, 0 };   // |1>

    static std::default_random_engine generator;
    static std::uniform_real_distribution<double> distribution;

public:
    // H: Hadamard gate
    void H() {
        auto newAlpha = (_alpha + _beta) / std::sqrt(2.0);
        auto newBeta = (_alpha - _beta) / std::sqrt(2.0);

        _alpha = newAlpha;
        _beta = newBeta;
    }

    // X: Pauli-X gate or NOT gate
    void X() {
        auto temp = _alpha;
        _alpha = _beta;
        _beta = temp;
    }

    // Pauli-Y gate
    void Y() {
        auto newAlpha = std::complex<double>(0, 1) * _beta;
        auto newBeta = -std::complex<double>(0, 1) * _alpha;

        _alpha = newAlpha;
        _beta = newBeta;
    }

    // Pauli-Z gate
    void Z() {
        _beta = -_beta;
    }

    // S: Phase gate
    void S() {
        _beta = std::complex<double>(0, 1) * _beta;
    }

    // T: π/8 gate or T gate
    void T() {
        _beta = std::exp(std::complex<double>(0, M_PI / 4.0)) * _beta;
    }

    // Measurement and Collapse!
    bool M() {
        double probabilityZero = std::norm(_alpha);
        double randomValue = distribution(generator);

        if (randomValue < probabilityZero) {
            CollapseToZero();
            return false;
        }
        else {
            CollapseToOne();
            return true;
        }
    }

    void CollapseToZero() {
        _alpha = { 1, 0 };
        _beta = { 0, 0 };
    }

    void CollapseToOne() {
        _alpha = { 0, 0 };
        _beta = { 1, 0 };
    }

    // SWAP: Swap gate
    void Swap(QBit& otherQBit) {
        auto tempAlpha = _alpha;
        auto tempBeta = _beta;

        _alpha = otherQBit._alpha;
        _beta = otherQBit._beta;

        otherQBit._alpha = tempAlpha;
        otherQBit._beta = tempBeta;
    }

    // CNOT: Controlled NOT gate or Controlled X gate
    void CNot(QBit& control) {
        if (std::norm(control._beta) > 0.5) { // Control qubit is more likely in |1> state
            X();
        }
    }

    // CCNOT: Double-controlled NOT gate or Toffoli gate
    void CCNot(QBit& control1, QBit& control2) {
        double probabilityControl1One = std::norm(control1._beta);
        double probabilityControl2One = std::norm(control2._beta);

        if (probabilityControl1One > 0.5 && probabilityControl2One > 0.5) {
            X();
        }
    }
};

std::default_random_engine QBit::generator;
std::uniform_real_distribution<double> QBit::distribution(0.0, 1.0);

int main() {
    for (int i = 0; i<10; i++)
    {
        QBit q1;
        q1.H();
        std::cout << q1.M() << std::endl;
    }

    return 0;
}


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

Догадки такие. Здесь есть операция CNOT и ССNOT. Это то самое запутывание 2 и 3 кубит. Возможно что если запутать 100 кубит — то это уже потребует нарастания сложности. Но вроде такой операции нет даже на Amazon.

Есть идеи?
Re: Кубит на C# и C++ - где квантовое превосходство?
От: Shmj Ниоткуда  
Дата: 24.09.23 08:25
Оценка: :)
Здравствуйте, Shmj, Вы писали:

S>Есть идеи?


В общем, немного разобрался.

Тут неплохо малец объяснил:

  Скрытый текст
https://www.youtube.com/watch?v=Quj5fP2Lqio


Вот уж где редкие люди бывают, еще совсем юн а талант понимать и не просто понимать а еще и объяснять таким тупорылым как я — снимаю виртуальную шляпу.

Еще чуть помогло: https://quantum-computing.ibm.com/composer

Суть там в том, что эти все операции применяются на последовательно, как я думал, а одномоментно — и все состояния нужно согласовать одномоментно одно с другим — там то экспоненщина и проявляется.
Re: Кубит на C# и C++ - где квантовое превосходство?
От: graniar  
Дата: 24.09.23 11:49
Оценка:
Здравствуйте, Shmj, Вы писали:

S>
S>    // CCNOT: Double-controlled NOT gate or Toffoli gate
S>    void CCNot(QBit& control1, QBit& control2) {
S>        double probabilityControl1One = std::norm(control1._beta);
S>        double probabilityControl2One = std::norm(control2._beta);

S>        if (probabilityControl1One > 0.5 && probabilityControl2One > 0.5) {
S>            X();
S>        }
S>    }
S>};

S>


Это ерунда какая-то, а не гейт Тоффоли. Я вообще сомневаюсь, что его реализация физически возможна.
А тут вообще бред какой-то на основе измерений вероятностей.
Re[2]: Кубит на C# и C++ - где квантовое превосходство?
От: Shmj Ниоткуда  
Дата: 24.09.23 12:14
Оценка:
Здравствуйте, graniar, Вы писали:

G>Это ерунда какая-то, а не гейт Тоффоли.


А в чем разница будет в выдаваемых значениях? Сравните с этим: https://quantum-computing.ibm.com/composer

G>Я вообще сомневаюсь, что его реализация физически возможна.


Здесь нет задачи физической реализации — а лишь нужен код, который будет выдавать те же самые результаты, что и код на квантовом компе.

G>А тут вообще бред какой-то на основе измерений вероятностей.


Давайте разницу в результатах вычислений. Почему это не соответствует реальным квантовым вычислениям и в чем разница.
Отредактировано 24.09.2023 12:22 Shmj . Предыдущая версия .
Re[3]: Кубит на C# и C++ - где квантовое превосходство?
От: graniar  
Дата: 24.09.23 14:06
Оценка: 6 (1)
Здравствуйте, Shmj, Вы писали:

S>А в чем разница будет в выдаваемых значениях? Сравните с этим: https://quantum-computing.ibm.com/composer


The owner of this website (quantum-computing.ibm.com) has banned the country or region your IP address is in (RU) from accessing this website.



S>Давайте разницу в результатах вычислений. Почему это не соответствует реальным квантовым вычислениям и в чем разница.


Как должно быть: на входе — суперпозиция состояний (a,b,c), на выходе суперпозиция состояний (a^(b&c),b,c)

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

static const int n_qbits=16;
static const int n_states=(1<<n_qbits);

struct State{
    std::complex amplitudes[n_states];
};

void Toffoli(State* state,int a,int b,int c)
{
    int bc_mask=(1<<b)|(1<<c);
    for(int i1=0;i1<n_states;++i1){
        if(i1&(1<<a)){
            int i0=(i1^(1<<a));
            if((i1&bc_mask)==bc_mask){
                std::complex tmp=state->amplitudes[i0];
                state->amplitudes[i0]=state->amplitudes[i1];
                state->amplitudes[i1]=tmp;
            };
        };
    };
}
Отредактировано 24.09.2023 14:08 graniar . Предыдущая версия .
Re[4]: Кубит на C# и C++ - где квантовое превосходство?
От: Shmj Ниоткуда  
Дата: 24.09.23 16:03
Оценка:
Здравствуйте, graniar, Вы писали:

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

G>На С++ что-нить типа:

А сможете придумать на этом 4-кубитном визуализаторе пример, где эта разница проявится: https://quantum-computing.ibm.com/composer/

Т.е. где код отработает не так как визуализатор.
Re[4]: Кубит на C# и C++ - где квантовое превосходство?
От: Shmj Ниоткуда  
Дата: 24.09.23 18:52
Оценка:
Здравствуйте, graniar, Вы писали:

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

G>На С++ что-нить типа:

В общем, проверил его модель — она не верно работает даже на этой схеме: https://quantum-computing.ibm.com/composer/files/new?initial=N4IgdghgtgpiBcIAWAGAtAYzAewC4oEY1UQAaEARwgGcoEQB5ABQFEA5ARQEEBlAWQAEAJgB0KANwAdMAEswGADYBXACYwBkyjAUyARgRFyMmqWGkUATjADmAigG0ALAF1TGK7YxPX0pHfsoPvIAHv6BpP4EQX4OgaZkIGrU7jIADrgy2GD0IAC%2BQA

Попросил его исправить модель — он дал 10 вариантов и я последовательно проверял один за другим. После каждого варианта извинялся и клялся и божился что в новой версии учел все ошибки и все работает — но фига
Re[5]: Кубит на C# и C++ - где квантовое превосходство?
От: graniar  
Дата: 24.09.23 20:51
Оценка:
Здравствуйте, Shmj, Вы писали:

S>Попросил его исправить модель — он дал 10 вариантов и я последовательно проверял один за другим. После каждого варианта извинялся и клялся и божился что в новой версии учел все ошибки и все работает — но фига


Ну как бы известно, что ЧатЖПТ сам думать не умеет, только подражает увиденному в сети.
Re[6]: Кубит на C# и C++ - где квантовое превосходство?
От: Shmj Ниоткуда  
Дата: 24.09.23 22:03
Оценка:
Здравствуйте, graniar, Вы писали:

G>Ну как бы известно, что ЧатЖПТ сам думать не умеет, только подражает увиденному в сети.


Так большинство людей до этого не додумаются.
Re[4]: Кубит на C# и C++ - где квантовое превосходство?
От: Shmj Ниоткуда  
Дата: 25.09.23 06:25
Оценка:
Здравствуйте, graniar, Вы писали:

G>

G>The owner of this website (quantum-computing.ibm.com) has banned the country or region your IP address is in (RU) from accessing this website.


Сорри, не увидел сразу и предложил вам опять этот сайт.

Думаю что есть вопросы — выше политики. В данном случае нужно проявить снисхождение и использовать VPN, понимая что просто попали под раздачу и никто серьезно не думал об этих блокировках — это чисто для галочки и умные люди понимают, что кому нужно — найдут как подключиться.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.