满足xy恰有k个约数的(x,y)所组成的图形
icon2 Brain Storm | icon4 2010-02-11 13:02| icon327 Comments | 本文内容遵从CC版权协议 转载请注明出自matrix67.com

刚才在这里看到了如题所说的图像,立即想到用 Mathematica 验证一下。我选出了几个个人比较感兴趣的 k ,再用一句话便可输出所有对应 k 的图像:

kArray = {2, 3, 4, 6, 8, 10, 12, 14, 16, 18, 20, 36, 50};
For[i = 1, i <= Length[kArray], i++,
 Export["F:\\" <> ToString[kArray[[i]]] <> ".png",
  ArrayPlot[Table[Boole[Length[Divisors[x*y]] == kArray[[i]]], {x, 1, 400}, {y, 1, 400}],
   PixelConstrained -> {1, 1}, Frame -> False]]];

 
当 k=2 时,由于只有素数才有两个约数,因此所有点都是形如 (p, 1) 或者 (1, p) 的点,其中 p 为某个素数:


 
当 k=3 时,图像上的点大致成一条斜线,斜线上的点都是形如 (p, p) 的点,其中 p 为某个素数:

当k是更大一些的奇数时,情况类似,因此不再重复了。

 
当 k=4 时,图像上出现了很多竖直线和水平线,这些直线的位置与素数的平方相对应:

 
当 k=6 时,逐渐出现了一些乍看之下不好理解的元素:

 
当 k=8 时,出现了之前不曾见过的情况:图中有一些连续的直线段:

 
当 k=10 时:

 
当 k=12 时:

 
当 k=14 时:

 
当 k=16 时,更加怪异了:

 
当 k=18 时:

 
当 k=20 时:

 
当 k=36 时:

 
当 k=50 时:

研究这些图像各种有趣的模式产生的原因,无疑是一个有趣的课题。

