我想构建一个高效的 Python 迭代器/生成器,它产生:
- 小于 N 的所有合数
- 连同他们的素数分解
我将其称为“composites_with_factors()”
假设我们已经有一个小于 N 的素数列表,或者一个可以做同样事情的素数生成器。
请注意,我:
- 不需要按数字顺序产生数字
- 不关心 1 是否在开始时产生
- 不要关心是否也产生了素数
我认为这可以通过一个聪明的递归生成器来完成......
因此,例如,对 composites_with_factors(16) 的调用可能会产生:
# yields values in form of "composite_value, (factor_tuple)"
2, (2)
4, (2, 2)
8, (2, 2, 2)
6, (2, 3)
12, (2, 2, 3)
10, (2, 5)
14, (2, 7)
3, (3)
9, (3, 3)
15, (3, 5)
5, (5)
7, (7)
11, (11)
13, (13)
正如您从我的输出顺序中看到的那样,我设想这个工作是从可用素数生成器上的最小素数开始,并输出该素数的所有幂小于 N,然后再次尝试通过该素数的幂,但在每个阶段看看我是否可以应用额外素数的幂(并且仍然小于 N)。当所有与那个素数的组合都完成后,放下它,然后用素数生成器上可用的下一个最低素数重复。
我尝试用“递归生成器”来做这件事让我很困惑,什么时候用“yield”、“raise StopIteration”或“return”退出递归,或者干脆退出递归函数。
谢谢你的智慧!
附加说明:
我现在确实有一种方法可以做到这一点:我编写了一个分解数字的函数,所以我可以将它们分解为素数,并产生结果。没问题。我依靠“什么是数字 N 的最低素数”的缓存来保持这个速度极快......对于 N 高达 1000 万。
但是,一旦我从缓存中取出,我们就会将其转移到“幼稚”的因式分解。(呸。)
这篇文章的要点是:
- 我假设“从它们的因子生成大型复合材料”将比“分解大型复合材料”更快......特别是因为我不关心订单,并且
- 如何让 Python 生成器“递归”调用自身,并生成一个生成的东西流?