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年。ちょっと古くなったかな?

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

シェアする

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

フォローする

野村 野村のプロフィール
メインPCはWindows10のVirtualBox上のFreeBSD。Linux/Unixの小ネタを求めて日々右往左往してたりする。