问题陈述
给定一组唯一的,连续的素数(不一定包括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,从而在不增加计算开销的情况下显着提高了结果(因为即使并行乘以两倍的乘数,平均而言,它仍然以相同的总步数找到答案)。