找回密码
 欢迎注册
楼主: KeyTo9_Fans

[原创] 谢尔宾斯基地毯与圆的交集

  [复制链接]
发表于 2019-12-9 18:29:56 | 显示全部楼层
用于三维的c++代码,在我的电脑上单线程算到11层需要3秒。
要算更多层,只需要更改const int maxl=层数;

  1. #include<stdint.h>
  2. #include<stdio.h>

  3. const int maxl=11;
  4. int64_t in[64]={0},on[64]={0},out[64]={0};
  5. int64_t g;

  6. #define xm(proc,x,y,z)                  \
  7.     proc(x-2,y-2,z-2,2*x+2*y+2*z+6,0);  \
  8.     proc(x-2,y-2,z,2*x+2*y+z+6,z-2);    \
  9.     proc(x-2,y-2,z+2,2*x+2*y+4,2*z-2);  \
  10.     proc(x-2,y,z-2,2*x+y+2*z+6,y-2);    \
  11.     proc(x-2,y,z+2,2*x+y+4,y+2*z-4);    \
  12.     proc(x-2,y+2,z-2,2*x+2*z+4,2*y-2);  \
  13.     proc(x-2,y+2,z,2*x+z+4,2*y+z-4);    \
  14.     proc(x-2,y+2,z+2,2*x+2,2*y+2*z-4);

  15. #define x0(proc,x,y,z)                  \
  16.     proc(x,y-2,z-2,x+2*y+2*z+6,x-2);    \
  17.     proc(x,y-2,z+2,x+2*y+4,x+2*z-4);    \
  18.     proc(x,y+2,z-2,x+2*z+4,x+2*y-4);    \
  19.     proc(x,y+2,z+2,x+2,x+2*y+2*z-6);   

  20. #define xp(proc,x,y,z)                  \
  21.     proc(x+2,y-2,z-2,2*y+2*z+4,2*x-2);  \
  22.     proc(x+2,y-2,z,2*y+z+4,2*x+z-4);    \
  23.     proc(x+2,y-2,z+2,2*y+2,2*x+2*z-4);  \
  24.     proc(x+2,y,z-2,y+2*z+4,2*x+y-4);    \
  25.     proc(x+2,y,z+2,y+2,2*x+y+2*z-6);    \
  26.     proc(x+2,y+2,z-2,2*z+2,2*x+2*y-4);  \
  27.     proc(x+2,y+2,z,z+2,2*x+2*y+z-6);    \
  28.     proc(x+2,y+2,z+2,0,2*x+2*y+2*z-6);

  29. void ffull(int l,int64_t x,int64_t y,int64_t z,int64_t fh,int64_t fl){
  30.     ++l;
  31.     x*=3;
  32.     y*=3;
  33.     z*=3;
  34.     fh*=9;
  35.     fl*=9;
  36.     int64_t nfh,nfl;
  37. #define proc(nx,ny,nz,dfh,dfl)          \
  38. do{                                     \
  39.     nfh=fh-4*(dfh),nfl=fl+4*(dfl);      \
  40.     if(nfl>=0)out[l]+=g;                \
  41.     else if(nfh<=0)in[l]+=g;            \
  42.     else {                              \
  43.         on[l]+=g;                       \
  44.         if(l<maxl)                      \
  45.             ffull(l,nx,ny,nz,nfh,nfl);  \
  46.     }                                   \
  47. }while(0)

  48.     xm(proc,x,y,z);
  49.     x0(proc,x,y,z);
  50.     xp(proc,x,y,z);

  51. }

  52. void fhalf(int l,int64_t y,int64_t z,int64_t fh,int64_t fl){
  53.     const int64_t x=0;
  54.     ++l;
  55.     y*=3;
  56.     z*=3;
  57.     fh*=9;
  58.     fl*=9;
  59.     int64_t nfh,nfl;
  60. #define proch(nx,ny,nz,dfh,dfl)         \
  61. do{                                     \
  62.     nfh=fh-4*(dfh),nfl=fl+4*(dfl);      \
  63.     if(nfl>=0)out[l]+=g/2;              \
  64.     else if(nfh<=0)in[l]+=g/2;          \
  65.     else {                              \
  66.         on[l]+=g/2;                     \
  67.         if(l<maxl)                      \
  68.             fhalf(l,ny,nz,nfh,nfl);     \
  69.     }                                   \
  70. }while(0)

  71.     x0(proch,x,y,z);
  72.     xp(proc,x,y,z);
  73. }

  74. int main(){
  75.     on[0]=1;
  76.     on[1]=20;
  77.     g=8;
  78.     ffull(1,2,2,2,18,-6);
  79.     g=24;
  80.     fhalf(1,  2,2,10,-6);
  81.     for(int i=1;i<=maxl;++i){
  82.         /*
  83.             Note: To avoid overflow,
  84.             in[i] & out[i] are not real counts of level i cubes
  85.             unless after executing following lines :

  86.         in[i]+=20*in[i-1];
  87.         out[i]+=20*out[i-1];

  88.             This can be done in Mathematica
  89.         */
  90.         printf("%llu %llu %llu\n",in[i],on[i],out[i]);
  91.     }
  92. }
