// qfunct.h basic functions bra ket unitary algorithms // new: many includes and types defined here #include // C++ templates #include #include #include using namespace std; typedef complex cmplx; typedef vector c_vec; typedef vector c_mat; // defined as vector of complex vectors static c_vec operator+(c_vec X, c_vec Y) { int n = X.size(); c_vec Z(n); for(int j=0; jm/2) cout << "get_ket n=" << n << " too big" << endl; Y[0] = kin[n*2]; Y[1] = kin[n*2+1]; return Y; } // end get_ket static c_vec cRk(c_vec ctrl, c_vec kin, c_mat Rk) // controlled rotation { c_vec Y(2); // returned ket Y = kin; if(ctrl[0]!=cmplx(1,0) && ctrl[1]!=cmplx(0,0)) Y = matvec(Rk, kin); return Y; } // end cRk2 // end qfunct.cpp static void prtket1(c_vec vec) // print a single ket (no << endl;) { double sml = 1.0e-12; // close to zero for printout double ar = real(vec[0]); double ai = imag(vec[0]); double br = real(vec[1]); double bi = imag(vec[1]); if(abs(ai)"; } else if(abs(vec[1])"; } else if(abs(bi)"; } else if(abs(vec[0])"; } else if(abs(ai)" << " + " << "(" << br << " |1>"; } else { cout << "(" << ar << "," << ai << ") |0>" << " + " << "(" << br << "," << bi << ") |1>"; } } // end prtket1 static void prtket(c_vec vec) // print a single ket (with << endl;) { prtket1(vec); cout << endl; } // end prtket static void prtket2(c_vec a, c_vec b) // two kets (no << endl;) { prtket1(a); prtket1(b); } // end prtket static void prtket3(c_vec a, c_vec b, c_vec c) // two kets (no << endl;) { prtket1(a); prtket1(b); prtket1(c); } // end prtket // factor state Y knowing |a> static c_vec factor(c_vec Y, c_vec a) // Y = |a>|b>, return b { double sml = 1.0e-12; // close to zero c_vec b(2); // returned ket if(abs(a[0]) > sml) { b[0] = conj(Y[0] / a[0]); b[1] = conj(Y[1] / a[0]); } else if(abs(a[1]) > sml) { b[0] = conj(Y[2] / a[1]); b[1] = conj(Y[3] / a[1]); } else { cout << "factor fail, bad first argument" << endl; prtvec(a); cout << endl; return a; } return b; } // end factor // factor state Y = |a>|b>|c> knowing |a> and |b> static c_vec factor3(c_vec Y, c_vec a, c_vec b) // Y = |a>|b>|c>, return c { double sml = 1.0e-12; // close to zero c_vec c(2); // returned ket c_vec Y2(4); // after a reduction if(abs(a[0]) > sml) { Y2[0] = conj(Y[0] / a[0]); Y2[1] = conj(Y[1] / a[0]); Y2[2] = conj(Y[2] / a[0]); Y2[3] = conj(Y[3] / a[0]); } else if(abs(a[1]) > sml) { Y2[0] = conj(Y[4] / a[1]); Y2[1] = conj(Y[5] / a[1]); Y2[2] = conj(Y[6] / a[1]); Y2[3] = conj(Y[7] / a[1]); } else { cout << "factor3 fail, bad a argument" << endl; prtvec(a); cout << endl; return a; } if(abs(b[0]) > sml) { c[0] = Y2[0] / b[0]; c[1] = Y2[1] / b[0]; } else if(abs(b[1]) > sml) { c[0] = Y2[2] / b[1]; c[1] = Y2[3] / b[1]; } else { cout << "factor3 fail, bad b argument" << endl; prtvec(b); cout << endl; return b; } return c; } // end factor3