JavaScriptでいろんな数列を書き出してみる

はじめに

こんにちは、野村です。

今回は、JavaScriptを使っていくつかの数列を書き出してみます。

せっかくなので
・厳格モード(use strict)で書く
・functionを使わず、アロー関数を使う
・varを使わず、letやconstを使う
などのルールを設けています。

実行

スクリプトファイルをVimで開いてコマンドモードから以下のコマンドを実行。

:!node %

素数

・1より大きい自然数で、正の約数が1と自分自身のみである数。

'use strict';

const chk = (a, lst)=>{
  return !lst.filter((x)=>x<=Math.sqrt(a)).some((v)=>a%v===0);
};
const loop2 = (n,lst)=>(chk(n,lst)) ? lst.concat(n) : loop2(n+1,lst);
const loop = (n,lst,f)=>(f(n,lst)) ? lst : loop(n,loop2(lst[lst.length-1]+1,lst),f);
const sosu = ()=>{
  let lst = [2];
  return {
    list : (n)=>{
      lst = loop(n,lst,(n,lst)=>lst.length>n);
      return lst.slice(0,n);
    },
    less : (n)=>{
      lst = loop(n,lst,(n,lst)=>lst[lst.length-1]>n);
      return lst.filter((x)=>x<n);
    },
    nth : (n)=>{
      lst = loop(n,lst,(n,lst)=>lst.length>n);
      return lst[n-1];
    }
  };
};
const p = sosu();

console.log(p.list(10)); // 素数を10個表示
console.log(p.less(50)); // 50未満の素数を表示
console.log(p.nth(10)); // 10番目の素数を表示
[ 2, 3, 5, 7, 11, 13, 17, 19, 23, 29 ]
[ 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47 ]
29

双子素数

・双子素数:差が2である2つの素数の組
・いとこ素数:差が4である2つの素数の組
・セクシー素数:差が6である2つの素数の組

'use strict';

const chk = (a, lst)=>{
  return !lst.filter((x)=>x<=Math.sqrt(a)).some((v)=>a%v===0);
};
const loop = (a,lst,f)=>{
  if (chk(a,lst)) {
    lst.push(a);
    if (lst.indexOf(a-f)>-1) return lst;
  }
  return loop(a+1,lst,f);
};
const C = (f)=>(n)=>{
  return Array(n).fill().reduce((a)=>{
    const x = loop(a[0][a[0].length-1]+1, a[0],f);
    return [x, a[1].concat(x[x.length-1])];
  },[[2],[]])[1].map((x)=>[x-f,x]);
};

console.log(C(2)(10)); // 双子素数を10組表示
console.log(C(4)(10)); // いとこ素数を10組表示
console.log(C(6)(10)); // セクシー素数を10組表示
[ [ 3, 5 ],
  [ 5, 7 ],
  [ 11, 13 ],
  [ 17, 19 ],
  [ 29, 31 ],
  [ 41, 43 ],
  [ 59, 61 ],
  [ 71, 73 ],
  [ 101, 103 ],
  [ 107, 109 ] ]
[ [ 3, 7 ],
  [ 7, 11 ],
  [ 13, 17 ],
  [ 19, 23 ],
  [ 37, 41 ],
  [ 43, 47 ],
  [ 67, 71 ],
  [ 79, 83 ],
  [ 97, 101 ],
  [ 103, 107 ] ]
[ [ 5, 11 ],
  [ 7, 13 ],
  [ 11, 17 ],
  [ 13, 19 ],
  [ 17, 23 ],
  [ 23, 29 ],
  [ 31, 37 ],
  [ 37, 43 ],
  [ 41, 47 ],
  [ 47, 53 ] ]

幸運数

・ポーランドの数学者スタニスワフ・ウラムによって提案された数列。
・素数の性質を研究するために、素数に似たルールで導き出せる数列を考案したとのこと。

'use strict';

const range = (m,n)=>Array.from(Array(n).keys()).slice(m);
const loop = (a,n)=>{
  const b = [0].concat(a).filter((v,i)=>i%(a[n])!==0);
  return (b[n]<b.length+1) ? loop(b,n+1) : b;
}
const luc = (n)=>loop(range(1,n).filter((x)=>x%2!==0), 1);

console.log(luc(100)); // 100未満の幸運数を表示
[ 1,
  3,
  7,
  9,
  13,
  15,
  21,
  25,
  31,
  33,
  37,
  43,
  49,
  51,
  63,
  67,
  69,
  73,
  75,
  79,
  87,
  93,
  99 ]

階乗

・1 から n までのすべての整数の積。

'use strict';

console.log(Array(10).fill().reduce((a,_,i)=>{ // 階乗を10個表示
  return a.concat([[1].concat(Array(i).fill().map((_,j)=>j+1))
    .reduce((x,y)=>x*y,1)]);
},[]));
[ 1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880 ]

フィボナッチ数

・フィボナッチ数:イタリアの数学者レオナルド・フィボナッチにちなんで名付けられた数
・リュカ数:フランスの数学者エドゥアール・リュカにちなんで名付けられた数

'use strict';

const C = (m)=>(n)=>{
  return Array(n).fill().reduce((a,b,i)=>{
    return (i<2) ? a : a.concat(a[i-2]+a[i-1]);
  },m).slice(0,n);
};

console.log(C([0,1])(10)); // フィボナッチ数を10個表示
console.log(C([2,1])(10)); // リュカ数を10個表示
[ 0, 1, 1, 2, 3, 5, 8, 13, 21, 34 ]
[ 2, 1, 3, 4, 7, 11, 18, 29, 47, 76 ]

パスカルの三角形

・二項展開における係数を三角形状に並べたもの。

'use strict';

const pas = (n)=>{
  return Array(n).fill().reduce((a,b,i)=>{
    if (i<1) return a;
    const p = [0].concat(a[a.length-1],0);
    return a.concat([p.map((v,w)=>v+p[w+1]).slice(0,-1)]);
  },[[1]]).slice(0,n);
};

console.log(pas(10)); // パスカルの三角形を10段表示
[ [ 1 ],
  [ 1, 1 ],
  [ 1, 2, 1 ],
  [ 1, 3, 3, 1 ],
  [ 1, 4, 6, 4, 1 ],
  [ 1, 5, 10, 10, 5, 1 ],
  [ 1, 6, 15, 20, 15, 6, 1 ],
  [ 1, 7, 21, 35, 35, 21, 7, 1 ],
  [ 1, 8, 28, 56, 70, 56, 28, 8, 1 ],
  [ 1, 9, 36, 84, 126, 126, 84, 36, 9, 1 ] ]

最後に

以上、JavaScriptを使っていくつかの数列を書き出してみました。

JavaScriptといえば、この本。『JavaScript 第6版』(オライリージャパン)

厚くて重い本ですが読みやすいです。
JavaScriptの基本を身につけるにはもってこい。
みっちりと再勉強するにはいいと思いますよ。
でも発売は2012年。ちょっと古くなったかな?

というわけで、今回はこれにて。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする

野村 野村のプロフィール
枕は高いほうがいい。高いほうが本を読みやすいのですよ。なので広めのタオルケットを何重にも折りたたんでその上に枕を載せてその上に頭を載せてたりする。twitterやってます