soa*_*dos 2 optimization wolfram-mathematica discrete-mathematics
我有以下代码,它完全符合我的要求,但它的速度非常慢.我不会那么烦恼,除了当我"手动"处理代码时,即我将它分成几部分并单独进行,它几乎是瞬间完成的.
这是我的代码:
Coefficient[Product[Sum[x^(j*Prime[i]), {j, 0, Floor[q/Prime[i]]}],
{i, 1, PrimePi[q]}], x, q]
Run Code Online (Sandbox Code Playgroud)
为清晰起见添加图片:

我认为它正试图优化总和,但我不确定.有办法阻止吗?
另外,由于我的所有系数都是正数,而我只想要x ^ qth,所以有没有办法让Mathematica丢弃所有大于那个的指数而不是那些乘法?
我可能误解了你想要的东西,但是,正如系数所依赖的那样q,我假设你想要它的具体评估q.因为我怀疑(像你一样)时间用于优化产品和总和,我重写了它.你有类似的东西:
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}
*)
Run Code Online (Sandbox Code Playgroud)
我用纯粹的结构操作重写了
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}
*)
Run Code Online (Sandbox Code Playgroud)
(这只是建立一个术语列表然后将它们相乘,因此不执行符号分析).
只是建立多项式是瞬时的,但它有几千个项,所以可能发生的是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}
*)
Run Code Online (Sandbox Code Playgroud)
它也适用于我的方法.
总而言之,只需坚持Expand在表达式前面,然后再取系数.