【发布时间】:2012-04-23 23:15:09
【问题描述】:
我想构建一个高效的 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 生成器“递归”调用自身,并生成一个生成的东西流?
【问题讨论】:
-
你为这个方法做了哪些努力?请向我们展示您的代码。
-
您是制作素数生成器,还是只制作奇数生成器?如果你一次只做一件,也许会更容易理解。请向我们展示您目前拥有的代码。
-
@Makoto:我的尝试完全失败了,如果我张贴残骸,也不会发光。例如,我的案例只产生了小于 N 的所有整数的一小部分。
-
您提到您想递归地执行此操作,但很难击败筛子! en.wikipedia.org/wiki/Sieve_of_Eratosthenes。这可以简单地修改以保留这些因素。
-
@Hooked:好的,我可以再看看 SoE。也许我可以“反转”它以产生复合而不是素数。但是,我曾经尝试实现一个 SoE(用于素数),在我的观察中它占用了大量内存(因为每个阶段都需要“记住”它将过滤掉的内容)。
标签: python algorithm iterator generator