楼主: 〇〇

欧拉计划747:三角披萨

[复制链接]
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
31#
 楼主| 发表于 2021-2-17 22:42 来自手机 | 只看该作者
你点页面底下的电脑版就能看见对齐的格式了

使用道具 举报

回复
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
32#
 楼主| 发表于 2021-2-18 08:55 | 只看该作者
用了公式


  1. In[1]:= Solve[(1+n+c+d)^2-4*n(c+1)*(d+1)==0,d]

  2.                                                      2        2    2  2
  3. Out[1]= {{d -> -1 - c + n + 2 c n - 2 Sqrt[-(c n) - c  n + c n  + c  n ]},

  4.                                                  2        2    2  2
  5. >    {d -> -1 - c + n + 2 c n + 2 Sqrt[-(c n) - c  n + c n  + c  n ]}}
  6. >>> def f1(n):
  7. ...  s=0
  8. ...  for c in range(1,n+1):
  9. ...   v=0
  10. ...   for d in range(1,n+1):
  11. ...    x=(-1-c-d-n)**2-4*n*(1+d)*(1+c)
  12. ...    if x<0: break #print(c,x,v);break
  13. ...    else:
  14. ...     if x==0:s+=3;v+=1
  15. ...     else:s+=6;v+=1
  16. ...  return s
  17. ...

  18. >>> def f2(n):
  19. ...  s=0
  20. ...  for c in range(1,n-1):
  21. ...   #for d in range(1,n+1):
  22. ...    w=(-(c* n) - c*c*  n + c* n*n  + c*c*n*  n )
  23. ...    if w>=0:
  24. ...     d=int( -1 - c + n + 2* c* n - 2* pow(w,0.5))
  25. ...     x=(-1-c-d-n)**2-4*n*(1+d)*(1+c)
  26. ...     #print(c,x,d)
  27. ...     if x<0: break
  28. ...     else:
  29. ...      if x==0:s+=6*d-3  #;print('****')
  30. ...      else:s+=6*d
  31. ...  return s

  32. import time
  33. def test(m):
  34. t=time.time()
  35. s=0
  36. for n in range(3,1001):s+=f1(n)
  37. print('f1',s,time.time()-t)
  38. t=time.time()
  39. s=0
  40. for n in range(3,1001):s+=f2(n)
  41. print('f2',s,time.time()-t)

  42. >>> test(1001)
  43. f1 3008595 1.7994389533996582
  44. f2 3008595 2.2176740169525146
复制代码

使用道具 举报

回复
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
33#
 楼主| 发表于 2021-2-18 09:10 | 只看该作者
本帖最后由 〇〇 于 2021-2-18 09:23 编辑

根据c==1时求出的最大d退出c循环,快了不少。这次公式f2b终于比列举f1b快了

  1. >>> def f1b(n):
  2. ...  s=0
  3. ...  up=0
  4. ...  for c in range(1,n+1):
  5. ...   if c==1:w=(-(c* n) - c*c*  n + c* n*n  + c*c*n*  n );up=int( -1 - c + n + 2* c* n - 2* pow(w,0.5))
  6. ...   if c>up:break
  7. ...   v=0
  8. ...   for d in range(1,n+1):
  9. ...    x=(-1-c-d-n)**2-4*n*(1+d)*(1+c)
  10. ...    if x<0: break #print(c,x,v);break
  11. ...    else:
  12. ...     if x==0:s+=3;v+=1
  13. ...     else:s+=6;v+=1
  14. ...  return s
  15. ...
  16. >>> def f2b(n):
  17. ...  s=0
  18. ...  up=0
  19. ...  for c in range(1,n-1):
  20. ...   #for d in range(1,n+1):
  21. ...    w=(-(c* n) - c*c*  n + c* n*n  + c*c*n*  n )
  22. ...    if w>=0:
  23. ...     d=int( -1 - c + n + 2* c* n - 2* pow(w,0.5))
  24. ...     if c==1:up=d
  25. ...     if c>up:break
  26. ...     x=(-1-c-d-n)**2-4*n*(1+d)*(1+c)
  27. ...     #print(c,x,d)
  28. ...     if x<0: break
  29. ...     else:
  30. ...      if x==0:s+=6*d-3  #;print('****')
  31. ...      else:s+=6*d
  32. ...  return s
  33. ...
  34. >>> import time
  35. >>> def test(m):
  36. ...  t=time.time()
  37. ...  s=0
  38. ...  for n in range(3,m):s+=f1(n)
  39. ...  print('f1',s,time.time()-t)
  40. ...  t=time.time()
  41. ...  s=0
  42. ...  for n in range(3,m):s+=f2(n)
  43. ...  print('f2',s,time.time()-t)
  44. ...  t=time.time()
  45. ...  s=0
  46. ...  for n in range(3,m):s+=f2b(n)
  47. ...  print('f2b',s,time.time()-t)
  48. ...  t=time.time()
  49. ...  s=0
  50. ...  for n in range(3,m):s+=f1b(n)
  51. ...  print('f1b',s,time.time()-t)
  52. ...
  53. >>> test(1001)
  54. f1 3008595 1.7506561279296875
  55. f2 3008595 2.199603796005249
  56. f2b 3008595 0.3860177993774414
  57. f1b 3008595 0.9080519676208496
  58. >>> test(2001)
  59. f1 14100711 7.668433427810669
  60. f2 14100711 9.103666543960571
  61. f2b 14100711 1.5756027698516846
  62. f1b 14100711 4.127683877944946
