2022-07-25 18:56:12 +00:00
|
|
|
export * from './Types/Complex.mjs'
|
2022-07-25 11:20:13 +00:00
|
|
|
|
|
|
|
export const sqrt = {
|
|
|
|
Complex: ({
|
|
|
|
config,
|
2022-07-25 18:56:12 +00:00
|
|
|
zero,
|
|
|
|
sign,
|
|
|
|
one,
|
|
|
|
add,
|
2022-07-25 11:20:13 +00:00
|
|
|
complex,
|
|
|
|
multiply,
|
|
|
|
self,
|
|
|
|
divide,
|
|
|
|
'abs(Complex)': abs,
|
|
|
|
subtract
|
|
|
|
}) => {
|
|
|
|
if (config.predictable) {
|
|
|
|
return z => {
|
2022-07-25 18:56:12 +00:00
|
|
|
const imZero = zero(z.im)
|
2022-07-25 11:20:13 +00:00
|
|
|
const imSign = sign(z.im)
|
2022-07-25 18:56:12 +00:00
|
|
|
const reOne = one(z.re)
|
2022-07-25 11:20:13 +00:00
|
|
|
const reSign = sign(z.re)
|
2022-07-25 18:56:12 +00:00
|
|
|
if (imSign === imZero && reSign === reOne) return complex(self(z.re))
|
|
|
|
const reTwo = add(reOne, reOne)
|
2022-07-25 11:20:13 +00:00
|
|
|
return complex(
|
2022-07-25 18:56:12 +00:00
|
|
|
multiply(sign(z.im), self(divide(add(abs(z),z.re), reTwo))),
|
|
|
|
self(divide(subtract(abs(z),z.re), reTwo))
|
2022-07-25 11:20:13 +00:00
|
|
|
)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return z => {
|
2022-07-25 18:56:12 +00:00
|
|
|
const imZero = zero(z.im)
|
2022-07-25 11:20:13 +00:00
|
|
|
const imSign = sign(z.im)
|
2022-07-25 18:56:12 +00:00
|
|
|
const reOne = one(z.re)
|
2022-07-25 11:20:13 +00:00
|
|
|
const reSign = sign(z.re)
|
2022-07-25 18:56:12 +00:00
|
|
|
if (imSign === imZero && reSign === reOne) return self(z.re)
|
|
|
|
const reTwo = add(reOne, reOne)
|
2022-07-25 11:20:13 +00:00
|
|
|
return complex(
|
2022-07-25 18:56:12 +00:00
|
|
|
multiply(sign(z.im), self(divide(add(abs(z),z.re), reTwo))),
|
|
|
|
self(divide(subtract(abs(z),z.re), reTwo))
|
2022-07-25 11:20:13 +00:00
|
|
|
)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|