Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
30 Июня 2022, 13:33:51
Начало Помощь Поиск Войти Регистрация
Новости: Книгу С.Доронина "Квантовая магия" читать здесь
Материалы старого сайта "Физика Магии" доступны для просмотра здесь
О замеченных глюках просьба писать на почту quantmag@mail.ru

+  Квантовый Портал
|-+  Тематические разделы
| |-+  Физика (Модератор: valeriy)
| | |-+  Численный анализ многокубитных систем
0 Пользователей и 1 Гость смотрят эту тему. « предыдущая тема следующая тема »
Страниц: 1 2 [3] 4 5 ... 15  Все Печать
Автор Тема: Численный анализ многокубитных систем  (Прочитано 348656 раз)
Pipa
Администратор
Ветеран
*****
Сообщений: 3608


Квантовая инструменталистка


Просмотр профиля WWW
« Ответ #30 : 06 Апреля 2007, 14:43:20 »

...только местами ничего не надо менять, в нижнем треугольнике нужно лишь изменить знак у мнимой части (поменять плюсы на минусы и наоборот), а вещественная часть будет симметричной.

    Верное замечание. И что это вдруг на меня нашло? :)

Ускорение на пределе (ускорилось в 9.5 раз, почти на порядок, по сравнению с базовым вариантом).
А что дальше делать?

Но, повторюсь, нам эти интенсивности не нужны, мы будем считать квантовую запутанность и графики строить для нее.

    Хотелось бы дотянуть до графика. Иначе у меня нет стимула делать GUI-версию.
Записан
С.И. Доронин
Администратор
Ветеран
*****
Сообщений: 795


Просмотр профиля
« Ответ #31 : 07 Апреля 2007, 16:17:13 »

Насчет дальнейших действий. Думаю, можно постепенно переходить ко второму блоку, который будет считать квантовую запутанность. Здесь работы много, поскольку практически ничего нет. Что нужно – назову три основных подпрограммы, которые нам понадобятся:
  • операция взятия частичного следа и получение редуцированной матрицы плотности (меньшего размера) из той матрицы плотности, которая вычисляется в первом блоке.
  • функция для тензорного (прямого) произведения двух матриц произвольной размерности и, частный случай, который и будет в основном использоваться это тензорное произведение матрицы плотности на единичную матрицу (как справа, так и слева, нужны оба случая).
  • нахождение собственных значений для комплексной эрмитовой матрицы (собственные векторы не нужны).

Если в наличии будут эти три подпрограммы, то второй блок, можно сказать, будет сделан.

Но сейчас уже легко делать анализ квантовой запутанности в отдельных частных случаях для двухкубитной системы. Здесь есть аналитические выражения, которые легко запрограммировать, я их приведу.
Первый случай – чистое состояние двухкубитной системы. Если начальная матрица плотности это чистое состояние, то оно чистым и останется, тогда мера квантовой запутанности (критерий Вуттерса, concurrence) между подсистемами A и B равна

С=2|sqrt(ρ11ρ44) – sqrt(ρ22ρ33)|.      (1)

Здесь ρ11 и т.д. это диагональные элементы двухкубитной матрицы плотности.
В программе нужно предусмотреть функцию для проверки чистоты состояния, оно довольно простое, если выполняется условие ρ2=ρ, то состояние чистое.

Второй случай – смешанное состояние двухкубитной системы. Здесь ситуация сложнее, но и тут кое-что сделано. В качестве примера можно взять состояние Вернера, это состояние типа:

ρ= (1–γ)/4 I + γ|Ф><Ф|,        (2)

где I – единичная матрица, а |Ф> – одно из четырех белловских (максимально-запутанных состояний):
1/√2(|00>) + |11>),
1/√2(|00>) – |11>),
1/√2(|01>) + |10>),
1/√2(|01>) – |10>).

Эта четверка векторов часто называется белловским базисом, последний из этих векторов – это хорошо известное состояние ЕПР-пары.
Для состояния (2) мера запутанности равна:

С=3γ/2 – 1/2.

Если простыми словами, то состояние (2) это что-то промежуточное между максимально-смешанным состоянием (скалярная матрица плотности, т.е. нормированная единичная матрица, след которой равен единице) и одним из максимально-запутанных состояний. Их «удельный вес» и соотношение характеризуется параметром γ.

