【JavaScript】ライブラリ関数を使わずに数値の平方根を求める方法
はじめに
本記事では、Math.sqrt() 関数などの組み込みライブラリを使わずに、数値の平方根を計算する JavaScript 関数の作成方法を解説します。数値を引数として受け取り、その平方根を返す関数を「二分探索(バイナリサーチ)」のアルゴリズムを活用して実装していきます。
実装コード
以下が実際のコード例です。
const square = (n, i, j) => {
let mid = (i + j) / 2;
let mul = mid * mid;
if ((mul === n) || (Math.abs(mul - n) < 0.00001)){
return mid;
}else if (mul < n){
return square(n, mid, j);
}else{
return square(n, i, mid);
}
}
// 数値 n の平方根を求める関数
const findSqrt = num => {
let i = 1;
const found = false;
while (!found){
// n が完全平方数の場合
if (i * i === num){
return i;
}else if (i * i > num){
let res = square(num, i - 1, i);
return res;
};
i++;
}
}
console.log(findSqrt(33));出力結果
このコードを実行すると、コンソールには次のような出力が表示されます。
5.744562149047852
コードの解説
このアルゴリズムの仕組みを順を追って見ていきましょう。
ステップ1:整数部分の特定
まず i = 1 から順にループ処理を行います。
- i × i = n の場合: n は完全平方数であり、その平方根はちょうど i なので、そのまま i を返します。
- i × i > n となった場合: 平方根が整数にならない数値であるため、「i × i が初めて n を超える」最小の i を特定します。
ステップ2:二分探索による高精度化
ステップ1の段階で、「n の平方根は必ず i − 1 から i の間に存在する」ことが確定します。そこで square() 関数がこの区間に対して二分探索を適用します。
- 区間の中間値 mid を計算し、mid × mid と n を比較します。
- 差が 0.00001 未満になるまで、探索範囲を半分ずつ絞り込みながら再帰的に処理を繰り返します。
- 十分な精度に達した時点で mid を平方根として返します。
ポイントまとめ
この手法では、誤差の許容範囲(ここでは 0.00001)を調整することで、必要な精度の平方根を効率的に求められます。二分探索により候補範囲が毎回半分になるため、線形探索に比べて非常に少ない計算回数で収束する点が大きなメリットです。
-
JavaScriptでライブラリ関数を使わずにASCIIコードからアルファベットを取得する方法
問題 数値を引数として受け取るJavaScript関数を作成する必要があります。この関数は、その数値に対応するASCIIコード上のアルファベット文字を返し、該当するアルファベットが存在しない場合は -1 を返します。 ここでの重要な条件は、String.fromCharCode() のように数値と文字を相互変換する組み込み関数を使用してはならないという点です。 解決のアプローチ ASCIIコードでは、小文字の「a」〜「z」には 97〜122、大文字の「A」〜「Z」には 65〜90 の番号が連続して割り当てられています。この規則性を利用すれば、与えられた数値がどちらの範囲内にあるかを判定する
-
C++で平方根を使わずに数値が完全平方数かどうかを判定する方法
数値が与えられたとき、その数が完全平方数(perfect square)かどうかを判定することを考えます。ここでは、平方根の演算を使用せずに判定を行う方法を紹介します。例えば、1024は 32 × 32 = 1024 と表せるため完全平方数ですが、1000はいかなる整数の二乗にもならないため完全平方数ではありません。 考え方は非常にシンプルです。1から順に整数 i を増やしながら、i × i が n を超えるまで調べます。このとき、n が i で割り切れ、かつ商(n ÷ i)も i と等しい場合、すなわち n = i × i が成立した時点で、n は完全平方数であると判定できます。 アルゴリズ