#include <math.h>

struct complex
	{
	double re;
	double im;
	};

typedef struct complex complex;

extern complex     Complex (double a, double b);
extern complex     Cadd (complex a, complex b);
extern complex     Csub (complex a, complex b);
extern complex     Cmul (complex a, complex b);
extern complex     Conj (complex a);
extern complex     Cdiv (complex a, complex b);
extern double      Cabs (complex a);
extern complex     Csqrt (complex a);
extern complex     RCmul (double a, complex b);
extern complex     Cexp (complex a);
extern complex     Clog (complex a);
extern complex **  pscmatrix (int dim);   // mallocs a square complex matrix
extern void        free_pscmatrix (complex **m); // frees the square complex matrix
extern void        dump_pscmatrix (complex **m, int dim); // prints a square complex matrix
extern void        copy_pscmatrix (complex **from, complex **to, int dim); // copies
extern void        dump_complexVector (complex *vec, int dim);
extern int         ComplexInvertMatrix (complex **a, int n, double *dwork, int *indx, complex **a_inv, complex *col);
extern int         ComplexLUDecompose (complex **a, int n, double *vv, int *indx, double *pd);
extern void        ComplexLUBackSubst (complex **a, int n, int *indx, complex *b);