В нашем случае, когда мы реализуем общий алгоритм, результаты должны совпадать с этими двумя примерами (1) и (2). Т.е. это все равно нужно делать, хотя бы для того, чтобы затем тестировать и отлаживать общий алгоритм.

Есть еще примеры смешанных состояний, где совпадения с критерием Вуттерса не будет, но у нас другой критерий, и это расхождение объяснимо. В книге я писал, что в настоящее время существует довольно большое количество мер и критериев квантовой запутанности, из них критерий Вуттерса самый известный и чаще всего используется. Но у всех у них недостаток в том, что они применимы лишь в отдельных частных случаях, тот же критерий Вуттерса не существует в общем виде уже для трехкубитных систем, лишь для отдельных типов чистых состояний. Наш критерий будет общий, для любых ситуаций, и что самое важное, он строится по единому алгоритму.

Цитата:
Хотелось бы дотянуть до графика. Иначе у меня нет стимула делать GUI-версию.

Для двухкубитных систем по матрице плотности, которую мы считаем, и по критерию (1) уже можно строить график запутанности, когда начальная матрица плотности задана как чистое состояние. Информативность пока небольшая, но хотя бы для отладки графического режима.


Записан
Pipa
Администратор
Ветеран
*****
Сообщений: 3608


Квантовая инструменталистка


Просмотр профиля WWW
« Ответ #32 : 07 Апреля 2007, 17:48:58 »

Что нужно – назову три основных подпрограммы, которые нам понадобятся:
операция взятия частичного следа и получение редуцированной матрицы плотности (меньшего размера) из той матрицы плотности, которая вычисляется в первом блоке.

    Вопрос по первому пункту. В чем заключается редуцирование? Обрасывание "лишних" столбцов и строк или какой-то иной алгоритм понижения размерности?
    Хотелось бы услышать подробнее о том, какова стратегия редуцирования.

С остальными двумя пунктами понятно.
Записан
С.И. Доронин
Администратор
Ветеран
*****
Сообщений: 795


Просмотр профиля
« Ответ #33 : 07 Апреля 2007, 18:31:02 »

Цитата:
В чем заключается редуцирование?


Об этом я писал:
http://quantmagic.narod.ru/volumes/VOL112004/abs1123.html

на стр.5.
Записан
ksv
Новичок
*
Сообщений: 42


Просмотр профиля
« Ответ #34 : 08 Апреля 2007, 23:42:21 »

А Вы сможете написать какую-нибудь функцию? Например, взятие частичного следа и получение редуцированной матрицы плотности. Общий алгоритм есть в статье, о которой я уже упоминал http://quantmagic.narod.ru/volumes/VOL112004/abs1123.html на 5 странице.

Если честно, то я не понял из статьи, как это делается :) Хоть я и понимаю, что данная статья научно-популярная, но данный момент на мой взгляд в ней изложен весьма запутанно. Например, на стр.5 Вы пишите:
Цитата:
Чтобы получить частичную  матрицу  плотности,  редуцированную (усредненную), например, по второй частице  roA = TrB|psy><psy|, можно воспользоваться простым правилом: Каждый из элементов матрицы |psy><psy| нужно взять в "обкладки" из векторов <0| |0> и <1| |1> и подействовать ими на второй спин.

Что значит взять в обкладки? Какой второй спин? Каким образом на него подействовать? Мне не понятно.
Записан
Pipa
Администратор
Ветеран
*****
Сообщений: 3608


Квантовая инструменталистка


Просмотр профиля WWW
« Ответ #35 : 09 Апреля 2007, 07:21:41 »

    Меня тоже «обкладки» покоробили :). Как <0| |0>, так и <1| |1> - скаляры. Ими никак нельзя ничего обхватить. А если матрицу вкладывать во внутрь <0| M |0> или <1| M |1>,