复制代码

使用道具 举报

回复
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
34#
 楼主| 发表于 2021-2-18 09:32 | 只看该作者
在pypy中,反而是f1b快

  1. >>>> test(1001)
  2. ('f2b', 3008595, 0.17499995231628418)
  3. ('f1b', 3008595, 0.032000064849853516)
  4. >>>> test(2001)
  5. ('f2b', 14100711, 0.24900007247924805)
  6. ('f1b', 14100711, 0.04699993133544922)
复制代码

使用道具 举报

回复
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
35#
 楼主| 发表于 2021-2-18 13:17 | 只看该作者
加速版

  1. >>>> def f4c(n):
  2. ....  s=0
  3. ....  up=0
  4. ....  a=[0 for i in range(100)]
  5. ....  for c in range(1,n-1):
  6. ....   #for d in range(1,n+1):
  7. ....    w=(-(c* n) - c*c*  n + c* n*n  + c*c*n*  n )
  8. ....    if w>=0:
  9. ....     d=int( -1 - c + n + 2* c* n - 2* pow(w,0.5))
  10. ....     if c==1:up=d
  11. ....     if c>up:break
  12. ....     if c>d:
  13. ....       a[c]=d
  14. ....       #print('&&&&',a[slice(10)])
  15. ....       for i in range(1,c):
  16. ....         if a[i+1]==0 or a[i]==i: break
  17. ....         s+=6*i*(a[i]-a[i+1]) #;print(i,s)
  18. ....       break
  19. ....      #if d0>d:s+=6*(d0-d);break
  20. ....     x=(-1-c-d-n)**2-4*n*(1+d)*(1+c)
  21. ....     #print(c,x,d)
  22. ....     if x<0: break
  23. ....     else:
  24. ....      a[c]=d
  25. ....      if x==0:s+=6*d-3  #;print('****',6*d-3)
  26. ....      else:s+=6*d
  27. ....      #if d0>d:s+=6*(st)*(d0-d) #;print(6*d)
  28. ....  return s
  29. ....
  30. >>>> import time
  31. >>>> def test(m):
  32. ....  t=time.time()
  33. ....  s=0
  34. ....  for n in range(3,m):s+=f2b(n)
  35. ....  print('f2b',s,time.time()-t)
  36. ....  t=time.time()
  37. ....  s=0
  38. ....  for n in range(3,m):s+=f1b(n)
  39. ....  print('f1b',s,time.time()-t)
  40. ....  t=time.time()
  41. ....  s=0
  42. ....  for n in range(3,m):s+=f4c(n)
  43. ....  print('f4c',s,time.time()-t)
  44. ....

复制代码

使用道具 举报

回复
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
36#
 楼主| 发表于 2021-2-18 15:16 | 只看该作者
改正了一个bug

  1. >>>> def f4c(n):
  2. ....  s=0
  3. ....  up=0
  4. ....  x0=0
  5. ....  a=[0]# for i in range(100)]
  6. ....  for c in range(1,n-1):
  7. ....   #for d in range(1,n+1):
  8. ....    w=(-(c* n) - c*c*  n + c* n*n  + c*c*n*  n )
  9. ....    if w>=0:
  10. ....     d=int( -1 - c + n + 2* c* n - 2* pow(w,0.5))
  11. ....     if c==1:up=d
  12. ....     if c>up:break
  13. ....     if c>d:
  14. ....       if x0>0:s-=3*x0
  15. ....       a.append(d) #a[c]=d
  16. ....       #print('&&&&',a[slice(10)])
  17. ....       for i in range(1,c):
  18. ....         if a[i]==i:  break
  19. ....         s+=6*i*(a[i]-a[i+1]) #;print(i,s)
  20. ....       break
  21. ....      #if d0>d:s+=6*(d0-d);break
  22. ....     x=(-1-c-d-n)**2-4*n*(1+d)*(1+c)
  23. ....     #print(c,x,d)
  24. ....     if x<0: break
  25. ....     else:
  26. ....      a.append(d) #a[c]=d
  27. ....      if x==0:
  28. ....       s+=6*d-3
  29. ....       if c!=d:x0+=1 #;print('****',6*d-3)
  30. ....      else:s+=6*d
  31. ....      #if d0>d:s+=6*(st)*(d0-d) #;print(6*d)
  32. ....  return s
  33. ....
