素数の二進法表記

二進数表記に変換してみる - みずぴー日記素数の二進法表記 - 西尾泰和のはてなダイアリーを見てですが、素数の二進法表記を awk でもやってみました。

素数は is_prime() という関数、2 進数への変換は dec2bin() という関数で変換しています。

#! /usr/bin/gawk -f
# bin_show.awk

BEGIN {
    max = ARGV[1] ? AEGV[1] : 100;
    for (i = 1; i <= max; i++) {
        prime = is_prime(i);
        if (prime) {
            bin_num = dec2bin(prime) "";
            gsub(/0/, " ", bin_num);
            gsub(/1/, "+", bin_num);
            printf("%10s\n", bin_num);
        }
    }
}

function is_prime(num,    div) {
    for ( div = 2; div <= num; div++ ) {
        if ( div * div > num ) {
            return num;
            break;
        }
        if ( num % div == 0 ) {
            return 0;
        }
    }
}


function dec2bin(num,    rem, str) {
    while (num > 0) {
        rem = int(num % 2);
        if (rem == 1) {
            str = "1" str;
        } else {
            str = "0" str;
        }
        num = int(num / 2);
    }
    return str;
}

このスクリプトを実行してみます。

$ nawk -f bin_show.awk
        +
        ++
       + +
       +++
      + ++
      ++ +
     +   +
     +  ++
     + +++
     +++ +
     +++++
    +  + +
    + +  +
    + + ++
    + ++++
    ++ + +
    +++ ++
    ++++ +
   +    ++
   +   +++
   +  +  +
   +  ++++
   + +  ++
   + ++  +
   ++    +

何か超高層ビルの模様のような、規則性のあるような図形に見えてきます。

tag_nawk.pngtag_nawk.pngtag_nawk.pngtag_nawk.png