то получится тоже скаляр, т.к. это вроде бы квадратичная форма.
     Из примера на той же 5-ой странице у меня создалось впечатление, что для таких вычислений проектор вычислять не надо. Очевидно, что по меньшей вере половина строк и столбцов получатся сплошь нулевыми. И накакой отбор это обстоятельство уже не изменит. А, значит, матрица уже всегда автоматически редуцируется в вдвое меньшего порядка. Правило «отбора» может лишь обнулить какие-то клетки таким способом редуцированной матрицы, но не в состоянии еще более понизить ее порядок.
     Из этого следует, что можно сразу строить псевдоредуцированную матрицу нужно размера, а затем лишь обнулить в ней кое-что. Например, матрицу (*) на 5-ой странице (не понятно отчего вместо номера у нее звездочка) можно сразу было построить в псевдоредуцированнаном виде. Тогда она выглядела бы так:

aa’ ab’
ba’ bb’

А уж потом, вычеркнув, что не надо, получим тоже самое:

aa’ 0
0 bb’

тут я комплексное сопряжение обозначаю шрихом, и использую aa’ вместо вычурной  записи |a|2.
    На мой взгляд, постороение псевдоредуционной матрицы типа

aa’ ab’
ba’ bb’

не только всегда возможно, но и имеет более простые правила для своего построения, чем «распухшая матрица». Кроме того, она уже имеет нужный размер.
    Начинаю подозревать, что прямое (тензорное) умножение матриц вообще не надо производить, поскольку размер редуцированной матрицы можно предсказать заранее – она будет ровно того же размера, как и матрицы до умножения.
Записан
С.И. Доронин
Администратор
Ветеран
*****
Сообщений: 795


Просмотр профиля
« Ответ #36 : 09 Апреля 2007, 21:13:53 »

Насчет редуцированной матрицы плотности попробую, для начала, пояснить на простых примерах.
Возьмем двухкубитное cat-состояние:

|Ψ>=1/√2 (|00> + |11>).          (1)

Если первый кубит обозначить А, а второй В, то принадлежность отдельных составляющих вектора состояния своим кубитам можно обозначать в виде нижнего индекса.

