Python'da Çarpanlara Ayırma

Merhabalar sevgili abilerim ve kardeşlerim,
Ben girilen bir sayının çarpanlarını bulan bir program yaparken bir sorunla karşılaştım,
kodlarım şöyle:

print("ÇARPANLARA AYIRMA")

while True:
    try:
        sayi = int(input("Sayınızı giriniz :"))
    except ValueError:
        print("Yanlış tuşladınız !!!")
    else:
        break
anahtar = 1
while anahtar <= int(sayi):
    if sayi % anahtar == 0:
        sonuc = int(sayi) / anahtar
        print(anahtar, int(sonuc), sep=",")
    anahtar += 1
input()

buradaki sorunum küçük bir sayı girdiğimde hemen bulabiliyor fakat yüksek bir sayı girdiğimde anahtar değişkeni tek tek yükseldiği için süre uzuyor,bu süreyi kısaltmak için ne yapabilirim.
Şimdiden cevaplarınız için teşekkür ederim :slightly_smiling_face::slightly_smiling_face:

Mesela aşağıdaki kodlar aşağı yukarı 5 saniyede 30000000 sayısını çarpanlarına ayırıyor. Sizin yazdığınız kodlara göre ise işlem aşağı yukarı 12 saniye sürüyor.

f = lambda x: map(lambda j: f"{j}, {x / j}", \
    filter(lambda i: x % i == 0, range(1, x + 1, 1)))

for i in f(30000000):
    print(i)
1 Beğeni

Aslında çarpanlara ayırma işlemi aşağıdaki kodlarla daha kısa sürer:

def f(n):
    carpanlar = []
    for i in range(1, n + 1, 1):
        if divmod(n, i)[1] == 0:
            x = [i, divmod(n, i)[0]]
            if list(reversed(x)) not in carpanlar:
                carpanlar.append(x)
            else:
                break
    for i in reversed(carpanlar):
        if list(reversed(i)) not in carpanlar:
            carpanlar.append(list(reversed(i)))
    return carpanlar
            

for i in f(30000000):
    print(*i, sep=", ")  

Yukarıdaki kodlara göre çarpanlara ayırma işleminin gerçekleşme süresi 0.002260446548461914 saniye olmuştur. Yani işlem 5 saniyeden 0.002260446548461914 saniyeye düştü.

Yukarıdaki kodları şu şekilde kısaca açıklayabilirim:
10 sayısının çarpanları aşağıdaki gibidir:

1, 10
2, 5
5, 2
10, 1

Şimdi yukarıda görüldüğü gibi bölenler bir yerden sonra bölüm olmaya başlayacak. Bölenin, bölüm olmaya başladığı yerde for döngüsü durdurulur. Sonra carpanlar listesine reversed(carpanlar) listesinin elemanları ters bir şekilde eklenir. Böylece çok kısa sürelerde çok büyük sayılar çarpanlarına ayrılabilir.

3 Beğeni

Sayinin asal carpanlarini bulup, carpanlari bunlardan uretebilirsin. Cunku:

  1. 2 disinda cift asal carpan yok
  2. Asal carpanlar en fazla sayinin karekoku buyuklugunde (veya sayiya esit)

Ilki 2 kat, ikincisi de Turkce bir cumleyle anlatilamayacak kadar (O(n) → O(√n)) hizlandirir.

1 Beğeni

Cevabınız için çok teşekkür ederim sanırım return ve def fonksiyonlar bölümünde daha oraya gelemedim maruz görün.:grin::smile:

Cevabınız için çok teşekkür ederim.:slightly_smiling_face:

Yanlış anlamayın ama, mazur olacaktı. :innocent:

Estağfirullah hocam. Bakalım sizden daha neler öğreneceğim.:grin::grin: