Dairesel Asalların Sayısı

197 sayısı dairesel asaldır. Çünkü (197 ,971,719) asal sayıdır.
Başka örnek olarak 2, 3, 5, 7, 11, 13, 17, 31, 37, 71, 73, 79, ve 97 verilebilir.
Soruda bir milyondan küçük kaçtane bu şartı sağlayan sayı var diyor?
Şimdi çözüm için bulduğum kodu paylaşıyorum.Benim sorum şu ben dairesel olma şartını sağlamak için biraz fazla döngü kurduğumu düşünüyorum verilen herhangi bir sayının dairesellerini bulmanın daha kolay yolu varmıdır?Örneğin 197 verildiğinde 971 ve 719 belirlemenin daha kolay yolu demek istiyorum.

import sympy
arananların_listesi=[]
for aranan in range(1,1000000):
    liste=list(str(aranan))
    istenen_döngüler = []
    for i in range(1,len(liste)+1):
        liste=liste+[liste[0]]
        liste.remove(liste[0])
        boş=''
        for i in liste:
            boş=boş+str(i)
        istenen_döngüler.append(int(boş))
    döngüdeki_asallar=[]
    for i in istenen_döngüler:
        if sympy.isprime(i)==True:
            döngüdeki_asallar.append(i)
        if len(döngüdeki_asallar)==len(istenen_döngüler):
            arananların_listesi.append(aranan)
len(arananların_listesi)

Asal sayıdır demek istediniz sanırım.

evet yanlış olmuş düzeltiyorum

Keşke dairesel sayıyı daha açıklayıcı anlatsaydınız. En baştaki rakamı en sona atarak ve bu işlem devam ettirilerek elde edilebilecek bütün sayılar asalsa bu sayılar dairesel asal sayıdır diyebilirdiniz. Ben başta yanlış anlamışım.

from sympy import sieve # önbelleğe alınmış asal sayıları tutan bir nesne

sınır = 1_000_000

sieve.extend(sınır) # 1_000_000'a kadar olan asalları belleğe alıyoruz, yani tek seferde üretmiş oluyoruz

sieve = set(sieve._list) # set'lerde "in" işleci listlere kıyasla çok hızlı çalışır, o yüzden set kullanacağız

dairesel_asallar = set() # add metodu kullanacağım için "set" lazım

def generate(number):
    number = list(str(number))
    for i in range(len(number)):
        yield "".join(number)
        number.append(number.pop(0))
    

for i in range(sınır):
    sayılar = generate(i)
    for sayı in sayılar:
        if int(sayı) not in sieve:
            break
    else:
        dairesel_asallar.add(i)
    
1 Beğeni

Örnekten anlaşılır gibi gelmişti ama sizin ifade ettiğiniz gibi daha anlaşılır olur ben sorunun orjinalinde ki gibi aktardım.
Teşekkürler gayet açık ve güzel çözüm :slight_smile:

1 Beğeni

Buna “cyclomatic complexity” diyoruz—icice gecen dongu sayisi.

Azaltmak ve yukaridaki kodu “kolaylastirmak” icin soyle bir sey tavsiye ediyorum: Kodun “amaci” ile “yaptigi” seyi biraz daha ayristirmak—tercihen fonksiyonlar ile.

Ornegin aranan 1 ile 1M arasinda donuyor, yani demek ki bir noktada asalligina bakilacak. Fakat butun kod bu 1~1M arasinda, yani arananin asallik kontrolu ile dairesel asallik kontrolleri birlesmis durumda. Su sekilde ayirsaydik:

asallar = 1_ile_1M_arasindaki_asallar()
for asal in asallar:
   ...

aranan’in asal kontrolu loop disina alinmis olurdu. Benzer sekilde, bir sayinin daire kardeslerini de bir fonksiyondan alsak:

asallar = 1_ile_1M_arasindaki_asallar()
for asal in asallar:
    dairesel_kardesler = dairesel_kardesleri_bul(asal)
    if all([asal_mi(kardes) for kardes in dairesel_kardesler]):
        print(asal, "ve kardesleri", dairesel_kardesler, "asal.")

Kod neredeyse kagida yazilmis algoritmaya benziyor, daha fazla nasil okunabilir olabilir bilmiyorum.

(all ve icindeki list comprehension dert olabilir—onu basitlestirmeyi, fonksiyonel olmayan/baslangic seviyesine daha yakin kodlara daha hakim insanlara birakiyorum.)

2 Beğeni

Çok doğru, sadece asal sayılara bakmak aklıma gelmemişti.