|Ψ>=1/√2 (|0>A|0>B + |1>A|1>B).      (1')

Матрица плотности cat-состояния имеет вид:

½ 0 0 ½
0 0 0 0
0 0 0 0
½ 0 0 ½

Она получается если взять проектор |Ψ><Ψ|, т.е. вектор-столбец умножить на вектор-строку. В общем случае вектор-строку нужно брать комплексно сопряженной.

Эта матрица плотности может быть расписана следующим образом

ρ = ½ |00><00| + ½ |00><11| + ½ |11><00| + ½ |11><11|              (2)

Или используя индексы для отдельных кубитов:

ρ= ½ |0>A|0>B<0|A<0|B + ½ |0>A|0>B<1|A<1|B + ½ |1>A|1>B<0|A<0|B + ½ |1>A|1>B<1|A<1|B         (2')

Теперь, собственно, сам процесс редуцирования. Если мы оставляем первый кубит А, и хотим сделать редукцию по В, то нужно как я писал:
Цитата:
Каждый из элементов матрицы |psy><psy| нужно взять в "обкладки" из векторов <0| |0> и <1| |1> и подействовать ими на второй спин.

Поясню подробнее. В нашем случае есть четыре элемента матрицы плотности, возьмем самый первый

½ |0>A|0>B<0|A<0|B

И те вектора, которые имеют индекс В, мы берем в «обкладки» из базисных векторов, выглядит это следующим образом.

½ |0>A<0||0>B<0|A<0|B|0>

Смотрим теперь на <0||0>B и <0|B|0> здесь получаются единицы, поскольку это скалярное произведение вектора на самого себя. Чтобы убедиться, можно умножить вектор-строку (1, 0) на вектор-столбец (1, 0)T, получается 1.

В результате данный элемент матрицы плотности «редуцируется» до

½ |0>A<0|A

Если подействовать таким образом на все четыре элемента матрицы плотности, и не только <0| |0>, но и <1| |1>, то остаются два элемента, тот, который выше и второй

½ |1>A<1|A

Очевидно, что когда мы имеем варианты типа <0||1>В или <1|В|0>, либо <1||0>В или <0|В|1> – то это нули. Таким образом, два из четырех элементов в приведенном примере исчезают.

В конечном итоге мы имеем редуцированную матрицу плотности размерностью 2*2

ρA = TrBAB) = ½ |0><0| + ½ |1><1|.       (3)

Простое «обнуление» отдельных элементов матрицы плотности здесь не поможет. Из приведенного примера этого пока не видно, чтобы убедиться, можно взять более сложный пример – произвольное чистое состояние двухкубитной системы:

|Ψ>= a|00> + b|01> + c|10> + d|11>.              (4)

Если все проделать так, как я написал выше, то получим ρA, которая имеет вид:

|a|2+|b|2    ac*+bd*
ca*+db*    |c|2+|d|2

Т.е. происходит не просто обнуление, а суммирование отдельных элементов исходной матрицы плотности.

Причем, когда мы берем частичный след по другому кубиту (по A, а не по B, как перед этим), то частичная матрица плотности ρВ уже другая:

|a|2+|с|2    ab*+cd*
ba*+dc*    |b|2+|d|2

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

Сначала насчет того, что мы уже имеем все свои матрицы плотности в виде проекторов, поскольку мы их все строим в стандартном двоичном базисе. Если простыми словами, то на любой элемент матрицы плотности
Код:
ρ[i][j]
можно смотреть как на запись данного элемента в виде проектора, если под i и j понимать числа в двоичной системе счисления. Например, элемент ρ23 для 5-кубитной системы это проектор вида |00010><00011|, т.е. 2 и 3 нужно записать в двоичной системе. Нумерация начинается с 0, как обычно в Си, т.е. самый первый элемент (в левом верхнем углу матрицы) ρ00. В случае 5-кубитной системы матрица плотности имеет размер 32*32 и самый последний элемент ρ31;31 (в правом нижнем углу). Число 31 в двоичной системе это как раз 11111, т.е. последний элемент в виде проектора записывается |11111><11111|.

Теперь насчет общего алгоритма редуцирования. Поступаем следующим образом, если мы редуцируем, скажем пятикубитную систему ABCDE и оставляем кубиты AD, проводя редукцию по всем остальным (по ВСЕ), то перебираем все элементы 5-кубитной матрицы плотности и по их индексам в двоичной форме смотрим, что стоит на позициях ВСЕ, т.е. на второй, третьей и пятой позиции в проекторе. Например,

|11111><11111|

Я выделил то, на что нужно смотреть. Если в проекторе слева и справа есть полное совпадение, то этот элемент остается в редуцированной матрице AD и идет, в данном случае к элементам |11><11| (то, что не выделено жирным), таких элементов может получаться несколько, и они будут суммироваться, например,

|11011><11011|
или
|10010><10010|

Тоже пойдут к элементам |11><11| в матрице ρAD.

Если же в проекторе нет совпадения слева и справа, например,

|10011><11011|,

То этот элемент при редукции равен нулю, и он просто игнорируется.

Здесь делается все то же самое, о чем я писал выше для двухкубитной системы, только при редукции по 3 кубитам, когда остается 2, в «обкладки» нужно брать по всем базисным векторам трехкубитной системы, их уже восемь штук, а не два как раньше. Но смысл такой же – либо скалярное произведение дает единицу, и этот элемент остается в редуцированной матрице, либо скалярное произведение дает ноль, и этот элемент пропадает. 

P.S.  Обозначение ВСЕ немного неудачное получилось, это не слово «все» :), а подсистемы типа ABD.

Записан
Pipa
Администратор
Ветеран
*****
Сообщений: 3608


Квантовая инструменталистка


Просмотр профиля WWW
« Ответ #37 : 10 Апреля 2007, 00:49:11 »

Что нужно – назову три основных подпрограммы, которые нам понадобятся:
  • операция взятия частичного следа и получение редуцированной матрицы плотности (меньшего размера) из той матрицы плотности, которая вычисляется в первом блоке.
  • функция для тензорного (прямого) произведения двух матриц произвольной размерности и, частный случай, который и будет в основном использоваться это тензорное произведение матрицы плотности на единичную матрицу (как справа, так и слева, нужны оба случая).
  • нахождение собственных значений для комплексной эрмитовой матрицы (собственные векторы не нужны).

   Нашла на Фортране процедуру htrid3.f (из пакета EISPACK) для приведения комплексной эрмитовой матрицы к тридиагональной форме. Далее, для получения из нее собственных значений, годится старая tqli().
   На С существует лишь ее автоматический перевод отвратительного качества. Если у вас нет на примете ничего лучшего, то попытаюсь сделать на основе этого.

   Касаемо редуцирования матрицы плотности, к вам будет просьба определить входные и выходные параметры для этой процедуры.
   Представьте себе, что уже есть такая функция, и называется она, скажем,
