/* * File: optdecomp.c * Last Modified : Thu Oct 19 12:14:15 2006 * * Purpose: * Compute the entanglement of a mixed state by optimization * decompose the state with an optimal Unitary matrix * that minimizes entanglement * * Wei Cai, caiwei@stanford.edu * * based on Matlab codes: entangleM * * Sponsored by Lawrence Livermore National Laboratory (LLNL) * */ #include "util.h" double entanglement(int N, complex u[NMAX]) { /* entanglement of a pure state u */ complex rhoAB[NMAX][NMAX], rhoA[NMAX][NMAX], lambda[NMAX]; double E, lam[NMAX]; int i, j, k, n; for(i=0;i0) E -= lam[i]*log2(lam[i]); return E; } double unitarydecompose(int N, complex rho[NMAX][NMAX], complex U[NMAX][NMAX]) { /* entanglement of a mixed state rho measured by unitary decomposition U */ complex V[NMAX][NMAX], C[NMAX][NMAX], W[NMAX][NMAX]; complex lambda[NMAX], w[NMAX]; double E, p, psqrt, Esub[NMAX], psub[NMAX]; int i, j; eigvec(N,rho,V,lambda); /* to be consistent with matlab code */ reorder_eigvec(N,V,lambda); clearM(C); for(i=0;i0) { psqrt = sqrt(p); for(j=0;j0) { psqrt = sqrt(p); for(j=0;j0) Esub[i] -= lam[j]*log2(lam[j]); } psub[i] = p; } else { psub[i] = 0; Esub[i] = 0; } E += psub[i] * Esub[i]; } clearM(DS); for(i=0;i0) pre1[j] = -log2(exp(1)*L[i][j]); else pre1[j] = 0; // printf("pre1 ---\n"); /* yes */ // printV(stdout,N,pre1,6); clearM(term2); for(t=0;t10) { dE=fabs(E-data[curstep-2]); Hold[(curstep%10)]=dE; } if (curstep>20) { mean=0; for (i=0;i<10;i++) mean=mean+Hold[i]; mean=mean/10.0; // printf("mean=%e\n",mean); if (mean1) { sscanf(argv[1],"%ud",&seed); printf("random seed = %u\n",seed); srand48(seed); sscanf(argv[2],"%lf",&tol); printf("tolerance = %e\n",tol); } else { seed = (unsigned int)time(NULL); printf("random seed = %u\n",seed); srand48bytime(); } /* test_utils(); return 0; */ N = 9; randDM(N,rho); randUM(N,U); printf("rho ---\n"); printM(stdout,N,rho,6); printf("U ---\n"); printM(stdout,N,U,6); /* print to matlab input file */ fp = fopen("../matlab/entangleM/rhoU0.m","w"); fprintf(fp,"rho = [\n"); printM(fp,N,rho,16); fprintf(fp,"];\n"); fprintf(fp,"U = [\n"); printM(fp,N,U ,16); fprintf(fp,"];\n"); fclose(fp); // E = unitarydecompose(N,rho,U); // printf("unitarydecompose(rho,U) = %.5f\n",E); // E = unitarydecompose2(N,rho,U,dEdU); printf("[E, dEdU] = unitarydecompose2(rho,U)\n"); printf("E = %.5f\n",E); printf("dEdU --\n"); printM(stdout,N,dEdU,6); delta = 1; maxstep = 100000; steepest_descent(N,rho,U,delta,maxstep,tol); /* print to matlab input file */ fp = fopen("../matlab/entangleM/rhoU.m","w"); fprintf(fp,"rho = [\n"); printM(fp,N,rho,12); fprintf(fp,"];\n"); fprintf(fp,"U = [\n"); printM(fp,N,U ,12); fprintf(fp,"];\n"); fclose(fp); return 0; }