Вы можете использовать класс комплексных чисел для отражения математики.
Большая часть кода состоит из двух сложных умножений.
Вы можете переписать свой код как:
unsigned long mmax=2;
while (n>mmax)
{
unsigned long istep = mmax<<1;
const complex wp = coef( mmax );
complex w( 1. , 0. );
for (unsigned long m=1; m < mmax; m += 2)
{
for (unsigned long i=m; i <= n; i += istep)
{
j=i+mmax;
complex temp = w * complex( data[j-1] , data[j] );
complexref( data[j-1] , data[j] ) = complex( data[i-1] , data[i] ) - temp ;
complexref( data[i-1] , data[i] ) += temp ;
}
w += w * wp ;
}
mmax=istep;
}
С:
struct complex
{
double r , i ;
complex( double r , double i ) : r( r ) , i( i ) {}
inline complex & operator+=( complex const& ref )
{
r += ref.r ;
i += ref.i ;
return *this ;
}
};
struct complexref
{
double & r , & i ;
complexref( double & r , double & i ) : r( r ) , i( i ) {}
inline complexref & operator=( complex const& ref )
{
r = ref.r ;
i = ref.i ;
return *this ;
}
inline complexref & operator+=( complex const& ref )
{
r += ref.r ;
i += ref.i ;
return *this ;
}
} ;
inline complex operator*( complex const& w , complex const& b )
{
return complex(
w.r * b.r - w.i * b.i ,
w.r * b.i + w.i * b.r
);
}
inline complex operator-( complex const& w , complex const& b )
{
return complex( w.r - b.r , w.i - b.i );
}
inline complex coef( unsigned long mmax )
{
double theta = -(2*M_PI/mmax);
double wtemp = sin(0.5*theta);
return complex( -2.0*wtemp*wtemp , sin(theta) );
}