AlgoritmalarMatematik

Project Euler 3: En Büyük Asal Çarpan

[penci_blockquote style=”style-3″ align=”none” author=””]Project Euler 3: 13195 sayısının asal çarpanları 5, 7, 13 ve 29’dur. 600851475143 sayının en büyük asal çarpanı nedir?[/penci_blockquote]

Project Euler 3 sorusunda karşımıza yine bir algoritma klasiği çıkıyor: Asal sayılar.

Asal sayıları elde edebileceğimiz bir sürü algoritma mevcut. Bunları incelemenizi şiddetle tavsiye ediyorum. Bir sayının asal sayı olup olmadığını denetlemenin en kaba yolu o sayıyı kendisine kadar olan sayma sayılarına bölmektir. Bu sayı bir ve kendisi hariç başka bir sayıya bölünmüyorsa asal bir sayıdır.

Fakat bu yöntem fazlasıyla gereksiz işlem kalabalığına sahiptir. Örneğin hiçbir asal sayı çift değildir, çünkü çift her sayı ikinin bir katıdır. Bu yüzden her seferinde çift sayıları kontrol etmek anlamsızdır (takdir edersiniz ki bu iki kat fazla sayının kontrol edilmesi demek). Bu soruda biz de tam olarak bu mantıktan ilerleyen bir algoritmayı ele alacağız. Lakin belirtmek isterim ki, algoritma dünyasında hızlı bir şekilde asal sayı bulmak oldukça önemli bir yere sahiptir ve bu bahsedeceğimiz algoritmalardan daha hızlıları da mevcuttur.

Eratosthenes’in Eleği Algoritması

Project Euler 2 Sieve of Eratosthenes
Project Euler 2 çözümünde kullanılabilecek bir asal sayı algoritması olan Eratosthenes’in eleği algoritması

Bu algoritma 2’den başlayarak eleme yöntemiyle asal sayıların belirlenmesini sağlar. Öncelikle ilk sayı olan 2 asal olarak yazılır ve eldeki listeden 2’nin katları silinir. Sonra sıradaki sayı olan 3’e geçilir ve 3’ün katları silinir. Sıradaki sayı 4 değildir, çünkü 2’nin katı olduğundan elenmiştir. Dolayısıyla sıradaki sayı 5’tir, asal olarak yazılır ve katları silinir. İşlem bu şekilde devam eder. Liste sona erdiğinde, geriye kalan sayılar yalnızca asal sayılardır.

Kareköke Kadar İncelemek

Denetlemeyi sayının kareköküne kadar olan sayılara kadar yapmak yeterlidir. Örneğin 100 sayısının asal olup olmadığını denetlemek için karekök 100’e yani 10’a kadar olan sayılara bakmak yeterlidir (bu yöntemin bizi ne kadar işlem kalabalığından kurtardığına dikkat edin). Bunun nedenini düşünmeyi size bırakıyoruz, işin arkasında oldukça şahane bir düşünce yatıyor. Eminiz elinize bir kağıt kalem alıp yazmaya başlayarak bunu kendiniz de görebilirsiniz.

C# Çözümü

Eğer sayıları bir dizide kabul eder ve dizinin asal olmayan elemanlarına yanlış değerini atarsak, dizinin doğru olan elemanlarının numarası bize asal sayıları verir. Böylece kodumuz aşağıdaki şekilde olur.

PE3 Kod 1

Şimdi yapmamız gereken işlem, bize verilen sayı olan 600851475143’ün karaköküne kadar olan asal sayıları Eratosthenes’in Eleği yöntemini kullanarak oluşturmak. Ardından sayımızı bu asal sayılara bölerek, hangisinin en büyük asal çarpan olacağını bulabiliriz.

PE3 Kod 2

Sonuç: 71, 839, 1471, 6857 olarak bulunur.

Python Çözümü

Belirli bir n değerine kadar olan asal sayıları liste haline getiren fonksiyon:

PE3 Python 2

Ardından hesabımızın yapıldığı kod parçası:

PE3 Python 1

Çıktı:

PE3 Python 3

Neredeyse saniyenin 10’da 1’i gibi bir sürede çözüldüğünü görebiliyoruz. Elbette ilerleyen problemlerde artan işlem kalabalığı nedeniyle bu bir problem teşkil etmeye başlayacak. O nedenle şimdiden, kodunuzu mümkün olan en yüksek hıza çıkartacak optimizasyonlara kafa yormanızı öneririm.

Eğer daha hızlı bir asal sayı bulma algoritması kullanırsak (ayrıca bkz.):

PE3 Python 4

Sürenin 3.5 kat kadar (%350) daha hızlandığını görüyoruz ki bu muhteşem bir gelişme. Ayrıca dikkatinizi çekmek istediğim bir nokta da asal çarpanları bulurken yaptığımız hamledir. Bize en büyük asal çarpan sorulduğundan ötürü listede küçük asallardan değil, büyük asallardan başlayarak taradık. Böylece daha az deneme yapmış olduk.

PE3 Python 5

Ögetay Kayalı

Etiketler
Daha Fazla Göster

Ögetay Kayalı

Ege Üni. Astronomi bölümünden birincilikle mezun olup, ilgili bölümde teorik kozmoloji üzerine bir yıl yüksek lisans yaptıktan sonra, İzmir Biyotıp ve Genom Enstitüsünde (iBG'de) Moleküler Biyoloji ve Genetik bölümünde yüksek lisansa geçiş yaparak bir yıl da burada lazerlerle, biyofotonik laboratuvarında optik görüntüleme üzerine çalışmalar yapmıştır.

Bir cevap yazın

Başa dön tuşu
Kapalı
Kapalı