复制代码

点评

明白了,一开始没有仔细看注释部分  发表于 2019-12-10 12:49
@mathe 运行一年都溢出不了。我的算法中没有乘法,很抗溢出,原理在37楼。  发表于 2019-12-9 23:11
运行一周估计要溢出了。@chyanog, 他给的是前后两项的差值  发表于 2019-12-9 20:22
算了,懒得并行了。我现在有VPS云服务器,扔上去算一周吧。  发表于 2019-12-9 19:58
速度很快!只是和我计算的数据不完全一样  发表于 2019-12-9 18:51

评分

参与人数 2威望 +2 金币 +2 贡献 +2 经验 +2 鲜花 +5 收起 理由
chyanog + 2 + 2 + 2 + 2 + 2 很给力!
mathe + 3 建议把更多数据提交到OEIS序列上

查看全部评分

毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2019-12-9 18:53:32 | 显示全部楼层
我试着运行了一下,和chyang的结果不同
0 20 0
44 216 140
1440 1224 1656
8400 7968 8112
50112 54456 54792
356232 367944 364944
2458824 2444520 2455536
16239768 16284576 16366056
108395712 108525168 108770640
723385080 723469800 723648480
4823029008 4822582872 4823784120

点评

原来是差值,结果是匹配的!  发表于 2019-12-9 19:00
中间一列相同,两边不同,是不是你们三列的定义不同  发表于 2019-12-9 18:54
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2019-12-9 20:20:52 | 显示全部楼层
0 20 0
44 216 140
2320 1224 4456
54800 7968 97232
1146112 54456 1999432
23278472 367944 40353584
468028264 2444520 809527216
9376805048 16284576 16206910376
187644496672 108525168 324246978160
3753613318520 723469800 6485663211680
75077089399408 4822582872 129718088017720
1501573939443704 32150080560 2594393910475736
30031693123408792 214334797104 51888092541794104
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2019-12-9 23:15:40 | 显示全部楼层
Ickiverar 发表于 2019-12-9 18:29
用于三维的c++代码,在我的电脑上单线程算到11层需要3秒。
要算更多层,只需要更改const int maxl=层数;
...

8线程并行写完了,20秒13层,预计3天能算到18层。开算。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2019-12-10 11:45:10 | 显示全部楼层
能够分别计算结果关于模2^64和2^64-1的结果吗?如果这样,最后就不怕溢出,最后通过中国剩余定理可以得出更大范围的结果了。
毕竟还是指数递增的,差值好像公差接近$\frac{20}3$,18项应该没有问题,但是计算更多项就有问题了。

点评

8线程并行可以做到24层不溢出,但算24层需要812年。  发表于 2019-12-10 13:57
也可以并行计算,每个线程算一部分,就更不会溢出。最后各线程结果相加可以用MMA做。  发表于 2019-12-10 13:51
没有必要。结果都是cpu一个一个8和24加起来的,加到溢出也要很久。如果保留我的注释的话,到21层都不会溢出。取出一个公因子8也可以多一层。  发表于 2019-12-10 13:49
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2019-12-13 18:23:26 | 显示全部楼层
18层的数据
内部 球面上 外部

  1. 0 20 0
  2. 44 216 140
  3. 2320 1224 4456
  4. 54800 7968 97232
  5. 1146112 54456 1999432
  6. 23278472 367944 40353584
  7. 468028264 2444520 809527216
  8. 9376805048 16284576 16206910376
  9. 187644496672 108525168 324246978160
  10. 3753613318520 723469800 6485663211680
  11. 75077089399408 4822582872 129718088017720
  12. 1501573939443704 32150080560 2594393910475736
  13. 30031693123408792 214334797104 51888092541794104
  14. 600635291349699440 1428893539656 1037763279756760904
  15. 12012715352891236816 9525966857976 20755275121141905208
  16. 240254370564131706488 63506419362240 415105565929448931272
  17. 4805087834658423387496 423376135436184 8302111741965441176320
  18. 96101759515675744360544 2822507323770168 166042237661816931869288
复制代码

点评

@mathe 没有账号,不会更(而且懒)。  发表于 2019-12-16 16:35
@Ickiverar 你可以自己把结果更新到OEIS了  发表于 2019-12-16 08:44
你可以自己更新到OEIS上去了  发表于 2019-12-13 18:28
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2020-1-15 16:07:18 来自手机 | 显示全部楼层
上面的数据已经更新在 https://oeis.org/A329302
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2024-11-23 16:09 , Processed in 0.028755 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表