如果我有一个素数/指数列表,如何生成一个数字的所有乘法分区?

时间:2012-11-15 01:58:47

标签: python algorithm number-theory

例如,数字24具有素数分解2 ^ 3 * 3 ^ 1,并且可以用以下方式编写

1*24
2*12
2*2*6
2*3*4
2*2*2*3
3*8
4*6

我可能错过了一个,但你明白了。

我试着调查另一个帖子How to find multiplicative partitions of any integer?但是不能完全理解答案。

我不需要任何人为我编写代码,但我真的可以使用一些帮助为此创建一个有效的算法(可能是递归的东西?)。

我在Python编码。

1 个答案:

答案 0 :(得分:5)

您的问题可以浓缩为查找所有partitions of a set,因为每个因子(素数和复合因子)都可以表示为构成分区的子集元素的乘积。

我会将您的号码因素表示为列表[2, 2, 2, 3](嗯,一组)。以下是此列表的一些可能分区:

  • [2] + [2, 2, 3]
  • [2, 2] + [2, 3]
  • [2] + [2] + [2, 3]
  • [3] + [2] + [2, 2]
  • ...

如果将每个子集的每个元素相乘,您将获得原始数字的因子:

  • 2 * 12
  • 4 * 6
  • 2 * 2 * 6
  • 3 * 2 * 4

您可能需要添加1 * n的特殊情况。

以下是相关问题:How can I maximally partition a set?

另一个相关链接:Generating the Partitions of a Set