满足xy恰有k个约数的(x,y)所组成的图形

刚才在这里看到了如题所说的图像,立即想到用 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 时:

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

29 条评论

  • 呼吸

    板凳!

  • lifo

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

  • sss正和

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

  • biohu

    有意思

  • yuan

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

  • maa04

    因数越多点越密?

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

  • P.K.

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

  • Skywayer

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

  • cat

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

  • lifo

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

  • lifo

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

  • morrowind

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

  • 小楠

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

  • Fox

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

  • h2feo4

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

  • dchneric

    64呢?128呢?256呢?

  • Majesty

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

  • ax_pokl

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

  • 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.

  • 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.

  • 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;{取个位数}

  • 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.

  • 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.

  • cervelo

    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);

发表评论

8  +  2  =