00001
00006 #include "bpm/bpm_nr.h"
00007
00008
00009
00010 complex_t complex( double re, double im ) {
00011 complex_t z;
00012 z.re = re;
00013 z.im = im;
00014 return z;
00015 }
00016
00017 double c_real( complex_t z ) { return z.re; }
00018 double c_imag( complex_t z ) { return z.im; }
00019 double c_abs( complex_t z ) { return sqrt( z.re*z.re+z.im*z.im ); }
00020 double c_abs2( complex_t z ) { return z.re*z.re+z.im*z.im; }
00021 double c_arg( complex_t z ) { return atan2( z.im, z.re ); }
00022
00023 complex_t c_conj( complex_t z ) { return complex( z.re, -z.im ); }
00024 complex_t c_neg( complex_t z ) { return complex( -z.re, -z.im ); }
00025
00026 complex_t c_sum( complex_t z1, complex_t z2 ) { return complex( z1.re + z2.re, z1.im + z2.im ); }
00027 complex_t c_diff( complex_t z1, complex_t z2 ) { return complex( z1.re - z2.re, z1.im - z2.im ); }
00028
00029 complex_t c_mult( complex_t z1, complex_t z2 ) {
00030 return complex( z1.re*z2.re - z1.im*z2.im,
00031 z1.re*z2.im + z1.im*z2.re );
00032 }
00033
00034 complex_t c_scale( double r, complex_t z ) { return complex( r*z.re, r*z.im); }
00035
00036
00037 complex_t c_div( complex_t z1, complex_t z2 ) {
00038 double r = c_norm2( z2 );
00039 return complex( ((z1.re*z2.re) + (z1.im*z2.im)) / r,
00040 ((z1.im*z2.re) - (z1.re*z2.im)) / r );
00041 }
00042
00043 complex_t c_sqr( complex_t z ) { return c_mult( z, z ); }
00044
00045 double c_norm2( complex_t z ) { return ( z.re*z.re + z.im*z.im ); }
00046
00047 complex_t c_exp( complex_t z ) { return complex( exp(z.re)*cos(z.im), exp(z.re)*sin(z.im) ); }
00048
00049 complex_t c_sqrt( complex_t z ) {
00050 double r = c_abs( z );
00051 complex_t u = complex( sqrt( (r + z.re ) / 2. ), sqrt( ( r - z.re ) / 2. ) );
00052 if( z.im < 0.0 ) u.im = -u.im;
00053 return u;
00054 }
00055
00056
00057 int c_isequal( complex_t z1, complex_t z2 ) {
00058 if ( ( z1.re == z2.re ) && ( z1.im == z2.im ) ) {
00059 return 1;
00060 } else return 0;
00061 }
00062