As shown below:
x = 27 * e^π
e^2im
e^(2+2pi)im
n = 3
Θ = pi/3
Q = 27
x = Q⋅e^(Θ⋅im)
ϕ₁ = Θ/n + 2π⋅1/n
ϕ₂ = Θ/n + 2π⋅2/n
ϕ₃ = Θ/n + 2π⋅3/n
R = Q^(1/n)
y₁ = R⋅e^(ϕ₁⋅im)
y₂ = R⋅e^(ϕ₂⋅im)
y₃ = R⋅e^(ϕ₃⋅im)
println(x)
println(y₁^3)
println(y₂^3)
println(y₃^3)
println(x^(1/3))
println(y₁)
println(y₂)
println(y₃)
I was expecting x^(1/3)
to give me 3 roots, but it only returned one of them. Why? How can I get the others?
x ^ n
is the exponentiation operation, not the root finder. If you want to find all the roots of a complex number, you can for example search for the roots of the corresponding polynomial using PolynomialRoots.jl
(but there are also other packages for looking for roots of polynomials, like Polynomials.jl
):
julia> using PolynomialRoots
julia> roots([8, 0, 0, -1])
3-element Array{Complex{Float64},1}:
-1.0-1.73205im
2.0-9.61481e-17im
-1.0+1.73205im
The argument of roots
is the vector of coefficients of the polynomial, from the lowest to the highest one. This gives you the 3rd roots of 8.
In your case:
julia> roots([x, 0, 0, -1])
3-element Array{Complex{Float64},1}:
2.81908+1.02606im
-0.520945-2.95442im
-2.29813+1.92836im
Note also that for the exponentiation operation x ^ (1/3)
with x
real you can use instead cbrt(x)
, which is often faster and more accurate.
3 Likes
PolynomialRoots.jl is very nice!
PolynomialRoots.jl
is indeed very nice, but possibly overkill for this problem, as something like
function allroots{T <: Real}(x::Complex{T}, n::Int)
z = x^(1/n)
[z*cis((i-1)*2*π/n) for i in 1:n]
end
should get all the roots.
5 Likes