/* complex.h define type complex and arithmetic operations */ /* also elementary functions and vector,matrix operations */ #ifndef COMPLEX_H_ #define COMPLEX_H_ typedef struct {double re; double im;} complex; complex cmplx(double a, double b); /* create a complex number */ double real (complex a); /* get real part */ double imag (complex a); /* get imaginary part */ complex cxadd(complex a, complex b); /* add two complex numbers */ complex cxsub(complex a, complex b); /* subtract b from a, complex */ complex cxmul(complex a, complex b); /* multiply two complex numbers */ complex cdmul(double a, complex b); /* multiply double times complex */ complex cmuld(complex a, double b); /* multiply complex times double */ complex cxdiv(complex a, complex b); /* divide complex by complex */ complex cdivd(complex a, double b); /* divide complex by double */ double cxabs(complex a); /* return magnitude of complex munber */ double cxarg(complex a); /* return argument of complex number */ complex cxneg(complex a); /* negate a complex number */ complex cxconj(complex a); /* conjugate a complex number */ double sumabs(complex a); /* abs re + abs im */ /* elementary functions */ complex cxsqrt(complex a); /* square root of a complex number */ complex cxexp(complex a); /* e^a exp of a complex number */ complex cxlog(complex a); /* log base e of a complex number */ complex cxsin(complex a); /* sine of a complex number */ complex cxcos(complex a); /* cosine of a complex number */ complex cxtan(complex a); /* tangent of a complex number */ complex cxatan(complex a); /* arctangent of a complex number */ complex cxsinh(complex a); /* sinh of a complex number */ complex cxcosh(complex a); /* cosh of a complex number */ complex cxtanh(complex a); /* tanh of a complex number */ complex cxatanh(complex a); /* atanh of a complex number */ /* vector, matrix operations */ void cxvadd(int n, complex A[n], complex B[n], complex C[n]); /* C = A + B */ void cxvsub(int n, complex A[n], complex B[n], complex C[n]); /* C = A - B */ void cxvcopy(int n, complex A[n], complex B[n]); /* copy vector A to B */ double cxvnorm(int n, complex A[n]); /* vector norm of A */ void cxvident(int n, int i, complex A[n]); /* identity vector at i */ void cxvprint(int n, complex A[n]); /* print complex vector */ void cxvran(int n, complex A[n]); /* generate random complex vec */ void cxmadd(int n, complex A[n][n], complex B[n][n], complex C[n][n]);/*C=A+B*/ void cxmsub(int n, complex A[n][n], complex B[n][n], complex C[n][n]);/*C=A-B*/ void cxmmul(int n, complex A[n][n], complex B[n][n], complex C[n][n]);/*C=A*B*/ void cxmcopy(int n, complex A[n][n], complex B[n][n]); /* copy matrix A to B */ double cxmnorm(int n, complex A[n][n]); /* matrix norm of A */ void cxmident(int n, complex A[n][n]); /* initialize identity matrix */ void cxmprint(int n, complex A[n][n]); /* print complex matrix */ void cxmran(int n, complex A[n][n]); /* generate random complex matrix*/ void cxmvmul(int n, complex A[n][n], complex B[n], complex C[n]); /* C=A*B */ void cxsimeq(int n, complex A[n][n], complex Y[n], complex X[n]); /* solve complex A*X=Y for X */ complex cxdet(int n, complex A[n][n]); /* complex determinant of A */ void cxinv(int n, complex A[n][n], complex AA[n][n]); /* complex AA = A^-1 */ #endif /* COMPLEX_H_ */