書籍「アートで魅せる数学の世界」のp.161-162で解説されている素数列を用いたストリング・アートについて再現を試みています。

素数列

素数列は以下のようなものです。\[ s_5(i) = i \text{番目の素数} \]ただし、書籍「アートで魅せる数学の世界」によると、素数列によるストリング・アートを描く際には糸掛係数\(N\)を導入した方がよいようです。つまり、\[ x_i = R \cos (2 \pi s_5(i) N / M), \ \ y_i = R \sin (2 \pi s_5(i) N / M) \ \ (i=0,1,2, \cdots, P) \]として描きます。

以下に、再現した結果をまとめておきます。なお、素数列は2000個までとしています。

素数列によるストリング・アート(N=233, M=1000)
素数列によるストリング・アート(N=525, M=10000)
素数列によるストリング・アート(N=726, M=10000)

ソースコード

素数列によるストリング・アートのプログラムのソースコードを示しておきます。

void setup(){
  size(500,500);
  translate(width/2.0, height/2.0);
  noFill();

  // 素数の数列によるストリング・アートを描画
  background(255,255,255);  
  stroke(0,0,0);
  strokeWeight(0.1);  

  int P = 2000;
  int[] s5 = makeSequence_PrimeNumber(P);
  drawSequence(200.0, s5, 233.0, 1000.0, P);
}

// 素数列を生成する関数
int[] makeSequence_PrimeNumber(
  int P // データ数
){
  
  int[] primenumber = new int[P+1];
  primenumber[0] = 2; // 最初の素数は2
  int count = 1; // 算出した素数の個数
  //int i = 1;
  int candidate = 3;
  boolean flag = true;
  while( count <= P){
    for(int i=0; i<count; i++){
      if( candidate % primenumber[i] == 0 ){
        flag = false;
        break;
      }
    }
    if(flag){
      primenumber[count] = candidate;
      count++;
    }
    flag = true;
    candidate += 2;
  }
    
  return primenumber;
}

// 数列によるストリング・アートを描く関数
void drawSequence(
  float R, // 振幅
  int[] s, // 数列
  float N, // 糸掛係数
  float M, // 周期
  int P // データ数
){   
  float x, y, theta; 
  beginShape();
  for(int i=0; i<=P; i++){
    theta = 2.0 * PI * s[i] * N / M;
    x = R * cos( theta );
    y = R * sin( theta );
    vertex(x,y);
  }
  endShape();
}