[问题] Mathematica bug?

楼主: biglion ( )   2016-08-06 23:23:58
最近在解 Project Euler 写了一段code
出现了一些error message
个人觉得这可能是Mathematica的bug
fexp[{n_Integer}] = 1;
fexp[exp_List] := fexp[exp] = Multinomial @@ exp;
f[i_] := fexp[Sort[FactorInteger[i]][[All, 2]]];
code蛮单纯的,就不解释了
执行
Sum[f[i], {i, 1000000}] // AbsoluteTiming
几秒钟后就计算完毕
但如果执行
Sum[f[i], {i, 1000001}] // AbsoluteTiming
开始出现错误讯息
FactorInteger::exact: Argument i in FactorInteger[i] is not an exact number.
Part::partd: "Part specification FactorInteger[i][[All,2]] is longer than
depth of object."
但事实上 单独执行f[1000001]是正常的
神奇的是 如果使用平行运算又没问题
ParallelSum[f[i], {i, 1000001}] // AbsoluteTiming
而且答案在Project Euler上是正确的
所以code应该是没错
使用Mathematica 10.2 跟 10.3 都是如此
想请教各位高手的是:
1) 这究竟是否是Bug,或其实是coding上有问题
2) 如果真是Bug,要怎么避开这个Bug
3) 当我丢平行运算的时候,各thread并无法共用内存,导致DP无法真正发挥效用
应该要如何设定才能够让各thread可以共用呢?
作者: AmibaGelos (Amiba Gelos)   2016-08-08 19:54:00
只要指定ff[i_Integer]应该就好了,没有指定的话Mathematica会自作聪明去optimize,很容易出现bug改了后速度快很多..应该是f:=f=...被optimize掉了@@重跑发现只是cache Clear没用,因为有if实际上是比较慢
楼主: biglion ( )   2016-08-17 23:18:00
感谢楼上,原来只要指定好型态就OK了另外感谢chungyuandye有提供另一个方法避开使用 Sum[f[i], {i, 1000001}, Method -> "Procedural"]

Links booklink

Contact Us: admin [ a t ] ucptt.com