Trabajo de Fin de Grado de Fı́sica Cálculo numérico en teorı́a cuántica de campos de la materia condensada Autor: Jorge Alda Gallo Directores: David Zueco Láinez Isaac Fernando Quijandrı́a Dı́az Departamento de Fı́sica de la Materia Condensada Facultad de Ciencias, Universidad de Zaragoza Junio de 2015 “El cientı́fico no estudia la naturaleza por la utilidad que le pueda reportar; la estudia por el gozo que le proporciona, y este gozo se debe a la belleza que hay en ella” Henri Poincaré Me gustarı́a agradecer a mi familia por su infinita paciencia y comprensión conmigo, y por su constante impulso y apoyo para seguir adelante y perseguir nuevas metas. También a mis amigos y compañeros por no fallarme nunca en los momentos complicados y hacerlos siempre un poco más fáciles. Por supuesto, no me puedo olvidar de David y Fernando. Me han abierto la puerta a un mundo fascinante repleto de nuevos retos, y con su tutela he podido superarlos con éxito. Ellos han convertido este trabajo en toda una experiencia vital. Para la elaboración de este trabajo he sido beneficiario de la beca JAE Intro 2014 para la introducción a la investigación concedida por el CSIC. i Índice general Introducción 1 Objetivos 2 1 Conceptos de mecánica cuántica 1.1. Operador de evolución . . . . . 1.2. Matriz densidad . . . . . . . . 1.3. Entrelazamiento . . . . . . . . 1.4. Espacio de Fock . . . . . . . . . 1.5. Teorı́a cuántica de campos . . . 1.6. El principio variacional . . . . . . . . . . . 3 3 4 5 6 7 7 2 Estados producto de matrices 2.1. Tensores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2. Estados cuánticos como tensores . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.3. Utilidad de los estados tensoriales . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 8 9 10 3 Estados producto de matrices continuos 3.1. Paso al continuo . . . . . . . . . . . . . . 3.2. Expresiones para algunas magnitudes . . . 3.3. Dinámica disipativa en el sistema auxiliar 3.4. Extensión a campos acoplados . . . . . . . . . . . 11 11 12 12 14 4 Metodologı́a 4.1. Algoritmo para un solo campo . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.2. Algoritmo para dos campos acoplados . . . . . . . . . . . . . . . . . . . . . . . . 16 16 18 5 Modelos y resultados 5.1. Modelo de Lieb-Liniger . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.2. Dos campos acoplados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 20 23 Conclusiones 27 Bibliografı́a 28 A Cálculos con cMPS A.1. Normalización . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . A.2. Funciones de correlación campo-campo . . . . . . . . . . . . . . . . . . . . . . . . A.3. Funciones de correlación densidad-densidad . . . . . . . . . . . . . . . . . . . . . 30 31 32 33 B Código de los programas B.1. Modelo Lieb-Liniger en un campo . . . . . . . . . . . . . . . . . . . . . . . . . . . B.2. Cálculo de funciones de correlación . . . . . . . . . . . . . . . . . . . . . . . . . . 34 34 43 . . . . . . . . . . . . . . . . . . . . . . . . ii . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Introducción La teorı́a cuántica de campos es el lenguaje natural para la descripción de la fı́sica de la materia condensada. Superfluidez, superconductividad, condensación de Bose-Einstein o lı́quidos de Fermi son solo algunos de los fenómenos cuya comprensión requiere el uso de campos cuánticos [1]. El caso de los lı́quidos de Fermi es paradigmático del éxito de la teorı́a de perturbaciones. Sin embargo, en los sistemas unidimensionales las interacciones se ven reforzadas [2], por lo que la teorı́a de perturbaciones no es aplicable. Para ir más allá del régimen perturbativo, se puede emplear la discretización de los campos y su simulación computacional. La existencia de una distancia mı́nima conlleva el problema de la introducción de un máximo en las energı́as y momentos. Para elevar este corte (cutoff ) hasta energı́as suficientemente altas como para que no tengan relevancia fı́sica, hay que disminuir consiguientemente la discretización. Los niveles de discretización necesarios hacen completamente inviables las perspectivas de una simulación. Como método alternativo, en el año 2010 Verstraete y Cirac [3] propusieron un estado de prueba (ansatz ) para el método variacional, el estado de producto de matrices continuo. Esta solución tiene la ventaja de que necesita muy pocos parámetros para describir los estados fı́sicamente relevante, lo cual es una clara ventaja a la hora de realizar simulaciones. Además, otro punto a favor es que su formulación matemática tiene una interpretación fı́sica directa, como un sistema auxiliar discreto interaccionando con el campo. El estado de producto de matrices continuo puede ser generalizado para el caso de varios campos que interaccionan entre sı́ [4]. Como se verá, esto permite la reproducción de una transición de fase fuera del régimen perturbativo con un esfuerzo computacional muy moderado. La organización de esta memoria es como sigue: tras una exposición de los objetivos del trabajo de fin de grado, se procederá a la revisión de los conceptos de mecánica cuántica estudiados durante el grado necesarios en la sección 1. En la sección 2 se presentan los estados producto de matrices, el predecesor para casos discretos de los estados producto de matrices, y con cuyo estudio se comprenderán las ventajas que ofrecen para la descripción de sistemas fı́sicos. En la sección 3 se describen los estados producto de matrices continuos y su generalización para campos acoplados. Una vez conocida toda la teorı́a, en la sección 4 se explican los algoritmos utilizados para las simulaciones, destacando los problemas encontrados durante su ejecución y las soluciones adoptadas. Los modelos empleados y los resultados obtenidos mediante las simulaciones se presentan en la sección 5. Finalmente se exponen las conclusiones alcanzadas en la realización del trabajo y las posibles aplicaciones que ofrece en un futuro. 1 Objetivos El primer objetivo que debe cumplir el presente trabajo es la comprensión y asimilación de los fundamentos teóricos en los que se basan las simulaciones que se van a realizar: Identificación del entrelazamiento cuántico como la magnitud adecuada para caracterizar los estados fı́sicos. Revisión bibliográfica de los métodos de simulación basados en el entrelazamiento, las llamadas redes de tensores, haciendo especial énfasis en los estados producto de matrices. Estudio de la generalización de estos métodos a campos mediante los estados producto de matrices continuos. Cálculos, interpretación fı́sica. Ampliación del formalismo a campos que interaccionan. Una vez que estén fijados los conceptos esenciales, el objetivo es aprovecharlos para diseñar y ejecutar simulaciones numéricas con las que obtener nuevos resultados: Elaboración de un programa para simular un campo cuántico partiendo de los cálculos vistos en la teorı́a. Comprobación del código comparando los resultados obtenidos con métodos analı́ticos. Extensión a dos campos en interacción. Localización y caracterización de una transición de fase. 2 1 Conceptos de mecánica cuántica 1.1. Operador de evolución Uno de los postulados de la mecánica cuántica (el quinto para [5], el segundo para [6]) establece que las funciones de onda evolucionan en el tiempo según la ecuación de Schrödinger. Esto implica que las funciones de onda en dos tiempos distintos t0 y t1 están relacionadas mediante una transformación U , que debe ser unitaria para que se conserve la densidad de probabilidad: ψ(t1 ) = U (t1 , t0 )ψ(t0 ) U (t1 , t0 )U † (t1 , t0 ) = 1 (1.1) Además, el operador evolución temporal U debe respetar las operaciones de grupo, ya que la evolución desde un tiempo t0 hasta t1 seguida de la evolución desde t1 a t2 debe ser equivalente a la evolución desde t0 hasta t2 . U (t2 , t0 ) = U (t2 , t1 )U (t1 , t0 ) (1.2) En concreto, si se realiza una evolución en un tiempo infinitesimal, estará dada por el generador de la transformación, el hamiltoniano H. Esto significa que el operador U debe cumplir la ecuación diferencial (1.3). La misma ecuación se puede obtener introduciendo (1.1) en la ecuación de Schrödinger: ∂t U = −iHU ∂t U † = iU † H (1.3) La solución general a dicha ecuación diferencial es la siguiente [7]: U (s, s0 ) = T exp Z s s0 −iH(t)dt ≡ Z ∞ X (−i)n n=0 n! s s0 ··· Z s s0 T H(t1 ) · · · H(tn )dt1 · · · dtn donde T es el operador de ordenación temporal: A(t)B(t0 ) si t > t0 0 T A(t)B(t ) = B(t0 )A(t) si t0 > t (1.4) (1.5) La necesidad de la ordenación de los operadores es una consecuencia de que el hamiltoniano a diferentes tiempos no tiene por qué conmutar, y el orden lo establece la ecuación 1.3 (por ejemplo, para el operador U † habrı́a que emplear el orden opuesto). Todo esto se puede generalizar a una evolución no unitaria definida por la siguiente ecuación: ∂s U = U H (1.6) La solución a esta ecuación se expresa de nuevo como el desarrollo en serie de la exponencial del operador hamiltoniano: U (s0 , s) = P exp Z s s0 Z Z s ∞ X 1 s H(t)dt ≡ ··· PH(t1 ) · · · H(tn )dt1 · · · dtn n! s0 s0 (1.7) n=0 El operador P realiza el orden según el parámetro s. De la ecuación (1.6) se sigue que será el siguiente: A(s)B(s0 ) si s < s0 0 PA(s)B(s ) = (1.8) B(s0 )A(s) si s0 < s Emplearemos la imagen de interacción (o de Dirac), que se basa en la separación del hamiltoniano en dos partes, H = H0 + V . H0 representa la evolución libre y V un término de interacción. El operador evolución en la imagen de interacción se define como UI (s0 , s) = U (s0 , s)e−H0 (s−s0 ) 3 (1.9) Asumiendo invarianza bajo traslaciones, U (s0 , s) = U (0, s−s0 ), podemos escribir la expresión anterior como: UI (0, x) = U (0, x)e−H0 x (1.10) Derivando según (1.6): ∂x UI = U (0, x)He−H0 x − U (0, x)H0 e−H0 x = UI (0, x)V (1.11) Integrando de nuevo (con la condición de contorno de UI (0, 0) = 1) y operando, podemos reescribir el operador evolución: Z x −H0 x dsU (0, s)V e−H0 s (1.12) UI (0, x) = U (0, x)e =1+ 0 U (0, x) = eH0 x + x Z dsU (0, s)V eH0 (x−s) (1.13) 0 La solución a esta ecuación integral se puede obtener mediante el método iterativo. Para ello emplearemos una solución aproximada U (n) y la insertaremos en la expresión (1.13), para obtener la siguiente aproximación U (n+1) . La solución exacta se obtiene en el lı́mite n → ∞. Como primera solución, para que sea consistente con el lı́mite en x = 0, se toma U (0) = eH0 x : Z x Z x (0) H0 (x−s) H0 x (1) H0 x dseH0 x V eH0 (x−s) (1.14) dsU (0, s)V e =e + U (0, x) = e + 0 0 U (2) (0, x) = eH0 x + Z x dseH0 x V eH0 (x−s) + 0 Z 0 x ds0 Z s0 0 0 dseH0 s V eH0 (s−s ) V eH0 (x−s) 0 Repitiendo el procedimiento se llega a una expresión en serie para el operador evolución, conocida como serie de Dyson: U (0, x) = ∞ Z X n=0 0 x dxn · · · Z 0 x2 dx1 eH0 x1 V eH0 (x2 −x1 ) V eH0 (x3 −x2 ) · · · eH0 (xn −xn−1 ) V eH0 (x−xn ) (1.15) 1.2. Matriz densidad Además de la formulación en términos de la función de onda existe otra formulación más general, debida a von Neumann, empleando la matriz densidad. Este enfoque tiene la ventaja de poder tratar conjuntos estadı́sticos de estados además de estados puros [5, Complemento CIII]. Si hay una probabilidad (clásica) pi de que el estado del sistema sea |ψi i, la matriz densidad se define como X ρ= pi |ψi i hψi | (1.16) i La matriz densidad es un operador hermı́tico, definido positivo y de traza igual a uno. Si todos los pi son nulos a excepción de uno, entonces el estado es puro, y se puede describir mediante una función de ondas; en caso contrario es un estado mezcla. Hay distintas pruebas para comprobar si una matriz densidad ρ corresponde a un estado puro o mezcla. Una de ellas es la entropı́a de von Neumann (definida de manera análoga a la entropı́a de Gibbs o de Shanon), que es nula para un estado puro y positiva para un estado mezcla: X S(ρ) = − pi log pi = −tr(ρ log ρ) (1.17) i 4 La evolución temporal de la matriz densidad, calculada a partir de la ecuación de Schrödinger, está dada por la ecuación de Liouville-von Neumann: i~ ∂ ρ = [H, ρ] ∂t (1.18) El valor esperado de un operador A se calcula según hAi = tr(ρA) (1.19) Matriz densidad reducida Podrı́a pensarse que la matriz densidad no aporta nada nuevo con respecto a la función de ondas. Al fin y al cabo, en principio se podrı́a conocer la función de ondas del universo y resolver con ella la ecuación de Schrödinger, y cualquier problema estarı́a automáticamente resuelto. Pero la matriz densidad proporciona la herramienta necesaria para tratar los componentes de un sistema de forma individual: la matriz densidad reducida. Si un sistema fı́sico está descrito por la matriz densidad ρ y se puede dividir en dos partes A y B, cuyos espacios de Hilbert admitan las bases {|ϕi i} y {|χj i} respectivamente, a cada uno de los subsistemas le corresponde una matriz densidad reducida obtenida al hacer la traza parcial sobre los grados de libertad de la otra parte: X ρA = trB ρ = hχj | ρ |χj i (1.20a) j ρB = trA ρ = X i hϕi | ρ |ϕi i (1.20b) La evolución temporal de cada una de las matrices reducidas sigue obedeciendo la ecuación de Liouville-von Neumann(1.18), y los valores esperados de observables que afecten solo a una de las partes se pueden calcular con (1.19). 1.3. Entrelazamiento En sistemas de muchas partı́culas, el espacio de Hilbert es el resultado de realizar el producto tensorial de los espacios de las partı́culas individuales. HT = H1 ⊗ H2 ⊗ · · · ⊗ Hn (1.21) Al hacer esto, aparecen estados que no se pueden separar como el producto tensorial de los estados independientes, lo que se conoce como entrelazamiento. Se define un estado entrelazado como un estado del espacio de Hilbert HT que no se puede expresar como un producto tensorial de estados en los diferentes espacios Hi . El ejemplo más tı́pico es el de dos objetos con dos niveles que forman un estado de Bell: 1 |ϕi = √ (|0i ⊗ |1i − |1i ⊗ |0i) 6= |ai ⊗ |bi 2 (1.22) El hecho de que dos objetos estén entrelazados significa que no son independientes entre sı́, sino que entre ellos existen correlaciones. En el ejemplo anterior, si se realiza una medición sobre el primer estado y se obtiene el valor |0i, automáticamente se sabe que el segundo estará en el estado |1i (o viceversa). El significado del entrelazamiento es que, aunque se tenga un conocimiento completo de un sistema cuántico, eso no implica que se tenga un conocimiento completo de cada una de sus partes por separado. 5 Entropı́a de entrelazamiento En un sistema puro, la condición necesaria y suficiente para que dos de sus partes estén entrelazadas es que sus matrices reducidas correspondan a estados mezcla. Esto permite elaborar diferentes medidas del entrelazamiento, como la entropı́a de entrelazamiento: En un sistema bipartito, la entropı́a de entrelazamiento es la entropı́a de von Neumann de las matrices reducidas. Si el estado está entrelazado, la entropı́a de entrelazamiento es mayor que cero. Además, se cumple que la entropı́a de entrelazamiento de ambas partes es igual. Es bien conocido que la entropı́a clásica aumenta con el volumen de los sistemas. Cabe preguntarse si sucede lo mismo con la entropı́a de entrelazamiento. Si se escoge un estado arbitrario [8], la respuesta es que sı́. Pero no es cierto en algunos casos concretos, con una gran relevancia fı́sica. En concreto, si el hamiltoniano incluye únicamente interacciones locales y existe una diferencia de energı́a (gap) entre el nivel fundamental y el primer excitado, entonces en el nivel fundamental la entropı́a de entrelazamiento depende del tamaño de la frontera entre los dos componentes, y por lo tanto están menos entrelazados que un estado general. Esta propiedad se conoce como ley del área, y se ilustra en la figura 1.1. Nos restringiremos a sistemas unidimensionales, por lo que la frontera de cualquier bloque está formada por dos sitios, y la entropı́a estará acotada por una constante. Figura 1.1: En sistemas con interacciones locales y gaps de energı́a, la entropı́a de entrelazamiento depende del número de enlaces entre las dos partes A y B. 1.4. Espacio de Fock Hay muchas situaciones fı́sicas en las que el número de excitaciones o de partı́culas no se mantiene constante. Por ello, hay que emplear un espacio de estados adaptado a un número arbitrario de partı́culas: el espacio de Fock. Si H es el espacio de Hilbert correspondiente a una única partı́cula, el espacio de Fock incluye C (el vacı́o, representado con el estado |Ωi), H, H2 , H3 ..., ası́ como las combinaciones lineales de elementos de los distintos espacios. La forma conveniente de expresar estos estados, incluyendo la condición de simetrización, es mediante estados de Fock, donde se expresa la ocupación de cada uno de los estados. Estos estados, con un número definido de partı́culas, constituyen una base del espacio de Fock. Si a† (xn ) es el operador de creación de una partı́cula en la posición xn , un estado de Fock es de la forma 1 |x1 , · · · xn i = √ a† (x1 ) . . . a† (xn ) |Ωi n! Como estos estados constituyen una base, cualquier otro estado se puede expresar como 6 combinación lineal de ellos: |ϕi = ∞ Z X n=0 dx1 · · · dxn φ(x1 , · · · xn )a† (x1 ) · · · a† (xn ) |Ωi (1.23) Los coeficientes de la combinación lineal se pueden calcular, como es habitual, como φ(x1 , · · · , xn ) = hx1 , · · · xn |ϕi = hΩ| ψ(x1 ) · · · ψ(xn ) |ϕi 1.5. (1.24) Teorı́a cuántica de campos Un campo es el caso lı́mite de una red en la que la distancia entre los sitios de red tiende a cero ( → 0) aumentando el número de sitios N → ∞ y manteniendo fija la longitud total L = N . Al hacer el lı́mite, los operadores de creación y destrucción dan lugar a los operadores de campo: ai (1.25) lı́m √ = ψi →0 En el caso de que las partı́culas sean bosones (que es el único caso que consideramos en este trabajo) las relaciones de conmutación entre los operadores de creación y destrucción se traducen en las correspondientes para los campos [9]: δij 1 [ψi , ψj† ] = [ai , a†j ] = =⇒ →0 [ψ(x), ψ † (y)] = δ(x − y) (1.26) Notar que el factor −1/2 en la definición (1.25) garantiza que las dimensiones sean correctas, ya que la delta de Kronecker es adimensional mientras que la delta de Dirac tiene dimensiones inversas a las de la variable de integración (longitud en este caso). Un observable importante es el operador número de partı́culas, N , definido como Z ∞ N= dxψ † (x)ψ(x) (1.27) −∞ Un estado de Fock es autoestado de este operador, y el autovalor correspondiente es la ocupación total del estado. 1.6. El principio variacional El teorema de Rayleigh-Ritz [10, Complemento E XI] proporciona un método para determinar al estado fundamental de un hamiltoniano H: El valor esperado del hamiltoniano en un estado cualquiera |ψi es mı́nimo si ese estado es el fundamental: hEiψ = hψ| H |ψi ≥ E0 hψ|ψi (1.28) La estrategia a seguir a la hora de aplicar el principio variacional es elegir una familia de estados que dependan de uno o más parámetros, |ψ(α)i y minimizar el valor esperado del hamiltoniano con respecto a estos parámetros. Para elegir una clase variacional de funciones, se requiere [11] que sea completa (capaz de reproducir todos los estados del espacio de Hilbert), computacionalmente eficiente (que el número de parámetros no dependa exponencialmente con el tamaño del sistema) y motivada por argumentos fı́sicos. A lo largo de los dos próximos capı́tulos se mostrará una clase variacional para sistemas unidimensionales que cumple estos requisitos. 7 2 Estados producto de matrices En mecánica clásica, el espacio de fases para varias partı́culas se construye como suma directa de los espacios de fases de cada una de las partı́culas, y su dimensión crece linealmente con el número de partı́culas. Por el contrario, en mecánica cuántica los espacios de Hilbert de varias partı́culas se forman mediante el producto tensorial de los espacios de Hilbert de una partı́cula. Por lo tanto, su dimensión crece exponencialmente con el número de partı́culas. Este hecho hace que métodos como el principio variacional, basados en explorar el espacio de estados, están abocados al fracaso debido al gran número de estados posibles incluso en sistemas con unas decenas de partı́culas. Sin embargo, la evolución del sistema explora solo una pequeña parte de los estados a priori posibles. Ası́ que el problema no es tratar con espacios de dimensión elevada, sino saber seleccionar de ellos los estados relevantes. La ley de área del entrelazamiento permite identificar los estados correspondientes al estado fundamental y primeros excitados, lo que permite acotar enormemente el conjunto de estados en los que buscar. Hay diversos modelos que explotan las propiedades del entrelazamiento, colectivamente conocidos como redes de tensores. Esto es ası́ porque describen los estados cuánticos como un conjunto de tensores cuyo producto sigue la estructura dictada por el entrelazamiento. El estado producto de matrices es un caso particular, aplicable a redes unidimensionales. 2.1. Tensores A efectos prácticos, un tensor es una colección multidimensional de números, Aαβγ··· . El número de ı́ndices α, β, γ, · · · necesarios para especificar uno de los números es el orden del tensor [12]. Cada ı́ndice puede tomar un número de valores discretos posibles, lo que constituye la dimensión de ese ı́ndice. La operación básica entre tensores es la contracción de ı́ndices (para lo cual los ı́ndices contraı́dos deben tener la misma dimensión D): Cβγ···µν··· = D X Aαβγ··· Bαµν··· (2.1) α=1 El caso más elemental es el producto de matrices (una matriz es un tensor de orden 2): Cαγ = D X Aαβ Bβγ (2.2) β=1 donde la matriz A tiene dimensión d en el ı́ndice α y D en el ı́ndice β, mientras que B tiene dimensión d en el ı́ndice γ, con lo cual C tiene dimensión d en ambos ı́ndices: para escribir C hace falta especificar d2 elementos, y para AB, hay que especificar 2dD elementos. Un tensor se puede representar pictóricamente, mediante la notación de Penrose, como un objeto con un segmento externo por cada ı́ndice. De este modo, la contracción de dos tensores se simboliza conectando dos segmentos, como se ilustra en la figura 2.1. Figura 2.1: Izquierda: Un tensor con dos ı́ndices (matriz). Derecha: contracción de dos tensores (producto de matrices). 8 2.2. Estados cuánticos como tensores Consideremos una red unidimensional con N sitios. En cada sitio acomodaremos un sistema discreto de d niveles, al que le corresponde un espacio de Hilbert Hr , (r = 1, · · · , N ) parametrizado por una base de autoestados {|ir i}, ir = 1, · · · , d. El espacio de Hilbert de la red en su conjunto será N O H= Hr = H1 ⊗ H2 ⊗ · · · ⊗ HN (2.3) r=1 con base {|i1 i ⊗ |i2 i ⊗ · · · ⊗ |iN i}. En consecuencia, cualquier estado de dicho espacio es de la forma X |ψi = Ci1 i2 ···in |i1 i ⊗ |i2 i ⊗ · · · ⊗ |iN i (2.4) i1 ,i2 ,··· ,iN Los coeficientes Ci1 ,i2 ,··· ,iN necesarios para expresar el estado en términos de los elementos de la base se pueden entender como un tensor de N ı́ndices, por lo que contiene dN elementos. El objetivo es expresar este tensor como la contracción de N tensores de tres ı́ndices, de los cuales uno tenga dimensión d y los otros dos dimensión D (dimensión de enlace o bond dimension). El estado reescrito de este modo se denomina MPS (matrix product state, por sus siglas en inglés). Figura 2.2: Descomposición de un tensor de N ı́ndices con dimensión d en la contracción de N tensores de tres ı́ndices de dimensiones d y D. |ψi = X X i1 ,··· ,iN α,n1 ,··· ,nN −1 (i2 ) (iN ) 1) A(i αn1 An1 n2 · · · AnN −1 α |i1 i ⊗ |i2 i ⊗ · · · ⊗ |iN i (2.5) Construcción mediante descomposición de Schmidt Se puede demostrar, de forma constructiva, que cualquier estado se puede escribir en la forma MPS. El tensor Ci1 i2 ···in se puede considerar como una matriz con solo dos ı́ndices: el i1 y el ı́ndice resultante de agrupar a todos los demás. Cualquier matriz se puede descomponer mediante la descomposición de valores singulares (SVD) M = U ΣV † (2.6) en el producto de dos matrices unitariasPU U † = I y V V † = I y una diagonal (no necesariamente cuadrada) Σ con Σij = σi δij , σ ≥ 0 y σi2 = 1 por normalización. El número de elementos σ distintos de cero, D2 , es el rango de la matriz. Aplicado al estado cuántico (2.4), resulta en Ci1 (i2 ···iN ) = D2 X i=1 † Ui1 k σk Vk(i 2 ···iN ) (2.7) Definiendo |Ii = U |i1 i y |Ji = V † |i2 i ⊗ · · · ⊗ |iN i, se obtiene la descomposición de Schmidt: D2 X |ψi = σk |Ik i ⊗ |Jk i (2.8) i=k 9 Iterando el procedimiento de SVD, se llega al estado MPS: X X Ci1 i2 ···iN = Ui1 k1 Ck1 (i2 ···iN ) = Ui1 k1 U(k1 i2 )k2 Ck2 (i3 ···iN ) = X = Ui1 k1 U(k1 i2 )k2 · · · U(kN −2 iN −1 )kN −1 UiN kN −1 = Ai1 Ai2 · · · AiN (2.9) Para trabajar con condiciones de contorno periódicas (lo cual es recomendable si se va a realizar el lı́mite termodinámico N → ∞), hay que entrelazar el primer sitio de la red con el último contrayendo sus tensores, esto es, haciendo la traza a la expresión anterior: X |ψi = tr[Ai1 Ai2 · · · AiN ] |i1 i ⊗ |i2 i ⊗ · · · ⊗ |iN i (2.10) i1 ,··· ,iN Dimensión de enlace y entropı́a Hay que notar que la expresión (2.8) no es más que un sistema bipartito, con lo que se puede calcular la entropı́a de entrelazamiento que existe entre las dos partes a partir de los coeficientes de Schmidt: D2 X S=− σk2 log σk2 ≤ log D2 (2.11) i=k Por lo tanto, el rango de la matriz es una medida del entrelazamiento entre los dos subsistemas, y cuanto menor sea el entrelazamiento, menor será la dimensión D2 . 2.3. Utilidad de los estados tensoriales En conclusión, se ha conseguido reescribir un estado cuántico desde su forma de producto tensorial, para lo que hacen falta dN elementos, a la forma de estado de producto matricial, en la que hay que especificar N dD2 elementos. El parámetro clave en esta descripción es D, la dimensión de enlace, que está determinada por el entrelazamiento entre los componentes del sistema. En el caso de que D no crezca exponencialmente con N , el formalismo MPS es una manera eficiente de describir los estados cuánticos. Figura 2.3: El espacio de Hilbert (azul) contiene un número muy elevado de estados, pero de ellos solo unos pocos son fı́sicamente relevantes: los que siguen la ley de área (gris). Eligiendo una dimensión D reducida (rojo), se pueden describir parte de dichos estados. Los MPS incorporan de manera automática la ley de área. Con un valor de D muy elevado (que dependa exponencialmete con el tamaño del sistema) se puede describir cualquier estado. Al restringirse a valores pequeños, por el contrario, se obtienen solo los estados significativos, y además de forma computacionalmente eficiente. 10 3 Estados producto de matrices continuos Los estados de producto de matrices continuos (cMPS por sus siglas en inglés) son la generalización, para campos en una dimensión, de los estados MPS. Se definen por la siguiente expresión [3]: h RL i † |χi = traux Pe 0 dx[Q(x)⊗I+R(x)⊗ψ ] |Ωi ≡ traux U |Ωi (3.1) donde Q(x) y R(x) son matrices de dimensión D que actúan sobre un sistema auxiliar, y que especifican completamente el estado. 3.1. Paso al continuo Al igual que un campo se puede obtener mediante el paso al continuo de una red atómica, su descripción computacionalmente eficiente, el cMPS (continuous matrix product state) se puede obtener mediante el paso al continuo del MPS: |χ i = X i1 ···iN tr[Ai1 Ai2 · · · AiN ](ψ1† )i1 · · · (ψN )iN |Ωi (3.2) Por simplicidad el modelo se puede hacer invariante bajo traslaciones si las matrices A no dependen del sitio de la red, Ain = An . La forma de estas matrices se escoje, de acuerdo con [3], para que reproduzcan de forma correcta el lı́mite continuo, empleando las matrices Q y R, ambas de dimensión D × D: A0 = 1 + Q An = n n R n! (3.3) Comprobemos que realmente se obtiene el resultado esperado. En primer lugar se realiza la discretización del espacio, haciendo dx = , x = n: U = P exp Z 0 L dx Q ⊗ 1 + R ⊗ ψ † (nε) L/ X = lı́m P exp Q ⊗ 1 + R ⊗ ψn† ε→0 n=0 L/ε Y L/ε ∞ h i Y X εm m † Qε = lı́m P exp Q ⊗ 1 + R ⊗ ψn = lı́m P e R ⊗ (ψn† )m ε→0 ε→0 m! n=0 n=0 m=0 ! ! L/ε L/ε ∞ ∞ Y X Y X m † m 0 m † m ≈ lı́m P (1 + Qε) 1 + A ⊗ (ψn ) ≈ lı́m P A + A ⊗ (ψn ) ε→0 = lı́m ε→0 n=0 X i1 ,··· ,iL/ε ε→0 m=1 i1 i2 A A ···A iL/ε (ψ1† )i1 † · · · (ψL/ε )iL/ε 11 n=0 m=1 (3.4) 3.2. Expresiones para algunas magnitudes Los observables del sistema se pueden escribir en función de las matrices Q y R [13]. Los detalles se pueden encontrar en el apéndice A: hχ|χi = tr eT L (3.5a) h i hψ † (x)ψ(0)i = tr eT (L−x) (R ⊗ 1)eT x (1 ⊗ R? ) (3.5b) hψ † (x)ψ(x)i = tr eT L R ⊗ R? (3.5c) h i hψ † (0)ψ † (x)ψ(x)ψ(0)i = tr eT (L−x) (R ⊗ R? )eT x (R ⊗ R? ) (3.5d) hψ † (x)ψ † (x)ψ(x)ψ(x)i = tr eT L R2 ⊗ (R? )2 (3.5e) En todos los casos se ha empleado la matriz de transferencia, definida como T = Q ⊗ 1 + 1 ⊗ Q? + R ⊗ R? (3.6) Estas ecuaciones son de vital importancia, ya que permiten relacionar valores esperados para campos (con infinitos grados de libertad), con trazas de matrices de dimensión finita. Por lo tanto, son las herramientas para poder hacer cálculos con un estado cMPS. 3.3. Dinámica disipativa en el sistema auxiliar Libertad gauge El estado cMPS posee una libertad gauge a la hora de elegir las matrices Q y R: queda invariante al hacer la transformación dada por la matriz invertible g: Q → Q0 = gQg −1 R → R0 = gRg −1 (3.7) La elección de gauge que se suele emplear es la siguiente: Q + Q† + R† R = 0 (3.8) que se puede escribir, empleando una matriz hermı́tica K = K † , como 1 Q = −iK − R† R 2 (3.9) Con esta elección, el estado (3.1) toma la forma: |χi = traux [U (L, 0)] |Ωi Z U (L, 0) = P exp −i 0 L dz(K ⊗ 1 + iR ⊗ ψ (z) − iR ⊗ ψ(z)) † † (3.10) Interpretación holográfica Esta expresión es matemáticamente análoga a la del operador evolución para un campo ψ y un sistema auxiliar (ancilla) con D niveles. Esto permitirá reinterpretar el cMPS como un sistema auxiliar con un hamiltoniano K acoplado con un campo que actúa como baño térmico mediante la matriz R, como se ilustra en la figura 3.1. Ası́ pues, la dinámica de un sistema unidimensional queda completamente descrita por la de un sistema puntual, lo que constituye un ejemplo del principio holográfico. 12 Figura 3.1: El estado cMPS como un sistema de D niveles con hamiltoniano K sometido al baño térmico (campo ψ) mediante la matriz R. Ecuación de Lindblad Las expresiones anteriores (3.5) incluyen productos tensoriales en el espacio auxiliar. Para evitarlos, y además hacer patente la dinámica disipativa, se emplea el siguiente isomorfismo: |ai ⊗ |bi ⇐⇒ |ai hb| (3.11) Este isomorfismo se traduce en un isomorfismo entre operadores en H ⊗ H y superoperadores (es decir, operadores lineales que actúan en el espacio de los operadores de un espacio de Hilbert): (A ⊗ B ? ) |ai ⊗ |bi ⇐⇒ A |ai hb| B † (3.12) Es interesante aplicar el isomorfismo a la matriz de transferencia T (3.6) actuando sobre un vecor |ρi: T |ρi = (Q ⊗ 1 + 1 ⊗ Q? + R ⊗ R? ) |ρi ⇐⇒ T[ρ] = Qρ + ρQ† + RρR† (3.13) El vector ha pasado a ser una matriz densidad ρ sobre la que opera el superoperador T. Aplicando la expresión (3.9) se obtiene 1 T[ρ] = −i[K, ρ] + RρR† − {R† R, ρ} 2 (3.14) La expresión (3.14) corresponde a una ecuación de Lindblad [7] que describe la evolución del sistema auxiliar ∂ 1 ρ(x) = T[ρ(x)] = −i[K, ρ] + RρR† − {R† R, ρ} (3.15) ∂x 2 Si solamente estuviera el primer término, el conmutador, serı́a una ecuación de Liouvillevon Neumann, equivalente a la ecuación de Schrödinger para la matriz densidad de un sistema aislado. Al añadir los términos dependientes de R ya no se está describiendo un sistema aislado sino uno abierto, en contacto con un baño térmico (representado por el campo). En el lı́mite termodinámico L → ∞, el autovector de T al que corresponda el autovalor de mayor parte real es el dominante en las expresiones (3.5). Para evitar divergencias, esperamos que el mayor autovalor sea cero, lo que equivale a que en (3.15) exista una matriz densidad estacionaria ρss tal que T[ρss ] = 0. 13 En este lı́mite, las cantidades en (3.5) se pueden escribir en función de la matriz densidad estacionaria: hχ|χi = trρss = 1 h i hψ † (x)ψ(0)i = tr eTx (Rρss )R† h i hψ † (x)ψ(x)i = tr R† Rρss h i hψ † (0)ψ † (x)ψ(x)ψ(0)i = tr ReTx (Rρss R† )R† h i hψ † (x)ψ † (x)ψ(x)ψ(x)i = tr (R† )2 R2 ρss h i ∂2 hψ † (x) − 2 ψ(x)i = tr ([Q, R])† [Q, R]ρss ∂x (3.16a) (3.16b) (3.16c) (3.16d) (3.16e) (3.16f) Al igual que las relaciones (3.5), estas ecuaciones establecen cómo calcular promedios, y de hecho serán empleadas continuamente en las simulaciones. 3.4. Extensión a campos acoplados El formalismo de estados de producto de matrices continuos se puede extender para aplicarlo en sistemas de varios campos bosónicos acoplados. Estos campos deberán cumplir las relaciones de conmutación acordes a su estadı́stica: [ψα (x), ψβ (x0 )] = 0 [ψα (x), ψβ† (x0 )] = δαβ δ(x − x0 ) La generalización del estado cMPS es inmediata [4]: h RL i P † |χi = traux Pe 0 dx[Q̃⊗1+ R̃α ⊗ψα ] |Ωi (3.17) (3.18) El sistema está descrito por la matriz Q̃ y las matrices R̃α : de estas últimas, hay una correspondiente a cada campo ψα , y para evitar divergencias, deben heredar las relaciones de conmutación de los campos: [R̃α , R̃β ] = 0 (3.19) Al igual que en el caso de un único campo, la evolución temporal se puede describir como una dinámica disipativa mediante una ecuación de Linblad, de modo que las matrices R̃α actúan como el acoplamiento del sistema auxiliar con el baño (los campos): X d 1 ρ̃(z) = −i[K̃, ρ̃(z)] + R̃α ρ̃R̃α† − {R̃α† R̃α , ρ̃(z)} dz 2 α (3.20) El hamiltoniano K̃ se puede relacionar con los parámetros del estado, Q̃ y R̃α , según la relación: 1X † Q̃ = −iK̃ − R̃α R̃α (3.21) 2 Como primer paso vamos a construir las matrices correspondientes a campos no acoplados, a partir de las matrices K y R de un único campo. Para recuperar la dinámica de cada uno de los campos, deberemos exigir que la matriz densidad total sea separable, ρ̃ = ρ1 ⊗ ρ2 . Cada uno de los campos actúa en su propio espacio con su hamiltoniano Kα y su acoplo con el baño Rα de manera independiente, por lo que K̃ = K1 ⊗ 1 + 1 ⊗ K2 R̃1 = R1 ⊗ 1 14 R̃2 = 1 ⊗ R2 (3.22) Figura 3.2: En el cMPS para dos campos, el acoplamiento entre ambos se traduce en un acoplamiento entre sus sistemas auxiliares. Dado que R̃1 y R̃2 operan en espacios diferentes, obedecen de manera trivial la relación de conmutación (3.19). El acoplamiento entre campos se puede introducir adiabáticamente. Al hacerlo, los sistemas auxiliares comienzan a interaccionar, y las soluciones se modifican respecto a las de los campos independientes. En concreto, el estado ya no será separable. Para conseguirlo hay que usar un hamiltoniano K̃ más general: K̃ = K1 ⊗ 1 + 1 ⊗ K2 + P X p=0 (p) (p) Z1 ⊗ Z2 (3.23) (0) Se han añadido P parejas de matrices hermı́ticas (para que K̃ también lo sea) y con Z1 = (0) Z2 = 0 para reproducir el lı́mite de campos independientes. El número de matrices P es en principio arbitrario, pero el número óptimo aumentará al incrementar el acoplamiento. Las matrices R̃1 y R̃2 no se modifican respecto del caso sin perturbar. Empleando una dimensión de enlace D, el número de parámetros variacionales para describir los dos campos asciende a (4 + 2P )D2 . 15 4 Metodologı́a El presente trabajo está dedicado a la simulación computacional de campos cuánticos. En consecuencia, la labor de investigación correspondiente se ha realizado mediante la elaboración y ejecución de los códigos informáticos necesarios. La elaboración del código se estructuró como sigue: En primer lugar se estudió un único campo. Para ello se empleó un código diseñado por el alumno (Apéndice B) en el lenguaje de programación C. La elección del lenguaje se debe a su rapidez y flexibilidad, y también porque el alumno está familiarizado por su utilización en otras asignaturas del grado. El código se basa en el que presenta [11] (en el lenguaje MATLAB), incluyendo mejoras para incrementar su eficiencia computacional. La ejecución del programa se realizó en el ordenador personal del alumno, con el sistema operativo Ubuntu (Linux) y el compilador gcc. Después se realizó la simulación de dos campos acoplados. En esta etapa, la mayor exigencia de potencia de cálculo marcó la metodologı́a necesaria. Las rutinas de optimización en C se mostraron insuficientes al incrementar el número de parámetros variacionales, con lo que en su lugar se empleó MATLAB debido a su potente rutina fmincon. Para hacer frente al elevado tiempo de cálculo, la ejecución se realizó en el cluster del Departamento de Fı́sica de la Materia Condensada de la Universidad de Zaragoza (con sistema operativo Linux). El código fue elaborado para su investigación por uno de los directores del trabajo, Fernando Quijandrı́a, y modificado para adaptarse al problema especı́fico por el alumno. 4.1. Algoritmo para un solo campo La idea del algoritmo es tomar como parámetros variacionales las matrices K y R, ambas de dimensión M , y con ellas calcular la matriz densidad ρss según (3.14). Esta matriz se emplea para calcular la energı́a del modelo de Lieb-Liniger (5.1) aplicando los resultados (3.16f) y (3.16e): h i h i ∂2 hEi = hψ (x) − 2 ψ(x)i+chψ † (x)ψ † (x)ψ(x)ψ(x)i = tr ([Q, R])† [Q, R]ρss +tr c(R† )2 R2 ρss ∂x (4.1) Los valores de energı́a ası́ calculados se emplean para su optimización numérica según (1.28), tomando como condición de minimización el valor de N (recordemos que para el modelo de LiebLiniger es una constante del movimiento), que se calcula de acuerdo con su definición (1.27) y el resultado (3.16c): h i † hN i = hψ † (x)ψ(x)i = tr R† Rρss (4.2) Ası́ pues, al fijar la condición hN i = ρ se está restringiendo la optimización al subespacio de estados con densidad de partı́culas ρ. El proceso de minimización se inicia con unas matrices K y R aleatorias y se continúa hasta que el valor de la energı́a converja a un mı́nimo. Una vez calculadas las matrices K y R, y con ellas la matriz densidad ρss , es posible calcular funciones de correlación empleando (3.16b) y (3.16d). Modificaciones del código Respecto del código original, se han realizado algunas modificaciones: El programa, originariamente en MATLAB, se ha reescrito en C. Para ello ha sido necesaria la utilización de librerias: para las operaciones matriciales la GNU Scientific Library [14] y para las rutinas de optimización la librerı́a NLOpt [15]. 16 Se ha modificado el método usado para calcular el estado estacionario del Liouvilliano: en el original se usa el inverse power method, pero dado que las matrices empleadas son singulares, esto conlleva problemas de estabilidad numérica. En su lugar, se ha empleado la descomposición QR: El Liouvilliano se expresa como L = A · B, siendo A unitaria (y por tanto regular) y B rectangular superior. El estado estacionario ρ se encuentra resolviendo por backsubstitution el sistema Bρ = 0. Este cambio ofrece una ventaja adicional, ya que requiere un menor número de operaciones: Al tratar con superoperadores (matrices de dimensión D2 × D2 ), las multiplicaciones necesarias para calcular el Liouvilliano emplean O(D6 ) operaciones. El inverse power method requiere efectuar una inversión (O(D6 )) y un número, a priori desconocido, de multiplicaciones (O(D6 )); mientras que el método alternativo ejecuta una descomposición QR (O(D6 )) y una backsubstitution (O(D4 )). El código original emplea para la optimización sujeta a restricciones mediante la función fmincon de MATLAB, que opera a modo de caja negra. Este enfoque, aunque cómodo, no está exento de riesgos, ya que un conocimiento más detallado del funcionamiento interno puede usarse para mejorar el rendimiento: en este caso, se puede evitar calcular varias veces la matriz ρss a partir de los mismos {K, R}. Esto es una gran ventaja, ya que éste es precisamente la etapa más exigente computacionalmente. Figura 4.1: Esquema de operación de la fase de optimización en el código original (arriba) y en el actual (abajo). El proceso de optimización La optimización sujeta a restricciones se realiza mediante el llamado método de la barrera (fmincon lo utiliza, aunque los detalles de su implementación permanezcan obscuros y ultrasecretos). Para minimizar la función f (x) obedeciendo la condición g(x) = 0, el método de la barrera minimiza la función F (x) = f (x) + I(g(x)) (4.3) La función I(x) es la barrera, tal que I(0) I(x), |x| > 0. Fı́sicamente esto se puede interpretar como añadir a la energı́a un potencial que atrae al sistema hacia las regiones del espacio de fases que verifican g(x) = 0. Una primera idea para elegir la barrera es I(x) = −δ(x). Sin embargo, esto no es conveniente, ya que partiendo de condiciones iniciales aleatorias es prácticamente imposible llegar a la región que verifica las condiciones, mientras que partiendo desde un punto válido, el movimiento por el espacio de fases está muy limitado impidiendo llegar a otros mı́nimos locales. 17 Una solución es emplear como barrera una función con forma de embudo: partiendo de cualquier punto arbitrario se acaba rápidamente en la región de interés, permitiendo una exploración de una región mayor del espacio de fases. Algunas de las funciones que se han probado son I(x) = |x|, I(x) = tan−1 (x) y I(x) = tanh−1 (x). En la literatura matemática, los problemas de optimización sujeto a restricciones de igualdad atraen mucha menos atención que las restricciones de desigualdad, ya que estos últimos son más fáciles de tratar. Usando este enfoque, se puede transformar el problema actual en uno más sencillo computacionalmente teniendo en cuenta que la energı́a es una función creciente con el número de partı́culas: ası́, fijando el número mı́nimo de partı́culas mediante la barrera, la propia función a minimizar se encargará de acotarlo superiormente. La opción favorita es la barrera logarı́tmica, I(x) = −t−1 log(x), t → ∞. 4 3.5 3 E 2.5 2 1.5 1 log tan−1 tanh−1 0.5 abs 0 0 20 40 60 80 100 c Figura 4.2: Resultados para D = 2 obtenidos con diferentes barreras en la optimización. De entre todos los métodos expuestos anteriormente, se encuentra que es preferible el de la barrera logarı́tmica, tanto por ofrecer resultados algo mejores como por requerir de menos tiempo de ejecución. El proceso de optimización exhibe una marcada dependencia a los puntos iniciales suministrados. Para conseguir los mejores resultados, al calcular la energı́a correspondiente a un valor de c se comienza con el estado óptimo calculado para otro valor de c próximo. Aun ası́, es necesario hacer varias rondas aumentando y disminuyendo sucesivamente el valor de c para que el resultado converja. Además, al aumentar la dimensión de enlace D se está incrementando el número de parámetros variacionales, por lo que obtener una buena convergencia en la optimización se hace más complicado. Por ello es conveniente poder construir una solución en dimensión D partiendo de la solución en dimensión D − 1. Esto se consigue empleando las matrices K (D) , R(D) obtenidas al añadir una fila y columna de ceros a las matrices K (D−1) y R(D−1) . Es inmediato comprobar (D) (D−1) que la matriz densidad estacionaria que se obtiene ρss es igual a ρSS con la fila y columna de ceros añadidas,, y que la densidad de partı́culas y la energı́a que se calculan con ambas también coinciden. Por lo tanto, al ir subiendo en dimensión es conveniente emplear las matrices calculadas en las dimensiones anteriores como valor inicial para la minimización. 4.2. Algoritmo para dos campos acoplados La idea tras el algoritmo es similar a la que se emplea para un único campo, aunque presenta algunas peculiaridades. 18 El acoplamiento entre los campos, a nivel de los operadores en el sistema auxiliar, se realizó de forma perturbativa: la matriz K se construye a partir de hamiltonianos para campos independientes, añadiéndoles P parejas de matrices Z (3.23). Esta misma lógica se emplea en la simulación: en primer lugar se simula un único campo con lo que se obtienen sus matrices K y R. A continuación se crean las matrices K̃ = K ⊗ 1 + 1 ⊗ K, R̃1 = R ⊗ 1 y R̃2 = 1 ⊗ R, que se emplean para simular los dos campos sin introducir aún el acoplamiento entre ellos. Finalmente se añaden al hamiltoniano K̃ tantos pares de matrices Z como sea necesario y se introduce el acoplamiento, de forma adiabática. El objetivo es poder reproducir una transición de fase. De ser ası́, las magnitudes deberán cambiar bruscamente. Como es complicado reproducir este cambio en un proceso de optimización, en la zona próxima a la transición trataremos de ayudar al programa a que haga variaciones más grandes: antes de cada paso de minimización, a cada elemento de las matrices K, R y Z le sumaremos o restaremos un número aleatorio, cuyo valor es como máximo el 10 % del elemento de matriz correspondiente. 19 5 Modelos y resultados 5.1. Modelo de Lieb-Liniger Modelo teórico El modelo de Lieb-Liniger describe un sistema de partı́culas bosónicas no relativistas en una dimensión que exhiben interacción de contacto (potencial delta de Dirac). Es por tanto el modelo con interacción más sencillo posible. El hamiltoniano correspondiente (con unidades en las que ~ = 2m = 1) es † Z ∞ dψ (x) dψ(x) † † H= dx + cψ (x)ψ (x)ψ(x)ψ(x) (5.1) dx dx −∞ La interacción es repulsiva haciendo c > 0. El número de partı́culas es una cantidad conservada para este hamiltoniano, [H, N ] = 0. Por lo tanto, partiendo de un estado en el subespacio de Fock con N0 partı́culas, la evolución dada por el hamiltoniano no saca al sistema de ese subespacio. El modelo de Lieb-Liniger se puede resolver exactamente mediante el ansatz de Bethe [16][17]. Si la densidad de partı́culas es ρ, se puede definir un acoplamiento adimensional γ= c ρ (5.2) La energı́a del estado fundamental se puede escribir en términos de la densidad y de la densidad de energı́a e, que depende solo del acoplamiento adimensional: ELL (c, ρ) = ρ3 e(γ) (5.3) La función e(γ) no tiene una expresión analı́tica, aunque se pueden emplear las fórmulas asintóticas: 4 √ lı́m e(γ) = γ 1 − γ →γ (5.4a) γ→0 3π 2 1 2 γ 1 lı́m e(γ) = π → π2 (5.4b) γ→∞ 3 γ+2 3 El primer lı́mite es la aproximación de campo medio. El lı́mite de acoplamiento infinito se conoce como aproximación de Tonks-Girardeau, y corresponde a tener una única partı́cula por sitio. En la actualidad se pueden hacer sistemas fı́sicos que reproduzcan el modelo de Lieb-Liniger, por ejemplo en condensados atrapados en trampas ópticas cuasiunidimensionales [18]. Energı́a El primer objetivo de las simulaciones es comprobar si los resultados que producen son correctos. Para ello, se utiliza un modelo sencillo, el modelo de Lieb-Liniger, y se comparan los resultados con los publicados previamente, tanto con el mismo método [3] [11], como con los resultados analı́ticos [16] [17]. En esta simulación se calcula la energı́a del nivel fundamental del modelo de Lieb-Liniger (5.1), en función del parámetro de la interacción c. Para ello se trabaja con la densidad de partı́culas fija en hN i = ρ = 1, y se emplean distintos valores de la dimensión de enlace D. El resultado se muestra en la figura 5.1a Para poder cuantificar la calidad de los datos, se realiza el ajuste de los resultados para c > 50 2 c a una dependencia del tipo E(c) = A c+B , obteniendo los parámetros de ajuste recogidos en 20 (b) 4 4 3.5 3.5 3 3 2.5 2.5 2 2 E E (a) 1.5 1.5 D=2 D=3 D=4 D=6 1 0.5 1 D = 4, convergencia 0.5 Tonks-Girardeau D=2 D=3 Tonks-Girardeau 0 0 0 50 100 150 200 250 300 0 c 50 100 150 200 250 c Figura 5.1: (a) Densidad de energı́a E en el modelo Lieb-Liniger en función de la intensidad c. (b) Proceso de convergencia hasta el resultado óptimo con D = 4. Se observa que el sistema permanece bastante tiempo en las curvas que se obtenı́an con D = 2 y D = 3. D 2 3 4 6 A 3.97921 3.65069 3.3646 3.31124 B 2.18811 2.23825 1.87705 1.96327 Tabla 5.1: Ajustes de los datos a la forma funcional asintótica. la tabla 5.1. Se observa que con D = 2 y D = 3 no es posible recrear los resultados analı́ticos, pero con muy poco esfuerzo computacional adicional, a partir de D = 4 los resultados obtenidos difieren en un 2 % de los que cabrı́a esperar y convergen rápidamente hacia la solución exacta. Este es el comportamiento esperado, ya que incluso con dimensiones de enlace muy bajas se puede reproducir fielmente los estados relevantes. Es interesante ver lo que ocurre al simular un campo en una dimensión relativamente grande (D ≥ 4) partiendo de valores iniciales aleatorios, como se ilustra en la figura 5.1b. En un principio no se obtienen las curvas de la figura 5.1a, sino que hacen falta varios barridos aumentando y disminuyendo secuencialmente c para que la solución converja. Mientras tanto, los puntos que se obtienen no aparecen en cualquier sitio: solo están sobre las curvas obtenidas para D = 2 y D = 3. Esto puede indicar que se están observando distintos niveles del espectro discreto de energı́as. Introducción de potencial quı́mico Efectuando la transformada de Legendre respecto del número de partı́culas se obtiene el hamiltoniano gran canónico Z H= ∞ −∞ dx dΨ† (x) dΨ(x) † † † + cΨ (x)Ψ (x)Ψ(x)Ψ(x) − µΨ (x)Ψ(x) dx dx (5.5) Las propiedades termodinámicas [17] en el lı́mite de Tonks-Girardeau están dadas por las expresión: µ = (πρ)2 (5.6) En la gráfica 5.2a se observa cómo el modelo es capaz de reproducir esta dependencia, incluso con valores bajos de D. 21 (a) (b) 1 10 0.1 0.1 E N 1 0.01 D=2 D=3 Tonks-Girardeau 0.01 0.1 D=2 D=3 Tonks-Girardeau 0.001 1 10 0.1 1 µ 10 µ Figura 5.2: Densidad de número de partı́culas (a) y energı́a (b) en el modelo de Lieb-Liniger con potencial quı́mico µ en el lı́mite de Tonks-Girardeau. Sustituyendo en la expresión para la energı́a en el lı́mite de Tonks-Girardeau (5.4b), se obtiene π 2 3 π 2 µ3/2 1 3/2 E= ρ = = µ (5.7) 3 3 π3 3π En la figura 5.2b se aprecia cómo la energı́a como el número de partı́culas ajusta bien a la previsión teórica, incluso con valores bajos de D. Funciones de correlación Las últimas magnitudes que calcularemos con el modelo con un único campo son las funciones de correlación densidad-densidad. Las funciones de correlación densidad-densidad, como la gráfica 5.3, se ajustan satisfactoriamente a los resultados teóricos. En concreto, para valores elevados de x las densidades de los dos puntos son independientes y hn(x)n(0)i = hn(x)ihn(0)i = ρ2 (5.8) Para distancias cortas, al aproximarse al régimen de Tonks-Girardeau los bosones son prácticamente impenetrables, por lo que la función de correlación tiende a cero. Si por el contrario la constante c es pequeña, las partı́culas apenas interaccionan y su comportamiento se asemeja al de un gas ideal de bosones: las densidades están más próximas a ser independientes. Los resultados obtenidos reproducen correctamente las funciones de correlación teóricas [19]. 1 hn(x)n(0)i 0.8 0.6 0.4 c = 0.2 c=2 c = 20 c = 200 0.2 0 0 1 2 3 4 5 x Figura 5.3: Funciones de correlación densidad-densidad para varios valores de c en dimensión D = 4. 22 5.2. Dos campos acoplados Modelo teórico y transición de fase El modelo que emplearemos son dos campos de Lieb-Liniger con un acoplamiento dependiente de la densidad. La intensidad del acoplamiento es g. Z H= L dx 0 X α=1,2 ∂x ψα† ∂x ψα + cψα† ψα† ψα ψα + gψ1† ψ2† ψ1 ψ2 = HLL ⊗ 1 + 1 ⊗ HLL + gn1 n2 (5.9) El hamiltoniano conmuta con la densidad de partı́culas de cada especie por separado, [H, ρ1 ] = [H, ρ2 ] = 0. Esto nos permite mantener las densidades fijas y emplearlas como restricciones para la minimización. Mantendremos la densidad total ρ = ρ1 + ρ2 fija. En el caso de dos campos independientes, g = 0, el término dominante en el hamiltoniano corresponde a la repulsión entre partı́culas de la misma especie. Como consecuencia, la situación de mı́nima energı́a se produce cuando hay la menor densidad de partı́culas posible de cada especie, es decir, ρ1 = ρ2 = 12 ρ. En el caso de interacción elevada, c → ∞: E= π2 3 (ρ1 + ρ2 3 ) 3 dE = π 3 (ρ1 2 dρ1 + ρ2 3 dρ2 ) = π 3 (ρ1 2 − ρ2 2 )dρ1 = 0 y en el caso de c → 0: (5.10) 1 ρ1 = ρ2 = ρ 2 E = ρ1 3 γ1 + ρ2 3 γ2 = c(ρ1 2 + ρ2 2 ) dE = 2c(ρ1 dρ1 + ρ2 dρ2 ) = 2c(ρ1 − ρ2 )dρ1 = 0 (5.11) (5.12) ρ1 = ρ2 = 1 2 (5.13) Por el contrario, en el lı́mite de acoplo elevado entre los dos campos elevados, g → ∞, el hamiltoniano se puede aproximar como H ≈ gn1 n2 (5.14) En estas condiciones, domina la repulsión entre las dos especies. La mı́nima energı́a corresponderá, por lo tanto, a que solo esté presente una de las dos especies: ρ1 = ρ, ρ2 = 0 o ρ1 = 0, ρ2 = ρ. En el rango intermedio de acoplo, se producirá la transición de fase entre ambos comportamientos. Para estimar el punto en el que tendrá lugar, aplicamos la aproximación de ThomasFermi, consistente en despreciar el término cinético del hamiltoniano, con lo que el sistema es resoluble H = c(ρ1 2 + ρ2 2 ) + gρ1 ρ2 = cρ1 2 + c(ρ − ρ1 )2 + gρ1 (ρ − ρ1 ) (5.15) dH = 2cρ1 + 2c(ρ1 − ρ) + gρ − 2gρ1 = (2c − g)(2ρ1 − ρ) = 0 dρ1 (5.16) Se observa que ρ1 = 12 ρ siempre hace la energı́a extremal. Para comprobar si es un máximo o un mı́nimo, recurrimos a la segunda derivada d2 E = 2(2c − g) dρ1 2 (5.17) En consecuencia, la transición de fase se produce en g ∗ = 2c. Para g < g ∗ , el estado de mı́nima energı́a es que los dos campos tengan la misma densidad, mientras que en g > g ∗ , se produce la separación de las dos especies [20]. 23 Figura 5.4: Transición de fase entre dos campos con igual población (acoplamiento g bajo, izquierda) y poblamiento de un único campo (g elevado, derecha). Cabe preguntarse cuál será el estado cuántico del sistema |ϕ(ρ, g)i en las dos fases. En primer lugar, con g = 0, simplemente se tienen dos campos de Lieb-Liniger independientes con densidad ρ/2: |ϕ(ρ, g = 0)i = |χ(ρ/2)i ⊗ |χ(ρ/2)i (5.18) La energı́a correspondiente a este estado será E(ρ, g = 0) = hϕ(ρ, g = 0)| H |ϕ(ρ, g = 0)i = 2ELL (ρ/2) (5.19) Para valores de g pequeños, el término de acoplamiento se puede considerar como una perturbación respecto al hamiltoniano de los dos campos independientes, por lo que la corrección a la energı́a se puede calcular por teorı́a de perturbaciones: E(ρ, g) ≈ 2ELL (ρ/2) + hϕ(ρ, g = 0)| gn1 n2 |ϕ(ρ, g = 0)i = 2ELL (ρ/2) + g ρ2 4 (5.20) Una vez superada la transición, uno de los campos está en el estado del vacı́o, y el otro en el estado de un Lieb-Liniger sencillo de densidad ρ. El estado más general para describir el sistema es una superposición de las dos posibles elecciones: |ϕ(ρ, g)i = α |χ(ρ)i ⊗ |Ωi + β |Ωi ⊗ |χ(ρ)i |α|2 + |β|2 = 1 (5.21) Todos estos estados están degenerados en energı́a: n1 n2 |χ(ρ)i ⊗ |Ωi = n1 n2 |Ωi ⊗ |χ(ρ)i = 0 E(ρ, g) = hϕ(ρ, g)| H |ϕ(ρ, g)i = ELL (ρ) (5.22) Sin embargo, difieren en el valor esperado de la densidad de cada uno de los campos: ρ1 = hϕ(ρ, g)| n1 |ϕ(ρ, g)i = |α|2 ρ ρ2 = hϕ(ρ, g)| n2 |ϕ(ρ, g)i = |β|2 ρ (5.23) En las simulaciones de dos campos de Lieb-Liniger acoplados, nos centraremos en intentar localizar y caracterizar la transición de fase que se produce al variar el parámetro de acoplo entre campos g. Para ello mantendremos la densidad total del sistema fija, y emplearemos P = 4 pares de matrices Z para representar el acoplamiento a nivel del sistema auxiliar. Energı́a Un indicador importante de la transición es el comportamiento de la energı́a en función del acoplo g, representado en la figura 5.5. Con acoplos elevados, solo existe población en uno de los campos, por lo que la energı́a no puede depender de la intensidad de esta interacción: su valor 24 deberı́a ser el de la energı́a de un modelo de Lieb-Liniger con densidad ρ. Por el contrario, con acoplos bajos sı́ que existen interacciones interespecie, y la energı́a mostrará una dependencia con g. Aunque en principio no conocemos cómo es esa dependencia (además de monótonamente creciente), sı́ que podemos saber que, con g = 0, la energı́a de cada uno de los campos es la de un modelo de Lieb-Liniger con densidad ρ/2. 10 E 8 6 4 c=1 c=2 c=5 2 0 2 4 6 8 10 12 14 g Figura 5.5: Energı́a total. Para la simulación se ha usado D = 4 y ρ = 2, y varios parámetros de la interacción de Lieb-Liniger c. Tal y como se esperaba, la energı́a va aumentando al incrementar g hasta que se produce la transición en g = 2c. A partir de ese punto, la energı́a se mantiene siempre constante. Para comprobar si, además de cualitativamente, la simulación también se comporta de forma adecuada cuantitativamente, podemos comparar los valores numéricos de la energı́a en los casos extremos con los que se obtendrı́an con el modelo de Lieb-Liniger sin acoplar en la simulación previa. Los resultados se recogen en la tabla 5.2 c 1 2 5 Simulación g = 0 1.31 2.20 3.87 Lieb-Liniger 2E(ρ/2) 1.29 2.13 3.59 Simulación g > 2c 2.99 5.25 10.24 Lieb-Liniger E(ρ) 2.98 5.17 9.81 Tabla 5.2: Comparación entre la energı́a para los dos campos acoplados (simulación) y la situación correspondiente con un solo campo (Lieb-Liniger ). El grado de acuerdo entre las simulaciones dos campos y el resultado previsto con las simulaciones de un único campo es bastante bueno, en especial cuando c es bajo. Densidad Otro de los aspectos que permiten distinguir la transición de fases es la densidad que presentan ambos campos, representada en 5.6a En todas las simulaciones realizadas se encuentra que, en el régimen de g > 2c, se cumple que |∆ρ| = |ρ1 − ρ2 | = ρ. Ası́ pues, aunque el sistema en principio pueda encontrarse en cualquier superposición de los estados con uno de los campos despoblados (5.21), solo se observan los casos de α = 1 y α = 0. Esto se puede justificar porque son los estados con menor entrelazamiento, y por tanto los que se describen con mayor facilidad por el cMPS. Añadiendo más restricciones a la relación que deben guardar las densidades de los dos campos se podrı́a forzar a otros valores de |∆ρ| con la misma energı́a. En la gráfica 5.6b se aprecia que, para distintos valores de c, en el valor g = 2c se produce una variación muy brusca entre las dos fases, lo cual es una señal inequı́voca de una transición 25 (a) (b) 2 1 0.8 |∆ρ|/ρ 1.5 ρ 1 0.6 0.4 0.5 0.2 ρ1 ρ2 c=1 c=2 c=5 0 0 2 2.5 3 3.5 4 4.5 0 5 2 4 6 8 10 12 14 g g Figura 5.6: (a) Población en los dos campos. Los parámetros utilizados son D = 4, c = 2, ρ = 2 y P = 3. (b) Diferencia de población entre los campos. Se ha usado D = 4 y ρ = 2, y varios valores de c. de fase. Para valores de g algo menores se observa una cierta fluctuación respecto de ∆ρ = 0. Esto es la consecuencia del método empleado para la simulación, en el que a las matrices que describen el estado se les ha añadido una componente aleatoria. Funciones de correlación La diferencia cualitativa de comportamiento también se manifiesta en las funciones de correlación densidad-densidad. Para g = 0 (figura 5.7a), los dos campos son independientes, lo que se ve claramente porque hn1 (x)n2 (0)i = hn1 (x)ihn2 (0)i = (ρ/2)2 . Además, las funciones de correlación para ambos campos son idénticas entre sı́ y a la figura 5.3. (a) (b) 1.2 1.2 1 1 (c) 4 3.5 0.6 0.4 hn1(0)n1(x)i hn2(0)n2(x)i hn1(0)n2(x)i 0.2 0 0 1 2 3 hn(x)n(0)i hn(x)n(0)i hn(x)n(0)i 3 0.8 0.8 0.6 0.4 hn1(0)n1(x)i hn2(0)n2(x)i hn1(0)n2(x)i 0.2 0 4 5 0 1 2 x 3 x 2.5 2 1.5 hn1(0)n1(x)i hn2(0)n2(x)i hn1(0)n2(x)i 1 0.5 0 4 5 0 1 2 3 4 5 x Figura 5.7: Funciones de correlación con g = 0 (a), g =2.8 (b) y g =4.4 (c). Cálculos realizados con D = 4, P = 3, c = 2 ρ = 2. Para g > 2c, como se observa en la figura 5.7c, uno de los dos campos tiene densidad nula, como demuestra el hecho de que su función de correlación sea nula a todas las distancias. Al otro campo le corresponde la función de correlación de un campo de Lieb-Liniger simple con densidad doble. Por último, también se han calculado las funciones de correlación en el caso g < 2c, representadas en la figura 5.7b. Es interesante notar que en estas condiciones las densidades de los dos campos no son independientes entre sı́, hn1 (x)n2 (0)i = 6 hn1 (x)ihn2 (0)i. Además, las correlaciones de ambos campos son prácticamente iguales, lo que indica que el estado es simétrico bajo la inversión de los dos campos. 26 Conclusiones En la primera parte de la memoria del trabajo hemos seguido los pasos que han llevado a la elaboración del modelo teórico que lo sustenta. Se ha argumentado que en los sistemas fı́sicos de la materia condensada la simulación por fuerza bruta es una aproximación ineficiente e inútil, y que una buena solución es la selección de los estados fı́sicamente relevantes. Para ello se ha visto cómo emplear los estados producto de matrices para sistemas unidimensionales discretos, y los estado producto de matrices continuos para campos unidimensionales. Se ha comprobado también que es posible describir de este modo varios campos que interaccionan entre sı́, y cómo esta interacción puede dar lugar a una transición de fase. En la segunda parte de la memoria se ha dado el salto del papel al ordenador, y se ha expuesto el proceso de simulación numérica de campos cuánticos guiada por los métodos estudiados. Se han realizado simulaciones con un único campo cuántico, comprobando que se obtienen los resultados correctos al calcular en el modelo de Lieb-Liniger la energı́a, las funciones de correlación, y las propiedades termodinámicas en el conjunto gran canónico. Una vez verificada la solvencia y eficacia computacional del método, se ha procedido a la obtención de resultados novedosos en la simulación de dos campos de Lieb-Liniger acoplados. Se ha comprobado que variando la intensidad del acoplo se produce una transición de fase en la que uno de los campos queda despoblado, y que dicha transición deja signaturas en la energı́a, la densidad de partı́culas y las funciones de correlación. Los resultados obtenidos en este trabajo permitirán la realización experimental mediante simuladores cuánticos de sistemas análogos a los modelos teóricos empleados, en los que se espera reproducir la transición de fase. Dichos experimentos se realizarán en una colaboración con el grupo de Andreas Wallraf (ETH-Zürich). 27 Bibliografı́a [1] A. Altland y B. Simons, Condensed Matter Field Theory. Cambridge University Press, 2010. [2] T. Giamarchi, Quantum Physics in One Dimension. Clarendon Press, 2003. [3] F. Verstraete y J. I. Cirac, Continuous matrix product states for quantum fields, Physical Review Letters 104 no. 19, (2010) 1–4, arXiv:1002.1824. [4] F. Quijandrı́a, J. J. Garcı́a-Ripoll, y D. Zueco, Continuous matrix product states for coupled fields: Application to Luttinger Liquids and quantum simulators, Physical Review B - Condensed Matter and Materials Physics 90 no. 23, (2014) 1–10, arXiv:1409.4709v1. [5] C. Cohen-Tannoudji, B. Diu, y F. Laloë, Quantum Mechanics. Volume one. Hermann-John Wiley & Sons, 1977. [6] M. A. Nielsen y I. L. Chuang, Quantum Computation and Quantum Information. Cambridge University Press, 2000. [7] A. Rivas y S. F. Huelga, Open Quantum Systems. An Introduction. Springer, 2011. arXiv:1104.5242v2. [8] J. Eisert, Entanglement and tensor network states, Modeling and Simulation 3 no. 520, (2013) 39, arXiv:1308.3318. [9] C. Cohen-Tannoudji, J. Dupont-Roc, y G. Grynberg, Photons and Atoms: Introduction to Quantum Electrodynamics. Wiley, 1989. [10] C. Cohen-Tannoudji, B. Diu, y F. Laloë, Quantum Mechanics. Volume two. Hermann-John Wiley & Sons, 1977. [11] M. Rispler, Continuous Matrix Product State Representations for Quantum Field Theory. Msc dissertation, Imperial College London, 2012. https://workspace.imperial.ac.uk/theoreticalphysics/Public/MSc/ Dissertations/2012/ManuelRisplerDissertation.pdf. [12] R. Orús, A practical introduction to tensor networks: Matrix product states and projected entangled pair states, Annals of Physics 349 (2014) 117–158, arXiv:1306.2164. [13] J. Haegeman, J. I. Cirac, T. J. Osborne, y F. Verstraete, Calculus of continuous matrix product states, Physical Review B - Condensed Matter and Materials Physics 88 no. 8, (2013) 1–47, arXiv:1211.3935. [14] M. Galassi, GNU Scientific Library Reference Manual, 2009. http://www.gnu.org/software/gsl/. [15] S. G. Johnson, The NLopt nonlinear-optimization package, 2014. http://ab-initio.mit.edu/wiki/index.php/NLopt. [16] M. Olshanii y V. Dunjko, Short-distance correlation properties of the Lieb-Liniger system and momentum distributions of trapped one-dimensional atomic gases., Physical Review Letters 91 no. 9, (2003) 090401, arXiv:cond-mat/0210629. [17] M. Zvonarev, Correlations in 1D boson and fermion systems: exact results. PhD thesis, Copenhagen University, 2005. 28 [18] H. Moritz, T. Stöferle, M. Köhl, y T. Esslinger, Exciting Collective Oscillations in a Trapped 1D Gas, Physical Review Letters 91 no. 25, (Dec., 2003) , arXiv:cond-mat/0307607. [19] M. A. Cazalilla, Bosonizing one-dimensional cold atomic gases, Journal of Physics B: Atomic, Molecular and Optical Physics 37 no. 7, (Apr., 2004) S1–S47, arXiv:cond-mat/0307033. [20] A. K. Kolezhuk, Stability of low-dimensional multicomponent dilute Bose gases, Physical Review A - Atomic, Molecular, and Optical Physics 81 no. 1, (2010) 1–6, arXiv:0903.1647v4. [21] S. B. Papp, J. M. Pino, y C. E. Wieman, Tunable miscibility in a dual-species Bose-Einstein condensate, Physical Review Letters 101 no. 4, (2008) 1–5, arXiv:0802.2591. [22] L. E. Sadler, J. M. Higbie, S. R. Leslie, M. Vengalattore, y D. M. Stamper-Kurn, Spontaneous symmetry breaking in a quenched ferromagnetic spinor Bose-Einstein condensate., Nature 443 no. 7109, (2006) 312–315, arXiv:cond-mat/0605351. [23] E. Timmermans, Phase separation of Bose-Einstein condensates, Physical Review Letters 81 no. 26, (1997) 11, arXiv:cond-mat/9709301. 29 A Cálculos con cMPS Para describir la dinámica en el formalismo cMPS se utilizará un espacio de Hilbert auxiliar Haux además del espacio del campo Hf , H = Haux ⊗ Hf . El operador hamiltoniano en este espacio es H = Q ⊗ 1 + R ⊗ ψ† (A.1) El estado cMPS se define como la acción del operador U sobre el vacı́o, trazando sobre los grados de libertad del sistema auxiliar: Z L Hds |Ωi (A.2) |χi = traux P exp 0 En el hamiltoniano usado, se puede asociar la parte de H0 = Q ⊗ I como el hamiltoniano libre y V = R ⊗ ψ † como una interacción. Trabajando en la imagen de interacción: UI (x0 , x) = U0† (x0 , x)U (x0 , x) (A.3) Haciendo MQ (a, b) = eH0 (b−a) y V (x) = R(x) ⊗ ψ † (x), podemos escribir el estado cMPS como "∞ Z # X |χi = traux MQ (0, x1 )(R(x1 ) ⊗ ψ † (x1 ))MQ (x1 , x2 ) · · · MQ (xn , L) |Ωi = " = traux n=0 0≤x1 ≤···≤L ∞ Z X n=0 # MQ (0, x1 )R(x1 )MQ (x1 , x2 ) · · · R(xn )MQ (xn , L) ψ † (x1 ) · · · ψ † (xn ) |Ωi (A.4) Por lo tanto, el estado cMPS se puede expresar como una superposición de estados con 1, 2, . . . , n partı́culas (estados de Fock): XZ |χi = dx1 · · · dxn φ(x1 , · · · , xn )ψ † (x1 ) · · · ψ † (xn ) |Ωi (A.5) n 0<x1 <···<xn <L donde los coeficientes de la combinación lineal son φ(x1 , · · · , xn ) = hΩ| ψ(x1 ) · · · ψ(xn ) |χi (A.6) Teniendo en cuenta las relaciones de conmutación para los operadores del campo [ψ(x), ψ † (x1 )] = δ(x − x1 ) [ψ(x), ψ † (x1 )ψ † (x2 )] = ψ † (x2 )δ(x − x1 ) + ψ † (x1 )δ(x − x2 ) X [ψ(x), ψ † (x1 ) · · · ψ † (xn )] = ψ † (x1 ) · · · ψ † (xm−1 )ψ † (xm+1 ) · · · ψ † (xn )δ(x − xm ) (A.7) m con lo cual, utilizando el desarrollo de la exponencial que hemos encontrado antes e integrando en xm , se obtiene Z L Z x Z L ψ(x), P exp Hds = P exp Hds R(x) P exp Hds (A.8) 0 0 x Una vez conocido este conmutador, ya podemos expresar el estado cMPS desarrollado en los estados de Fock (1.24), pasando los operadores de destrucción a la parte derecha (normal ordering), teniendo en cuenta que: Z L Z L Z x Z L ψ(x)P exp Hds |Ωi = P exp Hdsψ |Ωi + P exp Hds R(x) P exp Hds |Ωi 0 0 0 x Z x Z L = P exp Hds R(x) P exp Hds |Ωi (A.9) 0 x 30 Aplicándolo sucesivamente con cada uno de los ψ: Z L φ(x1 , · · · , xn ) = hΩ| ψ(x1 ) · · · ψ(xn ) |χi = hΩ| ψ(x1 ) · · · ψ(xn )traux P exp Hds |Ωi 0 Z xn Z L Hds R(xn ) P exp Hds |Ωi = hΩ| ψ(x1 ) · · · traux P exp 0 xn R R x2 RL i h R x1 xn Hds Hds · · · Pe xn−1 R(xn ) Pe xn Hds |Ωi = hΩ| traux Pe 0 Hds R(x1 ) Pe x1 = traux [MQ (0, x1 )R(x1 )MQ (x1 , x2 ) · · · R(xn )MQ (xn , L)] A.1. (A.10) Normalización Una vez obtenido el ket del estado cMPS, su bra asociado es simplemente ∞ Z X ? ? ? hχ| = dy1 · · · dyn hΩ| ψ(y1 ) · · · ψ(yn )traux [MQ (0, y1 )R? (y1 )MQ (y1 , y2 ) · · · R? (yn )MQ (yn , L)] n=0 (A.11) por lo que su norma es: Z ∞ Z X hχ|χi = dy1 · · · dym dx1 · · · dxn hΩ| ψ(y1 ) · · · ψ(ym )ψ † (x1 )ψ † (xn ) |Ωi × n,m=0 ? ? × traux [MQ (0, x1 )R(x1 ) · · · R(xn )MQ (xn , L)]traux [MQ (0, y1 )R? (y1 ) · · · R? (ym )MQ (ym , L)] (A.12) La parte que depende de los campos es simplemente el producto escalar de dos estados del espacio de Fock, que forman parte de una base ortonormal: hΩ| ψ(y1 ) · · · ψ(ym )ψ † (x1 )ψ † (xn ) |Ωi = δnm δ(x1 − y1 ) · · · δ(xn − yn ) (A.13) La parte del sistema auxiliar se puede simplificar teniendo en cuenta las propiedades de las trazas y exponenciales de los productos tensoriales: trAtrB = tr(A ⊗ B) trACtrBD = trAC ⊗ BD = tr(A ⊗ B)(C ⊗ D) exp A ⊗ exp B = exp(A ⊗ 1 + 1 ⊗ B) (A.14) con lo cual, hχ|χi = ∞ Z X n=0 dx1 · · · dxn traux [MQ (0, x1 )R(x1 ) · · · R(xn )MQ (xn , L)] (A.15) ? ? × traux [MQ (0, x1 )R? (x1 ) · · · R? (xm )MQ (xm , L)] ∞ Z X ? ? = dx1 · · · dxn traux [MQ (0, x1 ) ⊗ MQ (0, x1 )R(x1 ) ⊗ R? (x1 ) · · · MQ (xn , L) ⊗ MQ (xn , L)] = n=0 ∞ Z X n=0 dx1 · · · dxn traux × Z x2 exp x1 x1 Z exp 0 ds(Q(s) ⊗ 1 + 1 ⊗ Q? (s) R(x1 ) ⊗ R? (x1 )× Z ds(Q(s) ⊗ 1 + 1 ⊗ Q? (s) · · · R(xn ) ⊗ R? (xn ) exp L xn ds(Q(s) ⊗ 1 + 1 ⊗ Q? (s) Recordando el desarrollo de la exponencial (1.15), finalmente tenemos: Z L Z ? ? hχ|χi = P exp ds(Q(s) ⊗ 1 + 1 ⊗ Q (s) + R(s) ⊗ R (s)) = P exp 0 L T (s)ds (A.16) 0 donde se ha definido el operador de transferencia T como: T = Q ⊗ 1 + 1 ⊗ Q? + R? R 31 (A.17) A.2. Funciones de correlación campo-campo En primer lugar nos interesará calcular la siguiente función de correlación: C(x, y) = hχ| ψ † (x)ψ(y) |χi y>x (A.18) Para hacerlo calcularemos ψ(y) |χi y hχ| ψ † (x) y realizaremos su producto escalar. ψ(y) |χi = traux ψ(y)P exp Z 0 L H(s)ds |Ωi (A.19) que aplicando la relación (A.9) queda Z = traux P exp 0 L Z Hds R(y) P exp L |Ωi Hds 0 (A.20) La primera integral la separamos en dos, una entre 0 y x y otra entre x e y. Las tres integrales las podemos calcular con el desarrollo de Dyson (1.15): " Z Z X Z ψ(y) |χi =traux dx1 dxm1 dy1 ym2 dz1 dzm3 MQ (0, x1 )R(x1 ) · · · MQ (xm1 , x)1MQ (x, y1 ) m1 ,m2 ,m3 # × R(y1 ) · · · MQ (ym2 , y)R(y)MQ (y, z1 )R(z1 ) · · · MQ (zm3 , L) ψ † (x1 ) · · · ψ † (zm3 ) |Ωi (A.21) Procedemos del mismo modo con hχ| ψ † (x), teniendo en cuenta que ahora la integral que debemos separar en dos va entre x y L: hχ| ψ † (x) =traux X Z m1 ,m2 ,m3 dx1 · · · dxm1 Z dy1 · · · ym2 Z ? dz1 · · · dzm3 hΩ| ψ(x1 ) · · · ψ(zm3 )MQ (0, x1 ) (A.22) # ? ? ? ? ? × R? (x1 ) · · · MQ (xm1 , x)R? (x)MQ (x, y1 )R? (y1 ) · · · MQ (ym2 , y)IMQ (y, z1 )R? (z1 ) · · · MQ (zm3 , L) Tal y como pasaba al calcular la normalización, al hacer el producto escalar, la parte que depende de los campos se reduce a un producto de deltas que expresa la ortonormalidad. Y para la parte del sistema auxiliar, de nuevo podemos operar con las propiedades del producto tensorial: ? ? hχ| ψ † (x)ψ(y) |χi =traux MQ (0, x1 ) ⊗ MQ (0, x1 )R(x1 ) ⊗ R? (x1 ) · · · MQ (xm1 , x) ⊗ MQ (xm1 , x)1 ⊗ R? (x) ? ? × MQ (x, y1 ) ⊗ MQ (x, y1 )R(y1 ) ⊗ R? (y1 ) · · · MQ (ym2 , y) ⊗ MQ (ym2 , y)R(y) ⊗ 1 ? ? ? × MQ (y, z1 ) ⊗ MQ (y, z1 )R(z1 ) ⊗ R (z1 ) · · · MQ (zm3 , L) ⊗ MQ (zm3 , L) (A.23) volviendo a aplicar la serie de Dyson, y con la matriz de transferencia T (s), se consigue el siguiente resultado: h R x Ry RL i hχ| ψ † (x)ψ(y) |χi = traux Pe 0 T (s)ds 1 ⊗ R? (x) Pe x T (s)ds R(y) ⊗ 1 Pe y T (s)ds (A.24) 32 A.3. Funciones de correlación densidad-densidad La correlación entre la densidad de partı́culas en dos puntos y < x, es proporcional a la siguiente correlación: hn(x)n(y)i ∼ hχ| ψ † (x)ψ † (y)ψ(y)ψ(x) |χi (A.25) Para calcularla, debemos conocer el valor de ψ(y)ψ(x) |χi: Z ψ(y)ψ(x) |χi =ψ(y)traux ψ(x)P exp Z =traux P exp = X m1 ,m2 ,m3 Z y 0 L 0 Z Hds |Ωi = ψ(y)traux P exp Z Hds R(y) P exp dx1 · · · dxm1 Z x y dy1 · · · dym2 0 Z Hds R(x) P exp Z Hds R(x) P exp Z x L Hds x Hds x L |Ωi dz1 · · · zm3 traux [MQ (0, x1 )R(x1 ) · · · R(xm1 )MQ (xm1 , y)R(y) × MQ (y, y1 )R(y1 ) · · · R(ym2 )MQ (ym2 , x)R(x)MQ (x, z1 )R(z1 ) · · · R(zm3 )MQ (zm3 )]ψ † (x1 ) · · · ψ † (zm3 ) |Ωi (A.26) Para obtener el correspondiente bra se procede de modo análogo. Como ocurrı́a en los casos anteriores, al realizar el producto escalar la parte que depende de los campos se reduce a la condición de ortonormalidad, y la parte del sistema auxiliar se simplifica al expresarla en términos de productos tensoriales: ? ? hψ † (x)ψ † (y)ψ(y)ψ(x)i =traux MQ (0, x1 ) ⊗ MQ (0, x1 )R(x1 ) ⊗ R? (x1 ) · · · R(y) ⊗ R? (y)MQ (y, y1 ) ⊗ MQ (y, y1 ) ? ? × R(y1 ) ⊗ R? (y1 ) · · · MQ (ym2 , x) ⊗ MQ (ym2 , x)R(x) ⊗ R? (x)MQ (x, z1 ) ⊗ MQ (x, z1 ) ? ? × R(z1 ) ⊗ R (z1 ) · · · R(zm3 ) ⊗ R(zm3 )MQ (zm3 , L) ⊗ MQ (zm3 , L) (A.27) que haciendo uso del desarrollo de Dyson, resulta h R y Rx RL i hn(x)n(y)i = traux Pe 0 T (s) ds R(y) ⊗ R? (y) Pe y T (s) ds R(x) ⊗ R? (x) Pe x T (s) ds (A.28) 33 B B.1. Código de los programas Modelo Lieb-Liniger en un campo /∗ ∗ Program t o f i n d t h e minimal e n e r g y i n t h e Lieb−L i n i g e r model as a f u n c t i o n o f t h e i n t e r a c t i o n parameter c i n t h e framework o f t h e Continuous Matrix Product S t a t e (cMPS) Based on t h e code by M. R i s p l e r J o r g e Alda ∗/ #include <s t d i o . h> #include < s t d l i b . h> #include <time . h> //#i n c l u d e < s t r i n g . h> //GNU S c i e n t i f i c L i b r a r y h e a d e r s #include < g s l / g s l m a t h . h> #include < g s l / g s l r n g . h>//Random number g e n e r a t o r #include < g s l / g s l v e c t o r . h> // Vector h a n d l i n g #include < g s l / g s l m a t r i x . h> // Matrix h a n d l i n g #include < g s l / g s l c o m p l e x . h> // Complex numbers #include < g s l / g s l c o m p l e x m a t h . h> // Complex number o p e r a t i o n s #include < g s l / g s l b l a s . h> // L i n e a r a l g e b r a e n g i n e #include < g s l / g s l l i n a l g . h> // O p t i m i z a t i o n #include <n l o p t . h> // A l g o r i t h m t o f i n d t h e s t e a d y s t a t e o f t h e L i o u v i l l i a n #define QR void e x t r a c t ( const g s l v e c t o r ∗x , g s l m a t r i x c o m p l e x ∗H0 , g s l m a t r i x c o m p l e x ∗R0 , unsigned i nt D) ; void e n l a r g e ( double ∗ o r i g , double ∗ d e s t , unsigned i n t n , g s l r n g ∗ rng ) ; void s p r e ( g s l m a t r i x c o m p l e x ∗A, g s l m a t r i x c o m p l e x ∗preA , unsigned i n t D) ; void reprM ( g s l m a t r i x c o m p l e x ∗R0 , unsigned i n t dim ) ; void s p o s t ( const g s l m a t r i x c o m p l e x ∗A, g s l m a t r i x c o m p l e x ∗ postA , unsigned i n t t r a n s , unsigned i nt D) ; void s t e a d y s t a t e f i n d e r ( g s l m a t r i x c o m p l e x ∗H, g s l m a t r i x c o m p l e x ∗R, g s l m a t r i x c o m p l e x ∗ rho , unsigned i nt D) ; double matrixnorm ( g s l m a t r i x c o m p l e x ∗A) ; void powermethod ( g s l m a t r i x c o m p l e x ∗A, g s l v e c t o r c o m p l e x ∗v , unsigned i nt D) ; i n t g s l l i n a l g c o m p l e x Q R d e c o m p ( g s l m a t r i x c o m p l e x ∗ A) ; double p a r t i c l e n u m b e r ( g s l m a t r i x c o m p l e x ∗R, g s l m a t r i x c o m p l e x ∗ rho , unsigned i n t D) ; double e n e r g y d e n s i t y ( g s l m a t r i x c o m p l e x ∗H, g s l m a t r i x c o m p l e x ∗R, g s l m a t r i x c o m p l e x ∗ rho , double c , unsigned i nt D) ; void s a v e ( double ∗x , char ∗ t , unsigned i nt D) ; double b a r r i e r ( unsigned i nt n , const double ∗x , const double ∗ grad , void ∗ myfuncdata ) ; double enr , np , e p s=1e −6, Npart = 0 . 5 3 ; 34 i n t main ( ) { i n t D, j , k , Nbuc ; double min , max , d e l t a ; char i n p u t [ 2 0 0 ] , output [ 5 0 0 ] ; FILE ∗ s e t t i n g s ; i f ( ( s e t t i n g s=f o p e n ( ” s e t t i n g s . t x t ” , ” r t ” ) )==NULL) { p r i n t f ( ” no e x i s t e a r c h i v o s e t t i n g s ” ) ; return −1; } f s c a n f ( s e t t i n g s , ” %s ” , i n p u t ) ; f s c a n f ( s e t t i n g s , ” %s ” , output ) ; f s c a n f ( s e t t i n g s , ” %d” , &D) ; f s c a n f ( s e t t i n g s , ” %l f ” , &min ) ; f s c a n f ( s e t t i n g s , ” %l f ” , &max) ; f s c a n f ( s e t t i n g s , ” %l f ” , &d e l t a ) ; f s c a n f ( s e t t i n g s , ” %d” , &Nbuc ) ; double x [ 2 ∗D∗D ] ; FILE ∗ f ; time t start , stop ; i f ( strcmp ( input , ” r ” )==0){ p r i n t f ( ”random\n” ) ; g s l r n g ∗ rng = g s l r n g a l l o c ( g s l r n g t a u s ) ; f o r ( j =0; j <2∗(D) ∗ (D) ; j ++){ x [ j ] = g s l r n g u n i f o r m ( rng ) ; } } else { f = f o p e n ( input , ” r t ” ) ; f o r ( j =0; j <2∗(D) ∗ (D) ; j ++){ f s c a n f ( f , ” %l f ” , &x [ j ] ) ; } fclose ( f ) ; p r i n t f ( ” l e i d o e l a r c h i v o %s ” , i n p u t ) ; } double c [ 2 ] , mm; c [ 1 ] = D; c [ 0 ] = min ; nlopt nlopt nlopt nlopt o p t opt = n l o p t c r e a t e (NLOPT LN SBPLX, 2∗D∗D) ; s e t m i n o b j e c t i v e ( opt , b a r r i e r , c ) ; s e t x t o l r e l ( opt , 1 e −4) ; s e t m a x e v a l ( opt , 3 0 0 0 0 ) ; // Find t h e g r o u n d s t a t e s p r i n t f ( arch , ”LL %d . t x t ” , D) ; time (& s t a r t ) ; f o r ( j =0; j <Nbuc ; j ++){ f o r ( c [ 0 ] = min ; c [0] <max ; c [0]+= d e l t a ) { n l o p t o p t i m i z e ( opt , x , &mm) ; f = f o p e n ( arch , ” a t ” ) ; f p r i n t f ( f , ” %l f \ t %l f \n” , c [ 0 ] , e n r ) ; fclose ( f ) ; 35 } p r i n t f ( ” %l f \n” , e n r ) ; f o r ( ; c [0] > min ; c [0] −= d e l t a ) { n l o p t o p t i m i z e ( opt , x , &mm) ; f = f o p e n ( arch , ” a t ” ) ; f p r i n t f ( f , ” %l f \ t %l f \n” , c [ 0 ] , e n r ) ; fclose ( f ) ; } } time (& s t o p ) : s a v e ( x , output , D) ; p r i n t f ( ” %0. f s \n” , d i f f t i m e ( stop , s t a r t ) ) ; return 0 ; } double b a r r i e r ( unsigned i nt n , const double ∗x , const double ∗ grad , void ∗ myfuncdata ) { // B a r r i e r f u n c t i o n t o be minimized double e , N, L ; double ∗ c = ( double ∗ ) myfuncdata ; unsigned i nt D = ( unsigned i nt ) c [ 1 ] ; g s l v e c t o r v i e w v = g s l v e c t o r v i e w a r r a y ( x , 2∗D∗D) ; g s l m a t r i x c o m p l e x ∗H = g s l m a t r i x c o m p l e x a l l o c (D, D) ; g s l m a t r i x c o m p l e x ∗R = g s l m a t r i x c o m p l e x a l l o c (D, D) ; g s l m a t r i x c o m p l e x ∗ rho = g s l m a t r i x c o m p l e x a l l o c (D, D) ; e x t r a c t (&v . v e c t o r , H, R, D) ; s t e a d y s t a t e f i n d e r (H, R, rho , D) ; e = e n e r g y d e n s i t y (H, R, rho , c [ 0 ] , D) ; enr = e ; N = p a r t i c l e n u m b e r (R, rho , D) ; np = N; g s l m a t r i x c o m p l e x f r e e (H) ; g s l m a t r i x c o m p l e x f r e e (R) ; g s l m a t r i x c o m p l e x f r e e ( rho ) ; L = e − 0 . 0 0 0 1 ∗ l o g ( (N−Npart ) ) ; //We ’ r e u s i n g a l o g a r i t h m i c b a r r i e r return L ; } void reprM ( g s l m a t r i x c o m p l e x ∗R0 , unsigned i n t dim ) { // A u x i l i a r f u n c t i o n t o p r i n t m a t r i c e s unsigned i nt m, n ; f o r (m=0; m<dim ; m++){ f o r ( n=0; n<dim ; n++){ p r i n t f ( ” %l f+ %l f i \ t ” , GSL REAL( g s l m a t r i x c o m p l e x g e t (R0 , m, n ) ) , GSL IMAG( g s l m a t r i x c o m p l e x g e t (R0 , m, n ) ) ) ; } p r i n t f ( ” \n” ) ; } p r i n t f ( ” \n” ) ; } void r e p r v ( g s l v e c t o r c o m p l e x ∗v ) { // A u x i l i a r f u n c t i o n t o p r i n t v e c t o r s unsigned i nt D = v−>s i z e , i ; 36 f o r ( i =0; i <D; i ++){ p r i n t f ( ” %.3 l f + %.3 l f i \ t ” , GSL REAL( g s l v e c t o r c o m p l e x g e t ( v , i ) ) , GSL IMAG( g s l v e c t o r c o m p l e x g e t ( v , i ) ) ) ; } p r i n t f ( ” \n” ) ; } void s a v e ( double ∗x , char ∗ t , unsigned i nt D) { // A u x i l i a r f u n c t i o n t o s a v e t h e s t a t e t o f i l e int i , j ; char t 1 [ 5 0 0 ] , t 2 [ 5 0 0 ] ; s p r i n t f ( t1 , ”KR %s . t x t ” , t ) ; s p r i n t f ( t2 , ” r h o %s . t x t ” , t ) ; FILE ∗ f = f o p e n ( t1 , ”wt” ) ; f o r ( i =0; i <2∗D∗D; i ++){ f p r i n t f ( f , ” %l f \n” , x [ i ] ) ; } fclose ( f ) ; g s l v e c t o r v i e w v = g s l v e c t o r v i e w a r r a y ( x , 2∗D∗D) ; g s l m a t r i x c o m p l e x ∗H = g s l m a t r i x c o m p l e x a l l o c (D, D) ; g s l m a t r i x c o m p l e x ∗R = g s l m a t r i x c o m p l e x a l l o c (D, D) ; g s l m a t r i x c o m p l e x ∗ rho = g s l m a t r i x c o m p l e x a l l o c (D, D) ; e x t r a c t (&v . v e c t o r , H, R, D) ; s t e a d y s t a t e f i n d e r (H, R, rho , D) ; f = f o p e n ( t2 , ”wt” ) ; f o r ( j =0; j <D; j ++){ f o r ( i =0; i <D; i ++){ f p r i n t f ( f , ” %l f \ t %l f i \n” , GSL REAL( g s l m a t r i x c o m p l e x g e t ( rho , i , j ) ) , GSL IMAG( g s l m a t r i x c o m p l e x g e t ( rho , i , j ) ) ) ; } } fclose ( f ) ; g s l m a t r i x c o m p l e x f r e e (H) ; g s l m a t r i x c o m p l e x f r e e (R) ; g s l m a t r i x c o m p l e x f r e e ( rho ) ; } void e x t r a c t ( const g s l v e c t o r ∗x , g s l m a t r i x c o m p l e x unsigned i nt D) { // Unpacks H and R from a compact v e c t o r s t o r a g e unsigned i nt a , n ,m; f o r (m=0; m<D;m++){ g s l m a t r i x c o m p l e x s e t (H0 , m, m, g s l c o m p l e x } a = D; f o r (m=0; m<D;m++){ f o r ( n=m+1; n<D; n++){ g s l m a t r i x c o m p l e x s e t (H0 , m, n , gsl complex rect ( gsl vector get (x , a) , g s l m a t r i x c o m p l e x s e t (H0 , n , m, gsl complex rect ( gsl vector get (x , a) , a += 2 ; } } 37 ∗H0 , g s l m a t r i x c o m p l e x ∗R0 , r e c t ( g s l v e c t o r g e t ( x ,m) , 0 ) ) ; g s l v e c t o r g e t ( x , a+1) ) ) ; − g s l v e c t o r g e t ( x , a+1) ) ) ; a =0; f o r (m=0;m<D;m++){ f o r ( n=0;n<D; n++){ g s l m a t r i x c o m p l e x s e t (R0 , n , m, g s l c o m p l e x r e c t ( g s l v e c t o r g e t ( x , a+D∗D) , 0 ) ) ; a++; } } } void e n l a r g e ( double ∗ o r i g , double ∗ d e s t , unsigned i n t n , g s l r n g ∗ rng ) { // C r e a t e s a D+1 d i m e n s i o n a l s t a t e form a D d i m e n s i o n a l one unsigned i nt i , j , k , l ; double a l f a =0; f o r ( i =0; i <n ; i ++){ dest [ i ] = orig [ i ] ; } l=i ; d e s t [ i ] = a l f a ∗ g s l r n g u n i f o r m ( rng ) ; i ++; f o r ( j =0; j <n−1; j ++){ f o r ( k=0; k<2∗(n−j −1) ; k++){ i ++; l ++; dest [ l ] = or ig [ i −2]; } d e s t [ l +2] = a l f a ∗ g s l r n g u n i f o r m ( rng ) ; d e s t [ l +1] = a l f a ∗ g s l r n g u n i f o r m ( rng ) ; l +=2; } d e s t [ l +2] = a l f a ∗ g s l r n g u n i f o r m ( rng ) ; d e s t [ l +1] = a l f a ∗ g s l r n g u n i f o r m ( rng ) ; f o r ( i =0; i <(n+1) ∗ ( n+1) ; i ++){ j = i / ( n+1) ; k = i %(n+1) ; i f ( ( j <n )&&(k<n ) ) { d e s t [ i +(n+1) ∗ ( n+1) ] = o r i g [ n∗ j+k+n∗n ] ; } else { d e s t [ i +(n+1) ∗ ( n+1) ] = a l f a ∗ g s l r n g u n i f o r m ( rng ) ; } } } void s p r e ( g s l m a t r i x c o m p l e x ∗A, g s l m a t r i x c o m p l e x ∗preA , unsigned i n t D) { // S u o e r o p e r a t o r f o r l e f t m a t r i x m u l t i p l i c a t i o n g s l m a t r i x c o m p l e x s e t z e r o ( preA ) ; unsigned i nt i ; f o r ( i =0; i <D; i ++){ gsl matrix complex view block = g s l m a t r i x c o m p l e x s u b m a t r i x ( preA , i ∗D, i ∗D, D,D) ; g s l m a t r i x c o m p l e x m e m c p y (& b l o c k . matrix ,A) ; 38 } } void s p o s t ( const g s l m a t r i x c o m p l e x ∗A, g s l m a t r i x c o m p l e x ∗ postA , unsigned i n t t r a n s , unsigned i nt D) { // S u p e r o p e r a t o r f o r r i g h t m a t r i x m u l t i p l i c a t i o n g s l m a t r i x c o m p l e x s e t z e r o ( postA ) ; unsigned i nt i , n , m; gsl complex d ; f o r (m=0;m<D;m++){ f o r ( n=0;n<D; n++){ i f ( trans ){ d = g s l c o m p l e x c o n j u g a t e ( g s l m a t r i x c o m p l e x g e t (A, n , m) ) ; } else { d = g s l m a t r i x c o m p l e x g e t (A, m, n ) ; } f o r ( i =0; i <D; i ++){ g s l m a t r i x c o m p l e x s e t ( postA , i+D∗n , i+D∗m, d ) ; } } } } void s t e a d y s t a t e f i n d e r ( g s l m a t r i x c o m p l e x ∗H, g s l m a t r i x c o m p l e x ∗R, g s l m a t r i x c o m p l e x ∗ rho , unsigned i nt D) { // Finds t h e s t e a d y s t a t e d e n s i t y m a t r i x i n t i =0 , m, n ; g s l c o m p l e x t r = GSL COMPLEX ZERO ; g s l r n g ∗ rng = g s l r n g a l l o c ( g s l r n g t a u s ) ; g s l m a t r i x c o m p l e x ∗L = g s l m a t r i x c o m p l e x a l l o c (D∗D, D∗D) ; g s l m a t r i x c o m p l e x ∗ p o s t = g s l m a t r i x c o m p l e x a l l o c (D∗D, D∗D) ; g s l m a t r i x c o m p l e x ∗ p r e = g s l m a t r i x c o m p l e x a l l o c (D∗D, D∗D) ; g s l m a t r i x c o m p l e x ∗RtR = g s l m a t r i x c o m p l e x a l l o c (D, D) ; g s l v e c t o r c o m p l e x ∗ v e c t r = g s l v e c t o r c o m p l e x a l l o c (D∗D) ; s p r e (H, L , D) ; s p o s t (H, post , 0 , D) ; g s l m a t r i x c o m p l e x s u b (L , p o s t ) ; s p r e (R, pre , D) ; s p o s t (R, post , 1 , D) ; g s l b l a s z g e m m ( CblasNoTrans , CblasNoTrans , g s l c o m p l e x r e c t ( 1 , 0 ) , pre , post , g s l c o m p l e x r e c t ( 0 , −1) , L) ; g s l b l a s z g e m m ( CblasConjTrans , CblasNoTrans , g s l c o m p l e x r e c t ( 1 , 0 ) , R, R, g s l c o m p l e x r e c t ( 0 , 0 ) , RtR) ; s p r e (RtR , pre , D) ; s p o s t (RtR , post , 0 , D) ; g s l m a t r i x c o m p l e x a d d ( pre , p o s t ) ; g s l m a t r i x c o m p l e x s c a l e ( pre , g s l c o m p l e x r e c t ( 0 . 5 , 0 ) ) ; g s l m a t r i x c o m p l e x s u b (L , p r e ) ; g s l m a t r i x c o m p l e x f r e e ( pre ) ; g s l m a t r i x c o m p l e x f r e e (RtR) ; gsl matrix complex free ( post ) ; #i f d e f QR 39 g s l l i n a l g c o m p l e x Q R d e c o m p (L) ; f o r ( i=D∗D−1; i >=0; i −−){ i f ( g s l c o m p l e x a b s ( g s l m a t r i x c o m p l e x g e t (L , i , i ) ) < e p s ) { g s l v e c t o r c o m p l e x s e t ( vectr , i , gsl complex rect (0 ,0) ) ; } else { g s l c o m p l e x hh = g s l c o m p l e x r e c t ( 0 , 0 ) ; int j ; f o r ( j=i −1; j <D∗D; j ++){ hh = g s l c o m p l e x s u b ( hh , g s l c o m p l e x m u l ( g s l m a t r i x c o m p l e x g e t (L , i , j ) ∗ gsl vector complex get ( vectr , j ) ) ) ; } g s l v e c t o r c o m p l e x s e t ( v e c t r , i , g s l c o m p l e x d i v ( hh , g s l m a t r i x c o m p l e x g e t (L , i , i ) ) ) ; } } #e l s e f o r ( i =0; i <v e c t r −>s i z e ; i ++){ g s l v e c t o r c o m p l e x s e t ( vectr , i , g s l c o m p l e x r e c t ( g s l r n g u n i f o r m ( rng ) , g s l r n g u n i f o r m ( rng ) ) ) ; } g s l v e c t o r c o m p l e x s e t ( v e c t r , v e c t r −>s i z e −1, GSL COMPLEX ZERO) ; powermethod (L , v e c t r , D∗D) ; g s l r n g f r e e ( rng ) ; #e n d i f // QR i =0; f o r (m=0; m<D; m++){ f o r ( n=0; n<D; n++){ g s l m a t r i x c o m p l e x s e t ( rho , n , m, g s l v e c t o r c o m p l e x g e t ( v e c t r , i ) ) ; i f (m==n ) t r= g s l c o m p l e x a d d ( t r , g s l v e c t o r c o m p l e x g e t ( v e c t r , i ) ) ; i ++; } } g s l m a t r i x c o m p l e x s c a l e ( rho , g s l c o m p l e x i n v e r s e ( t r ) ) ; g s l m a t r i x c o m p l e x f r e e (L) ; gsl vector complex free ( vectr ) ; } double matrixnorm ( g s l m a t r i x c o m p l e x ∗A) { /∗ Compute t h e i n f −norm o f m a t r i x A∗/ const s i z e t M = A−>s i z e 1 ; double n = 0 , t ; int i , j ; f o r ( i =0; i <M; i ++){ f o r ( j =0; j <M; j ++){ t = g s l c o m p l e x a b s ( g s l m a t r i x c o m p l e x g e t (A, i , j ) ) ; i f ( t > n) n = t ; } } return n ; } double vectornorm ( g s l v e c t o r c o m p l e x ∗v ) { 40 /∗ Compute t h e i n f −norm o f v e c t o r v ∗/ const s i z e t M = v−>s i z e ; double n = 0 , t ; int i ; f o r ( i =0; i <M; i ++){ t = gsl complex abs ( gsl vector complex get (v , i ) ) ; i f ( t > n) n = t ; } return n ; } void powermethod ( g s l m a t r i x c o m p l e x ∗A, g s l v e c t o r c o m p l e x ∗v , unsigned i nt D) { /∗ Compute t h e e i g e n v e c t o r whose e i g e n v a l u e i s l o w e r u s i n g t h e i n v e r s e power method ∗/ i n t i , j , s i g =1; double n ; g s l m a t r i x c o m p l e x ∗L = g s l m a t r i x c o m p l e x a l l o c (D, D) ; g s l m a t r i x c o m p l e x ∗M = g s l m a t r i x c o m p l e x a l l o c (D, D) ; g s l v e c t o r c o m p l e x ∗w = g s l v e c t o r c o m p l e x a l l o c (D) ; double d = matrixnorm (A) ∗ e p s ; f o r ( i =0; i <D; i ++){ f o r ( j =0; j <D; j ++){ i f ( i==j ) { g s l m a t r i x c o m p l e x s e t (L , i , i , g s l c o m p l e x a d d ( g s l m a t r i x c o m p l e x g e t (A, i , i ) , g s l c o m p l e x r e c t (d , 0) ) ) ; } else { g s l m a t r i x c o m p l e x s e t (L , i , j , g s l m a t r i x c o m p l e x g e t (A, i , j ) ) ; } } } g s l p e r m u t a t i o n ∗p = g s l p e r m u t a t i o n a l l o c (D) ; g s l l i n a l g c o m p l e x L U d e c o m p (L , p , &s i g ) ; g s l l i n a l g c o m p l e x L U i n v e r t (L , p , M) ; g s l m a t r i x c o m p l e x f r e e (L) ; gsl permutation free (p) ; f o r ( i =0; i <19; i ++){ g s l b l a s z g e m v ( CblasNoTrans , GSL COMPLEX ONE, M, v , GSL COMPLEX ZERO, w) ; n = vectornorm (w) ; g s l v e c t o r c o m p l e x s c a l e (w, g s l c o m p l e x i n v e r s e ( g s l c o m p l e x r e c t ( n , 0 ) ) ) ; g s l b l a s z g e m v ( CblasNoTrans , GSL COMPLEX ONE, A, w, GSL COMPLEX ZERO, v ) ; n = vectornorm ( v ) ; f o r ( j =0; j <D; j ++){ g s l v e c t o r c o m p l e x s e t ( v , j , g s l v e c t o r c o m p l e x g e t (w, j ) ) ; } i f ( n< e p s ) break ; } g s l m a t r i x c o m p l e x f r e e (M) ; g s l v e c t o r c o m p l e x f r e e (w) ; } double e n e r g y d e n s i t y ( g s l m a t r i x c o m p l e x ∗H, g s l m a t r i x c o m p l e x ∗R, 41 m a t r i x c o m p l e x ∗ rho , double c , unsigned i nt D) { m a t r i x c o m p l e x ∗Q = g s l m a t r i x c o m p l e x a l l o c (D, D) ; m a t r i x c o m p l e x ∗C = g s l m a t r i x c o m p l e x a l l o c (D, D) ; m a t r i x c o m p l e x ∗ aux = g s l m a t r i x c o m p l e x a l l o c (D, D) ; m a t r i x c o m p l e x m e m c p y (Q, H) ; b l a s z g e m m ( CblasConjTrans , CblasNoTrans , g s l c o m p l e x r e c t ( − 0.5 , 0 ) , R, R, g s l c o m p l e x r e c t ( 0 , −1) , Q) ; g s l b l a s z g e m m ( CblasNoTrans , CblasNoTrans , GSL COMPLEX ONE, Q, R, GSL COMPLEX ZERO, C ) ; g s l b l a s z g e m m ( CblasNoTrans , CblasNoTrans , g s l c o m p l e x r e c t ( −1 , 0 ) , R, Q, GSL COMPLEX ONE, C ) ; g s l b l a s z g e m m ( CblasNoTrans , CblasNoTrans , GSL COMPLEX ONE, R, R, GSL COMPLEX ZERO, aux ) ; g s l b l a s z g e m m ( CblasConjTrans , CblasNoTrans , GSL COMPLEX ONE, aux , aux , GSL COMPLEX ZERO, Q) ; g s l m a t r i x c o m p l e x s c a l e (Q, g s l c o m p l e x r e c t ( c , 0 ) ) ; g s l b l a s z g e m m ( CblasConjTrans , CblasNoTrans , GSL COMPLEX ONE, C, C, GSL COMPLEX ZERO, aux ) ; g s l m a t r i x c o m p l e x a d d (Q, aux ) ; g s l b l a s z g e m m ( CblasNoTrans , CblasNoTrans , GSL COMPLEX ONE, rho , Q, GSL COMPLEX ZERO, aux ) ; g s l c o m p l e x z = GSL COMPLEX ZERO ; unsigned i nt i ; f o r ( i =0; i <D; i ++){ z = g s l c o m p l e x a d d ( z , g s l m a t r i x c o m p l e x g e t ( aux , i , i ) ) ; } g s l m a t r i x c o m p l e x f r e e (Q) ; g s l m a t r i x c o m p l e x f r e e (C) ; g s l m a t r i x c o m p l e x f r e e ( aux ) ; return GSL REAL( z ) ; gsl gsl gsl gsl gsl gsl } p a r t i c l e n u m b e r ( g s l m a t r i x c o m p l e x ∗R, g s l m a t r i x c o m p l e x ∗ rho , unsigned D) { m a t r i x c o m p l e x ∗ aux = g s l m a t r i x c o m p l e x a l l o c (D, D) ; m a t r i x c o m p l e x ∗C = g s l m a t r i x c o m p l e x a l l o c (D, D) ; b l a s z g e m m ( CblasConjTrans , CblasNoTrans , GSL COMPLEX ONE, R, R, GSL COMPLEX ZERO, aux ) ; g s l b l a s z g e m m ( CblasNoTrans , CblasNoTrans , GSL COMPLEX ONE, aux , rho , GSL COMPLEX ZERO, C) ; g s l c o m p l e x z = GSL COMPLEX ZERO ; unsigned i nt i ; f o r ( i =0; i <D; i ++){ z = g s l c o m p l e x a d d ( z , g s l m a t r i x c o m p l e x g e t (C, i , i ) ) ; } g s l m a t r i x c o m p l e x f r e e (C) ; g s l m a t r i x c o m p l e x f r e e ( aux ) ; return GSL REAL( z ) ; double int gsl gsl gsl } i n t g s l l i n a l g c o m p l e x Q R d e c o m p ( g s l m a t r i x c o m p l e x ∗ A) { /∗ Compute t h e QR d e c o m p o s i t i o n o f a complex m a t r i x Code by Jonny T a y l o r : h t t p : / / l i s t s . gnu . o r g / a r c h i v e / html / h e l p −g s l /2008 −01/ msg00079 . html ∗/ const s i z e t M = A−>s i z e 1 ; 42 const s i z e t N = A−>s i z e 2 ; g s l v e c t o r c o m p l e x ∗ tau = g s l v e c t o r c o m p l e x a l l o c (GSL MIN (M, N) ) ; size t i ; f o r ( i = 0 ; i < GSL MIN (M, N) ; i ++) { /∗ Compute t h e H o u s e h o l d e r t r a n s f o r m a t i o n t o r e d u c e t h e j −t h column o f t h e m a t r i x t o a m u l t i p l e o f t h e j −t h u n i t v e c t o r ∗/ g s l v e c t o r c o m p l e x v i e w c f u l l = g s l m a t r i x c o m p l e x c o l u m n (A, i ) ; gsl vector complex view c = gsl vector complex subvector (&( c f u l l . v e c t o r ) , i , M−i ) ; gsl complex tau i = gsl complex conjugate ( gsl linalg complex householder transform (&( c . v e c t o r ) ) ) ; g s l v e c t o r c o m p l e x s e t ( tau , i , t a u i ) ; /∗ Apply t h e t r a n s f o r m a t i o n t o t h e r e m a i n i n g columns and u p d a t e t h e norms ∗/ i f ( i + 1 < N) { g s l m a t r i x c o m p l e x v i e w m = g s l m a t r i x c o m p l e x s u b m a t r i x (A, i , i + 1 , M − i , N − ( i + 1) ) ; g s l l i n a l g c o m p l e x h o u s e h o l d e r h m ( t a u i , &(c . v e c t o r ) , &(m. matrix ) ) ; } } return GSL SUCCESS ; } B.2. #include #include #include #include #include #include #include #include #include #include Cálculo de funciones de correlación <s t d i o . h> < s t d l i b . h> < g s l / g s l m a t h . h> < g s l / g s l r n g . h>//Random number g e n e r a t o r < g s l / g s l v e c t o r . h> // Vector h a n d l i n g < g s l / g s l m a t r i x . h> // Matrix h a n d l i n g < g s l / g s l c o m p l e x . h> // Complex numbers < g s l / g s l c o m p l e x m a t h . h> // Complex number o p e r a t i o n s < g s l / g s l b l a s . h> // L i n e a r a l g e b r a e n g i n e < g s l / g s l l i n a l g . h> double e p s = 1 e −6; void reprM ( g s l m a t r i x c o m p l e x ∗R0 , unsigned i n t dim ) ; void r e p r v ( g s l v e c t o r c o m p l e x ∗v ) ; void e x t r a c t ( double ∗x , g s l m a t r i x c o m p l e x ∗H0 , g s l m a t r i x c o m p l e x ∗R0 , unsigned i n t D) ; void expm ( g s l m a t r i x c o m p l e x ∗A, g s l c o m p l e x alpha , i n t dimx ) ; 43 void k r o n e c k e r ( g s l m a t r i x c o m p l e x ∗A, g s l m a t r i x c o m p l e x ∗B, unsigned i nt D, g s l m a t r i x c o m p l e x ∗ prod ) ; void kronAI ( g s l m a t r i x c o m p l e x ∗A, unsigned i nt D, g s l m a t r i x c o m p l e x ∗ prod ) ; void kronIA ( g s l m a t r i x c o m p l e x ∗A, unsigned i nt D, g s l m a t r i x c o m p l e x ∗ prod ) ; void s t e a d y s t a t e f i n d e r ( g s l m a t r i x c o m p l e x ∗H, g s l m a t r i x c o m p l e x ∗R, g s l v e c t o r c o m p l e x ∗ rho , unsigned i nt D) ; double matrixnorm ( g s l m a t r i x c o m p l e x ∗A) ; double vectornorm ( g s l v e c t o r c o m p l e x ∗v ) ; void powermethod ( g s l m a t r i x c o m p l e x ∗A, g s l v e c t o r c o m p l e x ∗v , unsigned i nt D) ; void s p r e ( g s l m a t r i x c o m p l e x ∗A, g s l m a t r i x c o m p l e x ∗preA , unsigned i n t D) ; void s p o s t ( const g s l m a t r i x c o m p l e x ∗A, g s l m a t r i x c o m p l e x ∗ postA , unsigned i n t t r a n s , unsigned i nt D) ; i n t main ( ) { int D = 6 , j , k ; double x [ 2 ∗D∗D] , dx = 0 . 0 1 ; g s l c o m p l e x c f f , cdd ; FILE ∗ f ; f = f o p e n ( ”KR D6 c02 . t x t ” , ” r t ” ) ; f o r ( j =0; j <2∗(D) ∗ (D) ; j ++){ f s c a n f ( f , ” %l f ” , &x [ j ] ) ; } fclose ( f ) ; gsl gsl gsl gsl gsl gsl gsl gsl gsl gsl gsl gsl gsl matrix matrix matrix vector vector vector vector matrix matrix matrix matrix matrix matrix complex complex complex complex complex complex complex complex complex complex complex complex complex ∗H = g s l m a t r i x c o m p l e x a l l o c (D, D) ; ∗R = g s l m a t r i x c o m p l e x a l l o c (D, D) ; ∗Q = g s l m a t r i x c o m p l e x a l l o c (D, D) ; ∗ rho = g s l v e c t o r c o m p l e x a l l o c (D∗D) ; ∗ vaux = g s l v e c t o r c o m p l e x a l l o c (D∗D) ; ∗ v f f = g s l v e c t o r c o m p l e x a l l o c (D∗D) ; ∗vdd = g s l v e c t o r c o m p l e x a l l o c (D∗D) ; ∗T = g s l m a t r i x c o m p l e x a l l o c (D∗D, D∗D) ; ∗RR = g s l m a t r i x c o m p l e x a l l o c (D∗D, D∗D) ; ∗RI = g s l m a t r i x c o m p l e x a l l o c (D∗D, D∗D) ; ∗IR = g s l m a t r i x c o m p l e x a l l o c (D∗D, D∗D) ; ∗A = g s l m a t r i x c o m p l e x a l l o c (D∗D, D∗D) ; ∗B = g s l m a t r i x c o m p l e x a l l o c (D∗D, D∗D) ; e x t r a c t ( x , H, R, D) ; s t e a d y s t a t e f i n d e r (H, R, rho , D) ; g s l m a t r i x c o m p l e x m e m c p y (Q, H) ; g s l b l a s z g e m m ( CblasConjTrans , CblasNoTrans , g s l c o m p l e x r e c t ( − 0.5 , 0 ) , R, R, g s l c o m p l e x r e c t ( 0 , −1) , Q) ; k r o n e c k e r (R, R, D, RR) ; kronAI (Q, D, T) ; kronIA (Q, D, IR ) ; g s l m a t r i x c o m p l e x a d d (T, IR ) ; g s l m a t r i x c o m p l e x a d d (T, RR) ; kronAI (R, D, RI ) ; kronIA (R, D, IR ) ; g s l b l a s z g e m v ( CblasNoTrans , GSL COMPLEX ONE, IR , rho , GSL COMPLEX ZERO, v f f ) ; g s l b l a s z g e m v ( CblasNoTrans , GSL COMPLEX ONE, RR, rho , GSL COMPLEX ZERO, vdd ) ; 44 expm (T, g s l c o m p l e x r e c t ( dx , 0 ) , D∗D) ; f = f o p e n ( ” c o r r D 6 c 0 2 . t x t ” , ”wt” ) ; g s l m a t r i x c o m p l e x m e m c p y (A, T) ; f o r ( j =0; j <5000; j ++){ g s l b l a s z g e m m ( CblasNoTrans , CblasNoTrans , GSL COMPLEX ONE, T, A, GSL COMPLEX ZERO, B) ; g s l b l a s z g e m v ( CblasNoTrans , GSL COMPLEX ONE, B, v f f , GSL COMPLEX ZERO, rho ) ; g s l b l a s z g e m v ( CblasNoTrans , GSL COMPLEX ONE, RI , rho , GSL COMPLEX ZERO, vaux ) ; c f f = GSL COMPLEX ZERO ; f o r ( k=0; k<D∗D; k+=D+1){ c f f = g s l c o m p l e x a d d ( c f f , g s l v e c t o r c o m p l e x g e t ( vaux , k ) ) ; } g s l b l a s z g e m v ( CblasNoTrans , GSL COMPLEX ONE, B, vdd , GSL COMPLEX ZERO, rho ) ; g s l b l a s z g e m v ( CblasNoTrans , GSL COMPLEX ONE, RR, rho , GSL COMPLEX ZERO, vaux ) ; cdd = GSL COMPLEX ZERO ; f o r ( k=0; k<D∗D; k+=D+1){ cdd = g s l c o m p l e x a d d ( cdd , g s l v e c t o r c o m p l e x g e t ( vaux , k ) ) ; } f p r i n t f ( f , ” %l f \ t %l f \ t %l f \n” , j ∗dx , GSL REAL( c f f ) , GSL REAL( cdd ) ) ; g s l m a t r i x c o m p l e x m e m c p y (A, B) ; } fclose ( f ) ; return 0 ; } void reprM ( g s l m a t r i x c o m p l e x ∗R0 , unsigned i n t dim ) { // A u x i l i a r f u n c t i o n t o p r i n t m a t r i c e s unsigned i nt m, n ; f o r (m=0; m<dim ; m++){ f o r ( n=0; n<dim ; n++){ p r i n t f ( ” %l f+ %l f i \ t ” , GSL REAL( g s l m a t r i x c o m p l e x g e t (R0 , m, n ) ) , GSL IMAG( g s l m a t r i x c o m p l e x g e t (R0 , m, n ) ) ) ; } p r i n t f ( ” \n” ) ; } p r i n t f ( ” \n” ) ; } void r e p r v ( g s l v e c t o r c o m p l e x ∗v ) { unsigned i nt D = v−>s i z e , i ; f o r ( i =0; i <D; i ++){ p r i n t f ( ” %.3 l f + %.3 l f i \ t ” , GSL REAL( g s l v e c t o r c o m p l e x g e t ( v , i ) ) , GSL IMAG( g s l v e c t o r c o m p l e x g e t ( v , i ) ) ) ; } p r i n t f ( ” \n” ) ; 45 } void e x t r a c t ( double ∗x , g s l m a t r i x c o m p l e x ∗H0 , g s l m a t r i x c o m p l e x ∗R0 , unsigned i n t D) { unsigned i nt a , n ,m; f o r (m=0; m<D;m++){ g s l m a t r i x c o m p l e x s e t (H0 , m, m, g s l c o m p l e x r e c t ( x [m] , 0 ) ) ; } a = D; f o r (m=0; m<D;m++){ f o r ( n=m+1; n<D; n++){ g s l m a t r i x c o m p l e x s e t (H0 , m, n , g s l c o m p l e x r e c t ( x [ a ] , x [ a +1]) ) ; g s l m a t r i x c o m p l e x s e t (H0 , n , m, g s l c o m p l e x r e c t ( x [ a ] , −x [ a +1]) ) ; a += 2 ; } } a =0; f o r (m=0;m<D;m++){ f o r ( n=0;n<D; n++){ g s l m a t r i x c o m p l e x s e t (R0 , n , m, g s l c o m p l e x r e c t ( x [ a+D∗D] , 0 ) ) ; a++; } } } void s p r e ( g s l m a t r i x c o m p l e x ∗A, g s l m a t r i x c o m p l e x ∗preA , unsigned i n t D) { g s l m a t r i x c o m p l e x s e t z e r o ( preA ) ; unsigned i nt i ; f o r ( i =0; i <D; i ++){ gsl matrix complex view block = g s l m a t r i x c o m p l e x s u b m a t r i x ( preA , i ∗D, i ∗D, D,D) ; g s l m a t r i x c o m p l e x m e m c p y (& b l o c k . matrix ,A) ; } } void s p o s t ( const g s l m a t r i x c o m p l e x ∗A, g s l m a t r i x c o m p l e x ∗ postA , unsigned i n t t r a n s , unsigned i nt D) { g s l m a t r i x c o m p l e x s e t z e r o ( postA ) ; unsigned i nt i , n , m; gsl complex d ; f o r (m=0;m<D;m++){ f o r ( n=0;n<D; n++){ i f ( trans ){ d = g s l c o m p l e x c o n j u g a t e ( g s l m a t r i x c o m p l e x g e t (A, n , m) ) ; } else { d = g s l m a t r i x c o m p l e x g e t (A, m, n ) ; } f o r ( i =0; i <D; i ++){ g s l m a t r i x c o m p l e x s e t ( postA , i+D∗n , i+D∗m, d ) ; } } } } 46 void expm ( g s l m a t r i x c o m p l e x ∗A, g s l c o m p l e x alpha , i n t dimx ) { /∗ Code by S i j o Joseph , h t t p : / / s t a c k o v e r f l o w . com/a /14718470 ∗/ i n t j , k=0; g s l c o m p l e x temp ; g s l m a t r i x ∗ m a t r e a l =g s l m a t r i x a l l o c ( 2 ∗ dimx , 2 ∗ dimx ) ; g s l m a t r i x ∗ e x p m a t r e a l =g s l m a t r i x a l l o c ( 2 ∗ dimx , 2 ∗ dimx ) ; // C o n v e r t i n g t h e complex m a t r i x i n t o r e a l one u s i n g A=[ Areal , Aimag;−Aimag , A r e a l ] f o r ( j = 0 ; j < dimx ; j ++){ f o r ( k = 0 ; k < dimx ; k++){ temp=g s l c o m p l e x m u l ( g s l m a t r i x c o m p l e x g e t (A, j , k ) , a l p h a ) ; g s l m a t r i x s e t ( matreal , j , k , GSL REAL( temp ) ) ; g s l m a t r i x s e t ( matreal , dimx+j , dimx+k , GSL REAL( temp ) ) ; g s l m a t r i x s e t ( matreal , j , dimx+k , GSL IMAG( temp ) ) ; g s l m a t r i x s e t ( matreal , dimx+j , k,−GSL IMAG( temp ) ) ; } } g s l l i n a l g e x p o n e n t i a l s s ( matreal , expmatreal , . 0 1 ) ; double r e a l p ; double imagp ; f o r ( j = 0 ; j < dimx ; j ++){ f o r ( k = 0 ; k < dimx ; k++){ r e a l p=g s l m a t r i x g e t ( expmatreal , j , k ) ; imagp=g s l m a t r i x g e t ( expmatreal , j , dimx+k ) ; g s l m a t r i x c o m p l e x s e t (A, j , k , g s l c o m p l e x r e c t ( r e a l p , imagp ) ) ; } } g s l m a t r i x f r e e ( matreal ) ; g s l m a t r i x f r e e ( expmatreal ) ; } void k r o n e c k e r ( g s l m a t r i x c o m p l e x ∗A, g s l m a t r i x c o m p l e x ∗B, unsigned i nt D, g s l m a t r i x c o m p l e x ∗ prod ) { /∗ Compute Kronecker p r o d u c t A \ o t i m e s B∗ ∗/ int i , j , k , l ; gsl complex d ; f o r ( i = 0 ; i < D; i ++){ f o r ( j = 0 ; j < D; j ++){ d = g s l m a t r i x c o m p l e x g e t (A, i , j ) ; f o r ( k = 0 ; k < D; k++){ f o r ( l = 0 ; l < D; l ++){ g s l m a t r i x c o m p l e x s e t ( prod , D∗ i+k , D∗ j+l , gsl complex mul (d , g s l c o m p l e x c o n j u g a t e ( g s l m a t r i x c o m p l e x g e t (B, k , l ) ) ) ); } } } } } void kronAI ( g s l m a t r i x c o m p l e x ∗A, unsigned i nt D, g s l m a t r i x c o m p l e x ∗ prod ) { 47 /∗ Compute Kronecker p r o d u c t A \ o t i m e s i d ∗/ int i , j , k ; gsl complex d ; f o r ( i =0; i <D; i ++){ f o r ( j =0; j <D; j ++){ d = g s l m a t r i x c o m p l e x g e t (A, i , j ) ; f o r ( k=0; k<D; k++){ g s l m a t r i x c o m p l e x s e t ( prod , D∗ i+k , D∗ j+k , d ) ; } } } } void kronIA ( g s l m a t r i x c o m p l e x ∗A, unsigned i nt D, g s l m a t r i x c o m p l e x ∗ prod ) { /∗ Compute Kronecker p r o d u c t i d \ o t i m e s A∗ ∗/ int i , j , k ; gsl complex d ; f o r ( i =0; i <D; i ++){ f o r ( j =0; j <D; j ++){ d = g s l c o m p l e x c o n j u g a t e ( g s l m a t r i x c o m p l e x g e t (A, i , j ) ) ; f o r ( k=0; k<D; k++){ g s l m a t r i x c o m p l e x s e t ( prod , i+k∗D, j+k∗D, d ) ; } } } } void s t e a d y s t a t e f i n d e r ( g s l m a t r i x c o m p l e x ∗H, g s l m a t r i x c o m p l e x ∗R, g s l v e c t o r c o m p l e x ∗ rho , unsigned i nt D) { i n t i =0 , m, n ; g s l c o m p l e x t r = GSL COMPLEX ZERO ; g s l r n g ∗ rng = g s l r n g a l l o c ( g s l r n g t a u s ) ; g s l m a t r i x c o m p l e x ∗L = g s l m a t r i x c o m p l e x a l l o c (D∗D, D∗D) ; g s l m a t r i x c o m p l e x ∗ p o s t = g s l m a t r i x c o m p l e x a l l o c (D∗D, D∗D) ; g s l m a t r i x c o m p l e x ∗ p r e = g s l m a t r i x c o m p l e x a l l o c (D∗D, D∗D) ; g s l m a t r i x c o m p l e x ∗RtR = g s l m a t r i x c o m p l e x a l l o c (D, D) ; s p r e (H, L , D) ; s p o s t (H, post , 0 , D) ; g s l m a t r i x c o m p l e x s u b (L , p o s t ) ; s p r e (R, pre , D) ; s p o s t (R, post , 1 , D) ; g s l b l a s z g e m m ( CblasNoTrans , CblasNoTrans , g s l c o m p l e x r e c t ( 1 , 0 ) , pre , post , g s l c o m p l e x r e c t ( 0 , −1) , L) ; g s l b l a s z g e m m ( CblasConjTrans , CblasNoTrans , g s l c o m p l e x r e c t ( 1 , 0 ) , R, R, g s l c o m p l e x r e c t ( 0 , 0 ) , RtR) ; s p r e (RtR , pre , D) ; s p o s t (RtR , post , 0 , D) ; g s l m a t r i x c o m p l e x a d d ( pre , p o s t ) ; g s l m a t r i x c o m p l e x s c a l e ( pre , g s l c o m p l e x r e c t ( 0 . 5 , 0 ) ) ; g s l m a t r i x c o m p l e x s u b (L , p r e ) ; g s l m a t r i x c o m p l e x f r e e ( pre ) ; g s l m a t r i x c o m p l e x f r e e (RtR) ; 48 gsl matrix complex free ( post ) ; f o r ( i =0; i <rho−>s i z e ; i ++){ g s l v e c t o r c o m p l e x s e t ( rho , i , g s l c o m p l e x r e c t ( g s l r n g u n i f o r m ( rng ) , g s l r n g u n i f o r m ( rng ) ) ) ; } powermethod (L , rho , D∗D) ; g s l m a t r i x c o m p l e x f r e e (L) ; g s l r n g f r e e ( rng ) ; i =0; f o r (m=0; m<D∗D; m+= (D+1) ) { t r= g s l c o m p l e x a d d ( t r , g s l v e c t o r c o m p l e x g e t ( rho , m) ) ; } g s l v e c t o r c o m p l e x s c a l e ( rho , g s l c o m p l e x i n v e r s e ( t r ) ) ; } double matrixnorm ( g s l m a t r i x c o m p l e x ∗A) { /∗ Compute t h e i n f −norm o f m a t r i x A∗/ const s i z e t M = A−>s i z e 1 ; double n = 0 , t ; int i , j ; f o r ( i =0; i <M; i ++){ f o r ( j =0; j <M; j ++){ t = g s l c o m p l e x a b s ( g s l m a t r i x c o m p l e x g e t (A, i , j ) ) ; i f ( t > n) n = t ; } } return n ; } double vectornorm ( g s l v e c t o r c o m p l e x ∗v ) { /∗ Compute t h e i n f −norm o f v e c t o r v ∗/ const s i z e t M = v−>s i z e ; double n = 0 , t ; int i ; f o r ( i =0; i <M; i ++){ t = gsl complex abs ( gsl vector complex get (v , i ) ) ; i f ( t > n) n = t ; } return n ; } void powermethod ( g s l m a t r i x c o m p l e x ∗A, g s l v e c t o r c o m p l e x ∗v , unsigned i nt D) { /∗ Compute t h e e i g e n v e c t o r whose e i g e n v a l u e i s l o w e r u s i n g t h e i n v e r s e power method ∗/ i n t i , j , s i g =1; double n ; g s l m a t r i x c o m p l e x ∗L = g s l m a t r i x c o m p l e x a l l o c (D, D) ; g s l m a t r i x c o m p l e x ∗M = g s l m a t r i x c o m p l e x a l l o c (D, D) ; g s l v e c t o r c o m p l e x ∗w = g s l v e c t o r c o m p l e x a l l o c (D) ; double d = matrixnorm (A) ∗ e p s ; f o r ( i =0; i <D; i ++){ f o r ( j =0; j <D; j ++){ i f ( i==j ) { 49 g s l m a t r i x c o m p l e x s e t (L , i , i , g s l c o m p l e x a d d ( g s l m a t r i x c o m p l e x g e t (A, i , i ) , g s l c o m p l e x r e c t (d , 0) ) ) ; } else { g s l m a t r i x c o m p l e x s e t (L , i , j , g s l m a t r i x c o m p l e x g e t (A, i , j ) ) ; } } } gsl gsl gsl gsl gsl p e r m u t a t i o n ∗p = g s l p e r m u t a t i o n a l l o c (D) ; l i n a l g c o m p l e x L U d e c o m p (L , p , &s i g ) ; l i n a l g c o m p l e x L U i n v e r t (L , p , M) ; m a t r i x c o m p l e x f r e e (L) ; permutation free (p) ; f o r ( i =0; i <19; i ++){ g s l b l a s z g e m v ( CblasNoTrans , GSL COMPLEX ONE, M, v , GSL COMPLEX ZERO, w) ; n = vectornorm (w) ; g s l v e c t o r c o m p l e x s c a l e (w, g s l c o m p l e x i n v e r s e ( g s l c o m p l e x r e c t ( n , 0 ) ) ) ; g s l b l a s z g e m v ( CblasNoTrans , GSL COMPLEX ONE, A, w, GSL COMPLEX ZERO, v ) ; n = vectornorm ( v ) ; f o r ( j =0; j <D; j ++){ g s l v e c t o r c o m p l e x s e t ( v , j , g s l v e c t o r c o m p l e x g e t (w, j ) ) ; } i f ( n< e p s ) break ; } g s l m a t r i x c o m p l e x f r e e (M) ; g s l v e c t o r c o m p l e x f r e e (w) ; } 50