双向Josephus问题中的分形图形
icon2 Brain Storm | icon4 2008-08-20 7:17| icon310 Comments | 本文内容遵从CC版权协议 转载请注明出自matrix67.com

    Daisuke Minematsu和他的同学们发现,Josephus问题中也隐藏着分形图形。Josephus问题是初学编程的人必然会接触到的一个问题——n个人围成一圈进行1到k报数,每次报到k的人退出游戏(离开这个圆圈),那么最后剩下的那个人是谁。在这里,我们考虑一个Josephus问题的变种:双向Josephus问题。双向Josephus问题中有两个交替进行的报数进程,其中一个按顺时针方向踢出每第k个人,另一个进程则逆时针踢出每第k个人。两个进程交替进行,直到最后只剩一人为止。假如n=10, k=3的话,第一个退出的人是#3,第二个退出的人是#8,第三个退出的人是#6,以后分别是4, 10, 9, 5, 1, 7,最后剩下的人是2。我们用S(n,k)来表示在相应的n值和k值的情况下最后剩下的那个人的编号,对于每个固定的k值,函数S的图象竟然都是一个分形图形。右图是S(n,4)所对应的图象,你可以非常清楚地看到这个图象的自相似性。你可以自己用Mathematica来验证一下。


joseprocess[m_, mm_] := Block[{t, p, q, u, v, w},
   proc = {}; w = mm; t = Range[m]; p = t; q = t;
   Do[p = RotateLeft[p, w];
      u = First[p]; proc = Append[proc, u];
      p = Rest[p]; q = Drop[q, Position[q, u][[1]]];
      If[Length[p] == 1, Break[]];
      q = RotateRight[q, w];
      v = Last[q]; proc = Append[proc, v];
      q = Drop[q, -1]; p = Drop[p, Position[p, v][[1]]];
      If[Length[q] == 1, Break[]],
    {n, 1, Ceiling[m/2]}];
   proc];
 
ListPlot[Table[Complement[Range[n], joseprocess[n, 3]][[1]], {n, 2, 1000}]]

参考资料:http://demonstrations.wolfram.com/TheJosephusProblemInBothDirections/

10 条回复

  • 楼层: 沙发 | | billoshi 说:

    wolfram的Demonstration project是个好东西,可惜我这里上的太慢了。
    Matrix67,您用的是Mathematica for linux还是在Win用的?

  • 楼层: 板凳 | | manson 说:

    最近忙的都没时间看了

  • 楼层: 地毯 | | Ai.Freedom 说:

    这人真有想法..

  • 楼层: 地板 | | Mgccl 说:

    有没有用电脑直接验证一个东西是不是分形?
    因为我发现分形都是用人来看的...人感觉是分形也就是分形了...
    如果我们找不到一个算法来说明一个东西是不是分形,那么给定一个图案我们怎么知道是不是分形?

  • 楼层: 地下室 | | Ai.Freedom 说:

    还有, 你的<code>框起来的内容里是怎么保留行首的空格和空行的? 我的WP不行..

  • 楼层: 地基 | | Freeze 说:

    突然发现LS'S LS是MGCCL牛,MS和LF2有点关系的人么?

  • 楼层: 地壳 | | qcthreestones 说:

    不会吧,能给出证明吗?

  • 楼层: 地幔 | | dragon 说:

    真的耶!

  • 楼层: 地核 | | 不再犹豫 说:

    好久没来了!!
    来看看

  • 楼层: 10楼 | | hetong_007 说:

    重大发现:这篇日志的编号非常邪恶~

    http://www.matrix67.com/blog/archives/666

您也随便说几句吧:

请注意:如果您是第一次在本站发表评论,您的评论需要通过管理员的审核。

您可以在Gravatar设置您的头像。