Hemen hemen herkesin kullandığı klasik bir yöntemdir, sayıyı kendisine kadar ki sayılara sayılara sırayla bölmek. Bu yöntem müthiş bir işlem yükü getirmektedir programa. Bugün programını yazacağımız yöntemi anlatmadan önce bu klasik yöntemi nasıl geliştirebiliriz diye biraz tartışalım önce.
Akla ilk gelen şu olabilir; bir sayı 2ye tam bölünmüyorsa hiç bir çift sayıya tam bölünmez. O halde sayıyı kendisine kadar birer birer arttırmak yerine 2ye tam bölünmediğini gördükten sonra sayıyı 3 yapıp ikişer ikişer arttırabiliriz. Zira sayı 2ye tam bölünmüyorsa kesinlikle tektir ve tek sayıyı ancak bir tek sayı tam bölebilir.
İkinci olarak sayıyı kendisine kadar arttırmak yerine yarısına kadar arttırmak daha iyidir. Çünkü hiçbir sayıyı, yarısından büyük bir sayı tam bölemez.
Şimdide gelelim asıl yönteme,
Kural şu: Bir sayıyı bölebilen bütün asal asal sayılar kendisinin karekökünden küçüktür. Dolayısı ile bir sayının karekökünü aldıktan sonra, kare köküne kadar olan sayılardan herhangi biri sayıyı tam bölebiliyorsa sayı asal sayı değildir. Ancak sayının karekökünden küçük sayılardan herhangi biri sayıyı tam bölemiyorsa sayı asaldır.
Örnek C# Kodları:
using System;
namespace asal_sayi
{
class Program
{
static void Main(string[] args)
{
string Ssayi;
int Isayi;
string tercih;
do
{
Console.Clear();
Console.WriteLine("Lütfen test etmek istediğiniz sayıyı giriniz: ");
Ssayi = Console.ReadLine();
while (!Int32.TryParse(Ssayi, out Isayi))
{
Console.WriteLine("\"" + Ssayi + "\" değeri bir sayı değildir. Lütfen sayı değeri girin");
Ssayi = Console.ReadLine();
}
Isayi = Int32.Parse(Ssayi);
double karekok = Math.Sqrt(Isayi);
if (Isayi % 2 == 0 && Isayi != 2)
{
Console.WriteLine(Ssayi + " değeri asal sayı değildir. 2'ye bölünüyor");
Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine("Yeni bir sayi sorgulamak istiyor musunuz? (E/H)");
tercih = Console.ReadLine();
Console.ForegroundColor = ConsoleColor.White;
if (String.Compare("E", tercih, true) == 0)
{
Console.Clear();
continue;
}
else
{
return;
}
}
int i;
for (i = 3; i < karekok && Isayi % i != 0; i++) ;
if (i > karekok)
{
Console.WriteLine(Ssayi + " değeri asal sayıdır.");
}
else
{
Console.WriteLine("{0} değeri bir asal sayı değildir. ({1} değerine bölünüyor)", Ssayi, i);
}
Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine("Yeni bir sayi sorgulamak istiyor musunuz? (E/H)");
tercih = Console.ReadLine();
Console.ForegroundColor = ConsoleColor.White;
} while (String.Compare("e", tercih, true) == 0);
}
}
}