C# ta Girilen Sayının Asal Olup Olmadığını Yazan Program ?

Bu konuyu okuyanlar

emretanriverdi

Asistan
Katılım
15 Mart 2013
Mesajlar
225
Reaksiyon puanı
0
Puanları
16
Arkadaşlar C# ta textbox a girilen bi sayının asal mı değilmi olduğunu bulan bi program nasıl yazabiliriz?Uğraştım fakat bulamadım. bana açıklayarak anlatabilir misiniz?
 

engerex

Müdavim
Katılım
16 Ağustos 2008
Mesajlar
7,676
Reaksiyon puanı
26
Puanları
48
Çeşitli yol izleyebilirsin.
Örneğin;
Sayımız 47 olsun.
-Bir döngü oluşturursun. Sayının yarısına kadar döngüyü çalıştırırsın. 47 mod SAYIMIZ ile kalanı bulursun.

Bir diğer yöntem 47'nin kare kökü = 6.855... tam sayı kısmı = 6 >>> Döngüyü sadece 2'den 6'ya kadar çalıştıralım. Eğer 2, 3, 4, 5, 6'ya bölünmezse asaldır. (47 mod SAYIMIZ)
 

annttiigs

Müdavim
Emektar
Katılım
7 Şubat 2007
Mesajlar
2,589
Reaksiyon puanı
24
Puanları
38
Yani bunu modellemek bu kadar zor olmasa gerek. Açıyorsunuz; google.
Sonrasında asal sayı olma kurallarından birini seçiyorsunuz. Yapacağınız şey iki tane for iki tane if.
Eğer bunları yapamıyorsanız biraz ağır gibi gelecek ama doğru bir söz olacak. Bence olaya en baştan başlayın.
 

BeyDadaş

Öğrenci
Katılım
15 Ekim 2012
Mesajlar
91
Reaksiyon puanı
0
Puanları
0
for (long i = 1; i < 1000000; i++){

bool asalMi = true ;

//Sayının asal olup olmadığını kontrol ediyor

for (int = j = 2; j <i;j++){

if (i % j == 0){

asalMi = false;
break;
}

}

//asal olan sayılar ekrana yazdırılıyor

if (asalMi){

listBox1.ıtems.Add(i + " ");

}

}
 

emretanriverdi

Asistan
Katılım
15 Mart 2013
Mesajlar
225
Reaksiyon puanı
0
Puanları
16
Yani bunu modellemek bu kadar zor olmasa gerek. Açıyorsunuz; google.
Sonrasında asal sayı olma kurallarından birini seçiyorsunuz. Yapacağınız şey iki tane for iki tane if.
Eğer bunları yapamıyorsanız biraz ağır gibi gelecek ama doğru bir söz olacak. Bence olaya en baştan başlayın.
kardeş bizde öğrenmeye çalışmak için soruyoruz zaten. bilsek sormayız.belki çok kolaydır belki çok zordur ama ben yapamadım !

- - - Mesaj Güncellendi - - -

for (long i = 1; i < 1000000; i++){

bool asalMi = true ;

//Sayının asal olup olmadığını kontrol ediyor

for (int = j = 2; j <i;j++){

if (i % j == 0){

asalMi = false;
break;
}

}

//asal olan sayılar ekrana yazdırılıyor

if (asalMi){

listBox1.ıtems.Add(i + " ");

}

}

Çok sağol kardeş eline sağlık işime yaradı
 

BeyDadaş

Öğrenci
Katılım
15 Ekim 2012
Mesajlar
91
Reaksiyon puanı
0
Puanları
0
Önemli değil yazarak anlatılamayacağı için kodu yazdım sadece kusura bakma.
 

mutahhar

Müdavim
Katılım
14 Nisan 2009
Mesajlar
1,538
Reaksiyon puanı
15
Puanları
38
o sayıya kadar olan sayıları tek tek denemenize gerek yok. girilen sayının yarısına kadar olan sayıları denemeniz yeterli olacaktır. bu işlem süresini kısaltır.
 

engerex

