Применить 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], Если предполагается, что первый индекс является индексом кубита, а второй - значением этого кубита, то представление не подходит для моделирования запутанных ситуаций.

Другие вопросы по тегам