Declaração de problema
Dado um conjunto de primos únicos e consecutivos (não necessariamente incluindo 2), gere os produtos de todas as combinações das primeiras potências desses primos - por exemplo, sem repetições - e também 1. Por exemplo, dado o conjunto {2, 3, 5, 7}, você produz {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
Observe que, se a cardinalidade do seu conjunto de entradas for k, isso fornecerá 2 ^ k membros no seu conjunto de saída.
Regras / Condições
- Você pode usar qualquer idioma. Aponte para a menor contagem de caracteres do código-fonte.
- Sua solução deve ser um programa completo ou uma função completa. A função pode ser anônima (se o seu idioma suportar funções anônimas).
- Sua solução deve oferecer suporte a produtos de pelo menos 2 ^ 31. Não se preocupe em detectar ou manipular excesso de número inteiro se você receber números passados cujo produto é ótimo demais para representar. No entanto, indique os limites dos seus cálculos.
- Você pode aceitar uma lista ou um conjunto e produzir uma lista ou um conjunto. Você pode assumir que a entrada está classificada, mas não é necessário produzir uma saída classificada.
fundo
Quando ou por que isso é útil? Um local em que é muito útil é gerar uma tabela de multiplicadores para competir em paralelo em um algoritmo de fatoração inteiro conhecido como Fatoração de Formas Quadradas. Lá, cada multiplicador ímpar que você tenta diminui a probabilidade de o algoritmo falhar (para encontrar um fator) em aproximadamente 50% em semiprimes rígidos. Portanto, com o conjunto de primos geradores {3, 5, 7, 11}, que produz um conjunto de 16 multiplicadores de teste para correr em paralelo, o algoritmo falha aproximadamente 2 ^ –16 do tempo em semiprimes rígidos. Adicionar 13 à lista de números primos produz um conjunto de 32 multiplicadores de teste, reduzindo a chance de falha para aproximadamente 2 ^ –32, proporcionando uma melhoria drástica no resultado sem nenhuma despesa computacional adicional (porque mesmo com o dobro do multiplicador correndo em paralelo, em média, ainda encontra a resposta no mesmo número total de etapas).