私の問題は次のとおりです。大量の数列があります。ある時点の後、それが周期的になることを知っています-つまり、シーケンスの最初に k 個の数字があり、シーケンスの残りの部分で繰り返される m 個の数字があります。これをより明確にする例として、シーケンスは次のようになります: [1, 2, 5, 3, 4, 2, 1, 1, 3, 2, 1, 1, 3, 2, 1, 1, 3 、...]、ここで、k は 5、m は 4 で、繰り返しブロックは [2, 1, 1, 3] です。この例から明らかなように、大きなブロック内に繰り返しビットを含めることができるため、繰り返しの最初のインスタンスを探すだけでは役に立ちません。
ただし、kまたはmが何であるかはわかりません-私の目標は、シーケンス[a_1、a_2、...、a_n]を入力として受け取り、シーケンス[a_1、...、a_k、[a_(k +1), ... , a_(k+m)]] - 基本的に、その大部分を繰り返しブロックとしてリストすることにより、長いシーケンスを切り捨てます。
この問題を効率的に行う方法はありますか? また、計算上はおそらくより困難ですが、より理想的です-問題のシーケンスを生成するときにこれを実行して、最小限の量を生成する必要がありますか? このサイトで他の同様の質問を見てきましたが、それらはすべて、最初の非反復ビットなしでシーケンスを処理しているように見え、多くの場合、内部反復を心配する必要がありません.
それが役立つ/役立つ場合は、なぜこれを見ているのか、何に使用するのかについても説明できます。
ありがとう!
EDITS:最初に、入力シーケンスが繰り返されるブロックの最後で正確に終了するかどうかわからないことに言及する必要がありました。
私が取り組もうとしている現実世界の問題は、2 次無理数 (実際には負の CFE) の連分数展開 (CFE) の適切な閉じた形式の式を作成することです。これらの CFE の部分商 * を任意の精度で生成するのは非常に簡単ですが、ある時点で、2 次無理数の CFE の末尾が繰り返しブロックになります。この繰り返しブロックの部分商を処理する必要があります。
私の現在の考えは次のとおりです。おそらく、これらのシーケンスのいずれかで動作するように、右から動作するように提案されたアルゴリズムのいくつかを適応させることができます. あるいは、二次無理数が周期的である理由の証明には、なぜそれらが繰り返され始めるのかを理解するのに役立つ何かがあり、簡単な基準を確認するのに役立ちます.
*連分数展開を [a_0, a_1, ...] と書いている場合、a_i を部分商と呼びます。
興味のある方のために、いくつかの背景情報をここで見つけることができます: http://en.wikipedia.org/wiki/Periodic_continued_fraction