Je pense que la raison pour laquelle le code original est lent est que Coefficient
fonctionne même avec de très grandes expressions - celles qui ne rentreraient pas dans la mémoire si elles étaient naïvement développées.
est ici le polynôme d'origine:
poly[q_, x_] := Product[Sum[ x^(j*Prime[i]),
{j, 0, Floor[q/Prime[i]]}], {i, 1, PrimePi[q]}]
Voyez comment pour ne pas trop grand q
, l'élargissement du polynôme prend beaucoup plus de mémoire et devient assez lent:
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}}
Maintenant, nous allons définir le coefficient de 3 manières différentes et les temps
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}
Donc, SeriesCoefficient
est certainement le chemin à parcourir.À moins bien sûr que vous êtes un peu mieux à combinatoires que moi et vous connaissez les premier formules de partition suivantes (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}
@George Il semble la vie plus d'une chose de programmation, et je ne veux pas être accusé de double affichage ... Qu'est-ce que je fais? – soandos
Veuillez indiquer le code * Mathematica * au lieu du code Latex pour la formule. –
@Alexey Popkov Fait – soandos