アルゴリズムの勉強(7)

円周率

相加相乗平均を使ったアルゴリズムで実装。 相加相乗平均がなんだかわからない人はヨビノリの動画をみたらいいよ。スルッと理解できちゃうから。


「相加相乗平均の関係」を視覚的に理解する!

環境

$ node --version
v13.5.0
$ tsc --version
Version 3.7.4

コード

let a = 1;
let b = 1 / Math.sqrt(2.0);

// s = 分母
// k=0 のときの計算結果がここには含まれている
// 2じゃなくて1だよ
let s = 1;

// t = 分母にでてくる2^kの係数
let t = 4;

for (let k = 1; k <= 3; k++) { // パラメータ(ak, bk)の計算
  let prev_a = a;
  // パラメータ(ak, bk)の計算
  a = (a + b) / 2;
  b = Math.sqrt(prev_a * b);

  // 分母の計算
  s -= t * (a - prev_a) * (a - prev_a);
  t *= 2;

  // 式全体の計算
  // 分子の計算で2を掛けてないのは a k+1 を計算した結果 1/2が出てきてて、
  // それは分子側に押し付けてるから
  let pi = (a + b) * (a + b) / s;

  console.log(pi);
}

実行結果

$ tsc pi.ts && node pi.js
3.1405792505221686
3.141592646213543
3.141592653589794

所感

書籍に載っているコードと式が異なっているので、tやsの変数の初期値をみたとき 「?」ってなってしまった。 落ち着いて理解すればなんのことはないので、理解できてすっきり。

検算のために電卓アプリを購入してしまった。

書籍を前から順にできるやつだけやっていくという方針だったけど、他の項目を前提にしてコードが書かれている部分があるので苦しくなってきた。 今後は興味の赴くままに気になったやつを見ていくことにする。