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.