reduce(.........)
Какие параметры вы бы в нее заложили, и в каком виде хотели бы получить результат? При этом предполагается, что параметры этой функции являются достаточными для выполнения работы. (Нельзя надеяться на то, что функция умеет таскать недостающие данные из других мест). Порядок следования параметров сейчас роли не играет – важно определиться с тем, в каком виде предоставляются входные и выходные данные.

    Тензорное (прямое) произведение двух матриц – вроде бы тривиальная задача, но все равно тоже хотелось бы внести ясность.
    DirectMul(
    **mat1_re, // действительная часть 1-ой матрицы
    **mat1_im, // мнимая часть 1-ой матрицы
    n1, // размерность 1-ой матрицы
    **mat2_re, // действительная часть 2-ой матрицы
    **mat2_im, // мнимая часть 2-ой матрицы
    n2, // размерность 2-ой матрицы
    **mat_re, // действительная часть матрицы результата
    **mat_im, // мнимая матрицы результата
   );
Так годится? Надеюсь, что все-таки  mat1 и mat2 не "произвольной размерности", как вы пишите, а все-таки квадратные.
Записан
ksv
Новичок
*
Сообщений: 42


Просмотр профиля
« Ответ #38 : 10 Апреля 2007, 23:17:14 »

   Касаемо редуцирования матрицы плотности, к вам будет просьба определить входные и выходные параметры для этой процедуры.
   Представьте себе, что уже есть такая функция, и называется она, скажем,
reduce(.........)

Какие параметры вы бы в нее заложили, и в каком виде хотели бы получить результат?

Я себе это так представляю:
reduce(
    **mat1_re, // действительная часть исходной матрицы плотности
    **mat1_im, // ее мнимая часть
    n1, // размерность исходной матрицы плотности
    char *s  /* Строковый код схемы редукции. Например "ВСЕ" как в примере СИДа. Вообще считаю обозначения подсистем в таком виде весьма удобным и перспективным. Получаются настоящие квантовые формулы (по аналогии с химическими формулами :) Кроме того от букв, использую их внутренние asscii коды всегда легко перейти к цифрам. */
    **mat2_re // действительная часть редуцированной матрицы плотности
    **mat2_im, // ее мнимая часть
    &n2, /* размерность редуцированной матрицы плотности. Этот параметр вычисляется в самой функции (как разность между n1 и pow(2,ln(n1)/ln(2)-len(s)) ) и результат записывается в область памяти, на которую ссылается &n2. */
)

...то этот элемент остается в редуцированной матрице AD и идет, в данном случае к элементам |11><11| (то, что не выделено жирным)...

Не понял, что значит "идет к элементам |11><11|"? Какая за этим стоит операция?
« Последнее редактирование: 14 Апреля 2007, 21:56:01 от ksv » Записан
Pipa
Администратор
Ветеран
*****
Сообщений: 3608


Квантовая инструменталистка


Просмотр профиля WWW
« Ответ #39 : 11 Апреля 2007, 04:04:33 »

   Один из трех пунктов готов! А именно – нахождение собственных значений для комплексной эрмитовой матрицы.
   За основу взяла фортановскую версию процедуры, приводящую преобразованиями Наусхолдера эрмитову матрицу в тридиагональную. Следующая ступень, нахождение собственных значений для тридиагональной матрицы, в программе уже была реализована ранее (tqli).
  1) Фортрановская процедура транслирована на С++.
  2) Циклы модифицированы таким образом, чтобы матрицы и вектора считались с нулевого элемента (C-стандарт), а не с первого (Fortran-стандарт).
  3) Разделена входная матрица на две части – действительную и мнимую. В натуральной процедуре (видимо из-за соображений экономии памяти) эрмитова матрица задается только своим нижним треугольником. При этом  действительная часть лежит на своем месте, а ее мнимая часть транспонирована в верхний треугольник матрицы. Это пришлось выламывать из всего алгоритма – было довольно противно.
  4) Алгоритм протестирован пока только на одном примере – на матрице 4x4. Результат совпал по всем значащим цифрам с продуктом функции hess() из пакета MatLab 7.0.1 (форма Хессенберга для эрмитовых матриц является тридиагональной).
  5) Проведена частичная оптимизация - скалярные произведения по строкам вычисляются ассемблерной функцией. В настоящее время скорость составляет:

