【问题标题】:How to generate all multiplicative partitions of a number if I have a list of primes/exponents?如果我有一个素数/指数列表,如何生成一个数字的所有乘法分区?
【发布时间】:2012-11-03 15:19:13
【问题描述】:

例如,数字 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 编码。

【问题讨论】:

  • 为什么有两票可以关闭?那些投票的人可以解释一下吗?
  • 您可以将问题归结为查找列表的所有可能分区。
  • @Blender:我有一种方法可以找到数字的加法分区。你是这个意思吗?如果是这样,这与乘法分区有什么关系?

标签: python algorithm number-theory


【解决方案1】:

您的问题可以浓缩为查找所有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

【讨论】:

  • 这是否不仅需要查找列表分区,还需要查找分区的所有排列?
  • 不,只是分区。我的例子有点懒,抱歉。分区只是子集的集合,当它们组合时,形成原始集合。子集只是包含在原始集合中的一组元素(不按任何特定顺序)。
  • 我有一个生成器,它会产生,在 24 的情况下,它有 [1, 1, 1, 1] [1, 1, 2], [2, 2], [1, 3], [4] 够了吗?我不是必须以各种可能的方式围绕主要因素交换所有这些吗?
  • @JohnSmith:输出中的数字代表什么?
  • @JohnSmith:等等,不会的。 frozenset 可用于内部集合:frozenset([frozenset([3]), frozenset([2, 1])]) == frozenset([frozenset([1, 2]), frozenset([3])])
猜你喜欢
  • 1970-01-01
  • 2012-03-24
  • 2013-12-31
  • 2016-02-09
  • 2011-04-08
  • 2015-10-20
  • 1970-01-01
  • 2021-01-03
  • 2022-10-02
相关资源
最近更新 更多