Matematik Alıştırmaları

​3.

1+3 > 3

Pozitif oldugunu varsayiyorum. Negatif sayilarin tamami zengin.

Kendisi hariç bölenleri :slight_smile:

Ay, dogru.

Genelde bolen olarak 1 kullanilmaz ya, ona takildi kafam.

Zaten bütün sayılar zengin olur o zaman

945?

def en_kucuk_zengin_sayi():
    s = 0
    while True:
        s += 1
        if (
                s % 2 != 0
                and 
                sum(filter(lambda i: s % i == 0, range(1, s))) > s 
        ):
            return s


print(en_kucuk_zengin_sayi())
2 Beğeni

Hocam merhaba. Yazdığınız programda and ifadesinde sum and s%2==0 şeklinde bir kontrol yapmışsınız. Bunu görünce aklıma gelen şey şu oldu. Hatırladığım kadarıyla, bazı programlama dillerinde eğer and koşulu yürütülüyorsa ilk olarak birinci koşula bakılır, eğer ilk koşul 0 döndürüyorsa ikinci koşul hiç çalıştırılmaz. Dolayısıyla ekstra bir hız sağlanmış olur. Çünkü biliyorsunuz and işlecinde 0, tüm koşulu 0 yapar. Bu yüzden and koşulunda göreceli olarak daha çok iş yapan ifade sağ tarafa koyulur. Örneğin a ve b işlemlerinden a daha çok zaman alan bir işlem yapıyorsa

if(b and a):
    ...

şeklinde yazılır. Böylece b koşulu 0 olarak dönerse a koşuluna bakılmaz. Sizin kodunuz hızlı çalışıyor, ama sum() fonksiyonu göreceli olarak bölme işleminden daha çok zaman harcıyor. Şu şekilde yazılınca küçük de olsa bir hız farkı görülebilir sanırım.

if (
    s % 2 != 0
    and
    sum(filter(lambda i: s % i == 0, range(1, s))) > s 
):

Tabi bu aklımda kalan bir konuydu. Sizin kodunuzda gördüğüm için dile getirmek istedim, yanlış anlamayın :slight_smile: Doğru olup olmadığı ile ilgili bir bilgisi olan varsa ve paylaşırsa memnun olurum :slight_smile:

Denemek için basit bir program yazdım.

import timeit


kod1="""
def get_list():
	list(range(10000))
	return 1

for i in range(1000):
	if(i%2 and get_list()):
		pass
"""

kod2="""
def get_list():
	list(range(10000))
	return 1

for i in range(1000):
	if(get_list() and i%2):
		pass
"""

print(timeit.timeit(kod1,number=10))
print(timeit.timeit(kod2,number=10))

Çıktı:

2.846628731999772
5.378357662999861

Yukarıdaki iki kod bloğu da aynı işi yapıyor. Tek fark if ifadesi içerisindeki ifadelerin yerlerinin değiştirilmiş olması. Görüldüğü gibi, zaman alan işlem sola koyulunca yarı yarıya daha çok zaman harcamış oluyor programımız.

4 Beğeni

Merhaba @coderistan kardeşim.

Doğru söylüyorsunuz. Dikkatiniz için teşekkür ederim. İlgili satırların yerlerini değiştirdim. :kissing_heart:

1 Beğeni

Bu tür sorular hoşunuza gidiyorsa elimde çok var.

Siz sorularınızı sorun lütfen, cevap vermek isteyecek birileri çıkar diye düşünüyorum. Hem bir sorudan (yukarıdaki soruda olduğu gibi) soruyla ilgisi olmayan yeni şeyler de öğrenebiliriz.

1 Beğeni

Ben de bir katkıda bulunayım.
s % 2 != 0
şeklinde kontrol etmek yerine
s = 1 den başlatıp s +=2 diye gitseniz?

2 Beğeni

O da olur. İlk iki kodun çalışma sürelerinin oranı aşağı yukarı ikiydi. Sizin önerdiğiniz kod ile @coderistan’ın önerdiği kod arasındaki çalışma süreleri oranı 1’e oldukça yakın. Ama sizin önerdiğiniz yaklaşıma göre işlem daha kısa sürede gerçekleşti.

1 Beğeni
>>> (lambda: next(i for i in __import__("itertools").count(1, 2) if sum(j for j in range(1, i) if not i%j) > i))()
945

generator’lardan da böyle değer döndürebiliyoruz :slight_smile:

1 Beğeni

Tekrar herkese merhaba,
Cevaplarınız için hepinize teşekkür ederim.
Bir süre forumdan uzak kaldım.
cevaplarınızı incelemek ve yeni şeyler öğrenmek oldukça faydalı oluyor.

Bu tür sorular hoşuma gidiyor, paylaşırsanız sevinirim…
@coderistan mesajınız için teşekür ederim, benim gibi acemi kullanıcılar için ufuk açıcı ve faydalı bir mesaj oldu.

1 Beğeni