Müdavim
Katılım
16 Ağustos 2008
Mesajlar
7,676
Reaksiyon puanı
26
Puanları
48
o sayıya kadar olan sayıları tek tek denemenize gerek yok. girilen sayının yarısına kadar olan sayıları denemeniz yeterli olacaktır. bu işlem süresini kısaltır.
2 hariç çift sayıları, 3 hariç katları, 5'in çift katlarını çıkar daha da kısalır.
Kök yönteminde daha da kısa.
 

mutahhar

Müdavim
Katılım
14 Nisan 2009
Mesajlar
1,538
Reaksiyon puanı
15
Puanları
38
2 hariç çift sayıları, 3 hariç katları, 5'in çift katlarını çıkar daha da kısalır.
Kök yönteminde daha da kısa.

abi o büyük sayılarda daha kullanışlı olur sanki. yani listeye atarken o kontrolleri yapsa sonra diğerlerini kontrol etse büyük sayılar için uygun sonuç verir gibi :)
 

BeyDadaş

Öğrenci
Katılım
15 Ekim 2012
Mesajlar
91
Reaksiyon puanı
0
Puanları
0
o sayıya kadar olan sayıları tek tek denemenize gerek yok. girilen sayının yarısına kadar olan sayıları denemeniz yeterli olacaktır. bu işlem süresini kısaltır.

Arkadaşın dediği gibi "1000000" değeri bir değişkene atanıp programın hızlı çalışmasını sağlaya bilir .
 

John Ahmet

Öğrenci
Katılım
30 Ekim 2017
Mesajlar
3
Reaksiyon puanı
0
Puanları
1
Yaş
44
Asal sayıları seri halde elde etmek mi istiyorsunuz? Yoksa bir sayının asal olup olmadığını mı sorgulamak istiyorsunuz? Bu ihtiyaçlara cevap veren 3 kod hazırladım. İlk kod sayının asal olup olmadığını ulong tipininde alarak hesaplıyor. Bu kod ile 2 ^ 64 - 1 değerine kadar sayının asal olup olmadığını test edebilirsiniz.

Kod:
public static bool isPrime(ulong n)
        {
            // Küçük sayılar için test yapılıyor
            if (n <= 1) return false;
            if (n <= 3) return true;

            // 25 ten küçük sayılar, asal değilse 2 yada 3 'e kesinlikle bölünür. ((i * i <= n) i = 5 ten başlıyor.)
            if (n % 2 == 0 || n % 3 == 0) return false;
          
            // 3 ten büyük tüm asal sayılar k bir tamsayı olmak üzere 6k - 1 yada 6k + 1 olarak ifade edilebilir.
            // Bu nedenle hız kazanmak için döngüye 6'şar artırılarak devam ediliyor.
            for (ulong i = 5; i * i <= n; i = i + 6)
                if (n % i == 0 || n % (i + 2) == 0)
                    return false;

            return true;
        }

Peki 2 ^ 64 - 1 'den daha büyük sayıları test etmek istersek ne yapacağız. Bunun için ikinci bir kod daha yazdım. Burada sayılar ram 'iniz ile sınırlı ayrıca çok büyük bir sayı gerçekten asal ise işlem çok uzun sürebiliyor. System.Numerics assembly sindeki BigInteger sınıfından faydalandım. Ayrıca işlem süresini kısaltmak için Fermat ın ünlü teoreminden faydalandım. BigInteger'ın sayıları 50 byte ta saklamasına aldanmayın bu sınıf çok büyük sayılarla işlem yapmanızı kolaylaştırıyor.

Fermat'ın ünlü teoremi

a ^ (p - 1) ≡ 1 (mod p) ' dir.

Çok büyük bir sayı testi yapmak için örneğin;

bool asalMi = isBigPrime(BigInteger.Parse("654544665498122165321356311"));

şeklinde sorgulayabilirsiniz.