复制代码

使用道具 举报

回复
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
37#
 楼主| 发表于 2021-2-18 21:10 | 只看该作者
越算越慢
testget2(2000001,3000001)
1882.57299995
804155548
testget2(3000001,4000001)
2632.04400015
774864131
testget2(4000001,5000001)
2993.84100008
463780742

使用道具 举报

回复
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
38#
 楼主| 发表于 2021-2-18 21:28 | 只看该作者
本帖最后由 〇〇 于 2021-2-19 21:20 编辑

不能一个n算一次,要把它们合在一起。比如+6的几个,+12的几个
(c,d)==(1,1)的个数*12
+(1,2)的个数*24
+(1,3)的个数*36
-(x==0)的个数*3
-(c==d)的个数*3
-n最后一个d是1的个数*(12*1-6)
-n最后一个d是2的个数*(12*2-6)
-n最后一个c平方*6*个数


  1. >>>> def f3(n):
  2. ....  s=0
  3. ....  for c in range(1,n-1):
  4. ....     w=(c* n)*(-1 - c + n  + c* n )
  5. ....     d=int( -1 - c + n + 2* c* n - 2* pow(w,0.5))
  6. ....     if c>d:s-=d*d*6;break
  7. ....     x=(-1-c-d-n)**2-4*n*(1+d)*(1+c)
  8. ....     print(n,c,x,d)
  9. ....     s+=12*d
  10. ....     if x==0:
  11. ....      s-=3
  12. ....      if c!=d:s-=3
  13. ....     if c==d:s-=12*d-6
  14. ....  return s
  15. ....


  16. >>>> s=0
  17. >>>> for i in range(9,26):s+=f3(i)
  18. (9, 1, 0, 1)
  19. (10, 1, 9, 1)
  20. (11, 1, 20, 1)
  21. (12, 1, 33, 1)
  22. (13, 1, 48, 1)
  23. (14, 1, 65, 1)
  24. (15, 1, 1, 2)
  25. (16, 1, 16, 2)
  26. (17, 1, 33, 2)
  27. (18, 1, 52, 2)
  28. (19, 1, 73, 2)
  29. (20, 1, 96, 2)
  30. (21, 1, 4, 3)
  31. (22, 1, 25, 3)
  32. (23, 1, 48, 3)
  33. (24, 1, 73, 3)
  34. (25, 1, 100, 3)
  35. (25, 2, 0, 2)

  36. >>>> print(s)
  37. 294

  38. >>>> m=12*1*6 +12*2*7 +12*3*5  -3 -3 -6*(12*1-6)  -(12*2-6) -0*0*6*5 -1*1*6*(6+5)
  39. >>>> print(m)
  40. 294

复制代码


使用道具 举报

回复
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
39#
 楼主| 发表于 2021-2-19 12:23 | 只看该作者
f4c简化为不需要数组

  1. >>>> def f3b(n):
  2. ....  s=0
  3. ....  up=0
  4. ....  for c in range(1,n-1):
  5. ....     w=(c* n)*(-1 - c + n  + c* n )
  6. ....     d=int( -1 - c + n + 2* c* n - 2* pow(w,0.5))
  7. ....     if c>d:s-=d*d*6;break
  8. ....     x=(-1-c-d-n)**2-4*n*(1+d)*(1+c)
  9. ....     #print(c,x,d)
  10. ....     s+=12*d
  11. ....     if x==0:
  12. ....      s-=3
  13. ....      if c!=d:s-=3
  14. ....     if c==d:s-=12*d-6
  15. ....  return s
复制代码

使用道具 举报

回复
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
40#
 楼主| 发表于 2021-2-19 13:08 | 只看该作者
newkid 发表于 2021-2-17 22:24
方程我看得懂,就是答案看不懂,因为在手机上分数显示不出来。你把那个不等式展开看看有没有希望简化得到公 ...

  1. In[17]:= Reduce[{
  2.              c==1,
  3.              2> -1 - c + n + 2* c* n - 2* Sqrt[(c* n)*(-1 - c + n  + c* n )]>=1
  4.          },n]

  5. Out[17]= n == 1 || 9 <= n < 4 (2 + Sqrt[3])

  6. In[18]:= Reduce[{
  7.              c==1,
  8.              3> -1 - c + n + 2* c* n - 2* Sqrt[(c* n)*(-1 - c + n  + c* n )]>=2
  9.          },n]

  10. Out[18]= 4 (2 + Sqrt[3]) <= n < 11 + 4 Sqrt[6]

  11. In[19]:=
  12. In[19]:= Reduce[{
  13.              c==1,
  14.              4> -1 - c + n + 2* c* n - 2* Sqrt[(c* n)*(-1 - c + n  + c* n )]>=3
  15.          },n]

  16. Out[19]= 11 + 4 Sqrt[6] <= n < 2 (7 + 2 Sqrt[10])
复制代码

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表