Определение размерности оператора в qutip
Мой главный вопрос: может кто-нибудь объяснить мне, как список массивов используется для определения измерения в qutip?
Контекст:
Если у меня есть оператор плотности A = Qobj(np.arange(1,65).reshape(8,8))
для 3 кубитов, как мне выполнить частичное транспонирование, чтобы я хотел создать двудольную запутанность между кубитом 1 и кубитом 2 и 3?
Я предполагаю, что мне придется определить свою маску как X.dims = [[2,4],[2,4]]
и взять, qt.partial_transpose(X, [1,0])
что частично транспонирует по второй подсистеме. Но что это X.dims = [[2,4],[2,4]]
значит в qutip?
Если это верно, то как мне определить размер сцепления между кубитом 1 и 3 и кубитом 2?
Ответы
Из официальной документации :
Q.dims
: Список, отслеживающий формы для отдельных компонентов многочастной системы (для тензорных произведений и частичных трассировок).
Другими словами, вы можете думать об этом как о размерах (матричного представления) рассматриваемого объекта, принимая во внимание тензорную структуру нижележащего пространства. Первый элемент сообщает вам количество строк, а второй элемент сообщает вам количество столбцов.
Рассмотрим в качестве примера
fooQ = qutip.tensor(qutip.basis(2, 0), qutip.basis(2, 1))
Это тензорное произведение двух кет-состояний кубита, следовательно, это вектор в пространстве размерности $2\times 2$. В виде матрицы вы можете представить ее как$4\times 1$матрица. Но если вы хотите запомнить тензорную структуру этого пространства, которая упрощает такие вещи, как частичная трассировка, лучше сохранить каждое отдельное измерение. Тогда вы получите fooQ.dims == [[2, 2], [1, 1]]
, потому что есть$2\times 2$ ряды и $1=1\times 1$ столбец.
В вашем примере [[2, 4], [2, 4]]
представляет матрицу плотности в пространстве$\mathcal H_1\otimes\mathcal H_2$ с участием $\dim\mathcal H_1=2$ а также $\dim\mathcal H_2=4$.
Вы можете получить общие размеры пространства, выполнив, например,
number_of_rows = np.prod(fooQ.dims[0])
number_of_cols = np.prod(fooQ.dims[1])
Или вы можете "распутать" размеры, получив список измерений каждого отдельного компонентного пространства, с
unravelled_dimensions = np.transpose(fooQ.dims)