// ----------------------------------------------------------------------------- // --- COMPLEX NUMBER PROCESSING ----------------------------------------------- // ----------------------------------------------------------------------------- /* -------------------------------------------------------------------------------- --- Naming convention and remarks ---------------------------------------------- -------------------------------------------------------------------------------- The name of the functions always starts with 'c' in lower case. Each function has ALWAYS two parts: the real part and the imaginary part. Each function is coded with three letters. This gives: cXXXRe and cXXXIm XXX represents the operation performed by the function. For example, for multiplication : cMulRe and cMulIm. The parameters are the couple (re,im). When a function needs several parameters : (re,im,re2,Im2,...) Important remarks : - POV-Ray Scene Description Language ('SDL') is *** case sensitive *** - The construction of all the functions of this file required a lot of rigor. Commas ',', brackets '()" and braces '{}' are very important. If one of these characters is missing or not in the right place, nothing will work. Be careful with your modifications ! -------------------------------------------------------------------------------- --- COMPLEX -------------------------------------------------------------------- -------------------------------------------------------------------------------- Module #declare cModule = function (re,im) { } Argument / Phase #declare cArgRad = function (re,im) { } #declare cArgDeg = function (re,im) { } Conjuge #declare cConjRe = function (re,im) { } #declare cConjIm = function (re,im) { } Negative/Opposite #declare cNegRe = function (re,im) { } #declare cNegIm = function (re,im) { } -------------------------------------------------------------------------------- --- ARITHMETIC ----------------------------------------------------------------- -------------------------------------------------------------------------------- Addition #declare cAddRe = function (re1,im1,re2,im2) { } #declare cAddIm = function (re1,im1,re2,im2) { } Substration #declare cSubRe = function (re1,im1,re2,im2) { } #declare cSubIm = function (re1,im1,re2,im2) { } Multiplication #declare cMulRe = function (re1,im1,re2,im2) { } #declare cMulIm = function (re1,im1,re2,im2) { } Division #declare cDivRe = function (re1,im1,re2,im2) { } #declare cDivIm = function (re1,im1,re2,im2) { } Inverse #declare cInvRe = function (re,im) { } #declare cInvIm = function (re,im) { } -------------------------------------------------------------------------------- --- POWER ---------------------------------------------------------------------- -------------------------------------------------------------------------------- Power 2 (square) #declare cP2Re = function (re,im) { } #declare cP2Im = function (re,im) { } Synonym #declare cSqrRe = function (re,im) { } #declare cSqrIm = function (re,im) { } Power 3 (cube) #declare cP3Re = function (re,im) { } #declare cP3Im = function (re,im) { } Power 4 #declare cP4Re = function (re,im) { } #declare cP4Im = function (re,im) { } Power 5 #declare cP5Re = function (re,im) { } #declare cP5Im = function (re,im) { } Real Power #declare cPowRealRe = function (re,im,p) { } #declare cPowRealIm = function (re,im,p) { } Complex power complex #declare cPowCPowRe = function (re1,im1,re2,im2) { } #declare cPowCPowIm = function (re1,im1,re2,im2) { } Square root #declare cSqrtRe = function (re,im) { } #declare cSqrtIm = function (re,im) { } -------------------------------------------------------------------------------- --- LOGARITHM & EXPONENTIAL ---------------------------------------------------- -------------------------------------------------------------------------------- Logarithme #declare cLnRe = function (re,im) { } #declare cLnIm = function (re,im) { } Exponentielle #declare cExpRe = function (re,im) { } #declare cExpIm = function (re,im) { } -------------------------------------------------------------------------------- --- TRIGONOMETRIC -------------------------------------------------------------- -------------------------------------------------------------------------------- Sinus #declare cSinRe = function (re,im) { } #declare cSinIm = function (re,im) { } Cosinus #declare cCosRe = function (re,im) { } #declare cCosIm = function (re,im) { } Tangent #declare cTanRe = function (re,im) { } #declare cTanIm = function (re,im) { } ArcSinus #declare cArcSinRe = function (re,im) { } #declare cArcSinIm = function (re,im) { } ArcCosinus #declare cArcCosRe = function (re,im) { } #declare cArcCosIm = function (re,im) { } ArcTangent #declare cArcTanRe = function (re,im) { } #declare cArcTanIm = function (re,im) { } -------------------------------------------------------------------------------- --- HYPERBOLIC ----------------------------------------------------------------- -------------------------------------------------------------------------------- Hyperbolic sinus #declare cSinHRe = function (re,im) { } #declare cSinHIm = function (re,im) { } Hyperbolic cosinus #declare cCosHRe = function (re,im) { } #declare cCosHIm = function (re,im) { } Hyperbolic tangent #declare cTanHRe = function (re,im) { } #declare cTanHIm = function (re,im) { } -------------------------------------------------------------------------------- */ // ----------------------------------------------------------------------------- // --- COMPLEX ----------------------------------------------------------------- // ----------------------------------------------------------------------------- // ----------------------------------------------------------------------------- // complex : module // (a + ib) = sqrt(a*a + b*b) // ----------------------------------------------------------------------------- #declare cModule = function (re,im) { sqrt(re*re + im*im) } // ----------------------------------------------------------------------------- // complex : argument/phase // (a + ib) -> ArcTan (b/a) // ----------------------------------------------------------------------------- #declare cArgRad = function (re,im) { atan2(im,re) } #declare cArgRad2Pi = function (re,im) { select ( atan2(im,re), // < 0 atan2(im,re)+2*pi, // > = 0 atan2(im,re) ) } // Almost never used #declare cArgDeg = function (re,im) { degrees(atan2(im,re)) } #declare cArgDeg360 = function (re,im) { select ( degrees(atan2(im,re)), // < 0 degrees(atan2(im,re))+360, // >=0 degrees(atan2(im,re)) ) } // ----------------------------------------------------------------------------- // complex conjugate // (a + ib) -> a - i*b // ----------------------------------------------------------------------------- #declare cConjRe = function (re,im) { re } #declare cConjIm = function (re,im) { -im } // ----------------------------------------------------------------------------- // Negative/Opposite // Neg(z) = Neg(a+ib) = -a -ib // ----------------------------------------------------------------------------- #declare cNegRe = function (re,im) { -re } #declare cNegIm = function (re,im) { -im } // ----------------------------------------------------------------------------- // --- ARITHMETIC -------------------------------------------------------------- // ----------------------------------------------------------------------------- // ----------------------------------------------------------------------------- // complex addition // (a + ib) + (c + id) = (a + c) + i (b + d) // ----------------------------------------------------------------------------- #declare cAddRe = function (re,im, re2,im2) { re + re2 } #declare cAddIm = function (re,im, re2,im2) { im + im2 } // ----------------------------------------------------------------------------- // complex substration // (a + ib) - (c + id) = (a - c) + i (b - d) // ----------------------------------------------------------------------------- #declare cSubRe = function (re,im, re2,im2) { re - re2 } #declare cSubIm = function (re,im, re2,im2) { im - im2 } // ----------------------------------------------------------------------------- // complex multiplication // (a + ib) * (c + id) = (a*c - b*d) + i (a*d + b*c) // ----------------------------------------------------------------------------- #declare cMulRe = function (re,im, re2,im2) { re*re2 - im*im2 } #declare cMulIm = function (re,im, re2,im2) { re*im2 + im*re2 } // ----------------------------------------------------------------------------- // complex division // (a+ib)/(c+id) = ((a*c + d*b)/(c^2+d^2)) + ((b*c - ad)/(c^2 + d^2))i // ----------------------------------------------------------------------------- #declare cDivRe = function (re,im, re2,im2) { ( re*re2 + im2*im) / ( re2*re2 + im2*im2 ) } #declare cDivIm = function (re,im, re2,im2) { ( im*re2 - re*im2 ) / ( re2*re2 + im2*im2 ) } // ----------------------------------------------------------------------------- // complex inverse // 1 / ( a + ib) = (a / (a^2 + b^2)) - i ( b / ( a^2 + b^2)) // -------------------------------------------------------------------------- #declare cInvRe = function (re,im) { cDivRe (1, 0, re,im) } #declare cInvIm = function (re,im) { cDivIm (1, 0, re,im) } // ----------------------------------------------------------------------------- // --- POWER ------------------------------------------------------------------- // ----------------------------------------------------------------------------- // ----------------------------------------------------------------------------- // complex power : 2 (square) // (a + ib)^2 = (a^2 - b^2) + (2ab) i // ----------------------------------------------------------------------------- #declare cP2Re = function (re,im) { re*re - im*im } #declare cP2Im = function (re,im) { 2*re*im } // synonym #declare cSqrRe = function (re,im) { re*re - im*im } #declare cSqrIm = function (re,im) { 2*re*im } // ----------------------------------------------------------------------------- // complex power : 3 (cube) // (a +ib)^3 = (a^3 - 3ab^2) + (3*a^2b - b^3)i // ----------------------------------------------------------------------------- #declare cP3Re = function (re,im) { re*re*re - 3*re*im*im } #declare cP3Im = function (re,im) { 3*re*re*im - im*im*im } // ----------------------------------------------------------------------------- // complex power : 4 // (a +ib)^4 = (a^4 - 6*a^2b^2 + b^4) + (4*a^3*b - 4*a*b^3)i // ----------------------------------------------------------------------------- #declare cP4Re = function (re,im) { re*re*re*re - 6*re*re*im*im + im*im*im*im } #declare cP4Im = function (re,im) { 4*re*re*re*im - 4*re*im*im*im } // ----------------------------------------------------------------------------- // complex power : 5 // (a +ib)^5 = a^5 + 5 i a^4 b - 10 a^3 b^2 - 10 i a^2 b^3 + 5 a b^4 + i b^5 // = a^5 - 10 a^3 b^2 + 5 a b^4 + 5 i a^4 b - 10 i a^2 b^3 + i b^5 // = (a^5 - 10*a^3*b^2 + 5*a*b^4) + (5*a^4*b - 10*a^2*b^3 + b^5)i // = (re^5 - 10*re^3*im,^2 + 5*re*im,^4) + (5*re^4*im - 10*re^2*im,^3 + im,^5)i // = (re*re*re*re*re - 10*re*re*re*im*im + 5*re*im*im*im*im) + (5*re*re*re*re*im - 10*re*re*im*im*im + im*im*im*im*im)i // ----------------------------------------------------------------------------- #declare cP5Re = function (re,im) { re*re*re*re*re - 10*re*re*re*im*im + 5*re*im*im*im*im } #declare cP5Im = function (re,im) { 5*re*re*re*re*im - 10*re*re*im*im*im + im*im*im*im*im } // ----------------------------------------------------------------------------- // Power real // R = module(z), A = Argument(z) // z^n = R^n( cos(n.A) + i sin(n.A)) // ----------------------------------------------------------------------------- #declare cPowRealRe = function (re,im, p) { pow(cModule(re,im),p) * cos(cArgRad(re,im)*p) } #declare cPowRealIm = function (re,im, p) { pow(cModule(re,im),p) * sin(cArgRad(re,im)*p) } // ----------------------------------------------------------------------------- // Square root // sqrt(z) = sqrt(a+ib) = (a+ib)^1/2 // ----------------------------------------------------------------------------- #declare cSqrtRe = function (re,im) { cPowRealRe (re,im,0.50) } #declare cSqrtIm = function (re,im) { cPowRealIm (re,im,0.50) } // ----------------------------------------------------------------------------- // --- LOGARITHM & EXPONENTIAL ------------------------------------------------- // ----------------------------------------------------------------------------- // ----------------------------------------------------------------------------- // Neperian logarithm // ln(a + ib) = ln(sqrt(a*a + b*b)) + i arg(a+ib) // ----------------------------------------------------------------------------- #declare cLnRe = function (re,im) { ln(sqrt(re*re + im*im)) } #declare cLnIm = function (re,im) { cArgRad(re,im) } // ----------------------------------------------------------------------------- // Exponentiel // e^(a + ib) = e^(re)*cos(im) + (e^(re)*sin(im))i // ----------------------------------------------------------------------------- #declare cExpRe = function (re,im) { exp(re)*cos(im) } #declare cExpIm = function (re,im) { exp(re)*sin(im) } // ----------------------------------------------------------------------------- // Power Complex complex // z1^z2 = exp(ln(z1)*z2 ) // ----------------------------------------------------------------------------- #declare cPowCPowRe = function (re1,im1,re2,im2) { cExpRe ( cMulRe ( cLnRe(re1,im1), cLnIm(re1,im1), re2, im2 ), cMulIm ( cLnRe(re1,im1), cLnIm(re1,im1), re2, im2 ) ) } #declare cPowCPowIm = function (re1,im1,re2,im2) { cExpIm ( cMulRe ( cLnRe(re1,im1), cLnIm(re1,im1), re2, im2 ), cMulIm ( cLnRe(re1,im1), cLnIm(re1,im1), re2, im2 ) ) } // ----------------------------------------------------------------------------- // --- TRIGONOMETRIC ----------------------------------------------------------- // ----------------------------------------------------------------------------- // ----------------------------------------------------------------------------- // Sinus // sin(z) = (e^(iz) - e^(-iz))/2i // // iz = +i(a+ib) = +ai + i^2b = +ai - b = -b + ia // -iz = -i(a+ib) = -ia - i^2b = -ia + b = +b - ia // ----------------------------------------------------------------------------- #declare cSinRe = function (re,im) { cDivRe ( cSubRe( cExpRe(-im, re), cExpIm(-im, re), cExpRe(im, -re), cExpIm(im, -re) ), // cSubRe cSubIm( cExpRe(-im, re), cExpIm(-im, re), cExpRe(im, -re), cExpIm(im, -re) ), // cSubim 0, 2 ) // cDivRe } #declare cSinIm = function (re,im) { cDivIm( cSubRe( cExpRe(-im, re), cExpIm(-im, re), cExpRe(im, -re), cExpIm(im, -re) ), // cSubRe cSubIm( cExpRe(-im, re), cExpIm(-im, re), cExpRe(im, -re), cExpIm(im, -re) ), // cSubim 0, 2 ) // cDivRe } // ----------------------------------------------------------------------------- // Cosinus // cos(z) = (e^(iz) + e^(-iz))/2 // ----------------------------------------------------------------------------- #declare cCosRe = function (re,im) { cDivRe ( cAddRe( cExpRe(-im, re), cExpIm(-im, re), cExpRe(im, -re), cExpIm(im, -re) ), // cSubRe cAddIm( cExpRe(-im, re), cExpIm(-im, re), cExpRe(im, -re), cExpIm(im, -re) ), // cSubim 2, 0 ) // cDivRe } #declare cCosIm = function (re,im) { cDivIm( cAddRe( cExpRe(-im, re), cExpIm(-im, re), cExpRe(im, -re), cExpIm(im, -re) ), // cSubRe cAddIm( cExpRe(-im, re), cExpIm(-im, re), cExpRe(im, -re), cExpIm(im, -re) ), // cSubim 2, 0 ) // cDivRe } // ----------------------------------------------------------------------------- // Tangente // tan(z) = -i ( (e^(iz) - e^(-iz)) / (e^(iz) + e^(-iz)) ) // ----------------------------------------------------------------------------- #declare cTanRe = function (re,im) { cDivRe ( cSinRe (re,im), cSinIm (re,im), cCosRe (re,im), cCosIm (re,im) ) } #declare cTanIm = function (re,im) { cDivIm ( cSinRe (re,im), cSinIm (re,im), cCosRe (re,im), cCosIm (re,im) ) } // ----------------------------------------------------------------------------- // Arc Sinus // arcsin(z) = -i ln[iz + sqrt(1-z^2)] // ----------------------------------------------------------------------------- #declare cArcSinRe = function (re,im) { cMulRe ( 0, -1, cLnRe ( cAddRe ( -im, +re, cSqrtRe ( cSubRe ( 1, 0, cSqrRe (re,im), cSqrIm (re,im) ), // cSubRe cSubIm ( 1, 0, cSqrRe (re,im), cSqrIm (re,im) ) // cSubIm ), // cSqrtRe cSqrtIm ( cSubRe ( 1, 0, cSqrRe (re,im), cSqrIm (re,im) ), // cSubRe cSubIm ( 1, 0, cSqrRe (re,im), cSqrIm (re,im) ) // cSubIm ) // cSqrtIm ), // cAddRe cAddIm ( -im, +re, cSqrtRe ( cSubRe ( 1, 0, cSqrRe (re,im), cSqrIm (re,im) ), // cSubRe cSubIm ( 1, 0, cSqrRe (re,im), cSqrIm (re,im) ) // cSubIm ), // cSqrtRe cSqrtIm ( cSubRe ( 1, 0, cSqrRe (re,im), cSqrIm (re,im) ), // cSubRe cSubIm ( 1, 0, cSqrRe (re,im), cSqrIm (re,im) ) // cSubIm ) // cSqrtIm ) // cAddIm ), // cLnRe cLnIm ( cAddRe ( -im, +re, cSqrtRe ( cSubRe ( 1, 0, cSqrRe (re,im), cSqrIm (re,im) ), // cSubRe cSubIm ( 1, 0, cSqrRe (re,im), cSqrIm (re,im) ) // cSubIm ), // cSqrtRe cSqrtIm ( cSubRe ( 1, 0, cSqrRe (re,im), cSqrIm (re,im) ), // cSubRe cSubIm ( 1, 0, cSqrRe (re,im), cSqrIm (re,im) ) // cSubIm ) // cSqrtIm ), // cAddRe cAddIm ( -im, +re, cSqrtRe ( cSubRe ( 1, 0, cSqrRe (re,im), cSqrIm (re,im) ), // cSubRe cSubIm ( 1, 0, cSqrRe (re,im), cSqrIm (re,im) ) // cSubIm ), // cSqrtRe cSqrtIm ( cSubRe ( 1, 0, cSqrRe (re,im), cSqrIm (re,im) ), // cSubRe cSubIm ( 1, 0, cSqrRe (re,im), cSqrIm (re,im) ) // cSubIm ) // cSqrtIm ) // cAddIm ) // cLnIm ) // cMulRe } #declare cArcSinIm = function (re,im) { cMulIm ( 0, -1, cLnRe ( cAddRe ( -im, +re, cSqrtRe ( cSubRe ( 1, 0, cSqrRe (re,im), cSqrIm (re,im) ), // cSubRe cSubIm ( 1, 0, cSqrRe (re,im), cSqrIm (re,im) ) // cSubIm ), // cSqrtRe cSqrtIm ( cSubRe ( 1, 0, cSqrRe (re,im), cSqrIm (re,im) ), // cSubRe cSubIm ( 1, 0, cSqrRe (re,im), cSqrIm (re,im) ) // cSubIm ) // cSqrtIm ), // cAddRe cAddIm ( -im, +re, cSqrtRe ( cSubRe ( 1, 0, cSqrRe (re,im), cSqrIm (re,im) ), // cSubRe cSubIm ( 1, 0, cSqrRe (re,im), cSqrIm (re,im) ) // cSubIm ), // cSqrtRe cSqrtIm ( cSubRe ( 1, 0, cSqrRe (re,im), cSqrIm (re,im) ), // cSubRe cSubIm ( 1, 0, cSqrRe (re,im), cSqrIm (re,im) ) // cSubIm ) // cSqrtIm ) // cAddIm ), // cLnRe cLnIm ( cAddRe ( -im, +re, cSqrtRe ( cSubRe ( 1, 0, cSqrRe (re,im), cSqrIm (re,im) ), // cSubRe cSubIm ( 1, 0, cSqrRe (re,im), cSqrIm (re,im) ) // cSubIm ), // cSqrtRe cSqrtIm ( cSubRe ( 1, 0, cSqrRe (re,im), cSqrIm (re,im) ), // cSubRe cSubIm ( 1, 0, cSqrRe (re,im), cSqrIm (re,im) ) // cSubIm ) // cSqrtIm ), // cAddRe cAddIm ( -im, +re, cSqrtRe ( cSubRe ( 1, 0, cSqrRe (re,im), cSqrIm (re,im) ), // cSubRe cSubIm ( 1, 0, cSqrRe (re,im), cSqrIm (re,im) ) // cSubIm ), // cSqrtRe cSqrtIm ( cSubRe ( 1, 0, cSqrRe (re,im), cSqrIm (re,im) ), // cSubRe cSubIm ( 1, 0, cSqrRe (re,im), cSqrIm (re,im) ) // cSubIm ) // cSqrtIm ) // cAddIm ) // cLnIm ) // cMulRe } // ----------------------------------------------------------------------------- // Arc Cosinus // // acos(z) = (1/i) ln [ z + i sqrt( 1 - z^2 ) ] // 1/i = -i // ----------------------------------------------------------------------------- #declare cArcCosRe = function (re,im) { cMulRe ( 0, -1, cLnRe ( cAddRe ( re, im, cMulRe ( 0, 1, cSqrtRe ( cSubRe ( 1, 0, cSqrRe(re,im), cSqrIm(re,im) ), cSubIm ( 1, 0, cSqrRe(re,im), cSqrIm(re,im) ) ), cSqrtIm ( cSubRe ( 1, 0, cSqrRe(re,im), cSqrIm(re,im) ), cSubIm ( 1, 0, cSqrRe(re,im), cSqrIm(re,im) ) ) ), cMulIm ( 0, 1, cSqrtRe ( cSubRe ( 1, 0, cSqrRe(re,im), cSqrIm(re,im) ), cSubIm ( 1, 0, cSqrRe(re,im), cSqrIm(re,im) ) ), cSqrtIm ( cSubRe ( 1, 0, cSqrRe(re,im), cSqrIm(re,im) ), cSubIm ( 1, 0, cSqrRe(re,im), cSqrIm(re,im) ) ) ) ), cAddIm ( re, im, cMulRe ( 0, 1, cSqrtRe ( cSubRe ( 1, 0, cSqrRe(re,im), cSqrIm(re,im) ), cSubIm ( 1, 0, cSqrRe(re,im), cSqrIm(re,im) ) ), cSqrtIm ( cSubRe ( 1, 0, cSqrRe(re,im), cSqrIm(re,im) ), cSubIm ( 1, 0, cSqrRe(re,im), cSqrIm(re,im) ) ) ), cMulIm ( 0, 1, cSqrtRe ( cSubRe ( 1, 0, cSqrRe(re,im), cSqrIm(re,im) ), cSubIm ( 1, 0, cSqrRe(re,im), cSqrIm(re,im) ) ), cSqrtIm ( cSubRe ( 1, 0, cSqrRe(re,im), cSqrIm(re,im) ), cSubIm ( 1, 0, cSqrRe(re,im), cSqrIm(re,im) ) ) ) ) ), cLnIm ( cAddRe ( re, im, cMulRe ( 0, 1, cSqrtRe ( cSubRe ( 1, 0, cSqrRe(re,im), cSqrIm(re,im) ), cSubIm ( 1, 0, cSqrRe(re,im), cSqrIm(re,im) ) ), cSqrtIm ( cSubRe ( 1, 0, cSqrRe(re,im), cSqrIm(re,im) ), cSubIm ( 1, 0, cSqrRe(re,im), cSqrIm(re,im) ) ) ), cMulIm ( 0, 1, cSqrtRe ( cSubRe ( 1, 0, cSqrRe(re,im), cSqrIm(re,im) ), cSubIm ( 1, 0, cSqrRe(re,im), cSqrIm(re,im) ) ), cSqrtIm ( cSubRe ( 1, 0, cSqrRe(re,im), cSqrIm(re,im) ), cSubIm ( 1, 0, cSqrRe(re,im), cSqrIm(re,im) ) ) ) ), cAddIm ( re, im, cMulRe ( 0, 1, cSqrtRe ( cSubRe ( 1, 0, cSqrRe(re,im), cSqrIm(re,im) ), cSubIm ( 1, 0, cSqrRe(re,im), cSqrIm(re,im) ) ), cSqrtIm ( cSubRe ( 1, 0, cSqrRe(re,im), cSqrIm(re,im) ), cSubIm ( 1, 0, cSqrRe(re,im), cSqrIm(re,im) ) ) ), cMulIm ( 0, 1, cSqrtRe ( cSubRe ( 1, 0, cSqrRe(re,im), cSqrIm(re,im) ), cSubIm ( 1, 0, cSqrRe(re,im), cSqrIm(re,im) ) ), cSqrtIm ( cSubRe ( 1, 0, cSqrRe(re,im), cSqrIm(re,im) ), cSubIm ( 1, 0, cSqrRe(re,im), cSqrIm(re,im) ) ) ) ) ) ) } #declare cArcCosIm = function (re,im) { cMulIm ( 0, -1, cLnRe ( cAddRe ( re, im, cMulRe ( 0, 1, cSqrtRe ( cSubRe ( 1, 0, cSqrRe(re,im), cSqrIm(re,im) ), cSubIm ( 1, 0, cSqrRe(re,im), cSqrIm(re,im) ) ), cSqrtIm ( cSubRe ( 1, 0, cSqrRe(re,im), cSqrIm(re,im) ), cSubIm ( 1, 0, cSqrRe(re,im), cSqrIm(re,im) ) ) ), cMulIm ( 0, 1, cSqrtRe ( cSubRe ( 1, 0, cSqrRe(re,im), cSqrIm(re,im) ), cSubIm ( 1, 0, cSqrRe(re,im), cSqrIm(re,im) ) ), cSqrtIm ( cSubRe ( 1, 0, cSqrRe(re,im), cSqrIm(re,im) ), cSubIm ( 1, 0, cSqrRe(re,im), cSqrIm(re,im) ) ) ) ), cAddIm ( re, im, cMulRe ( 0, 1, cSqrtRe ( cSubRe ( 1, 0, cSqrRe(re,im), cSqrIm(re,im) ), cSubIm ( 1, 0, cSqrRe(re,im), cSqrIm(re,im) ) ), cSqrtIm ( cSubRe ( 1, 0, cSqrRe(re,im), cSqrIm(re,im) ), cSubIm ( 1, 0, cSqrRe(re,im), cSqrIm(re,im) ) ) ), cMulIm ( 0, 1, cSqrtRe ( cSubRe ( 1, 0, cSqrRe(re,im), cSqrIm(re,im) ), cSubIm ( 1, 0, cSqrRe(re,im), cSqrIm(re,im) ) ), cSqrtIm ( cSubRe ( 1, 0, cSqrRe(re,im), cSqrIm(re,im) ), cSubIm ( 1, 0, cSqrRe(re,im), cSqrIm(re,im) ) ) ) ) ), cLnIm ( cAddRe ( re, im, cMulRe ( 0, 1, cSqrtRe ( cSubRe ( 1, 0, cSqrRe(re,im), cSqrIm(re,im) ), cSubIm ( 1, 0, cSqrRe(re,im), cSqrIm(re,im) ) ), cSqrtIm ( cSubRe ( 1, 0, cSqrRe(re,im), cSqrIm(re,im) ), cSubIm ( 1, 0, cSqrRe(re,im), cSqrIm(re,im) ) ) ), cMulIm ( 0, 1, cSqrtRe ( cSubRe ( 1, 0, cSqrRe(re,im), cSqrIm(re,im) ), cSubIm ( 1, 0, cSqrRe(re,im), cSqrIm(re,im) ) ), cSqrtIm ( cSubRe ( 1, 0, cSqrRe(re,im), cSqrIm(re,im) ), cSubIm ( 1, 0, cSqrRe(re,im), cSqrIm(re,im) ) ) ) ), cAddIm ( re, im, cMulRe ( 0, 1, cSqrtRe ( cSubRe ( 1, 0, cSqrRe(re,im), cSqrIm(re,im) ), cSubIm ( 1, 0, cSqrRe(re,im), cSqrIm(re,im) ) ), cSqrtIm ( cSubRe ( 1, 0, cSqrRe(re,im), cSqrIm(re,im) ), cSubIm ( 1, 0, cSqrRe(re,im), cSqrIm(re,im) ) ) ), cMulIm ( 0, 1, cSqrtRe ( cSubRe ( 1, 0, cSqrRe(re,im), cSqrIm(re,im) ), cSubIm ( 1, 0, cSqrRe(re,im), cSqrIm(re,im) ) ), cSqrtIm ( cSubRe ( 1, 0, cSqrRe(re,im), cSqrIm(re,im) ), cSubIm ( 1, 0, cSqrRe(re,im), cSqrIm(re,im) ) ) ) ) ) ) } // ----------------------------------------------------------------------------- // Arc Tangent // arctan(z) = [ln(1-iz) - ln(1+iz)] * i/2 // ----------------------------------------------------------------------------- #declare cArcTanRe = function (re,im) { cMulRe ( cSubRe ( cLnRe ( cSubRe ( 1, 0, -im, cAddIm ( 1, 0, -im, +re ) ), cSubIm ( 1, 0, -im, cAddIm ( 1, 0, -im, +re ) ) ), cLnIm ( cSubRe ( 1, 0, -im, cAddIm ( 1, 0, -im, +re ) ), cSubIm ( 1, 0, -im, cAddIm ( 1, 0, -im, +re ) ) ), cLnRe ( cAddRe ( 1, 0, -im, +re ), cAddIm ( 1, 0, -im, +re ) ), cLnIm ( cAddRe ( 1, 0, -im, +re ), cAddIm ( 1, 0, -im, +re ) ) ), cSubIm ( cLnRe ( cSubRe ( 1, 0, -im, cAddIm ( 1, 0, -im, +re ) ), cSubIm ( 1, 0, -im, cAddIm ( 1, 0, -im, +re ) ) ), cLnIm ( cSubRe ( 1, 0, -im, cAddIm ( 1, 0, -im, +re ) ), cSubIm ( 1, 0, -im, cAddIm ( 1, 0, -im, +re ) ) ), cLnRe ( cAddRe ( 1, 0, -im, +re ), cAddIm ( 1, 0, -im, +re ) ), cLnIm ( cAddRe ( 1, 0, -im, +re ), cAddIm ( 1, 0, -im, +re ) ) ), 0, 0.50 ) } #declare cArcTanIm = function (re,im) { cMulIm ( cSubRe ( cLnRe ( cSubRe ( 1, 0, -im, cAddIm ( 1, 0, -im, +re ) ), cSubIm ( 1, 0, -im, cAddIm ( 1, 0, -im, +re ) ) ), cLnIm ( cSubRe ( 1, 0, -im, cAddIm ( 1, 0, -im, +re ) ), cSubIm ( 1, 0, -im, cAddIm ( 1, 0, -im, +re ) ) ), cLnRe ( cAddRe ( 1, 0, -im, +re ), cAddIm ( 1, 0, -im, +re ) ), cLnIm ( cAddRe ( 1, 0, -im, +re ), cAddIm ( 1, 0, -im, +re ) ) ), cSubIm ( cLnRe ( cSubRe ( 1, 0, -im, cAddIm ( 1, 0, -im, +re ) ), cSubIm ( 1, 0, -im, cAddIm ( 1, 0, -im, +re ) ) ), cLnIm ( cSubRe ( 1, 0, -im, cAddIm ( 1, 0, -im, +re ) ), cSubIm ( 1, 0, -im, cAddIm ( 1, 0, -im, +re ) ) ), cLnRe ( cAddRe ( 1, 0, -im, +re ), cAddIm ( 1, 0, -im, +re ) ), cLnIm ( cAddRe ( 1, 0, -im, +re ), cAddIm ( 1, 0, -im, +re ) ) ), 0, 0.50 ) } // ----------------------------------------------------------------------------- // --- HYPERBOLIC -------------------------------------------------------------- // ----------------------------------------------------------------------------- // ----------------------------------------------------------------------------- // Hyperbolic sinus // sinh(z) = (exp(z) - exp(-z)) / 2 // z = a + ib // -z = -a - ib // ----------------------------------------------------------------------------- #declare cSinHRe = function (re,im) { cDivRe ( cSubRe ( cExpRe (re,im), cExpIm (re,im), cExpRe (-re,-im), cExpIm (-re,-im) ), cSubIm ( cExpRe (re,im), cExpIm (re,im), cExpRe (-re,-im), cExpIm (-re,-im) ), 2, 0 ) } #declare cSinHIm = function (re,im) { cDivIm ( cSubRe ( cExpRe (re,im), cExpIm (re,im), cExpRe (-re,-im), cExpIm (-re,-im) ), cSubIm ( cExpRe (re,im), cExpIm (re,im), cExpRe (-re,-im), cExpIm (-re,-im) ), 2, 0 ) } // ----------------------------------------------------------------------------- // Hyperbolic cosinus // cosh(z) = (exp(z) + exp(-z)) / 2 // ----------------------------------------------------------------------------- #declare cCosHRe = function (re,im) { cDivRe ( cAddRe ( cExpRe (re,im), cExpIm (re,im), cExpRe (-re,-im), cExpIm (-re,-im) ), cSubIm ( cExpRe (re,im), cExpIm (re,im), cExpRe (-re,-im), cExpIm (-re,-im) ), 2, 0 ) } #declare cCosHIm = function (re,im) { cDivIm ( cAddRe ( cExpRe (re,im), cExpIm (re,im), cExpRe (-re,-im), cExpIm (-re,-im) ), cAddIm ( cExpRe (re,im), cExpIm (re,im), cExpRe (-re,-im), cExpIm (-re,-im) ), 2, 0 ) } // ----------------------------------------------------------------------------- // Hyperbolic tangent // tanh(z) = sinh(z) / cosh(z) // ----------------------------------------------------------------------------- #declare cTanHRe = function (re,im) { cDivRe ( cSinHRe (re,im), cSinHIm (re,im), cCosHRe (re,im), cCosHIm (re,im) ) } #declare cTanHIm = function (re,im) { cDivIm ( cSinHRe (re,im), cSinHIm (re,im), cCosHRe (re,im), cCosHIm (re,im) ) } // ----------------------------------------------------------------------------- // --- eof --------------------------------------------------------------------- // -----------------------------------------------------------------------------