Dichiarazione del problema
Dato un insieme di numeri primi consecutivi unici (non necessariamente inclusi 2), genera i prodotti di tutte le combinazioni dei primi poteri di questi numeri primi - ad esempio, nessuna ripetizione - e anche 1. Ad esempio, dato l'insieme {2, 3, 5, 7}, produci {1, 2, 3, 5, 6, 7, 10, 14, 15, 21, 30, 35, 42, 70, 105, 210} perché:
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
Nota che se la cardinalità del tuo set di input è k, questo ti darà 2 ^ k membri nel tuo set di output.
Regole / Condizioni
- Puoi usare qualsiasi lingua. Cerca il numero minimo di caratteri del codice sorgente.
- La soluzione deve essere un programma completo o una funzione completa. La funzione può essere anonima (se la tua lingua supporta funzioni anonime).
- La tua soluzione dovrebbe essere in grado di supportare prodotti fino ad almeno 2 ^ 31. Non preoccuparti di rilevare o gestire l'overflow di numeri interi se vengono passati numeri il cui prodotto è troppo grande per essere rappresentato. Tuttavia, si prega di indicare i limiti dei calcoli.
- È possibile accettare un elenco o un set e produrre un elenco o un set. È possibile supporre che l'input sia ordinato ma non è necessario produrre output ordinato.
sfondo
Quando o perché è utile? Un posto molto utile è la generazione di una tabella di moltiplicatori per correre in parallelo in un algoritmo di factoring intero noto come fattorizzazione delle forme quadrate. Lì, ogni moltiplicatore dispari che provi diminuisce la probabilità che l'algoritmo fallisca (per trovare un fattore) di circa il 50% sui semiprimi difficili. Quindi, con il set di generazione di numeri primi {3, 5, 7, 11}, che produce un set di 16 moltiplicatori di prova per correre in parallelo, l'algoritmo fallisce circa 2 ^ –16 del tempo su semiprime difficili. L'aggiunta di 13 all'elenco dei numeri primi produce un set di 32 moltiplicatori di prova, riducendo la possibilità di fallimento a circa 2 ^ –32, fornendo un drastico miglioramento del risultato senza spese computazionali aggiuntive (perché anche con il doppio dei moltiplicatori che corrono in parallelo, su nella media trova ancora la risposta nello stesso numero totale di passaggi).