<...>
Tienes razón. Si se usase como entrada al proceso de hackeo un fichero con las 18! combinaciones (ahora 8!), hay frase repetidas por la presencia de 4 términos "de", lo cual reduce la combinatoria al tratarse de permutaciones con repetición (en lugar de sin).
PR (permutaciones con repetición)= n! / (n1!*n2!* … *nm!)
Donde:
- n es el número de términos (18).
- n1 .. nm representa el número de repeticiones de cada término.
Quedaría pues:
18! / 4! (el resto de los multiplicandos del denominador se repite 1 sola vez cada uno, y multiplican por uno el denominador-> 1!=1) = 2,66766E+14 (266.766.000.000.000).
Es un ahorro importante en combinaciones teóricas.
En la práctica, para resolver el caso usando fuerza bruta, tengo dudas de si ciertos algoritmos serían capaces de llevar la reducción a la práctica. Por ejemplo, si para insertar un registro resultante de una combinación, sobre una tabla temporal, has de validar si ya está previamente creado, el proceso se ralentiza enormemente (y no digamos select distinct de la tabla resultante para crear la tabla final más reducida).
Quizás los procesos que trabajan sobre memoria pura y dura (sin usar disco) puedan manejarlo de manera que la reducción de la combinatoria (con comprobaciones sobre lo ya generado) sea más eficiente que generar y probar todas las combinaciones. Dependerá mucho del hardware usado supongo.
Teniendo esto presente, las 8! combinaciones pendientes se convierten realmente en 8!/3!= 6.720 combinaciones pendientes distintas ...