Opis problemu
Biorąc pod uwagę zestaw unikatowych, pierwszych liczb pierwszych (niekoniecznie obejmujących 2), generuj iloczyn wszystkich kombinacji pierwszych mocy tych liczb pierwszych - np. Bez powtórzeń - a także 1. Na przykład, biorąc pod uwagę zbiór {2, 3, 5, 7}, produkujesz {1, 2, 3, 5, 6, 7, 10, 14, 15, 21, 30, 35, 42, 70, 105, 210}, ponieważ:
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
Zauważ, że jeśli liczebność twojego zestawu wejściowego wynosi k, to da ci 2 ^ k członków w zestawie wyjściowym.
Zasady / warunki
- Możesz używać dowolnego języka. Cel najmniejszej liczby znaków w kodzie źródłowym.
- Twoje rozwiązanie musi być kompletnym programem lub pełną funkcją. Funkcja może być anonimowa (jeśli Twój język obsługuje funkcje anonimowe).
- Twoje rozwiązanie powinno obsługiwać produkty do co najmniej 2 ^ 31. Nie przejmuj się wykryciem lub obsługą przepełnienia liczb całkowitych, jeśli masz przekazane liczby, których produkt jest zbyt wielki, aby je reprezentować. Proszę jednak podać granice swoich obliczeń.
- Możesz zaakceptować listę lub zestaw i stworzyć listę lub zestaw. Możesz założyć, że dane wejściowe są posortowane, ale nie musisz tworzyć posortowanych danych wyjściowych.
tło
Kiedy lub dlaczego jest to przydatne? Jednym z użytecznych miejsc jest generowanie tabeli mnożników do równoległego wyścigu w algorytmie faktorowania liczb całkowitych znanym jako faktoryzacja form kwadratowych. Tam każdy nieparzysty mnożnik, który próbujesz, zmniejsza prawdopodobieństwo niepowodzenia algorytmu (w celu znalezienia współczynnika) o około 50% na twardych półpierwszych liczbach. Zatem z zestawem generujących liczb pierwszych {3, 5, 7, 11}, który wytwarza zestaw 16 próbnych mnożników do równoległego wyścigu, algorytm zawodzi około 2 ^ 16 czasu na twardych półpierwszych. Dodanie 13 do listy liczb pierwszych daje zestaw 32 próbnych mnożników, zmniejszając prawdopodobieństwo niepowodzenia do około 2 ^ –32, dając drastyczną poprawę wyniku bez dodatkowych kosztów obliczeniowych (ponieważ nawet przy dwukrotnie większej liczbie mnożników ścigających się równolegle, na średnia nadal znajduje odpowiedź w tej samej łącznej liczbie kroków).