Матрица          Время
 256x256          0.17 сек
 512х512          1.71 сек
1024x1024     14.20 сек

Вопрос: нужно ли сортировать собственные значения по ниспадающей или не надо? tqli() их сортировала.

    char *s  /* Строковый код схемы редукции. Например "ВСЕ" как в примере СИДа. Вообще считаю обозначения подсистем в таком виде весьма удобным и перспективным. Получаются настоящие квантовые формулы (по аналогии с химическими формулами :) Кроме того от букв, использую их внутренние asscii коды всегда легко перейти к цифрам. */

   А вот у меня есть сомнения, что программа должна обращаться к своей функции на человечьем языке, говоря "ВСЕ". Более симпатично было бы иметь битовую маску в числе типа int. "ВСЕ" - означало бы установить все биты в единичку. Младший бит - A, следующий за ним - B, и т.д. Соответственно этому, ABD кодируется как 1011. И совпадения удобно проверять по двоичной логике.
Записан
Pipa
Администратор
Ветеран
*****
Сообщений: 3608


Квантовая инструменталистка


Просмотр профиля WWW
« Ответ #40 : 11 Апреля 2007, 19:02:10 »

  • функция для тензорного (прямого) произведения двух матриц произвольной размерности и, частный случай, который и будет в основном использоваться это тензорное произведение матрицы плотности на единичную матрицу (как справа, так и слева, нужны оба случая).

    Готова функция тензорного (прямого) произведения двух матриц!
Алгоритм искать не стала – написала сама. Определение такого произведения – достаточный алгоритм.
    Процедура, как и ожидалось, получилась простая (6 строк):
Код:
void DirectMulR( double **mat1, int n1, double **mat2, int n2, double **mat)
// вычисление прямого произведения действительных матриц
// **mat1 = 1-я матрица
// n1 = размерность 1-ой матрицы
// **mat2 = 2-я матрицы
// n2 = размерность 2-ой матрицы
// **mat = матрица результата, размерности n1*n2
{
  for( int i=0, ii=0; i < n1; i++, ii+=n2)
  { for( int j=0, jj=0; j < n1; j++, jj+=n2)
    { double x = mat1[i][j];
      for( int k=0; k < n2; k++)
        for( int l=0; l < n2; l++)
          mat[ii+k][jj+l] = x * mat2[k][l];
    }
  }
}

Процедура DirectMulС, рассчитанная на комплексные матрицы, отличается лишь заменой единственного умножения  в цикле на его комплексный аналог.

Тестирование выглядит так:
Код:
а[][] =
1  2
3  4

b[][] =
  1    11     111
 10   110    1110
100  1100   11100

(такие числа выбраны для того, чтобы легко было проверять результат)

DirectMulR( a, 2, b, 3, c);

c[][] =
  1      11      111      2     22     222
 10     110     1110     20    220    2220
100    1100    11100    200   2200   22200
  3      33      333      4     44     444
 30     330     3330     40    440    4440
300    3300    33300    400   4400   44400
Записан
С.И. Доронин
Администратор
Ветеран
*****
Сообщений: 795


Просмотр профиля
« Ответ #41 : 11 Апреля 2007, 19:44:33 »

Насчет параметров reduce(…), помимо матриц, пока у меня самое простое предложение – для управления редукцией использовать вектор из целых чисел, в котором будут задаваться номера тех кубитов, по которым проводится редукция (или наоборот, тех, которые остаются). В принципе, можно использовать и символы, и битовую маску.

ksv

Цитата:
Не понял, что значит "идет к элементам |11><11|"? Какая за этим стоит операция?

