Herkese selam. Sizlere matematiğin yazılımda ne işe yaradığına dair mükemmel bir örnek göstermek istiyorum. Maalesef forumda hala matematiği sadece okullarda görülen soyut bir kavram olarak gören birçok kişi var, daha da üzücü olan şey ise yazılım ve matematik arasındaki güçlü ilişkinin bilinmemesi. Her neyse, konuya geçelim.
Mükemmel sayı, kendisi dışındaki bölenlerinin toplamı kendisine eşit olan sayılara denir. Örneğin 6 mükemmel sayıdır. 6'nın kendisi dışındaki bölenleri
Python ile mükemmel sayı bulan bir program yazmaya kalktığımızda aklımıza ilk gelen şu tür bir kod olur:
Kodu kısaca açıklamak gerekirse, 1'den sayının kendisine kadar olan tüm sayıları döngüye alıp tam bölenleri topluyor. Eğer toplam, sayının kendisine eşitse True döndürüyor. İlk bakışta gayet temiz ve optimal bir kod gibi gözükse de birazcık matematik yardımı ile bu kodu delicesine hızlandırabiliriz. Meraklısına, bu kodun Büyük O Notasyonu,
Önce optimize edilmiş yeni kodu göstereyim:
Gördüğünüz üzere for döngüsünün sınırları 2 ve karekök(sayı) şeklinde değişti. Son yazdığımız kod 1000 sınır değeri için 6.6, 10000 sınır değeri için 36 kat daha hızlı çalışıyor!
Peki bahsettiğim matematiksel yardım ne alaka? Forumda Latex desteği olmadığı için biraz zor anlatacağım ama deneyeyim. Bir sayının karekökü, küçükten büyüğe sıralanmış bölenlerinin tam ortasına denk geliyor. Bunu daha da detaylandırmaya gerek olduğunu düşünmüyorum çünkü zaten karekökün kendisiyle çarpımı içerideki sayıya eşit olacak, böylece en ortada olması gayet doğal. Peki kodumuzda bunu nasıl kullandık? Eğer sayının kareköküne kadar olan bölenlerini bulursak, diğer bölenleri döngüye ihtiyaç olmadan bulabiliyoruz. Örneğin 24 sayısı için, kareköküne 4.89 dersek, ona en yakın iki böleni 4 ve 6'nın çarpımı 24 ediyor. Yani 4'ü bilirsek 24/4 yaparak 6'ya ulaşabiliyoruz.
Bölenler ->
Sayının karekökü ve bölenler ->
Yani sayının karekökünü bildiğimiz için büyük bir işlem yükünden kurtulmuş olduk, böylece kodumuzu optimize ettik. İlgilenen varsa aşağıya kendi çektiğim videoyu (İngilizce) bırakıyorum, oradan daha ayrıntılı izleyebilirsiniz. Forumda yazılım için matematik gereksiz düşüncesine sahip arkadaşlara ise bu rehberimsi yazıyı gönderebilirsiniz. Hepinize iyi sosyaller.
Mükemmel sayı, kendisi dışındaki bölenlerinin toplamı kendisine eşit olan sayılara denir. Örneğin 6 mükemmel sayıdır. 6'nın kendisi dışındaki bölenleri
{1, 2, 3}
'tür ve 1 + 2 + 3 yine 6'ya eşit olur.Python ile mükemmel sayı bulan bir program yazmaya kalktığımızda aklımıza ilk gelen şu tür bir kod olur:
Python:
def perfectNum(number):
Sum = 0
for i in range(1, number):
if number % i == 0:
Sum += i
if Sum == number:
return True
return False
lim = int(input("Enter the limit: "))
perfectNums = []
for j in range(1, lim):
if (perfectNum(j)):
perfectNums.append(j)
print(*perfectNums)
Kodu kısaca açıklamak gerekirse, 1'den sayının kendisine kadar olan tüm sayıları döngüye alıp tam bölenleri topluyor. Eğer toplam, sayının kendisine eşitse True döndürüyor. İlk bakışta gayet temiz ve optimal bir kod gibi gözükse de birazcık matematik yardımı ile bu kodu delicesine hızlandırabiliriz. Meraklısına, bu kodun Büyük O Notasyonu,
O[n]
olarak geçiyor. Yeni yazacağımız kod ise O[sqrt n]
.Önce optimize edilmiş yeni kodu göstereyim:
Python:
import math
def perfectNum(num):
Sum = 1
for i in range(2, math.ceil(num**0.5)):
if (num % i == 0):
Sum += i
Sum += num // i
return Sum == num and num != 1
lim = int(input("Enter The Max Limit: "))
perfectNums = []
for k in range(1, lim):
perfectNum(k)
if perfectNum(k) == True:
perfectNums.append(k)
print(*perfectNums)
Gördüğünüz üzere for döngüsünün sınırları 2 ve karekök(sayı) şeklinde değişti. Son yazdığımız kod 1000 sınır değeri için 6.6, 10000 sınır değeri için 36 kat daha hızlı çalışıyor!
Peki bahsettiğim matematiksel yardım ne alaka? Forumda Latex desteği olmadığı için biraz zor anlatacağım ama deneyeyim. Bir sayının karekökü, küçükten büyüğe sıralanmış bölenlerinin tam ortasına denk geliyor. Bunu daha da detaylandırmaya gerek olduğunu düşünmüyorum çünkü zaten karekökün kendisiyle çarpımı içerideki sayıya eşit olacak, böylece en ortada olması gayet doğal. Peki kodumuzda bunu nasıl kullandık? Eğer sayının kareköküne kadar olan bölenlerini bulursak, diğer bölenleri döngüye ihtiyaç olmadan bulabiliyoruz. Örneğin 24 sayısı için, kareköküne 4.89 dersek, ona en yakın iki böleni 4 ve 6'nın çarpımı 24 ediyor. Yani 4'ü bilirsek 24/4 yaparak 6'ya ulaşabiliyoruz.
Bölenler ->
Sayının karekökü ve bölenler ->
Yani sayının karekökünü bildiğimiz için büyük bir işlem yükünden kurtulmuş olduk, böylece kodumuzu optimize ettik. İlgilenen varsa aşağıya kendi çektiğim videoyu (İngilizce) bırakıyorum, oradan daha ayrıntılı izleyebilirsiniz. Forumda yazılım için matematik gereksiz düşüncesine sahip arkadaşlara ise bu rehberimsi yazıyı gönderebilirsiniz. Hepinize iyi sosyaller.
Son düzenleme: