For döngüsü Asal sayı hesaplama

#ASAL SAYI HESAPLAMA

sayi = int(input("Sayı giriniz:"))
  
asaLMi = True   
for x in range(2,sayi):
    if (sayi % x) == 0:
        asaLMi = False
        break
    
if asaLMi:
    print("ASAL")
else:
    print("ASAL DEĞİL")


arkadaşlar burada 1 sayısı girildiğinde de Asal çıkıyor. Klavyeden 1 girildiğinde yeniden sayı giriniz deyip döngüyü nasıl kesebilirim.
1 Beğeni

Kodları kod etiketi içine alsanız?
```
Kodlarınız
```

Çentik işareti: alt gr + , (virgül)


sayi = int(input("Sayı giriniz:"))

if sayi==1:
    print('Yeniden sayı giriniz')
    quit()

asaLMi = True
for x in range(2, sayi):

    if sayi==1:
        print('başka sayı')

    if (sayi % x) == 0:
        asaLMi = False
        break

if asaLMi:
    print("ASAL")


else:
    print("ASAL DEĞİL")




Spyder 3.7 phyton kullanıyorum bu kodlarla 1 girdiğimde connecting kernel diyor.Olmuyor…

def asal_sayımı(param1):
    for i in range(2,param1):
        if param1%i == 0:
            return False
    return True               

try:
   sayı = int(input("Lütfen kontrol edilecek sayıyı girin:\t"))
except ValueError as hata:
    print("Sadece sayı girin",hata)
if asal_sayımı(sayı):
    print("Asal sayı")
else:
   print("Asal sayı değil")

Sayı eğer asal ise fonksiyon True değeri döndürür,değilse False değeri döndürür.girinti sayılarını forumda tam ayarlayamadım yalnız.

sayılar1 = range(0,21)

def asal_sayımı(param1):
    bolundu = False
    asal_sayı_liste = []
    for i in param1:
        bolundu = False
        for j in range(2,i):
            if i%j == 0:
                bolundu = True
        if bolundu == False:
            asal_sayı_liste.append(i)
    return asal_sayı_liste

print(asal_sayımı(sayılar1))

Burdaki fonksiyonda sayı aralığını parametre alıp bulunan asal sayıları listeye ekler

Böyle algoritma çalışmalarına bayılıyorum,bulmaca gibi. İzin verirseniz ben de daha önce uğraştığım çözümü gösterebilir miyim :wink:?

1 Beğeni

lambda ve liste üreteçleri çok iyi daha iyi yapmışsın :+1: lambda da ben for döngüsüne izin vermiyordu çözüm demek ki liste üreteçi imiş.Saolasın :+1:

1 Beğeni

asal_mi aslinda carpanlari bulup False'a ceviriyor. Isim itibariyle bool dondurmesi lazim, veya False'a cevirmeyi birakip ([i for i in ...]) “carpanlar” gibi bir isim de alabilir.

Sevgili Levent;
Yazmış olduğunuz algoritma “bölme algoritması” olarak biliniyor. Bu tip algoritmalarda bölen döngüsüne çift sayı ile başlamamalı, çünkü 2 hariç asalların hepsi tek sayıdır. Tek sayıların çiftsayı böleni yoktur, bu nedenle döngüye 3 ile başlayıp ikişer ikişer gitmeli. Ayrıca bölen üst sınırı karekök(sayı) olarak belirlenmeli. Böylelikle işlem sayısı epey azalacaktır.
Yazdığınız algoda 1%2 nin 1 vermesi normal, çünkü modüler aritmetikte 1 mod 2=1 dir. 1 sayısı diğer bölenler için de aynı 1 sonucunu verir, kalanı “0” yapacak bir bölen bulunmadığı için de algoritma sayıyı “asal” olarak değerlendirir. Halbuki 1 sayısı asal olarak kabul edilmiyor. Bu durumda algoya girerken ya 1 girmeyeceğiz ya da 1 girilirse “asal değil” sonucunu döndüren bir satır ekleyeceğiz. Eğer sayı olarak 15-20 veya daha fazla haneli sayılarla uğraşmak isterseniz “%” yerine “divmod” ifadesi daha uygun olabilir. Böyle sayılarla uğraşırkrn işlem sayısını ve de işlem süresini azaltmak için, ilkokulda öğrenmediğimiz daha değişik çarpma ve bölme algoritmalrı kullanılır. Bir çeşitleme olması bakımından, benim yazdığım “ortak bölen” algoritmasını da deneyebilirsiniz, çarpanları bulmaya yarıyor. Bu algoritmada fractions import edilip “gcd” deyimi kullanılıyor. Eski istihza forumunda yazmıştım, buraya eski yazılar aktarıldı mı bilmiyorum.
Sadece ufuk açıcı olması bakımından söylemek durumundayım: Sayıların asal olup olmadığının anlaşılması ve bununla bağlantılı olarak çarpanlara ayrılması (özellikle büyük sayıların) kriptolojinin ana konularından biridir. internette çok sayıda asal sayı test ve çarpanlara ayırma algortitması var. Hele “Miller-Rabin” denen bir test algosu var ki, birkaç satır ama müthiş. Fikir vermesi açısından incelemek yararlı olur diye düşünüyorum.

