| - 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 >> |