Polynomial Laguerre(unsigned i) { if(i==0) return Polynomial({1.0f}); else if(i==1) return Polynomial({1.0f, -1.0f}); else return (Laguerre(i-1)*Polynomial({2.0f*(i-1)+1.0f, -1.0f})-Laguerre(i-2)*float(i-1))/float(i); }
/* find all roots */ void CLPCAnal::AllRoots(COMPLEX *ap,int m,COMPLEX *roots) { int k,j,i; COMPLEX x,bp,c; COMPLEX ad[MAXPOLY]; for (j=0;j<=m;j++) ad[j] = ap[j]; for (j=m;j>=1;j--) { /* find root */ x = CMake(0.0,0.0); Laguerre(ad,j,&x); if (fabs(x.im) <= (IM_RANGE*fabs(x.re))) x.im = 0.0; roots[j] = x; /* deflation */ bp = ad[j]; for (k=j-1;k>=0;k--) { c = ad[k]; ad[k] = bp; bp = CAdd(CMult(x,bp),c); } } /* sort into increasing root.real */ for (j=2;j<=m;j++) { x = roots[j]; i = j; while ((i > 1) && (x.re < roots[i-1].re)) { roots[i] = roots[i-1]; i = i - 1; } roots[i] = x; } }
double motional_rabi_factor(int n1, int n2, double z0, double k) { //see Experimental Issues, Eq. 18, section 2.3.1 double eta = z0*k; return exp(-0.5*eta*eta) * sqrt(factorial(n1)/ factorial(n2)) * pow(eta,(int)(n2-n1)) * fabs(Laguerre(n1, n2-n1, eta*eta)); }
main() { short m; double abscis[N]; double wt[N]; double left, right; printf("Table 25.8, k= %1d, n=%1d\n\n", k, N); Jacobi(N, FLOATk, ZERO, abscis, wt); for (m=0; m<N; m++) wt[m] /= (k+1); for (m=0; m<N; m++) printf("%2d %20.18g %20.18g\n", m, abscis[m], wt[m]); getchar(); printf("\n\n\nTable 25.4, n=9\n\n"); Radau_Jacobi(4, -0.5, ZERO, abscis, wt, &left); left *= 2; for (m=0; m<4; m++) abscis[m]= sqrt(abscis[m]); printf("%2d %20.18g %20.18g\n", 0, ZERO, left); for (m=0; m<4; m++) printf("%2d %20.18g %20.18g\n", m, abscis[m], wt[m]); getchar(); printf("\n\n\nTable 25.9, n= %1d\n\n", N); Laguerre(N, ZERO, abscis, wt); for (m=0; m<N; m++) printf("%2d %20.18g %20.18g\n", m, abscis[m], wt[m]); getchar(); printf("\n\n\nTable 25.10, n= %1d\n\n", N); Hermite(N, ZERO, abscis, wt); for (m=0; m<N; m++) wt[m] *= SqrtPI; for (m=0; m<N; m++) printf("%2d %20.18g %20.18g\n", m, abscis[m], wt[m]); getchar(); printf("\n\n\nSame, n= %1d\n\n", 2*N); Even_Hermite(2*N, ZERO, abscis, wt); for (m=0; m<N; m++) wt[m] *= SqrtPI; for (m=0; m<N; m++) printf("%2d %20.18g %20.18g\n", m, abscis[m], wt[m]); getchar(); printf("\n\n\nSame, n= %1d\n\n", 9); Odd_Hermite(9, ZERO, abscis, wt, &left); left *= SqrtPI; for (m=0; m<4; m++) wt[m] *= SqrtPI; printf("%2d %20.18g %20.18g\n", 0, ZERO, left); for (m=0; m<4; m++) printf("%2d %20.18g %20.18g\n", m, abscis[m], wt[m]); getchar(); printf("\n\n\nTable 25.6, n= %1d\n\n", N+1); Lobatto_Jacobi(N-1, ZERO, ZERO, abscis, wt, &left, &right); for (m=0; m<(N-1); m++) wt[m] *= 2; left *= 2; right *= 2; for (m=0; m<(N-1); m++) abscis[m] = (2*abscis[m] - 1); printf(" %20.18g %20.18g\n", -1.0, left); for (m=0; m<(N-1); m++) printf("%2d %20.18g %20.18g\n", m, abscis[m], wt[m]); printf(" %20.18g %20.18g\n", 1.0, right); }