Declaración del problema
Dado un conjunto de primos consecutivos únicos (que no incluyen necesariamente 2), genera los productos de todas las combinaciones de primeras potencias de estos primos, por ejemplo, sin repeticiones, y también 1. Por ejemplo, dado el conjunto {2, 3, 5, 7}, produce {1, 2, 3, 5, 6, 7, 10, 14, 15, 21, 30, 35, 42, 70, 105, 210} porque:
1 = 1
2 = 2
3 = 3
5 = 5
6 = 2 x 3
7 = 7
10 = 2 x 5
14 = 2 x 7
15 = 3 x 5
21 = 3 x 7
30 = 2 x 3 x 5
35 = 5 x 7
42 = 2 x 3 x 7
70 = 2 x 5 x 7
105 = 3 x 5 x 7
210 = 2 x 3 x 5 x 7
Tenga en cuenta que si la cardinalidad de su conjunto de entrada es k, esto le dará 2 ^ k miembros en su conjunto de salida.
Reglas / condiciones
- Puedes usar cualquier idioma. Apunte al recuento de caracteres más pequeño del código fuente.
- Su solución debe ser un programa completo o una función completa. La función puede ser anónima (si su idioma admite funciones anónimas).
- Su solución debe poder admitir productos de al menos 2 ^ 31. No se preocupe por detectar o manejar el desbordamiento de enteros si se le pasan números cuyo producto es demasiado grande para representarlo. Sin embargo, indique los límites de sus cálculos.
- Puede aceptar una lista o un conjunto y producir una lista o un conjunto. Puede suponer que la entrada está ordenada, pero no es necesario que produzca una salida ordenada.
Fondo
¿Cuándo o por qué es útil? Un lugar en el que es muy útil es generar una tabla de multiplicadores para competir en paralelo en un algoritmo de factorización de enteros conocido como Factorización de formas cuadradas. Allí, cada multiplicador impar que intente disminuye la probabilidad de que el algoritmo falle (para encontrar un factor) en aproximadamente un 50% en semiprimes duros. Entonces, con el conjunto de primos generadores {3, 5, 7, 11}, que produce un conjunto de 16 multiplicadores de prueba para correr en paralelo, el algoritmo falla aproximadamente 2 ^ –16 del tiempo en semiprimes duros. Agregar 13 a la lista de números primos produce un conjunto de 32 multiplicadores de prueba, lo que reduce la posibilidad de falla a aproximadamente 2 ^ –32, brindando una mejora drástica en el resultado sin gastos computacionales adicionales (porque incluso con el doble de multiplicadores compitiendo en paralelo, en promedio todavía encuentra la respuesta en el mismo número total de pasos).