Постановка проблемы
Учитывая набор уникальных последовательных простых чисел (необязательно включая 2), генерируют произведения всех комбинаций первых степеней этих простых чисел - например, без повторов - а также 1. Например, учитывая набор {2, 3, 5, 7}, вы производите {1, 2, 3, 5, 6, 7, 10, 14, 15, 21, 30, 35, 42, 70, 105, 210}, потому что:
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
Обратите внимание, что если количество элементов вашего входного набора равно k, это даст вам 2 ^ k членов в вашем выходном наборе.
Правила / условия
- Вы можете использовать любой язык. Стремитесь к наименьшему количеству символов исходного кода.
- Ваше решение должно быть либо полной программой, либо полной функцией. Функция может быть анонимной (если ваш язык поддерживает анонимные функции).
- Ваше решение должно поддерживать продукты как минимум до 2 ^ 31. Не беспокойтесь об обнаружении или обработке целочисленного переполнения, если вам передают числа, чей продукт слишком велик для представления. Однако, пожалуйста, укажите пределы ваших расчетов.
- Вы можете принять список или набор и создать список или набор. Вы можете предположить, что вход отсортирован, но вы не обязаны производить отсортированный вывод.
Задний план
Когда или почему это полезно? Одним из мест, где это очень полезно, является создание таблицы множителей для параллельного состязания в алгоритме целочисленного факторинга, известном как факторизация квадратов, Там каждый нечетный множитель, который вы пробуете, уменьшает вероятность сбоя алгоритма (чтобы найти фактор) примерно на 50% на жестких полупростых числах. Таким образом, с набором порождающих простых чисел {3, 5, 7, 11}, который генерирует набор из 16 пробных множителей для параллельного состязания, алгоритм терпит неудачу примерно в 2 ^ –16 раз на жестких полуприцепах. Добавление 13 к списку простых чисел дает набор из 32 пробных множителей, снижая вероятность неудачи примерно до 2–32, что дает резкое улучшение результата без дополнительных вычислительных затрат (поскольку даже при увеличении вдвое большего числа множителей параллельно в среднем он все равно находит ответ в том же общем количестве шагов).