C# Karekök Hesaplama Algoritması

Projelerimizde hazır matematik fonksiyonlarını kullanırız genelde. Örneğin 19 sayısının karekökünü almak için “double sayi = Math.Sqrt(19);” kodunu yazdığımız an sonucu bize  4.358898943540674 şeklinde double olarak döndürür. Burada bir sıkıntı yok. Peki neden hazır “Math.Sqrt()” metodunu kullanmak yerine bir algoritma geliştirmek isteyelim. Hazır fonksiyon ile elde ettiğimiz double sayı virgülden sonra 15 hane. Daha hassas sonuçlar elde etmek istediğimiz projelerimiz olabilir. Mesela virgülden sonra 28 haneye kadar basamak görmek isteyebiliriz. Özellikle kripto algoritmalarında (MD5,SHA512 vb… gibi) ve uzay biliminde ölçümler ve hesaplamalar virgülden sonra çok daha fazla basamak sayıları ile çalışmakta. Bu durumda kendi karekök algoritmamızı kurmamız gerekebilir. Aşağıda ki kodları inceleyin derim.


public static decimal karekokalma(decimal dec)

{

decimal x = 7;

decimal y = dec;

decimal ka = 0;

for (int i = 0; i<50; i++)

{

x = Convert.ToDecimal(0.5) * Convert.ToDecimal(x + (y / (x)));

if (ka == x)

{

break;

}

ka = x;

}

return ka; //19 için sonuç "4.3588989435406735522369819840" şeklinde olacaktır.

}

Kodu incelediğimiz de matematik ile haşır neşir olanlarımızın hemen farkına varacağı babil yöntemi göze çarpmaktadır. Babil yöntemi aslında basit bir iterasyon yöntemidir. Tahmin edilen değer işlem sonucu çıkan değere yaklaşana ve nihayetinde eşit olana kadar bir döngüye sokulur. Olay bu kadar basit.

x=0,5*(x+y/x) şeklinde matematize edilmiş bir denklem var karşımızda. Denklemi bir başka şekilde şöyle yazabiliriz. x=1/2*((x²+y)/x)  —->  2x²=x²+y ——>  x²=y

Zaten bizim de çözmek istediğimiz öyle bir x bulalım ki x²=y  şartını sağlasın. Bu denklemlerde y sayısı karekökünü bulmak istediğimiz sayı, x sayısı ise ilk tahmin değerini ifade etmektedir.

Paylaşmayı unutmayın!