Mathematica取幂并找到指定的系数

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丢弃所有大于那个的指数而不是那些乘法?

acl*_*acl 5

我可能误解了你想要的东西,但是,正如系数所依赖的那样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在表达式前面,然后再取系数.