Наверное, я здесь плохо сказал, элемент |11><11| в редуцированной матрице, естественно один, но он может «собираться» из многих «осколков» при редуцировании исходной матрицы. Я приводил самый простой пример чистого состояния двухкубитной системы, когда для редуцированной матрицы ρA ее элемент |1><1| равен сумме |c|2+|d|2. В более сложных случаях будет та же самая ситуация – каждый элемент редуцированной матрицы может состоять из нескольких слагаемых, что я попытался показать на примере 5-кубитной системы для элемента |11><11|.

Если говорить о тензорном произведении, то, естественно, у нас все матрицы квадратные, и, Пипа, Вы правильно предлагаете параметры для DirectMul(…). Я могу еще привести явный алгоритм для вычисления элементов матрицы С, которая является тензорным произведением матриц А (размерностью m) и В (размерностью n).
Для r,i=1,2,…m и s,j=1,2,…,n
полагаем
k=(r-1)n + s,
l=(i-1)n + j,
тогда
сkl=aribsj.

Это из книги П. Ланкастера «Теория матриц», М.:Наука, 1978, стр.235. Нам нужно только в последнем выражении все индексы на единичку уменьшить, чтобы нумерация строк и столбцов с нуля начиналась.

Насчет собственных значений эрмитовой матрицы, Пипа, посмотрите еще здесь:
http://alglib.sources.ru/eigen/hermitian/hermitianevd.php
http://alglib.sources.ru/eigen/hermitian/hermitianbisectionandinverseiteration.php
http://www.zsu.zp.ua/lab/MathDep/ApMath/PROGR3/7/MGU/cat/cat571.htm

Я могу только уточнить, что нам даже не нужен полный спектр собственных значений, а только отрицательные собственные значения. И желательно подобрать что-то самое минимальное по времени, поскольку операция эта многократно будет использоваться.


P.S. Пипа, Вы молодец! :) Я не успеваю…, еще не видел Вашего последнего сообщения, буду смотреть :).

Записан
Pipa
Администратор
Ветеран
*****
Сообщений: 3608


Квантовая инструменталистка


Просмотр профиля WWW
« Ответ #42 : 11 Апреля 2007, 19:53:35 »

С.И. Доронин
   Просьба конкретизировать тип матриц, участвующих в тензорном произведении. Нужны процедуры для тензорного произведения комплексных матриц или сомножители всегда действительные?
Записан
С.И. Доронин
Администратор
Ветеран
*****
Сообщений: 795


Просмотр профиля
« Ответ #43 : 11 Апреля 2007, 20:07:03 »

   Просьба конкретизировать тип матриц, участвующих в тензорном произведении. Нужны процедуры для тензорного произведения комплексных матриц или сомножители всегда действительные?

Чаще всего будут использоваться тензорные произведения типа ρ×I и I×ρ, где I – единичная матрица, а ρ – комплексная матрица плотности (I и ρ разной размерности).
Здесь хорошо бы подумать, как ускорить алгоритм и не множить две полных матрицы.

Но общий случай, который Вы реализовали, тоже нужен.

Записан
Pipa
Администратор
Ветеран
*****
Сообщений: 3608


Квантовая инструменталистка


Просмотр профиля WWW
« Ответ #44 : 11 Апреля 2007, 20:09:55 »

Я могу только уточнить, что нам даже не нужен полный спектр собственных значений, а только отрицательные собственные значения. И желательно подобрать что-то самое минимальное по времени, поскольку операция эта многократно будет использоваться.

    Нет, на положительных собственных значениях сэкономить не удастся. QL-алгоритм представляет собой скрытую форму исчерпывания, а потому собственные значения получаются в монотонном порядке и полным набором. Алгоритм бисекций гораздо хуже, и выигрыша во времени в данной задаче он не даст.
    Хотелось бы уточнить какой (максимальный) размер предполагает у матриц-сомножителей, а также у продукта тензорного произведения (до редукции).
Записан
Страниц: 1 2 [3] 4 5 ... 15  Все Печать 
« предыдущая тема следующая тема »
Перейти в:  


Войти

Powered by SMF 1.1.10 | SMF © 2006-2009, Simple Machines LLC