Browse Source

Initial commit.

master
Andrius Štikonas 4 years ago
commit
a52e2e1ff6
2 changed files with 105 additions and 0 deletions
  1. 6
    0
      CMakeLists.txt
  2. 99
    0
      scrambling.cpp

+ 6
- 0
CMakeLists.txt View File

@@ -0,0 +1,6 @@
1
+cmake_minimum_required(VERSION 2.8)
2
+project(Scrambling)
3
+
4
+add_definitions(-std=gnu++11)
5
+
6
+add_executable(scrambling scrambling.cpp)

+ 99
- 0
scrambling.cpp View File

@@ -0,0 +1,99 @@
1
+/*************************************************************************
2
+ *  Copyright (C) 2015 by Andrius Štikonas <andrius@stikonas.eu>         *
3
+ *                                                                       *
4
+ *  This program is free software; you can redistribute it and/or modify *
5
+ *  it under the terms of the GNU General Public License as published by *
6
+ *  the Free Software Foundation; either version 3 of the License, or    *
7
+ *  (at your option) any later version.                                  *
8
+ *                                                                       *
9
+ *  This program is distributed in the hope that it will be useful,      *
10
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of       *
11
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the        *
12
+ *  GNU General Public License for more details.                         *
13
+ *                                                                       *
14
+ *  You should have received a copy of the GNU General Public License    *
15
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.*
16
+ *************************************************************************/
17
+
18
+// Calculation of mutual information in the setup of http://arxiv.org/abs/1503.08161
19
+
20
+#include <cmath>
21
+#include <complex>
22
+#include <iostream>
23
+#include <iomanip>
24
+
25
+static double alpha, beta;
26
+std::complex<double> crossRatio (std::complex<double>, std::complex<double>, std::complex<double>, std::complex<double>);
27
+double Fitzpatrick(std::complex<double>, std::complex<double>, double);
28
+
29
+int main()
30
+{
31
+	// Parameters that can be changed:
32
+	double tPlus = 0;  // time on the left boundary
33
+	double tMinus = 0; // time on the right boundary
34
+	alpha = 0.4; // encodes the conformal dimention of local operator h_Psi
35
+	double y = 1; // endpoint of interval A
36
+	double L = 5; // length of interval A
37
+	double epsilon = 0.01; // smearing parameter
38
+	beta = 10; // inverse temperature
39
+	double tOmega = 5.4418; // thermal state is perturbed by operator inserted at time -tOmega
40
+	double c = 600; // central charge. Must be large in our approximation
41
+	// End of parameters
42
+
43
+	// Operator insertion points: Left boundary
44
+	std::complex<double> x1 (0, -epsilon), x4 (0, epsilon), x1bar, x4bar;
45
+	x1bar = conj(x1);
46
+	x4bar = conj(x4);
47
+	double x2    = y - tOmega - tMinus;
48
+	double x2bar = y + tOmega + tMinus;
49
+	double x3    = L + x2;
50
+	double x3bar = L + x2bar;
51
+
52
+	// Operator insertion points: Right boundary
53
+	std::complex<double> x6    (y - tPlus - tOmega, beta/2);
54
+	std::complex<double> x6bar (y + tPlus + tOmega, -beta/2);
55
+	std::complex<double> x5    = L + x6;
56
+	std::complex<double> x5bar = L + x6bar;
57
+
58
+	// Cross-ratios for S_A
59
+	std::complex<double> zA    = crossRatio(x1, x2, x3, x4);
60
+	std::complex<double> zAbar = crossRatio(x1bar, x2bar, x3bar, x4bar);
61
+
62
+	// Cross-ratios for S_B
63
+	std::complex<double> zB    = crossRatio(x1, x5, x6, x4);
64
+	std::complex<double> zBbar = crossRatio(x1bar, x5bar, x6bar, x4bar);
65
+
66
+	// Cross-ratios for S_{A union B}
67
+	std::complex<double> z2    = crossRatio(x1, x2, x6, x4);
68
+	std::complex<double> z2bar = crossRatio(x1bar, x2bar, x6bar, x4bar);
69
+	std::complex<double> z5    = crossRatio(x1, x5, x3, x4);
70
+	std::complex<double> z5bar = crossRatio(x1bar, x5bar, x3bar, x4bar);
71
+
72
+	// Now we calculate entanglement entropies using Fitzpatrick, Kaplan, Walters formula.
73
+	double S_A = c/6 * log(Fitzpatrick(zA, zAbar, 2*M_PI));
74
+	double S_B = c/6 * log(Fitzpatrick(zB, zBbar, 0));
75
+	double S_union = c/6 * log(Fitzpatrick(z2, z2bar, 2*M_PI) * Fitzpatrick(z5, z5bar, 0));
76
+	double S_thermal = 2*c/3 * log(sinh(M_PI*L/beta)/cosh(M_PI/beta*(tMinus-tPlus)));
77
+	double I = S_A + S_B - S_union + S_thermal;
78
+	std::cout << I << std::endl;
79
+	return 0;
80
+}
81
+
82
+std::complex<double> crossRatio (std::complex<double> x1, std::complex<double> x2, std::complex<double> x3, std::complex<double> x4)
83
+{
84
+	double pb = M_PI/beta;
85
+	return sinh(pb*(x1-x2))*sinh(pb*(x3-x4))/sinh(pb*(x1-x3))/sinh(pb*(x2-x4));
86
+}
87
+
88
+double Fitzpatrick(std::complex<double> z, std::complex<double> zbar, double phase)
89
+{
90
+	// phase is necessary to take into account nontrivial monodromy
91
+	std::complex<double> c1(1, 0); // one as a complex number
92
+	std::complex<double> i(0,1); // imaginary unit
93
+	double alphaExpr = 0.5-alpha/2;
94
+	std::complex<double> exponent1 = exp(phase*i*alphaExpr);
95
+	std::complex<double> exponent2 = exp(phase*i*alpha);
96
+	return real(exponent1 * pow(z, alphaExpr) * pow(zbar, alphaExpr)
97
+			* (c1 - exponent2 * pow(z, alpha)) * (c1 - pow(zbar, alpha))
98
+			/ ( alpha*alpha * (c1-z) * (c1-zbar) ) );
99
+}

Loading…
Cancel
Save