- Language
- c++
- Purpose
- Calculates <math>\ln\left(\frac{Z-1}{Z+1}\right)</math>
- Author
- James R. Craig, Ph. Le Grand
#include <math.h>
#include <complex>
typedef std::complex<double> cmplex;
const double PI=3.141592653589793238462643; // pi
/*******************************************************************************
logZm1oZp1
optimized version of log ((Z-1.0)/(Z+1.0)):
~13% of the cost of a direct call- 1 order of magnitude speedup!
Author: James R. Craig
Modified 2007 12 06 by Ph. Le Grand:
Added local variables x,y,r2 to reduce number of calls to
member functions of Z and reduce number of operations
for minor speed gains.
Modified 2008 01 11 by Ph. Le Grand:
Reduced some operations for minor speed gains.
-------------------------------------------------------------------------------*/
inline cmplex logZm1oZp1(const cmplex &Z)
{
double x(Z.real());
double y(Z.imag());
double r2=x*x+y*y;
double den(r2+x+x+1.0);
double add=0.0;
if ((r2)<1.0){
add=-PI;
if (y>=0.0){add=PI;}
}
return cmplex(0.5*log(1.0-4.0*x/den),
add+atan( (y+y) /(r2-1.0) ));
}