Énoncé du problème
Étant donné un ensemble de nombres premiers uniques consécutifs (ne comprenant pas nécessairement 2), générez les produits de toutes les combinaisons de premières puissances de ces nombres premiers - par exemple, pas de répétitions - et également 1. Par exemple, étant donné l'ensemble {2, 3, 5, 7}, vous produisez {1, 2, 3, 5, 6, 7, 10, 14, 15, 21, 30, 35, 42, 70, 105, 210} parce que:
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
Notez que si la cardinalité de votre jeu d'entrée est k, cela vous donnera 2 ^ k membres dans votre jeu de sortie.
Règles / Conditions
- Vous pouvez utiliser n'importe quelle langue. Visez le plus petit nombre de caractères du code source.
- Votre solution doit être soit un programme complet, soit une fonction complète. La fonction peut être anonyme (si votre langue prend en charge les fonctions anonymes).
- Votre solution doit pouvoir prendre en charge des produits jusqu'à au moins 2 ^ 31. Ne vous inquiétez pas de détecter ou de gérer un débordement d'entier si vous passez des nombres dont le produit est trop grand pour être représenté. Veuillez cependant indiquer les limites de vos calculs.
- Vous pouvez accepter une liste ou un ensemble et produire une liste ou un ensemble. Vous pouvez supposer que l'entrée est triée, mais vous n'êtes pas obligé de produire une sortie triée.
Contexte
Quand ou pourquoi est-ce utile? Il est très utile de générer une table de multiplicateurs pour faire la course en parallèle dans un algorithme de factorisation d'entier connu sous le nom de factorisation de formes carrées. Là, chaque multiplicateur impair que vous essayez diminue la probabilité que l'algorithme échoue (pour trouver un facteur) d'environ 50% sur les demi-durs durs. Ainsi, avec l'ensemble de génération de nombres premiers {3, 5, 7, 11}, qui produit un ensemble de 16 multiplicateurs d'essai pour faire la course en parallèle, l'algorithme échoue environ 2 ^ –16 du temps sur les demi-durs durs. L'ajout de 13 à la liste des nombres premiers produit un ensemble de 32 multiplicateurs d'essai, réduisant le risque d'échec à environ 2 ^ –32, ce qui donne une amélioration drastique des résultats sans frais de calcul supplémentaires (car même avec deux fois plus de multiplicateurs qui courent en parallèle, sur moyenne, il trouve toujours la réponse dans le même nombre total d'étapes).