This is an implementation of tropical (min-plus) arithmetic in Julia.
The tropical numbers consist of the real numbers and infinity. The
SimpleTropical
module defines the Tropical
type (which is a
subtype of Number
). Tropical numbers can be parameterized by type,
but this is taken care of automatically:
julia> using SimpleTropical
julia> x = Tropical(3.5)
Tropical(3.5)
julia> y = Tropical{Int}(4)
Tropical(4)
Tropical infinity is available via TropicalInf
:
julia> TropicalInf
Tropical(∞)
To convert a Tropical
number to a real number, use real
:
julia> a = Tropical(5)
Tropical(5)
julia> a+2
Tropical(2)
julia> real(a)+2
7
The +
operation is defined as the min of the two values and *
as the sum:
julia> x+y
Tropical(3.5)
julia> x*y
Tropical(7.5)
The identity element for +
is TropicalInf
and the identity
element for *
is Tropical(0)
:
julia> x + TropicalInf
Tropical(3.5)
julia> x * Tropical(0)
Tropical(3.5)
No elements in tropical arithmetic have additive inverses, but they do have multiplicative inverses (except for infinity):
julia> inv(x)
Tropical(-3.5)
julia> inv(TropicalInf)
ERROR: AssertionError: TropicalInf is not invertible
Exponentiation by integers works:
julia> x^10
Tropical(35.0)
julia> x^-2
Tropical(-7.0)
The symbols ⊕
and ⊗
may be used instead of +
and *
for Tropical
numbers. In addition, these may be used on Real
numbers with the result
being the appropriate Tropical
number.
julia> 5 ⊕ 2
Tropical(2)
julia> 5 ⊗ 2
Tropical(7)
Note: In the REPL, the symbol ⊕
is created by typing \oplus
and then pressing TAB. Likewise, ⊗
is created as \otimes
followed by TAB.
The Julia function zero
normally returns the number zero because that is the
identity element for addition; likewise, one
returns the number one because
that is the identity element for multiplication.
In tropical arithmetic, these identity elements are Tropical(∞)
and Tropical(0)
,
respectively. Therefore we define the zero
and one
functions to return these values.
julia> a = Tropical(3)
Tropical(3)
julia> zero(a)
Tropical(∞)
julia> zero(Tropical)
Tropical(∞)
julia> one(a)
Tropical(0)
julia> one(Tropical)
Tropical(0)
Likewise, the functions zeros
and ones
return an array of the appropriate values:
julia> zeros(Tropical,3)
3-element Vector{Tropical}:
Tropical(∞)
Tropical(∞)
Tropical(∞)
julia> ones(Tropical,3)
3-element Vector{Tropical}:
Tropical(0)
Tropical(0)
Tropical(0)
Use isinf(X)
to test if a tropical number is infinity.
julia> isinf(x)
false
julia> isinf(TropicalInf)
true
The usual comparison operators ==
and !==
work as expected:
julia> Tropical(3.0) == Tropical(3)
true
julia> Tropical(3.1) != Tropical(3//1)
true
By default, Tropical
numbers are displayed in the form Tropical(xxx)
such as
Tropical(-3)
or Tropical(∞)
. This behavior can be changed using the function
long_tropical_show
.
long_tropical_show(true)
gives the default behavior.long_tropical_show(false)
makesTropical
numbers appear as ordinary real numbers.
julia> long_tropical_show(false)
false
julia> 5 ⊕ 2
2
julia> 5 ⊗ 2
7
julia> typeof(ans)
Tropical{Int64}
Calling long_tropical_show()
without any arguments returns the current state
for showing Tropical
numbers: true
for the default behavior and false
for the short display.