Tam olarak bu yuzden bolen dongusune cift sayi (2) ile baslamak lazim. Asal olmayan sayilarin cogunlugunu tek seferde eleyen, en etkin bolunme testi %2.

2’den baska cift sayiya bolunmeyi test etmeye gerek yok ama; sanirim bunu demek istediniz.

Sayın aib,
Özür dilerim, herhalde net olarak ifade edemedim, şunu söylemek istemiştim:
Elimizde bir grup sayı var. Bunların yarısı (1 eksik veya 1 fazla) çift sayıdır, diğerleri tek sayıdır. Bu sayıların tamamını bir döngü içinde tek tek ele alıyoruz ve ele aldığımız sayıların yarısının çift sayı olacağını yani 2 ye bölüneceklerini ve asal olmadıklarını en başta zaten biliyoruz. Dolayısıyla bunları elemek için 2 ye bölmeye gerek yok, zaten bölünürler. O halde, sayıları ele alırken döngüye tek sayı ile başlanır ve ikişer ikişer gidilirse, ele aldığımız sayıların tamamı tek sayı olacaktır. Yani çift sayılar baştan elenmiş olacak ve onları elemek için ayrı bir bölme işlemine gerek duyulmayacaktır. Bu, arzu edilen bir durumdur çünkü zaten bölme algoritmasında özellikle büyük sayılar ele alındığında işlem sayısı çok fazla olabilir. Çift sayıların hiç hesaba katılmaması, yapılan işlem sayısını yarıya indirecektir.
Aynı durum, bölen döngüsü için de söz konusudur. Ele aldığımız tek sayıların 2 ye ve katlarına, yani tüm çift sayılara bölünmeyeceklerini zaten en baştan biliyoruz. O halde bunları bölen olarak kullanan bölme işlemlerine gerek yoktur. Dolayısıyla, bölen döngüsüne de tek sayı ile başlayıp ikişer ikişer gitmek, bize sadece tek sayı bölenleri verecek ve bölme işlem sayısı azalacaktır.
Böyle bir algoritmada, çift sayıları hesaba katan bir algoritmanın 4 te biri kadar bölme işlemi vardır.
Ayrıca, tekraren arzetmek isterim ki, bölme algoritmalarında mutlaka sayının karekökü alınmalı ve bölen döngüsünde üst sınır olarak kullanılmalıdır. Çünkü matematiksel açıdan, bir sayının en küçük asal böleni karekökten küçüktür. Eğer karekök alındığında değer tamsayı (integer-int) çıkarsa zaten bingo! Sayı tam karedir, asal değildir ve çarpanlar bulunmuştur. Değilse bölme algosuna girilir, kareköke kadar tek sayı bölenler denenir, kalanı “0” yapan bir bölen bulunamadıysa sayımız asaldır.
Asal sayı (ve dolayısıyla çarpanlara ayırma) konusunda söylenecek çok şey var. Yazıyı uzatarak konuyu dağıtmak istemem ama son bir not:
Asal olmayan sayılar, asalların çarpımından türemişlerdir. Dolayısıyla, bir sayının bölenlerini araştırırken bütün teksayıları bölen olarak ele almaya gerek yoktur. Sadece kareköke kadar asalların denenmesi yeterlidir ama bu durum, önceden hazırlanmış bir “asallar dosyası” nın varlığını gerektirir. Sonsuz adet asal vardır, ve tüm asalları kapsayan bir dosya hazırlamak ve dahi kaydetmek mümkün değildir ama yine de kendimizin belirleyeceği bir sayıya kadar bunun yapılması mümkündür. Bendeki asal dosyası 105997 asalına kadar, 10106 satır, yaklaşık 60Kb. Asal sayı test algolarında işime yarıyor ve zaman kazandırıyor.
Başınızı ağrıttıysam tekrar özür dilerim.