求教:欧拉计划第145,还只算到1亿就用了800多秒,该怎么做啊?
mathematica吧
全部回复
仅看楼主
level 11
ucweb420 楼主
完全是暴力求解,还是用的4核8G的台式机算的,不知道该怎么做
2013年03月26日 13点03分 1
level 11
ucweb420 楼主
一些正整数n有这样一个性质:n与n取“相反”之和的所有位皆为奇数。例如: 36 + 63 = 99 以及 409 + 904 =
1313。我们将这样的数成为可反数;所以,36,63,409,904都是可反数。在n和n取相反的最前面都不允许有0。
一千以下共有120个可反数。
10亿(109)以下共有多少个可反数?
2013年03月26日 13点03分 2
level 11
ucweb420 楼主
Count[Range[100000000],x_/;(Mod[x,10]!=0&&And@@OddQ @IntegerDigits[x+FromDigits[Reverse[IntegerDigits[x]]]])]//Timing
2013年03月26日 13点03分 3
level 9
最无脑的加速就是并行了[揉脸]
2013年03月26日 14点03分 4
额,没注意第一位不能为0
2013年03月26日 14点03分
好的,明天我用台式机试试,笔记本完全不能用暴力算法
2013年03月26日 14点03分
回复 feiliupkpk :是末位不为0,我看论坛上的c/c++,Java,python等暴力计算都像是比mathematica的暴力计算快,是不是说明mathematica不适合暴力计算?再还有,感觉不学数论,做欧拉计划上的题,真是难啊
2013年03月26日 15点03分
@ucweb420 泪!程序还可以暴力,数论是暴力不来的。
2013年03月26日 15点03分
吧务
level 9
我用的是旧笔记本电脑,台式机目测10几秒的事儿
2013年03月26日 17点03分 5
我这里也要50来秒
2013年03月27日 01点03分
如何并行多线程处理啊,我不知道如何在算一个巨大的程序的时候算1+1
2013年03月27日 02点03分
回复 eyofdu :直接parallelize先试试看能不能并行,不能的话就要改改程序
2013年03月27日 02点03分
问个问题,是不是mma7里面没有RuntimeOptions,CompilationTarget?
2013年03月27日 02点03分
吧务
level 11
4G台式机
[88]我还是想想怎样从这些数字的特点来想想算法
2013年03月27日 02点03分 6
其实应该是不到4G,32位的悲剧
2013年03月27日 02点03分
我用笔记本算1亿,直接卡死,10亿也是显示内存不够,暴力求解真心不好啊
2013年03月27日 03点03分
level 9
整理了下,不晓得对不对:
x为n位数,每一位数字为a(n)
1.n为偶数时,a(i)+a(n+1-i)<10&&OddQ
2.n为奇数时
2-1.i为奇数a(i)+a(n+1-i)>10&&OddQ&&正中的数字2a(mid)<10
2-2.i为偶数a(i)+a(n+1-i)<10&&EvenQ
2013年03月27日 03点03分 7
每一位数字为a(i)
2013年03月27日 03点03分
level 11
ucweb420 楼主
怎么会这样?我上午用Parallelize的确是显示75秒啊,难道是因为用的是Timing,所以不对?
2013年03月27日 04点03分 8
timing显示的时间似乎不是总的计算时间
2013年03月27日 05点03分
话说你并行开的4个kernel么?
2013年03月27日 05点03分
回复 feiliupkpk :不知道到底开了几个kernel,我就是打开了一个notebook,然后进行计算啊。话说要手动开kernel么?
2013年03月27日 06点03分
回复 ucweb420 :不用,默认的话大概就是cpu的核心的数量,不过可以少开点,算的时候还可以干点其他的事啊[揉脸]
2013年03月27日 06点03分
level 12
Timing[mand = Compile[{{z0, _Complex}, {nmax, _Integer}}, Module[{z = z0, i = 1}, While[i < 100 && Abs[z] <= 2, z = z^2 + z0; i++]; i]]; ArrayPlot[ Reverse@Transpose@ Table[mand[x + y I, 500], {x, -2, 2, 0.001}, {y, -2, 2, 0.001}], ImageSize -> Full]]
算这个的同时怎么算1+1
是曼德勃罗集……
2013年03月27日 06点03分 9
重新开一个[拍砖]mma
2013年03月27日 06点03分
回复 feiliupkpk :能不能不重开个mathematica?
2013年04月15日 11点04分
回复 eyofdu :不知道了,不知道吧主他们怎么弄的@mm_酱
2013年04月15日 11点04分
吧务
level 9
2013年03月27日 09点03分 11
👍
2015年09月27日 12点09分
吧务
level 12
先找和数,再将和拆分为可反数,如两位数先找{11,33,……,99},再将其拆分(如99可拆分为18,27,……,81)。
沿着7楼思路继续往下,设a(n)a(n-1)...a1为n位可反数,其和为:(内积形式)
{a(n)+a1,a(n-1)+a2,...}.{10^(n-1)+1,10^(n-2)+10,...}
推理可知:
1:n为偶数时,每一个am+an都是不进位的奇数(也即是取值范围为Range[1,9,2]);
2:n为4K
+3
型数时,式中第一列表诸项取值范围为Range[11,17,2],Range[0,9]交替进行;
3:n为4K+1型数时无解。(所以,大家其实只需算到1亿……)
上代码:
Module[{dgts, idgts, list, listeven, listodd, count}, dgts[x_] := Min[x, 9] - Max[0, x - 9] + 1; idgts[x_] := If[3 <= x <= 17, Min[x - 1, 9] - Max[1, x - 9] + 1, 0]; listeven[n_] := Select[{Table[10^(n - 1 - i) + 10^i, {i, 0, (n - 1)/2}].
#, n, #
} & /@ Tuples[Range[1, 9, 2], Floor[(n + 1)/2]], And @@ OddQ /@ IntegerDigits[#[[1]]] &]; listodd[n_] := Select[{Table[10^(n - 1 - i) + 10^i, {i, 0, (n - 1)/2}].
#, n, #
} & /@ Tuples@Flatten[ Table[{Range[11, 17, 2], Range[0, 9]}, {i, Floor[(n + 1)/4]}], 1], And @@ OddQ /@ IntegerDigits[#[[1]]] &]; list[n_] := If[EvenQ@n, listeven[n], listodd[n]]; count[list_] := If[EvenQ@list[[2]], Times @@ Flatten[{idgts@list[[3, 1]], dgts /@ list[[3, 2 ;; -1]]}], Times @@ Flatten[{idgts@list[[3, 1]], dgts /@ list[[3, 2 ;; -2]]}] ]; Total[Total[count /@ list@#] & /@ Select[Range[4, 9], Mod[#, 4] != 1 &]] + 120 ] // Timing
如果被吞再看图片对照:
2013年03月28日 07点03分 12
看来我没整理错,顶一个
2013年03月28日 08点03分
吧务
level 12
顺路问下,第十四题大家是怎么做的?硬算的话1000都用了25秒,不敢算10^6了。个人感觉应该是要把之前每一步的计算结果利用起来以节省时间,但是没想好代码怎么写。谁给指点下?
原题:
以下迭代序列定义在整数集合上:
n -> n/2 (当n是偶数时)
n -> 3n + 1 (当n是奇数时)
应用以上规则,并且以数字13开始,我们得到以下序列:13 -> 40 -> 20 -> 10 -> 5 -> 16->8 -> 4 -> 2 -> 1
可以看出这个以13开始以1结束的序列包含10个项。虽然还没有被证明(Collatz问题),但是人们认为在这个规则下,以任何数字开始都会以1结束。以哪个不超过100万的数字开始,能给得到最长的序列?
注意: 一旦序列开始之后,也就是从第二项开始,项是可以超过100万的。
2013年03月28日 08点03分 13
额,我这题是先定义一个求长度的函数,然后再找函数值最大时的n,基本上就是硬算[瀑布汗~]
2013年03月28日 09点03分
level 9
是不是倒过来算比较好:
从1开始,如果其mod3余1且大于4则减1除以3,不然乘以2
2013年03月28日 10点03分 16
不行[我错了][我错了][我错了][瀑布汗~][瀑布汗~][瀑布汗~]
2013年03月28日 10点03分
level 10
14题,这个在我机子上15s。
Clear[foo];foo[1] = 1;foo[n_?OddQ] := foo[n] = 1 + foo[3 n + 1];foo[n_?EvenQ] := foo[n] = 1 + foo[n/2];Timing]]]
2013年03月28日 10点03分 17
和妙兄的原理一样,但是要快一点点。
2013年03月28日 10点03分
回复 mm_酱 :代码又被吞了,见下图:
2013年03月28日 10点03分
level 10
2013年03月28日 10点03分 18
level 6
n = 9; m = Floor[n/2]; k = Floor[(n - 3)/4]; Sum[20*30^x, {x, 0, m - 1}] + Sum[100*500^x, {x, 0, k}] // Timing
2013年04月18日 08点04分 20
缺点是只能计算小于n=10^k的可反数;优点速度超快,不过这样一来编程仅起到计算器作用
2013年04月18日 08点04分
看了一下,过程和12楼差不多;
2013年04月18日 08点04分
level 8
MMA真不是拿来干这种事情的,用C语言写一个暴力求解程序,单线程,算到1亿只要10秒,算10亿用了不多于150秒
2015年09月29日 01点09分 23
5楼的代码你那边要多久?
2015年10月03日 04点10分
@xzcyr 他如果不是图 我可以试试
2015年10月27日 17点10分
1