1 ile 300 arasındaki asal sayıları bulan program yazınız. (Derste de belirttiğim üzere: burada marifet hazır kod kullanmak değil, for ve if yeteneklerinizi sergilemek. Kodunuzun doğruluğunu primes(300) komutunun sonucuyla kıyaslayarak kontrol edebilirsiniz).
Asal sayıları bulurken tekrardan kaçınmak için asal sayı buldukça bunları asallar dizisinin içinde topluyor, kontrol edeceğimiz sayıyı bu dizimizdeki ("heybemizdeki") mevcut asal sayılara bölünüyor mu diye bakıyoruz. Yani örneğin 35'in asallığını kontrol etmek için 2'ye bölünüyor mu, 3'e bölünüyor mu diye sırayla bakıyoruz ama 4'e bölünüyor mu diye bakmıyoruz. O ana kadar bulduğumuz elimizdeki asal sayılardan birine bölündüğünü gördüğümüz anda da break ile kesip daha fazla kontrol etmiyoruz (örneğin 35'in 5'e bölündüğünü görünce, 7'ye, 11'e de, ... bölünüyor mu diye bakmıyoruz).
Programın detaylı anlatımı ve adım adım gelişimi için geçen senenin ilgili ders notlarına bakabilirsiniz.
asallar = [2]; % bulduğumuz asalları bu listenin içine koyacağız
for sayi = 3:300
    % bu bizim asallığını kontrol etmek istediğimiz sayı
    #disp("Asallığını kontrol ettiğimiz sayı:")
    #sayi
    #disp("") % Bir boş satır ekleyelim
    for bolen = asallar
        % asallar listesinin dinamik bir liste olduğunu
        % yani mesela 4'e gelindiğinde [2 3];
        % 9'a gelindiğinde [2 3 5 7] olduğuna dikkat edin!
        #bolen
        kalan = mod(sayi,bolen);
        if(kalan == 0)
            % Bu sayı asal olamaz.
            #disp("Sayı asal değil! - döngüden burada çıkıyorum.")
            #disp("") % Bir boş satır ekleyelim
            break; % "bolen = 2:sayi-1" döngüsünü kırıyoruz
        endif
        #disp("") % Bir boş satır ekleyelim
    endfor
    
    % Buraya iki yoldan gelmiş olabiliriz:
    %   ya sayi kalansız bolundu ve döngü break ile kırıldı
    %     (bu durumda kalan == 0)
    %   ya da hiçbir bolen kalansız bölemedi ve 2:sayi-1 döngüsü
    %     normal yoldan sona erdi (bu durumda kalan != 0)
    if(kalan != 0)
        #disp("Sayı asal!")
        asallar = [asallar sayi];
    endif
    #disp("-------------------")
endfor
asallar
asallar =
 Columns 1 through 13:
     2     3     5     7    11    13    17    19    23    29    31    37    41
 Columns 14 through 26:
    43    47    53    59    61    67    71    73    79    83    89    97   101
 Columns 27 through 39:
   103   107   109   113   127   131   137   139   149   151   157   163   167
 Columns 40 through 52:
   173   179   181   191   193   197   199   211   223   227   229   233   239
 Columns 53 through 62:
   241   251   257   263   269   271   277   281   283   293
Dersin başında incelediğimiz ve hazır formülle köklerini bulduğumuz $3x^2-7x+4=0$ denklemini tekrardan ele alalım. Kök bulmak için kullanılan metotların biri, kökün, tanım itibarı ile, fonksiyonun 0 değerini aldığı $x$ değeri olduğu gerçeğidir. Eğer fonksiyon kök değerinde 0'a eşitse, bu, fonksiyonun kök değerinde x-eksenini ya yukarıdan aşağıya, ya da aşağıdan yukarıya kesmesi anlamına gelir ("çoğu zaman" ;). O halde belli bir $x_0$ değerinden başlayıp, ufak ufak ilerleyerek şu şekilde (ve istenen hassasiyette) kökü bulacak bir algoritma kurabiliriz:
Bu algoritmayı anlayıp, program haline getirin.
(Bu vesileyle, bu algoritma işimizi görse de aslında epey hantal bir algoritma; ileride çok daha etkin metotlar göreceğiz kök bulma için)
x0 = 0;
adim_boyu = 1E-4;
a = 3*x0^2 - 7*x0 + 4;
for i=1:1000000
    x1 = x0 + adim_boyu;
    b = 3*x1^2 - 7*x1 + 4;
    if((a/b) < 0)
        # ikisinin birbirine bölümü negatifse 
        # işaretleri farklı demektir, yani
        # [x0,x1] aralığında kök var!
        kok = (x0 + x1) /2
        break;
    endif
    x0 = x1;
    a = b;
endfor
disp("---------------")
# Diğer kökü bulmak için aynı prosedürü tekrarlayalım
# ama bu sefer başlangıç adımını bulduğumuz kök alalım:
x0 = kok;
a = 3*x0^2 - 7*x0 + 4;
for i=1:1000000
    x1 = x0 + adim_boyu;
    b = 3*x1^2 - 7*x1 + 4;
    if((a/b) < 0)
        # ikisinin birbirine bölümü negatifse 
        # işaretleri farklı demektir, yani
        # [x0,x1] aralığında kök var!
        kok = (x0 + x1) /2
        break;
    endif
    x0 = x1;
    a = b;
endfor
kok = 1.0000 --------------- kok = 1.3333
Bonuslar
Bonusları çözerken de yukarıdaki algoritmayı geliştireceksiniz: if(b^2-4*a*c == 0) => "tek kök var", if(b^2-4*a*c < 0) => "gerçek kök yok" gibisinden cinlikler yapmaya izin yok. ;)
odev1_1.m & odev1_2.m olacak, zip dosyasının adı ise FIZ219_Odev1_GrupAdi.zip biçiminde olacaktır.(Değerlendirmenin matematiksel detayları dersin sayfasında bilahare (birkaç güne) açıklanacaktır)