This Julia module gives an alternative to Complex
numbers and their
operations to give mathematically more sensible results.
Standard complex field operations in Julia work fine; the problems
begin to arise when dividing by zero. It is logical to extend the real
numbers with a positive infinity and a negative infinity. And we have
both +Inf
and -Inf
in Julia. However, there are problems with the
implementation of infinite values for Julia Complex
numbers. Here
are some examples.
# For real numbers, division by 0 gives an infinite result
julia> 1/0
Inf
# This division by 0 for complex numbers is fine
julia> (2+3im)/0
Inf + Inf*im
# But this one doesn't make sense
julia> 2im/0
NaN + Inf*im
# For real numbers we have the following sensible result
julia> (Inf + 3) == (Inf + 2)
true
# But it breaks for complex numbers
julia> (Inf + 3im) == (Inf + 2im)
false
This module defines an alternative to Complex
numbers in which there is a
single infinite value (we call ComplexInfinity
). We introduce a new type
called RC
(an abbreviation for Riemann Complex number). Let's see how the
previous calculations work in this new context:
julia> using RiemannComplexNumbers
julia> (2+3IM)/0
ComplexInf
julia> 2IM/0
ComplexInf
julia> Inf + 3IM == Inf + 2IM
true
The constant IM
is the replacement for im
that can be used to construct
Riemann Complex numbers. In general, wrapping values in RC
will work:
julia> RC(2)
2 + 0IM
julia> RC(3-im)
3 - 1IM
Dividing by zero gives the following:
julia> (2-3IM)/0
ComplexInf
julia> 3/0IM
ComplexInf
julia> 0/0IM
ComplexNaN
To convert an RC
number to a Complex
do this:
julia> z = 3.5 - 5IM
3.5 - 5.0IM
julia> Complex(z)
3.5 - 5.0im
Basic arithmetic operations work exactly the same for RC
numbers as for Complex
but will be slower (to deal with division by zero and operations with ComplexInf
and ComplexNaN
).
Some basic functions (such as sqrt
and exp
) are provided. See the functions.jl
file in the src
directory.
Some LinearAlgebra
operations don't work; I'm not sure why. For example,
evaluating the determinant of an RC
matrix throws errors.