Cプログラムで平方根を求める「バフシャリー近似」の計算方法を解説
バフシャリー近似(Bakhshali approximation)とは
バフシャリー近似は、完全平方数ではない数の平方根を求めるための計算手法です。この手法は古代インドの数学書「バフシャーリー写本」に記されていたことに由来し、バビロニア法(ニュートン法)の最初の2ステップに相当する近似計算として知られています。
この記事では、まず関連する基本用語を確認し、その後、実際のプログラムでの実装方法までをわかりやすく解説します。
基本用語のおさらい
平方根
ある数 x の平方根とは、y2 = x という条件を満たす数 y のことです。
完全平方数
完全平方数とは、その平方根が整数になる数のことです。例えば 16 は、平方根が 4 と 4 になるため、完全平方数です。
数の平方根を求める方法は数学的に複数定義されていますが、本記事ではバフシャリー近似による求め方を学びます。
バフシャリー近似の計算手順
ある数 s の平方根を求めたいとします。近似値を得るために必要な手順は以下の通りです。
- 数 s に最も近い完全平方数、すなわち n2 を求めます。
- 数とその最も近い完全平方数の差、すなわち d = s − n2 を計算します。
- P = d / (2n) を計算します。
- A = n + P を計算します。
- 数 s の平方根の近似値は (A − P2 / 2A) として得られます。
C++での実装例
それでは、実際にプログラムでバフシャリー近似を実装してみましょう。以下のコードでは、まず入力した数より小さい最大の完全平方数を探し、その後、前述の手順に従って近似値を計算しています。
#include <iostream>
using namespace std;
int main(){
float s = 12.3412;
int perfectSqaure = 0;
int n = 0;
// s以下で最大の完全平方数とその平方根nを探索
for (int i = static_cast<int>(s); i > 0; i--) {
for (int j = 1; j<i; j++){
if (j*j == i){
perfectSqaure = i;
n = j;
break;
}
}
if (perfectSqaure > 0)
break;
}
float d = s - perfectSqaure;
float P = d/(2.0*n);
float A = n+P;
float rootOfs = A-((P*P)/(2.0*A));
cout<<"The square root of "<<s<<" = "<<rootOfs;
return 0;
}実行結果
The square root of 12.3412 = 3.51327
精度の検証
上記のプログラムで得られた近似値 3.51327 は、実際の平方根である 3.51300441... に非常に近い値です。このように、バフシャリー近似は数桁まで正確な結果を短い計算で求められるため、浮動小数点数の平方根を手軽に近似したい場合に有効な手法です。
より高い精度が必要な場合は、バビロニア法(ニュートン法)を反復適用する方法や、標準ライブラリの sqrt() 関数を使用するとよいでしょう。
-
C++でピラミッドの体積を計算するプログラムの作り方|底面の形状別の公式と実装例
ピラミッドの底面の種類に応じた辺の長さが与えられたとき、そのピラミッドの体積を計算するのが本記事のテーマです。 ピラミッドとは、外側の面がすべて三角形で構成され、それらが共通の一点(頂点)で交わることで鋭い角を形成する3次元図形です。ピラミッドの体積は、底面がどのような形状であるかによって異なります。 ピラミッドの底面にはさまざまな種類があり、代表的なものは以下の通りです。 底面の形状別の体積の求め方 三角形の底面(三角錐) 底面が三角形の場合、ピラミッドの体積は次の公式で求められます。 体積 = (1/6) × a × b × h 正方形の底面(四角錐) 底面が正方形の場合、ピラミッドの体
-
C++で学ぶクイックソート(QuickSort)の仕組みと実装方法
クイックソートとはクイックソート(Quicksort)は、比較に基づいて未ソートのリスト(配列)を並べ替えるソートアルゴリズムの一つです。「パーティション交換ソート(partition exchange sort)」とも呼ばれます。クイックソートは安定ソートではありません。これは、等しい値を持つ要素同士の相対的な順序が保持されないためです。ただし、配列に対してごくわずかな追加メモリだけで動作するため、メモリ効率に優れています。選択ソートと非常に似ていますが、常に最悪のパーティションを選んでしまうわけではない点が異なり、より洗練された形の選択ソートと捉えることもできます。クイックソートは最も効率