Calculate mutual information in all regions.
This commit is contained in:
parent
ddf89b6f80
commit
a56e5420ca
|
@ -31,50 +31,62 @@ int main()
|
||||||
double tPlus = 0; // time on the left boundary
|
double tPlus = 0; // time on the left boundary
|
||||||
double tMinus = 0; // time on the right boundary
|
double tMinus = 0; // time on the right boundary
|
||||||
alpha = 0.4; // encodes the conformal dimention of local operator h_Psi
|
alpha = 0.4; // encodes the conformal dimention of local operator h_Psi
|
||||||
double y = 1; // endpoint of interval A
|
double y = 3; // endpoint of interval A
|
||||||
double L = 5; // length of interval A
|
double L = 15; // length of interval A
|
||||||
double epsilon = 0.01; // smearing parameter
|
double epsilon = 0.01; // smearing parameter
|
||||||
beta = 10; // inverse temperature
|
beta = 10; // inverse temperature
|
||||||
double tOmega = 5.4418; // thermal state is perturbed by operator inserted at time -tOmega
|
// double tOmega = /*5.4418*/; // thermal state is perturbed by operator inserted at time -tOmega
|
||||||
double c = 600; // central charge. Must be large in our approximation
|
double c = 600; // central charge. Must be large in our approximation
|
||||||
// End of parameters
|
// End of parameters
|
||||||
|
for(unsigned int i = 0; i < 1000; ++i)
|
||||||
|
{
|
||||||
|
double tOmega = i*2*L/1000;
|
||||||
|
|
||||||
// Operator insertion points: Left boundary
|
// Operator insertion points: Left boundary
|
||||||
std::complex<double> x1 (0, -epsilon), x4 (0, epsilon), x1bar, x4bar;
|
std::complex<double> x1 (0, -epsilon), x4 (0, epsilon), x1bar, x4bar;
|
||||||
x1bar = conj(x1);
|
x1bar = conj(x1);
|
||||||
x4bar = conj(x4);
|
x4bar = conj(x4);
|
||||||
double x2 = y - tOmega - tMinus;
|
double x2 = y - tOmega - tMinus;
|
||||||
double x2bar = y + tOmega + tMinus;
|
double x2bar = y + tOmega + tMinus;
|
||||||
double x3 = L + x2;
|
double x3 = L + x2;
|
||||||
double x3bar = L + x2bar;
|
double x3bar = L + x2bar;
|
||||||
|
|
||||||
// Operator insertion points: Right boundary
|
// Operator insertion points: Right boundary
|
||||||
std::complex<double> x6 (y - tPlus - tOmega, beta/2);
|
std::complex<double> x6 (y - tPlus - tOmega, beta/2);
|
||||||
std::complex<double> x6bar (y + tPlus + tOmega, -beta/2);
|
std::complex<double> x6bar (y + tPlus + tOmega, -beta/2);
|
||||||
std::complex<double> x5 = L + x6;
|
std::complex<double> x5 = L + x6;
|
||||||
std::complex<double> x5bar = L + x6bar;
|
std::complex<double> x5bar = L + x6bar;
|
||||||
|
|
||||||
// Cross-ratios for S_A
|
// Cross-ratios for S_A
|
||||||
std::complex<double> zA = crossRatio(x1, x2, x3, x4);
|
std::complex<double> zA = crossRatio(x1, x2, x3, x4);
|
||||||
std::complex<double> zAbar = crossRatio(x1bar, x2bar, x3bar, x4bar);
|
std::complex<double> zAbar = crossRatio(x1bar, x2bar, x3bar, x4bar);
|
||||||
|
|
||||||
// Cross-ratios for S_B
|
// Cross-ratios for S_B
|
||||||
std::complex<double> zB = crossRatio(x1, x5, x6, x4);
|
std::complex<double> zB = crossRatio(x1, x5, x6, x4);
|
||||||
std::complex<double> zBbar = crossRatio(x1bar, x5bar, x6bar, x4bar);
|
std::complex<double> zBbar = crossRatio(x1bar, x5bar, x6bar, x4bar);
|
||||||
|
|
||||||
// Cross-ratios for S_{A union B}
|
// Cross-ratios for S_{A union B}
|
||||||
std::complex<double> z2 = crossRatio(x1, x2, x6, x4);
|
std::complex<double> z2 = crossRatio(x1, x2, x6, x4);
|
||||||
std::complex<double> z2bar = crossRatio(x1bar, x2bar, x6bar, x4bar);
|
std::complex<double> z2bar = crossRatio(x1bar, x2bar, x6bar, x4bar);
|
||||||
std::complex<double> z5 = crossRatio(x1, x5, x3, x4);
|
std::complex<double> z5 = crossRatio(x1, x5, x3, x4);
|
||||||
std::complex<double> z5bar = crossRatio(x1bar, x5bar, x3bar, x4bar);
|
std::complex<double> z5bar = crossRatio(x1bar, x5bar, x3bar, x4bar);
|
||||||
|
|
||||||
// Now we calculate entanglement entropies using Fitzpatrick, Kaplan, Walters formula.
|
// Now we calculate entanglement entropies using Fitzpatrick, Kaplan, Walters formula.
|
||||||
double S_A = c/6 * log(Fitzpatrick(zA, zAbar, 2*M_PI));
|
double S_A = c/6 * log(Fitzpatrick(zA, zAbar, y < tMinus + tOmega && tMinus + tOmega < y + L ? 2*M_PI : 0));
|
||||||
double S_B = c/6 * log(Fitzpatrick(zB, zBbar, 0));
|
// std::cerr << "S_A = " << S_A << std::endl;
|
||||||
double S_union = c/6 * log(Fitzpatrick(z2, z2bar, 2*M_PI) * Fitzpatrick(z5, z5bar, 0));
|
// double S_A_analytic = c/6 * log(beta/M_PI/epsilon/sinh(M_PI*L/beta)*sinh(M_PI/beta*(y+L-tMinus-tOmega))*sinh(M_PI/beta*(tMinus+tOmega-y)) * sin(M_PI*alpha)/alpha);
|
||||||
double S_thermal = 2*c/3 * log(sinh(M_PI*L/beta)/cosh(M_PI/beta*(tMinus-tPlus)));
|
// double S_A_analytic = 0;
|
||||||
double I = S_A + S_B - S_union + S_thermal;
|
// std::cerr << "S_A (analytic) = " << S_A_analytic << std::endl;
|
||||||
std::cout << I << std::endl;
|
double S_B = c/6 * log(Fitzpatrick(zB, zBbar, 0));
|
||||||
|
double S_union = c/6 * log(Fitzpatrick(z2, z2bar, y < tMinus + tOmega ? 2*M_PI : 0) * Fitzpatrick(z5, z5bar, y +L < tMinus + tOmega ? -2*M_PI : 0));
|
||||||
|
// std::cerr << "S_A+B = " << S_union << std::endl;
|
||||||
|
double S_union_analytic = c/3 * log(beta/M_PI/epsilon * sin(M_PI*alpha)/alpha) + c/6* log(sinh(M_PI/beta*(tMinus + tOmega - y)) * cosh(M_PI/beta*(tPlus + tOmega - y)) * sinh(M_PI/beta*(tMinus + tOmega - y - L)) * cosh(M_PI/beta*(tPlus + tOmega - y - L)));
|
||||||
|
// std::cerr << "S_A+B (analytic) = " << S_union_analytic << std::endl;
|
||||||
|
double S_thermal = 2*c/3 * log(sinh(M_PI*L/beta)/cosh(M_PI/beta*(tMinus-tPlus)));
|
||||||
|
double I = S_A + S_B - S_union + S_thermal;
|
||||||
|
// double I_analytic = S_A_analytic - S_union_analytic + S_thermal;
|
||||||
|
std::cout << tOmega << "\t" << I /*<< "\t" << I_analytic*/ << std::endl;
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue