| - Up - | Next >> |
Consider
domains
through
. Each domain
has cardinality
:
The cardinality of the cartesian product
is
. We are going to establish a bijection between
and
.
The idea is to partition the interval
into
equal subintervals: one for each value in
. Then to partition each subinterval into
subsubintervals: one for each value in
. Etc recursively.
It is easy to capture this idea in a formula. Consider a tuple
. According to the recursive algorithm outlined above, it is assigned to the following integer:
Thus, given an index
in the range
, we can recover the corresponding tuple by calling {DecodeInt I-1 Divs Doms}, where Divs is the list:
and Doms is the list of domains, each one consisting of a list of values. The function DecodeInt is implemented as follows:
fun {DecodeInt I Divs Doms}
case Divs#Doms
of nil#nil then nil
[] (Div|Divs)#(Dom|Doms) then
Q = I div Div
R = I mod Div
in
{Nth Dom Q+1}|{DecodeInt R Divs Doms}
end
end| - Up - | Next >> |