(Ruby 1.9+) def trans_mult(transa, transb) trans_ret = Array.new 0.upto(transa.length-1) do |index| trans_ret.push(transa[transb[index]]) end return trans_ret end def trans_powers(trans) trans_hash ={} trans_hash[trans] =1 last = 0 trans_current = trans.clone while trans_hash.size != last last = trans_hash.size trans_current = trans_mult(trans_current, trans) trans_hash[trans_current.clone] =1 end return trans_hash.keys end counting_numbers = Enumerator.new do |yielder| (0..1.0/0).each do |number| yielder.yield number end end 0.upto(10).each do |tran_size| histo_hash = {} counting_numbers.take(tran_size).repeated_permutation(tran_size).each { |x| size = trans_powers(x).length if (histo_hash[size] == nil) histo_hash[size] =1 else histo_hash[size] = histo_hash[size]+1 end } puts "#{tran_size}|" + histo_hash.inspect end