Применить n кубитов к Воротам Адамара
Прежде всего, извините за длинный текст, я попытался объяснить мою проблему / недоразумение как можно лучше.
Для моего студенческого проекта я должен реализовать симуляцию простого квантового компьютера. Сейчас я пытаюсь понять, как по-разному Гейтс применяется к n-кубитам.
Например, один кубит представлен двумя комплексными числами (a1, a2):
a1 |0> + a2 |1>
Где a1 и a2 - амплитуды - возможности измерения значения. Все амплитуды в квадрате и сумме всегда должны быть равны 1.
Поэтому я добавил ворота Адамара, представленные его матриксами 2х2
public void Hadamard(){
gate.entries[0][0] = new ComplexNumber(1,0);
gate.entries[0][1] = new ComplexNumber(1,0);
gate.entries[1][0] = new ComplexNumber(1,0);
gate.entries[1][1] = new ComplexNumber(-1,0);
gate = (Matrix.scalarMultiplication(gate,Math.pow(2,-0.5)));
}
Теперь я бы сделал умножение матриц на a1 и a2 с воротами Адамара.
Поэтому я настроил регистр как двумерный массив комплексных чисел, представляющих состояния бита в виде:
Register register = new Register(1);
Где число представляет количество кубитов. Мы создаем только одну строку, содержащую все наши состояния, а индекс столбцов равен состоянию. Так, например,
[0][0] = |0> and [0][1] = |1>
Если мы скажем, что a1=1+0i и a2=0+0i, умножение будет выглядеть так:
cmplx1 = cmplxMultiplicate(gate.entries[0][0],a1);
cmplx2 = cmplxMultiplicate(gate.entries[0][1],a2);
cmplx3 = cmplxMultiplicate(gate.entries[1][0],a1);
cmplx4 = cmplxMultiplciate(gate.entires[1][1],a2);
register.entries[0][0] = cmplxAddition(cmplx1,cmplx2); // 0.70710678118
register.entries[0][1] = cmplxAddition(cmplx3,cmplx4); // 0.70710678118
Теперь возникает вопрос - я понятия не имею, как это сделать, если у нас более одного Qubit. Например на двух кубитах я бы
a1 |00> + a2 |01> + a3 |10> + a4 |11>
Четыре различных состояния (или 2^(numberOfQubits) состояния для любого заданного числа). Но как я могу теперь применить все 4 состояния к моим Воротам Адамара? Должен ли я сделать все возможные результаты, когда я умножаю a1 на каждое значение, чем a2 и т. Д. И т. Д.? Как это:
cmplx1 = cmplxMultiplicate(gate.entries[0][0],a1);
cmplx2 = cmplxMultiplicate(gate.entries[0][1],a2);
cmplx3 = cmplxMultiplicate(gate.entries[1][0],a1);
cmplx4 = cmplxMultiplciate(gate.entries[1][1],a2);
cmplx1 = cmplxMultiplicate(gate.entries[0][0],a1);
cmplx2 = cmplxMultiplicate(gate.entries[0][1],a3);
cmplx3 = cmplxMultiplicate(gate.entries[1][0],a1);
cmplx4 = cmplxMultiplciate(gate.entries[1][1],a3);
Я действительно ничего не знаю об этом, и я думаю, что на моем сайте есть фундаментальное недоразумение, которое делает вещи настолько сложными для меня.
Любая помощь, ведущая меня по правильному пути / пути, будет очень признательна.
Большое спасибо.
1 ответ
Обратите внимание, что https://en.wikipedia.org/wiki/Hadamard_transform пишет:
Полезно отметить, что вычисление квантового преобразования Адамара - это просто применение гейта Адамара для каждого кубита индивидуально из-за структуры тензорного произведения преобразования Адамара.
Так что имеет смысл просто смоделировать одиночные ворота и создать их несколько раз.
Но как я могу теперь применить все 4 состояния к моим Воротам Адамара?
Ворота будут применяться ко всем 4 состояниям вашего 2-кубитного регистра. Он будет работать с парами коэффициентов, а именно с теми, которые отличаются только одним битом, соответствующим битовой позиции, к которой применяется строб.
Если вы хотите получить более широкую картину, сначала примените операцию Адамара к левому кубиту
((|00〉 + |10〉) 〈00| + (|00〉 - | 10〉) 〈10| + (|01〉 + |11〉) 〈01| + (|01〉 - | 11〉) 〈 11|) / кв.м (2)
а затем на правильный кубит
((|00〉 + |01〉) 〈00| + (|00〉 - | 01〉) 〈01| + (|10〉 + |11〉) 〈10| + (|10〉 - | 11〉) 〈 11|) / кв.м (2)
Записав это как матрицы с вашим порядком коэффициентов (правая матрица первого шага и левая матрица второго шага), вы получите
⎛1 1 0 0⎞ ⎛1 0 1 0⎞ ⎛1 1 1 1⎞
⎜1 -1 0 0⎟ ⎜0 1 0 1⎟ ⎜1 -1 1 -1⎟
½ ⎜0 0 1 1⎟ ⎜1 0 -1 0⎟ = ½ ⎜1 1 -1 -1⎟
⎝0 0 1 -1⎠ ⎝0 1 0 -1⎠ ⎝1 -1 -1 1⎠
Если вы хотите, вы можете закодировать матрицу продукта в вашей записи. Но я бы предпочел найти способ моделировать применение операции квантового строба к подмножеству кубитов в вашем регистре, проходя через другие биты без изменений. Это можно сделать, расширив матрицу, как я делал выше, чтобы перейти от обычных 2×2 к 4×4, которые я использовал. Или это может быть в том, как вы оцениваете векторное произведение матрицы на время, чтобы лучше использовать разреженную природу этих матриц.
Глядя на ваш код, я несколько обеспокоен двумя показателями в вашем register.entries[0][0]
, Если предполагается, что первый индекс является индексом кубита, а второй - значением этого кубита, то представление не подходит для моделирования запутанных ситуаций.