27 条回复

  • 楼层: 沙发 | | xxwzy 说:

    sofa

  • 楼层: 板凳 | | 呼吸 说:

    板凳!

  • 楼层: 地毯 | | lifo 说:

    这个跟欧拉公式有挺大关系

  • 楼层: 地板 | | sss正和 说:

    建议:x、y可以取实数,但xy为正整数,这样的图像更连续一些,不知道是什么结果。

  • 楼层: 地下室 | | 季陌,指尖冰凉 说:

    靠前,

  • 楼层: 地基 | | biohu 说:

    有意思

  • 楼层: 地壳 | | yuan 说:

    我是“地*”?
    崇拜大牛有一段时间了

  • 楼层: 地幔 | | maa04 说:

    因数越多点越密?

  • 楼层: 地核 | | 周 说:

    想问你个问题:无理数根号2,pi都可以用图形表示出来,那e可以吗?

  • 楼层: 10楼 | | P.K. 说:

    这个跟欧拉公式有挺大关系+1

  • 楼层: 11楼 | | Skywayer 说:

    能不能再试试其它的2^n,说不定更有趣...

  • 楼层: 12楼 | | cat 说:

    真的很有趣啊!!!变成圆的了^^

  • 楼层: 12a楼 | | lifo 说:

    12楼那个不是圆而是一个双曲线...
    实际是对k是xy进行分解后所有质因子次数+1的乘积。之所以偶数图像有趣就是因为这意味着至少xy有一个偶重质因子,这保证了x与y不互质的出现,所以图像就好玩了。

  • 楼层: 14楼 | | lifo 说:

    sorry上边写错了,其实图像似乎和xy是否互质没什么关系

  • 楼层: 15楼 | | morrowind 说:

    Matrix67的Mathematica用的真实登峰造极啊

  • 楼层: 16楼 | | 小楠 说:

    看了一上午介绍和12345,总算才知道一点。。。

  • 楼层: 17楼 | | Fox 说:

    2^n 似乎都有些奇怪得样子。

  • 楼层: 18楼 | | h2feo4 说:

    画成个立体图应该很有意思
    把k作为竖坐标绘图

  • 楼层: 19楼 | | dchneric 说:

    64呢?128呢?256呢?

  • 楼层: 20楼 | | Majesty 说:

    把 k从小到大的几个图片连结成一个gif~~哈哈 ~

  • 楼层: 21楼 | | orbea jersey 说:

    蛮不错!

  • 楼层: 22楼 | | ax_pokl 说:

    你有没有发现,把斐波纳吉数列按照n进制排列,取出每个数个位数,另这些个位数排成的数列为a(n),由(a(n),a(n+1))组成的图像各不相同。

  • 楼层: 23楼 | | ax_pokl 说:

    program feibonaki;
    uses graph,crt;

    const
    x1=52; y1=2;
    x2=2; y2=2;
    x3=20; y3=8;
    color=white;
    density=2000;{2<=density<=2000}
    timestep=2;{2<=timestep=i then a[n]:=a[n]-i;
    if (a[n]=0) and (a[n-1]=1) then over:=true;
    n:=n+1;
    until over=true;
    bar(x1,y1,i+x1,j+y1);
    for j:=1 to n do
    putpixel(a[j-1]+x1,a[j]+y1,color);
    str(n-1,str1);
    str(i,str2);
    bar(x2,y2,x2+x3+x3,y2+y3+y3);
    outtextxy(x2,y2,str2);
    outtextxy(x2,y2+y3,str1);
    outtextxy(x2,y2+i*y3,str2);
    outtextxy(x2+x3,y2+i*y3,str1);
    delay(timestep);
    end;
    readln;
    CloseGraph;
    end.

  • 楼层: 24楼 | | ax_pokl 说:

    漏东西了。

    program feibonaki;
    uses graph,crt;

    const
    x1=52; y1=2;
    x2=2; y2=2;
    x3=20; y3=8;
    color=white;
    density=2000;{2<=density<=2000}
    timestep=2;{2<=timestep=i then a[n]:=a[n]-i;{取个位数}
    if (a[n]=0) and (a[n-1]=1) then over:=true;{判断是否已循环}
    n:=n+1;
    until over=true;

    bar(x1,y1,i+x1,j+y1);
    for j:=1 to n do
    putpixel(a[j-1]+x1,a[j]+y1,color);
    str(n-1,str1);
    str(i,str2);
    bar(x2,y2,x2+x3+x3,y2+y3+y3);
    outtextxy(x2,y2,str2);
    outtextxy(x2,y2+y3,str1);
    outtextxy(x2,y2+i*y3,str2);
    outtextxy(x2+x3,y2+i*y3,str1);
    delay(timestep);
    end;
    readln;
    CloseGraph;
    end.

  • 楼层: 25楼 | | ax_pokl 说:

    var
    gd,gm:integer;
    i,j,n:integer;
    a:array[0..42000] of integer;
    over:boolean;
    str1,str2:string;

    begin
    gd:=detect; {
    gd:=D8bit;
    gm:=m640x480;}
    InitGraph(gd,gm,'');
    Assert(graphResult=grOk);

    for i:=2 to density do
    begin
    over:=false;
    a[0]:=0;
    a[1]:=1;
    n:=2;
    repeat
    a[n]:=a[n-1]+a[n-2];{斐波纳吉数列生成}
    if a[n]>=i then a[n]:=a[n]-i;{取个位数}

  • 楼层: 26楼 | | ax_pokl 说:

    for i:=2 to density do
    begin
    over:=false;
    a[0]:=0;
    a[1]:=1;
    n:=2;
    repeat
    a[n]:=a[n-1]+a[n-2];{斐波纳吉数列生成}
    if a[n]>=i then a[n]:=a[n]-i;{取个位数}
    if (a[n]=0) and (a[n-1]=1) then over:=true;{判断是否已循环}
    n:=n+1;
    until over=true;

    bar(x1,y1,i+x1,j+y1);
    for j:=1 to n do
    putpixel(a[j-1]+x1,a[j]+y1,color);
    str(n-1,str1);
    str(i,str2);
    bar(x2,y2,x2+x3+x3,y2+y3+y3);
    outtextxy(x2,y2,str2);
    outtextxy(x2,y2+y3,str1);
    outtextxy(x2,y2+i*y3,str2);
    outtextxy(x2+x3,y2+i*y3,str1);
    delay(timestep);
    end;
    readln;
    CloseGraph;
    end.

  • 楼层: 27楼 | | ax_pokl 说:

    program sushuxy; {本素数xy程序}
    uses graph,crt;

    const
    color=white;
    density=800;
    display=250;
    timestep=10;
    clean=false;
    colorchange=true;

    var {本素数xy程序}
    gd,gm:integer;
    i,j,k,color1,p:integer;
    a:array[0..density,0..density] of integer;
    str1,str2:string;

    begin {本素数xy程序}
    gd:=detect; {
    gd:=D8bit;
    gm:=m640x480;}
    InitGraph(gd,gm,'');
    Assert(graphResult=grOk);

    p:=(density div 2);
    color1:=color;
    for i:=1 to density do
    begin
    str(i,str1);
    bar(p,p,p+30,p+10);
    outtextxy(p,p,str1);
    for j:=1 to density do
    begin
    for k:=1 to round(sqrt(i*j))-1 do
    if (((i*j) mod k)=0) then a[i,j]:=a[i,j]+2;
    if ((i*j) mod round(sqrt(i*j))=0) then a[i,j]:=a[i,j]+1;
    end;
    end;
    for k:=1 to display do {本素数xy程序}
    begin
    if clean then bar(0,0,density,density);
    for i:=1 to density do
    for j:=1 to density do
    begin
    if colorchange then color1:=k;
    if a[i,j]=k then putpixel(i,j,color1);
    end;
    str(k,str2);
    bar(p,p,p+30,p+10);
    outtextxy(p,p,str2);
    delay(timestep);
    end;
    readln;
    CloseGraph;
    end.

您也随便说几句吧:

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