はじめに
こんにちは、野村です。
今回は、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年。ちょっと古くなったかな?
というわけで、今回はこれにて。