次の結果をもたらす効率的な 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 未満です)。THAT 素数とのすべての組み合わせが完了したら、それをドロップし、素数ジェネレーターで利用可能な次に小さい素数で繰り返します。
「再帰ジェネレーター」を使用してこれを実行しようとすると、「yield」、「raise StopIteration」、または「return」を使用して再帰からいつ抜け出すか、または単純に再帰関数から抜け出すかについて、非常に混乱してしまいました。
あなたの知恵をありがとう!
追加の注意:
これを行う方法は 1 つあります。数値を因数分解する関数を作成したので、素数に因数分解して結果を得ることができます。問題ない。私は、「数 N の最小の素因数」のキャッシュに依存することで、これを非常に高速に保ちます... N は 1000 万までです。
しかし、いったんキャッシュから出てしまえば、それは「単純な」因数分解になります。(うん。)
この投稿のポイントは次のとおりです。
- 「因子から大きな複合体を生成する」ことは、「大きな複合体を因子分解する」よりも高速であると想定しています...特に順序は気にしないので、
- Python ジェネレーターを「再帰的に」呼び出して、生成されたものの単一のストリームを生成するにはどうすればよいですか?