C++
 Computer >> コンピューター >  >> プログラミング >> C++

Cプログラムで平方根を求める「バフシャリー近似」の計算方法を解説

バフシャリー近似(Bakhshali approximation)とは

バフシャリー近似は、完全平方数ではない数の平方根を求めるための計算手法です。この手法は古代インドの数学書「バフシャーリー写本」に記されていたことに由来し、バビロニア法(ニュートン法)の最初の2ステップに相当する近似計算として知られています。

この記事では、まず関連する基本用語を確認し、その後、実際のプログラムでの実装方法までをわかりやすく解説します。

基本用語のおさらい

平方根

ある数 x の平方根とは、y2 = x という条件を満たす数 y のことです。

完全平方数

完全平方数とは、その平方根が整数になる数のことです。例えば 16 は、平方根が 44 になるため、完全平方数です。

数の平方根を求める方法は数学的に複数定義されていますが、本記事ではバフシャリー近似による求め方を学びます。

バフシャリー近似の計算手順

ある数 s の平方根を求めたいとします。近似値を得るために必要な手順は以下の通りです。

  1. s に最も近い完全平方数、すなわち n2 を求めます。
  2. 数とその最も近い完全平方数の差、すなわち d = s − n2 を計算します。
  3. P = d / (2n) を計算します。
  4. A = n + P を計算します。
  5. 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() 関数を使用するとよいでしょう。

  1. C++でピラミッドの体積を計算するプログラムの作り方|底面の形状別の公式と実装例

    ピラミッドの底面の種類に応じた辺の長さが与えられたとき、そのピラミッドの体積を計算するのが本記事のテーマです。 ピラミッドとは、外側の面がすべて三角形で構成され、それらが共通の一点(頂点)で交わることで鋭い角を形成する3次元図形です。ピラミッドの体積は、底面がどのような形状であるかによって異なります。 ピラミッドの底面にはさまざまな種類があり、代表的なものは以下の通りです。 底面の形状別の体積の求め方 三角形の底面(三角錐) 底面が三角形の場合、ピラミッドの体積は次の公式で求められます。 体積 = (1/6) × a × b × h 正方形の底面(四角錐) 底面が正方形の場合、ピラミッドの体

  2. C++で学ぶクイックソート(QuickSort)の仕組みと実装方法

    クイックソートとはクイックソート(Quicksort)は、比較に基づいて未ソートのリスト(配列)を並べ替えるソートアルゴリズムの一つです。「パーティション交換ソート(partition exchange sort)」とも呼ばれます。クイックソートは安定ソートではありません。これは、等しい値を持つ要素同士の相対的な順序が保持されないためです。ただし、配列に対してごくわずかな追加メモリだけで動作するため、メモリ効率に優れています。選択ソートと非常に似ていますが、常に最悪のパーティションを選んでしまうわけではない点が異なり、より洗練された形の選択ソートと捉えることもできます。クイックソートは最も効率