Kod:
        public static bool isBigPrime(BigInteger n)
        {
            if (n <= ulong.MaxValue)
                return isPrime((ulong)n); // daha önce yazdığımız metodu çağırıyoruz.
            // Fermat teoremine göre p asal bir sayı ise a ^ (p - 1) mod p = 1 dir.
            // Hesaplamanın kolay olması için a yı 2 alıyoruz.
            // Eğer 2 ^ (n - 1) mod n != 1 den n asal olamaz diyoruz false döndürüyoruz.
            // 2 ^ (n - 1) % n != 1 ise (ModPow methodu bu işlemi çok hızlı yapmaktadır)
            else if (BigInteger.ModPow(2, n - 1, n) != 1)
                return false;
            else
            {
                // 2 ^ (n - 1) mod n == 1 ise bu n ' nin kesinlikle asal olduğu anlamına gelmiyor.
                // Ancak büyük ihtimalle asaldır diyebiliriz.
                // Yine de kesin bir sonuç için test işlemine devam ediyoruz.
                Console.WriteLine("{0} sayısı büyük ihtimalle asal sayı, bu nedenle kesin çözüm için test işlemi uzun sürebilir.", n);

                // 2 ye yada 3 e bölünebiliyorsa false değerini döndürüyoruz.
                if (n % 2 == 0 || n % 3 == 0) return false;

                BigInteger i = 5;

                while (i * i <= n)
                {
                    if (n % i == 0 || n % (i + 2) == 0)
                        return false;
                    // Tüm asal sayılar 6k - 1 yada 6k + 1 olarak ifade edilebilir.
                    // Bu nedenle hız kazanmak için döngüye 6'şar artırılarak devam ediliyor.
                    i += 6;
                }

                return true;
            }
        }

Bize asal sayılar seri olarak lazımsa daha hızlı bir algoritma hazırlayabiliriz. Primes isminde hazırladığım sınıfın yapılandırıcısına bir değer verdiğinizde bu değerden küçük asal sayıları atadığınız değişkene IEnumrable<long> olarak atar. Sonrasında bu değerleri foreach yapısıyla dolaşabilirsiniz yada ListBox a direk olarak atayabilirsiniz. limit değerine eğer RAM' iniz yeterli ise maximum int.MaxValue - 56 değerini verebilirsiniz. (2.147.483.592)

Benim bilgisayarımda bir milyara kadar olan bütün asal sayıları 18 saniyede buldu. Sizin bilgisayarınızda işlem ne kadar sürdü paylaşabilir misiniz?

(intel core i7 8GB Ram) => 18 saniye

Kod:
public class Primes : IEnumerable<ulong>
    {
        private ulong limit;
        private ulong count;
        private bool[] numbers;
        private DateTime startTime;
        private TimeSpan calculatationDuration;

        public Primes(ulong limit)
        {
            this.count = 0;
            this.limit = limit;
            this.numbers = new bool[limit];
            startTime = DateTime.Now;
            findPrimes(); // limit değerinden küçük bütün asallar bu method ile bulunuyor.
            calculatationDuration = DateTime.Now - startTime; // süre hesaplanıyor
        }

        private void findPrimes()
        {
            // Şu an numbers dizisinin tüm elemanları false değerindedir.
            // limitten küçük bütün tek sayılar true yapılıyor (1 hariç çünkü artık asal olarak kabul edilmiyor).
            for (ulong i = 3; i < limit; i += 2) numbers[i] = true;
            // 2 çift olan yegane asal sayıdır (özel durum).
            if (limit > 2) numbers[2] = true;
            // 3 ten itibaren bütün tek sayılar dolaşılıyor.
            for (ulong j = 3; j * j <= limit; j += 2)
            {
                if (numbers[j])//is true
                    // Tek sayıların tek katları asal olmadığından değerler false yapılıyor.
                    for (ulong p = 3; (p * j) < limit; p += 2)
                        numbers[p * j] = false;
            }
        }

        public IEnumerator<ulong> GetEnumerator()
        {
            for(ulong i = 2; i < 3; i++)
                if (numbers[i])
                    yield return i;
            for (ulong i = 3; i < limit; i+=2)
                if (numbers[i])
                    yield return i;
        }

        IEnumerator IEnumerable.GetEnumerator()
        {
            return GetEnumerator();
        }


        public ulong Count
        {
            get
            {
                if (count == 0)
                {
                    if (limit > 2) count++;
                    for (ulong i = 3; i < limit; i += 2)
                        if (numbers[i]) count++;

                    return count;
                }
                else return count;
            }
        }

        public bool[] Numbers { get { return numbers; } }
        public TimeSpan CalculationDuration { get { return calculatationDuration; } }
    }

Tüm kodları bu linkten indirebilirsiniz.
Uploadfiles.io - TestPrimes.rar
 
Üst