興味をそそるだけで、プロジェクトオイラーの「最近の」カテゴリ(数字の合計シーケンス)から問題を解決しようとしました 。しかし、問題を効率的に解決する方法を考えることはできません。問題は次のとおりです(元の質問シーケンスでは最初に2つありますが、シーケンスは変更されません)。
Digit Sumシーケンスは、1,2,4,8,16,23,28,38,49 ....です。ここで、シーケンスの項は、シーケンス内でその前にある数字の合計です。シーケンスの項を見つけます。
素朴なソリューションは多くの時間がかかるため実装できません。私はこの問題を行列の累乗の場合(時間がかかる)に減らすことを試みましたが、このシーケンスの繰り返しはかなり線形であるため、このような繰り返しを見つけることはできませんでした独特の。シーケンスは繰り返しによって管理されていることがわかります。
ここではシーケンスの項であり、は入力として自然数が与えられると、その数字の桁の合計を返す関数です(例:)。2番目のアプローチは、シーケンス内のパターンを見つけることでした。シーケンスの最初のいくつかの用語は、次のように記述できることがわかります。
a_1 = 1
a_2 = 1 + d( 1 )
a_3 = 1 + d( 1 ) + d( 1 + d( 1 ) )
a_4 = 1 + d( 1 ) + d( 1 + d( 1 ) ) + d( 1 + d( 1 ) + d( 1 + d( 1 ) ) )
a_5 = 1 + d( 1 ) + d( 1 + d( 1 ) ) + d( 1 + d( 1 ) + d( 1 + d( 1 ) ) ) + d( 1 + d(
1 ) + d( 1 + d( 1 ) ) + d( 1 + d( 1 ) + d( 1 + d( 1 ) ) ) )
上記のパターンから、シーケンスの項は次の方法で生成できるようになります。
- の間に追加記号を入れて書き込みます。
- 最初の残して から、次の2 0項に関数dを適用し、次の2 1項に、次に次の2 2項に、というように関数dを適用します。
- 次に、適用された各関数の引数に上記のメソッドを再帰的に適用します。
たとえば、n = 3の場合、次の操作を実行します。
1 + 1 + 1 + 1 + 1 + 1 + 1 + 1
1 + d( 1 ) + d( 1 + 1 ) + d( 1 + 1 + 1 + 1 )
1 + d( 1 ) + d( 1 + d(1) ) + d( 1 + d( 1 ) + d( 1 +d( 1 ) ) )
動的プログラミングによってIが生成することができの時間で、上記の方法使って用語をO (LはO 、G (2 10 15))、再びない良好ナイーブ溶液よりなります。
EDIT 1
観察できるもう1つのことは、です。たとえば、d (a 6)= d (23 )= d (32 )= 5です。しかし、私はこの点を利用できません。再度、線形回帰関係(行列の累乗法)を見つけようとしましたが、見つけることができません。
編集2
以下は、より狭い範囲でシーケンスをプロットしたときのグラフです(シーケンスの最初の項がプロットされます)。
PS:Project Eulerにソリューションを依頼することはお勧めできません。しかし、私は過去数日間円を描いて移動してきたので、新しい方向性やヒントが欲しいだけです。それも受け入れられない場合は、提案があれば質問を削除できます。
You are given a106 = 31054319.
オリジナルのオイラー問題にヒントがあるように感じます。