¿Lo que buscas es calcular todas las permutaciones (combinatoria (?)) posibles en un espacio, dado un sistema numerico base? ¿O buscas otra cosa?
No se a que te refieres con "Similitud".
Lo que el algoritmo pretende es formar, escribir, calcular,... las permutaciones de una colección de "n" objetos (distintos entre sí).
Esa colección (conjunto) de "n" elementos puede ser representada (descrita, asimilada,...) por el subconjunto de números naturales 0, 1,... (n - 1). Por ejemplo, encontrar las permutaciones de las letras "a", "b", "c", es equivalente a encontrar las permutaciones de los números 0, 1, 2; no hay más que establecer la correspondencia: 0-"a", 1-"b", 2-"c". Igual daría "manzana"-"naranja"-"plátano"; ´"n" objetos (distintos) siempre son asimilabes a "n" números enteros (del 0 al n-1).
A su vez, un sistema de numeración en base "n" consta de "n" dígitos (símbolos, objetos,...) mediante los cuales puede escribirse, representarse,... simbólicamente un número natural. Usualmente para base 10 usamos los dígitos 0 - 9, pero si la base es mayor deberemos emplear otros símbolos. Por ejemplo en hexadecimal usamos además del 0 - 9 los símbolos A - F. Pero los símbolos A - F no representan otra cosa que los números 11 - 15 (en decimal). Podríamos representar igual los símbolos a partir del 9 como: (10)-(11)-...-(15). O sea los números naturales del 10 al 15.
Entonces, la "similitud" consiste en que una distribución cualquiera de "n" objetos (distintos entre sí) puede ser representada por "n" símbolos, dígitos,... cada uno de los cuáles representa, a su vez, un número en base "n" que consta de "n" dígitos.
Y una permutación de esos "n" símbolos" (objetos) consistirá simplemente en un número -en base "n"- que consta de "n" dígitos, y en el cual se dé, además, la condición de que todos los ("n") dígitos sean distintos entre sí. Esa es la condición de "caprichosos" a que se refería Serapis en el hilo que me orientó sobre cómo escribir el algoritmo. Son números de "n" dígitos -en base "n"- con la condición "caprichosa" de que todos los dígitos sean distintos entre sí.
Por lo tanto se trata de buscar todos los números de "n" dígitos en base "n" y extraer aquellos cuyos dígitos son todos distintos entre sí; o lo que es lo mismo desechar aquellos que tienen algún digito repetido.
Para ponerlo con un ejemplo. Pretendemos obtener las permutaciones de 3 elementos. Me da igual que sean: a-b-c, que que sea 2-f-X, que que sean manzana-pera-fresa, etc. Al final todas son equivalentes, asimilables... a las permutaciones de 0-1-2.
Pues serán aquellos números de 3 dígitos en base 3, y que además, los dígitos sean distintos y no se repitan. No tengo más entonces que empezar a formar los números de 3 dígitos en base 3 y extraer aquellos cuyos dígitos son todos distintos entre sí.
Empezamos símplemente a "contar" en ese sístema de numeración (3 - dígitos válidos: 0, 1, 2):
000 - No vale: dígitos repetidos
001 - ídem
002 - ídem
010 - ídem
011 - ídem
012 ---- aquí tenemos nuestra 1ª permutación
Seguimos contando (añadiendo +1 a los números)
020 - No vale: dígitos repetidos
021 ---- nueva permutación
Seguimos contando
022 - No vale: dígitos repetidos
100 - idem
101 - ídem
102 ---- nueva permutación
Seguimos contando
110 - No vale: dígitos repetidos
111 - ídem
120 ---- nueva permutación
Seguimos contando
121 - No vale: dígitos repetidos
122 - ídem
200 - ídem
201 ---- nueva permutación
Seguimos contando
202 - No vale: dígitos repetidos
210 ---- nueva permutación
Seguimos contando
211 - No vale: dígitos repetidos
212 - ídem
220 - ídem
221 - ídem
222 - ídem
Ya no se pueden escribir más números de tres digitos en base 3. (25 números en decimal = 2*3^2+2*3^1+2*3^0)
Las permutaciones de tres elementos (para el caso las de los objetos 0-1-2) son:
012 ---- aquí tenemos nuestra 1ª permutación
021 ---- nueva permutación
102 ---- nueva permutación
120 ---- nueva permutación
201 ---- nueva permutación
210 ---- nueva permutación
El algoritmo que escribí simplifica un poco ya que no cuenta desde 0, porque sabemos que la primera permutación (el nº más bajo de "n" dígitos en base "n") es :0-1-2-...-(n-1).
Igualmente sabemos que la 2ª permutación es directamente intercambiar los 2 dígitos de la derecha.
E igualmente sabemos que no es necesario seguir contando hasta el nº: (n-1)-(n-1)-...-(n-1) puesto que sabemos que la última permutación es: (n-1)-(n-2)-(n-3)-...-2-1-0.
Éso sí, no he conseguido simplificar el resto, y por éso lo he hecho a lo bestia: ir sumando de 1 en 1 y a cada nuevo número comprobar si todos sus dígitos son distintos o no.
AL menos el sistema es eficaz, ya que el hecho de que cada nuevo número a comprobar sea distinto del anterior (ya que van aumentando de 1 en 1) nos resguarda de que repitamos permutaciones. Así que si empezamos en la que sabemos que es 1ª, seguimos buscando todas las demás una por una, y paramos en la que sabemos que es última, se supone que debe de darnos todas.
NOTA: la palabra "similitud" es del lenguaje corriente; creo que en un foro de programación se puede entender bastante bien pensando en arreglos. Tengo ya un poco olvidadas mis nociones de álgebra, boole, conjuntos y formulación axiomática (Zermelo) de los numeros naturales; pero si no estoy equivocado, creo que la manera matemáticamente correcta de expresarlo sería que:
se puede constatar que existe un isomorfismo entre un conjunto cualquiera (finito) de n elementos (distintos entre sí) y el subconjunto de números naturales 0, 1, 2,..., (n-1).