有理数の再帰的シーケンスを生成するためのより速く、よりエレガントな方法[クローズ]

Nov 24 2020

私は以下の再帰を研究しています:

$$B_{N,0}=1$$

$$B_{N,k}=-\binom{N+k}{k}^{-1}\sum_{j=0}^{k-1}\binom{N+k}{j}B_{N,j}$$

今はMathematicaで書くのが苦手です。使ってから久しぶりです。それで私はいくつかの古い仕事を調べて、Mathematicaでこの方法に出くわしました。これはコード内の「メモリ」プロパティであり、それが私に記述されていることを覚えている方法です。だから私はそれをして、以下のコードを書きました。

 B[0]=1

 B[k]=B[k_]:=Simplify[-1/(Binomial[N+k,k])*Sum[Binomial[N+k,j]*B[j]],{j,0,k-1}]

そしてそれは動作します!素晴らしいとは言えません。だから私は最初の4つか5つをかなりうまく手に入れました。これらは変数の有理関数です$N$。だから最初の5つは以下に投稿されています(私はImgurを使用しました、ごめんなさい)

しかし、その後、コードが壊れます。必要な計算が大きくなるにつれて、再帰が難しくなりすぎると確信しています。次の2つの数字は次のように与えられます(ここでも、画像で申し訳ありません)

そして、ここに質問があります。6番目のB [6]、7番目のB [7]、...、k番目の数B [k]が、前の5のようにエレガントな因数分解された形式で、その不格好な二項式なしで書き込まれる、または出力されるようにするにはどうすればよいですか分母の機能?分母の因数分解の分布に興味があります。

回答

10 N0va Nov 24 2020 at 10:08
ClearAll[B];    
B[k_]:=B[k]=Simplify[FunctionExpand[-1/(Binomial[n+k,k])*Sum[Binomial[n+k,j]*B[j],{j,0,k-1}]]]

私にとっては問題なく動作します:

Table[{"B[" <> ToString[k] <> "]=", B[k]}, {k, 0, 7}] // TableForm

ClearAll[B]値はによってキャッシュされるため、定義を変更するときは必ず確認してくださいB[k]:=B[k]。計算B[k]k=7は0.02秒かかり、最大k=4210.7秒かかりました。それは私には理にかなっているようです。

6 yawnoc Nov 24 2020 at 20:54

OPの定義とN0vaの定義の違いを指摘するだけです。

間違ったバージョン

B[k] = B[k_] := <RHS>

左から右に読むと、最初の割り当ては単一の等号(Set)であり、2番目の割り当てはコロンの等号(SetDelayed)です。GUIでは、kが青色で表示されていることに注意してください(無料であると想定)。擬似コードの場合:

  1. Mathematicaは最初にを見B[k] = <expression1>て、「私はすぐ<expression1>に結果を評価してに割り当てます」と言いB[k]ます。
  2. 次にMathematicaは<expression1>、を見B[k_] := <RHS>て、「これからを定義B[k_]します<RHS>が、実際の値を受け取るまでの評価を遅らせます」と言い<RHS>ますk

2番目のステップはを返しNullNullすぐにに割り当てられるのはこれですB[k]。事実上、これは行うことと同じです

B[k_] := <RHS>
B[k] = Null

つまり、記憶されていない定義の後に、即時の(しかしかなり役に立たない)割り当てが続きます。

正しいバージョン

B[k_] := B[k] = <RHS>

左から右に読むと、最初の割り当てはコロンに等しい(SetDelayed)であり、2番目の割り当ては単一に等しい(Set)です。擬似コードの場合:

  1. Mathematicaは最初にを見B[k_] := <expression2>て、「これからはであると定義B[k_]します<expression2><expression2>、実際の値を受け取るまでの評価を遅らせます」と言いますk

では、の実際の値をk受け取るとどうなりますか?

  1. 次にMathematicaは、を評価し<expression2>B[k] = <RHS>「今すぐ評価<RHS> て結果をに割り当てます」と言いB[k]ます。暗記を達成するのはこの2番目の課題です。