Постановка проблеми
Давши набір унікальних послідовних прайменів (не обов'язково включаючи 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, що дозволяє різко покращити результат без додаткових обчислювальних витрат (тому що навіть удвічі більше множників, що паралельно гонять, на в середньому він все ще знаходить відповідь у однаковій загальній кількості кроків).