c# linq ile asal sayı bulma

asal sayılar yanlış hatırlamıyorsam şifreleme(crypto) algoritmalarında yada çok nadir abuk gubik işlerde kullanılıyorlar. velhasılı bir vakit ihtiyaç olabiliyor kendileri asal 🙂 linq ile c#da asal sayı bulma yolları

var asallar = Enumerable.Range(1, 20)
.Where(i => i != 1 && !Enumerable.Range(2, i - 2).Any(j => i % j == 0));

bu yöntemde adım adım gidiliyor ve sayıya kadar bölme kontrolü yapılıyor. ikinci yöntemimiz biraz daha mantıklı bu sefer sayının kareköküne kadar bölme kontrolü yapılıyor. bu arada bölme kontrolü mod ile yapılıyor.

var asallar = Enumerable.Range(1, 20)
.Where(x => x != 1 &&
!Enumerable.Range(2, (int)Math.Sqrt(x)).Any(y => x != y && x % y == 0));

son adımda parallel olarak bu algoritmayı çalıştırmak. yapmamız gereken “AsParallel” eklemek:

var asallar = Enumerable.Range(1, 20).AsParallel()
.Where(x => x != 1 &&
!Enumerable.Range(2, (int)Math.Sqrt(x)).Any(y => x != y && x % y == 0));

ilk iki algoritmanın performans testleri

Döngü boyu adım adım algo kareköklü algoritma
2000 .011 saniye .001 saniye
200,000 31 saniye .2 saniye
2,000,000 2,400 saniye (40 dakika) 4.5 saniye

burda döngü boyu gidilen rakamlar demek yani 0 dan 2000 e kadar olan sayılardaki harcanan zaman saniye olarak. son olarakda paralel yapıda çalış dediğimizdeki performans testleri buyrun:

2000 .029 saniye
200,000 .155 saniye
2,000,000 2.6 saniye
20,000,000 65 saniye

rakamlar büyünce gerçekten fark eden bir performans farkı var.

Linq ve Hibernate

uzun süredir duyduğum linq yu inceleme fırsatım oldu en sonunda ilk elden 🙂 genelde videolarda veya makalelerde görüyordum. olay özünde hibernate in görselleşmiş hali. sabahdan akşama ofisde hibernate xml leri ve pojolarıyla oynamakdan obje kusacam yakında ordan biliomki hibernate çok kolay değil.ve microsoft bu esnada piyasaya çıkıyor var olan orm yapısını yine şükela biçimde ambalajlıyor.

var olan asp.net projesine linq kabiliyeti nasıl kazandırılıyor:
1- projeye sağ tıklayıp “Add New Item” seçiliyor. çıkan ekranda da “LINQ to SQL Classes” seçiliyor örnek ekran görüntüsü

ve sadece bu adım var olan projeye bir dbml dosyası ekliyor.
2-sonraki adım dahada kolay hemen sağda duran server explorerdaki database’inizden açılan panele table ları sürükleyip bırakmak isimlerini istediğiniz gibi ayarlamak örnek görüntü

işte bu kadar classlar hazır koda gir yaz dio adam nereye ne koycan napacaksan 🙂

hemen kod örneğide verim screen shotdaki classları kullandım:
var p1 = (from p in db.Photos
where p.user_id == (Guid)Membership.GetUser().ProviderUserKey
orderby p.created
select p).First();

bu kod bize gidip photos tablosundan login olunulmuş user a ait fotoların ilkini getiriyor. çok tatlı olmuş çok. bu var keywordüde yeni c# 3 le gelio. compile time da tipi belirlenen değişken tanımlama yöntemi. eskiler bilir vb6 daki variant a benzemio bi satır aşşada p1=3; dersek compile da hatayı verio aynen.

asıl bomba hareketleri denemedim bu arada insan merak edio bu linq nanesi sqlite ile yada mysql ile ne derece anlaşabilio 🙂

linq yu denedikden sonra yine son zamanlarda asp.net dünyasında MVC muhabbetleri duyuyordum ona bakim dedim ilk elden deneme şansım olmadı ama symphony veya cakephp nin ambalajlanmışıda yolda henüz deploy edilebilir bi versiyonu yokmuş ama bu video öle dedi.