2

私は次のコードを持っています。それはまさに私がしたいことですが、まったく遅いです。コードを「手動で」処理するとき、つまり部品に分割して個別に実行するときを除いて、瞬時に近いことを除いては、私は心配していません。私は合計を最適化しようとしていると思いますが、わからないMathematicaのべき乗累乗と指定された係数の発見

enter image description here

Coefficient[Product[Sum[x^(j*Prime[i]), {j, 0, Floor[q/Prime[i]]}], 
         {i, 1, PrimePi[q]}], x, q] 

画像がわかりやすくするために追加しました:

は、ここに私のコードです。それを止める方法はありますか?

さらに、私のすべての係数は正であり、x^q番目のものだけが必要なので、Mathematicaにそれより大きなすべての指数を破棄させ、それらの乗算をすべて行わない方法がありますか?

+0

を知っている、と私は非難することにしたいいけませんダブル投稿の...私は何をしますか? – soandos

+1

数式にはラテックスコードの代わりに* Mathematica *コードを付けてください。 –

+0

@Alexey Popkov完了 – soandos

答えて

5

私はあなたが望むものを誤解しているかもしれませんが、係数がqに依存するため、具体的に評価されたいと思います。q私はprodutとsumを最適化するための時間が取られていると(あなたのように)思っていたので、私はそれを書き直しました。私は

With[{q = 80}, 
Coefficient[Times @@ 
Table[Plus @@ Table[x^(j*Prime[i]), {j, 0, Floor[q/Prime[i]]}], 
     {i, 1, PrimePi[q]}], x, q]] // Timing 
(* 
-> {8.36357, 10003} 
*) 

(これは単なる用語のリストを構築し、それらを乗算し、そのシンボリック解析が実行されません)として純粋に構造的な操作で書き直し

With[{q = 80}, Coefficient[\!\(
\*UnderoverscriptBox[\(\[Product]\), \(i = 1\), \(PrimePi[q]\)]\((
\*UnderoverscriptBox[\(\[Sum]\), \(j = 0\), \(\[LeftFloor] 
\*FractionBox[\(q\), \(Prime[i]\)]\[RightFloor]\)] 
\*SuperscriptBox[\(x\), \(j*Prime[i]\)])\)\), x, q]] // Timing 
(* 
-> {8.36181, 10003} 
*) 

:あなたのような何かを持っていました。

多項式を瞬時に構築していますが、数千の項があるので、おそらく起きているのはCoefficientが正しい係数を持つように時間を費やすことです。実際には、多項式を使ってExpandでこれを解くことができます。したがって:

With[{q = 80}, Coefficient[Expand[\!\(
\*UnderoverscriptBox[\(\[Product]\), \(i = 1\), \(PrimePi[q]\)]\((
\*UnderoverscriptBox[\(\[Sum]\), \(j = 0\), \(\[LeftFloor] 
\*FractionBox[\(q\), \(Prime[i]\)]\[RightFloor]\)] 
\*SuperscriptBox[\(x\), \(j*Prime[i]\)])\)\)], x, q]] // Timing 
(* 
-> {0.240862, 10003} 
*) 

また、私の方法でも動作します。

要約すると、係数の前に式の前にExpandを貼り付けるだけです。

+0

ありがとうございます。係数が "愚か"な理由はありますか?不要な用語を捨てる方法がありますか? – soandos

+0

@soandos私は考えていません... – acl

+1

@soandos :(私が思う) 'Coefficient'は*"愚か "ではないので遅いです。大規模な 'q'では、因数分解された形の多項式はまだ生成するのが速いが、展開するのは非常に大きい。 'Coefficient'は' Expand'があなたのコンピュータ内のすべてのメモリを使い果たしてしまうような場合でも動作します。 'q〜100'の展開の前後の多項式について、' LeafCount'と 'ByteCount'を見てください。それはおそらく、それが小さな 'q'のために最適化することができるかもしれないと言いました。 – Simon

1

元のコードが遅い理由は、非常に大きな式でもCoefficientが動作するようになっているからだと思います。ここで

は、元の多項式です:

In[2]:= Through[{LeafCount, ByteCount}[poly[300, x]]] // Timing 
     Through[{LeafCount, ByteCount}[[email protected][300, x]]] // Timing 
Out[2]= { 0.01, { 1859, 55864}} 
Out[3]= {25.27, {77368, 3175840}} 

今の係数を定義してみましょう:

poly[q_, x_] := Product[Sum[ x^(j*Prime[i]), 
          {j, 0, Floor[q/Prime[i]]}], {i, 1, PrimePi[q]}] 

q大きすぎないため、多項式を拡大すると、より多くのメモリを占有し、かなり遅くなる方法を参照してください。 3つの異なる方法と時間で

coeff[q_] := Module[{x}, Coefficient[poly[q, x], x, q]] 
exCoeff[q_] := Module[{x}, Coefficient[[email protected][q, x], x, q]] 
serCoeff[q_] := Module[{x}, SeriesCoefficient[poly[q, x], {x, 0, q}]] 

In[7]:= Table[ coeff[q],{q,1,30}]//Timing 
     Table[ exCoeff[q],{q,1,30}]//Timing 
     Table[serCoeff[q],{q,1,30}]//Timing 
Out[7]= {0.37,{0,1,1,1,2,2,3,3,4,5,6,7,9,10,12,14,17,19,23,26,30,35,40,46,52,60,67,77,87,98}} 
Out[8]= {0.12,{0,1,1,1,2,2,3,3,4,5,6,7,9,10,12,14,17,19,23,26,30,35,40,46,52,60,67,77,87,98}} 
Out[9]= {0.06,{0,1,1,1,2,2,3,3,4,5,6,7,9,10,12,14,17,19,23,26,30,35,40,46,52,60,67,77,87,98}} 

In[10]:= coeff[100]//Timing 
      exCoeff[100]//Timing 
     serCoeff[100]//Timing 
Out[10]= {56.28,40899} 
Out[11]= { 0.84,40899} 
Out[12]= { 0.06,40899} 

だから、SeriesCoefficientは間違いなく行く方法です。コースの場合を除き、あなたは私よりも組み合わせ論で少し良く だし、あなたはそれがプログラミングの事の生活より思える@George次プライムパーティション式 (oeis

In[13]:= CoefficientList[Series[1/Product[1-x^Prime[i],{i,1,30}],{x,0,30}],x] 
Out[13]= {1,0,1,1,1,2,2,3,3,4,5,6,7,9,10,12,14,17,19,23,26,30,35,40,46,52,60,67,77,87,98} 

In[14]:= f[n_]:[email protected][n,All,[email protected]@[email protected]]; Array[f,30] 
Out[14]= {0,1,1,1,2,2,3,3,4,5,6,7,9,10,12,14,17,19,23,26,30,35,40,46,52,60,67,77,87,98}