#include float plgndr(l,m,x) int l,m; float x; { float fact,pll,pmm,pmmp1,somx2; int i,ll; void nrerror(); if (m < 0 || m > l || fabs(x) > 1.0) nrerror("Bad arguments in routine PLGNDR"); pmm=1.0; if (m > 0) { somx2=sqrt((1.0-x)*(1.0+x)); fact=1.0; for (i=1;i<=m;i++) { pmm *= -fact*somx2; fact += 2.0; } } if (l == m) return pmm; else { pmmp1=x*(2*m+1)*pmm; if (l == (m+1)) return pmmp1; else { for (ll=(m+2);ll<=l;ll++) { pll=(x*(2*ll-1)*pmmp1-(ll+m-1)*pmm)/(ll-m); pmm=pmmp1; pmmp1=pll; } return pll; } } }