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)