Квантов компютърен симулатор
Напишете малка квантова схема в JavaScript, симулирайте я директно във вашия браузър и вижте електрическата диаграма, вероятностите и вектора на състоянието. Или опишете изчисление на високо ниво (например добавяне) и гледайте как автоматично се превръща в истинска обратима квантова верига.
Модел на шума
Истинските квантови компютри не изчисляват перфектно: кубитите са изключително чувствителни и губят част от информацията си (декохерентност) чрез всяко нежелано взаимодействие с околната среда – топлина, електромагнитни полета, съседни кубити. Операциите на вратата също никога не са идеално прецизни и дори окончателното отчитане може да се обърка. Този симулатор изчислява идеално по подразбиране; тук можете да активирате типични модели на грешки и да наблюдавате техния ефект директно в резултатите.
Опишете изчисление с quantum.add, quantum.subtract, quantum.multiply, quantum.divide или quantum.random. Ctrl+Enter стартира симулацията. Пълна документация чрез бутона „Документация“.
Този код беше автоматично генериран от програмния код по-горе и директно симулиран. Можете да го редактирате тук ръчно и да го стартирате отново.
Генерираната схема е редактирана ръчно. Следователно групирането на регистри в диаграмата е скрито; стартирането на програмния код по-горе отново ще презапише тези промени.
Максимум 4000 знака. Налични методи на QuantumCircuit: x, y, z, h, s, sdg, t, tdg, rx, ry, rz, cnot, cz, ccnot (псевдоним: toffoli), swap, measureAll, run. Ctrl+Enter стартира симулацията.
Електрическа схема
Стъпковият изглед показва вероятности и вектор на състоянието точно след избрания гейт. Резултатите от снимките по-долу винаги се отнасят за цялата верига.
OpenQASM 2.0
OpenQASM 2.0 е широко използваният формат за обмен на квантови вериги и се чете от Qiskit, наред с други. Забележка относно реда на битовете: този симулатор чете q0 като най-значимия (ляв) бит, докато Qiskit чете q[0] като най-малко значимите – следователно измерените битови низове изглеждат огледално там.
Вероятности
Шансът за измерване на всеки възможен битов низ, изчислен точно от вектора на състоянието. Посока на четене: q0 е левият (най-значимият) бит.
Bloch сфери
Състоянието на всеки отделен кубит като стрелка в сферата на Блок: северен полюс = |0⟩, южен полюс = |1⟩, екватор = еднакво претеглена суперпозиция. Ако стрелката е очевидно по-къса от радиуса на сферата, кубитът няма собствено чисто състояние – той е заплетен с други кубити. Къса стрелка може да дойде и от шум: с модел на активен шум кубитът губи кохерентност и стрелката се свива навътре. Шумните сфери тук са приближение – векторът на Блох е осреднен по траекториите на шума. Със стъпковия изглед по-горе, стрелките се движат порта по врата (само без шум).
Резултати от удара
Колко често всеки битов низ действително се е срещал в симулираните измервания. При няколко възможни резултата числата се разпръскват на случаен принцип около точните вероятности.
Вектор на състоянието
Комплексните амплитуди зад вероятностите: квадратната величина на амплитудата (реална² + въображаема²) дава вероятността за нейното състояние.
| Състояние | Реална част | Въображаема част |
|---|
Основи: Как работи?
От програма към физически кубит
Истинският квантов компютър е повече от чип. Класическата управляваща електроника преобразува веригата в прецизни импулси. В показания пример лазерите за охлаждане, повторна помпа, кюбит и отчитане оформят тези сигнали върху оптична маса и ги насочват към екранирана вакуумна камера. Там те променят и измерват състоянието на кубита; след това резултатът от измерването се връща към класическия компютър.
Qubit и основни състояния
Класическият бит е 0 или 1. Кубитът може допълнително да съществува в суперпозиция на двете основни състояния |0⟩ и |1⟩. При няколко кубита всички базови състояния се записват като битов низ, напр. |10⟩ за 2 кубита – къде q0 в този симулатор винаги е най-значимият (вляво) бит.
Суперпозиция
Кубит в суперпозиция едновременно носи компоненти на няколко основни състояния. Тези компоненти се описват като комплексни амплитуди; квадратът на големината на амплитудата дава вероятността за получаване на съответното състояние при измерване.
Сферата на Блок
Състоянието на един кубит може да се визуализира като стрелка в сфера: северният полюс представлява |0⟩, южния полюс |1⟩и всички точки на екватора са еднакво претеглени суперпозиции – фазата определя посоката по екватора, в която сочи стрелката. Ротационните врати rx, ryи rz завъртете стрелката около съответната ос, фазовите порти като S и T я завъртете около оста Z. При заплетени кубити стрелката се свива към центъра на сферата: тогава отделният кубит вече няма собствено чисто състояние – така че заплитането става буквално видимо.
Измерване и снимки
measureAll() измерва всички кубити наведнъж и прекратява веригата. Тъй като едно измерване дава само един произволен резултат, веригата концептуално се измерва "изстрели" пъти с run({ shots }), така че разпределението на вероятностите да се показва като хистограма. Точните вероятности се изчисляват допълнително директно от вектора на състоянието, независимо от случайността на изстрелите.
Портата Адамар
Портата на Адамард h(q) взема кубит от определено състояние (|0⟩ или |1⟩) в еднакво претеглена суперпозиция на |0⟩ и |1⟩ – така че около 50% / 50% при измерване.
Фазови порти: S и T
Портите s(q) и t(q) не променят вероятностите за измерване на един кубит; те само въртят фазата на |1⟩ амплитуда – S с 90°, T с 45°. Те показват своя ефект само в комбинация със суперпозиция: между две врати на Адамар фазата решава как амплитудите се комбинират или отменят (интерференция). Вариантите на камата sdg(q) и tdg(q) завъртете точно в обратната посока и отменете S и T. Правилото е: две T правят S, две S правят Z.
CNOT и условно заплитане
Портата CNOT cnot(control, target) обръща целевия кубит точно когато контролният кубит е в състояние |1⟩. Ако контролният кубит е в суперпозиция предварително, това може да създаде заплитане – тогава двата кубита вече не могат да бъдат описани независимо един от друг, както в примера със състоянието на Bell. Ако вместо това контролният кюбит е в определено базово състояние, CNOT извършва само условно преобръщане на битове без заплитане. Така че не всеки CNOT автоматично създава заплитане.
CZ: симетричен роднина на CNOT
Портата CZ cz(a, b) обръща знака на амплитудата точно когато и двата кубита са |1⟩. За разлика от CNOT, няма контрол и целеви кубит – портата действа еднакво и на двата кубита, поради което е начертана като две свързани точки на диаграмата. CZ и CNOT могат да бъдат преобразувани един в друг: CNOT е CZ, чийто целеви кубит преминава през врата на Адамар преди и след. CZ е централен градивен елемент на много алгоритми, като търсенето на Grover.
GHZ състояние: заплитане като трио
Състоянието GHZ (наречено на Greenberger, Horne и Zeilinger) разширява принципа на състоянието на Bell до три кубита: един Hadamard gate плюс два CNOTs оплитат и трите, така че измерването дава само |000⟩ или |111⟩ – никога смесени битови низове. Никой кубит вече няма собствено състояние; информацията се крие изключително в споделената корелация.
Deutsch алгоритъм: най-малкото квантово предимство
Алгоритъмът на Deutsch отговаря с една оценка на неизвестен оракул на въпрос, за който класическият компютър се нуждае от две оценки: постоянна ли е функцията или балансирана? Номерът е да изпратите входа през оракула в суперпозиция – благодарение на интерференцията отговорът след това е недвусмислено кодиран във входния кюбит. Принципът зад него (фазов откат) е в основата на почти всички квантови алгоритми.
Търсене на Grover: усилващи амплитуди
Търсенето на Grover намира маркиран запис в несортиран набор със значително по-малко заявки от класическите изисквания. Оракул маркира търсеното състояние с обръщане на фазата (тук чрез CZ порта), след което операторът на дифузия усилва маркираната амплитуда за сметка на всички останали. С 2 кубита, една итерация е достатъчна, за да се измери попадението със 100% вероятност.
Обратимо добавяне: от quantum.add() към верига
Редакторът на програмния код по-горе превежда quantum.add({ a, b }) във верига от гейтове X, CNOT и CCNOT (Toffoli), която възпроизвежда класическото събиране по чисто обратим начин: всеки гейт може да бъде отменен точно, защото не се изхвърля никаква информация. Порта CCNOT (ccnot(c1, c2, target)) обръща целевия кубит само когато и двата контролни кубита са |1⟩ – това е достатъчно като градивен елемент за повторно изграждане на всяка класическа схема обратимо, включително пълен суматор с пренасяне. Входовете A и B първо се инициализират като определени базови състояния (без суперпозиция) с помощта на X gates. Тъй като следователно цялата верига преминава само през определени състояния вместо суперпозиции, измерването в края дава точно един резултат със 100% вероятност – класически правилната сума. Ето защо quantum.add() дава детерминистичен резултат въпреки квантовата симулация, вместо няколко възможни състояния с вероятности под 100%.
Изваждане: събиране в обратен ред
Тъй като всеки гейт на квантовата верига е точно обратим, цялата верига на суматора може да се изпълни в обратна посока – и добавянето се превръща в изваждане: quantum.subtract({ a, b }) използва точно гейтовете на суматора в обратен ред и по този начин изчислява a − b. Това не е трик, а основният принцип на обратимо изчисление: никоя изчислителна стъпка не унищожава информацията, всяка стъпка може да бъде отменена. В тази версия се изисква a ≥ b, за да не се получи отрицателен резултат.
Умножение: quantum.multiply()
Умножението тук възниква от точно същите обратими градивни елементи като събирането: следвайки метода на учебника, фактор a се добавя няколко пъти в изместени позиции – съвпадайки със зададените битове на фактор b. Всяко частично добавяне е един и същ обратим суматор с пулсации; пренасянето се влива в следващия бит на продукта всеки път. Тъй като резултатният регистър расте заедно с продукта, факторите са ограничени до 3 бита (0–7) тук – само тогава факторът, продуктът и пренасящият кубит заедно се вписват в 10-те кубита на този симулатор.
Разделяне: quantum.divide()
Разделът също използва само обратими градивни елементи: quantum.divide({ a, b }) извършва дълго деление, изградено от изместени, обратими изваждания на делителя от остатъчния регистър; резултатът е коефициентът и остатъка (a = quotient · b + remainder). Защото дивидент, делител, частно и кубитът за заемане трябва да се побере в 10-те кубита заедно, разделянето е най-силно ограничената операция: bits(a) + bits(b) + bits(a÷b) + 1 ≤ 10 трябва да съдържа и делителя b трябва да бъде ≥ 1 (без деление на нула). Ако даден вход не отговаря на бюджета, редакторът го докладва, вместо да изчисли.
Истинска произволност: quantum.random()
Класическите компютри не могат да генерират истинска случайност – техните „случайни числа“ идват от детерминистични алгоритми (псевдослучайност). Квантовият компютър може: quantum.random({ bits }) поставя всеки бит в суперпозиция 50/50 с помощта на врата на Адамар и само измерването решава – фундаментално непредсказуемо – коя стойност излиза. На реалния квантов хардуер това е физически истинска произволност; този симулатор го имитира с псевдо-случайността на вашия браузър.
Симулатор срещу реален квантов хардуер
Този симулатор изчислява точно състоянието, като използва класическа аритметика с плаваща запетая във вашия браузър – това работи само защото тук се разглеждат изключително много малки вериги с до 10 кубита. Истинските квантови компютри използват физически кубити, податливи са на грешки (декохерентност, шум) и тяхното предимство се проявява само с много по-големи вериги, които вече не могат да бъдат симулирани класически на практика. Този инструмент е инструмент за обучение, а не истински квантов процесор.