diff --git a/kmath-core/src/commonMain/kotlin/scientifik/kmath/operations/Complex.kt b/kmath-core/src/commonMain/kotlin/scientifik/kmath/operations/Complex.kt index 3dd6f5157..e45dcb1ea 100644 --- a/kmath-core/src/commonMain/kotlin/scientifik/kmath/operations/Complex.kt +++ b/kmath-core/src/commonMain/kotlin/scientifik/kmath/operations/Complex.kt @@ -104,7 +104,12 @@ object ComplexField : ExtendedField { override fun asinh(arg: Complex): Complex = ln(sqrt((arg pow 2) + 1) + arg) override fun acosh(arg: Complex): Complex = ln(arg + sqrt((arg - 1) * (arg + 1))) override fun atanh(arg: Complex): Complex = (ln(arg + 1) - ln(1 - arg)) / 2 - override fun power(arg: Complex, pow: Number): Complex = exp(ln(arg) * pow) + + override fun power(arg: Complex, pow: Number): Complex = if (arg.im == 0.0) + arg.re.pow(pow.toDouble()).toComplex() + else + exp(pow * ln(arg)) + override fun exp(arg: Complex): Complex = exp(arg.re) * (cos(arg.im) + i * sin(arg.im)) override fun ln(arg: Complex): Complex = ln(arg.r) + i * atan2(arg.im, arg.re) @@ -145,9 +150,9 @@ data class Complex(val re: Double, val im: Double) : FieldElement Complex): Buffer = MemoryBuffer.create(Complex, size, init) diff --git a/kmath-core/src/commonMain/kotlin/scientifik/kmath/structures/ComplexNDField.kt b/kmath-core/src/commonMain/kotlin/scientifik/kmath/structures/ComplexNDField.kt index 85c997c13..f979707f4 100644 --- a/kmath-core/src/commonMain/kotlin/scientifik/kmath/structures/ComplexNDField.kt +++ b/kmath-core/src/commonMain/kotlin/scientifik/kmath/structures/ComplexNDField.kt @@ -70,25 +70,25 @@ class ComplexNDField(override val shape: IntArray) : override fun NDBuffer.toElement(): FieldElement, *, out BufferedNDField> = BufferedNDFieldElement(this@ComplexNDField, buffer) - override fun power(arg: NDBuffer, pow: Number): BufferedNDFieldElement = + override fun power(arg: NDBuffer, pow: Number): ComplexNDElement = map(arg) { power(it, pow) } - override fun exp(arg: NDBuffer): BufferedNDFieldElement = map(arg) { exp(it) } - override fun ln(arg: NDBuffer): BufferedNDFieldElement = map(arg) { ln(it) } + override fun exp(arg: NDBuffer): ComplexNDElement = map(arg) { exp(it) } + override fun ln(arg: NDBuffer): ComplexNDElement = map(arg) { ln(it) } - override fun sin(arg: NDBuffer): BufferedNDFieldElement = map(arg) { sin(it) } - override fun cos(arg: NDBuffer): BufferedNDFieldElement = map(arg) { cos(it) } - override fun tan(arg: NDBuffer): BufferedNDFieldElement = map(arg) { tan(it) } - override fun asin(arg: NDBuffer): BufferedNDFieldElement = map(arg) { asin(it) } - override fun acos(arg: NDBuffer): BufferedNDFieldElement = map(arg) { acos(it) } - override fun atan(arg: NDBuffer): BufferedNDFieldElement = map(arg) { atan(it) } + override fun sin(arg: NDBuffer): ComplexNDElement = map(arg) { sin(it) } + override fun cos(arg: NDBuffer): ComplexNDElement = map(arg) { cos(it) } + override fun tan(arg: NDBuffer): ComplexNDElement = map(arg) { tan(it) } + override fun asin(arg: NDBuffer): ComplexNDElement = map(arg) { asin(it) } + override fun acos(arg: NDBuffer): ComplexNDElement = map(arg) { acos(it) } + override fun atan(arg: NDBuffer): ComplexNDElement = map(arg) { atan(it) } - override fun sinh(arg: NDBuffer): BufferedNDFieldElement = map(arg) { sinh(it) } - override fun cosh(arg: NDBuffer): BufferedNDFieldElement = map(arg) { cosh(it) } - override fun tanh(arg: NDBuffer): BufferedNDFieldElement = map(arg) { tanh(it) } - override fun asinh(arg: NDBuffer): BufferedNDFieldElement = map(arg) { asinh(it) } - override fun acosh(arg: NDBuffer): BufferedNDFieldElement = map(arg) { acosh(it) } - override fun atanh(arg: NDBuffer): BufferedNDFieldElement = map(arg) { atanh(it) } + override fun sinh(arg: NDBuffer): ComplexNDElement = map(arg) { sinh(it) } + override fun cosh(arg: NDBuffer): ComplexNDElement = map(arg) { cosh(it) } + override fun tanh(arg: NDBuffer): ComplexNDElement = map(arg) { tanh(it) } + override fun asinh(arg: NDBuffer): ComplexNDElement = map(arg) { asinh(it) } + override fun acosh(arg: NDBuffer): ComplexNDElement = map(arg) { acosh(it) } + override fun atanh(arg: NDBuffer): ComplexNDElement = map(arg) { atanh(it) } }