Bir sayının en büyük asal bölenini bulan program yardım!

Merhabalar şu problemi çözmeye çalışıyorum https://projecteuler.net/problem=3

Şöyle bir kod yazdım ama 600851475143 değerini girince sonuç çıkmıyor daha doğrusu işlem çok fazla uzun sürüyor.İyileştirmeler yapmaya çalıştım ama değişen bişe olmadı.
Yardımcı olabilir misiniz.

def asalmidir(a):
    for i in range(2, a):
        if i > (a / 2):
            break
        elif a % i == 0:
            return False
    return True

saki = int(input("sayiyi giriniz :"))
s1 = 0

for i in range(2, saki + 1):
    if i < saki / 2 or i == saki:
        if saki / 2 != 0 and saki % i == 0 and asalmidir(i):
            s1 = i
print(s1)

işlemci, ram, hdd, ssd gibi bir çok faktöre bağlı olarak programın bunu hesaplama süresi uzun sürüyor. Aslında doğrusu şu bilgisayara öğretilen kadar sonuç bulursunuz. Windows’da hesap makinesini açtığınız zaman sonsuza kadar işlem yapamazsınız bir yerden sonra duracaktır. Bu da öyle bir şey. Maksimum hesaplayabildiği sayıdan daha yukarıda bir sayı çıkacaksa eğer bu işlemi belirli bir noktada sonlandırır.

Bu kodlarla hemen çözülüyor.
Uğraştıkça daha verimli yazmayı öğrenecem heralde.

def yontem(s1, ekle = 2):
    while ekle < s1:
        if s1 % ekle == 0 and s1 / ekle > 1:
            s1 = s1 / ekle
            ekle = 2
        else:
            ekle = ekle + 1
    return s1

print(yontem(600851475143))
3 Beğeni

Aslında ilk kodlarla da sonuç çıkar ama zaman alır. Muhtemelen birkaç dakika.

2 Beğeni

Asal sayıyı, sayının yarısına kadar değil kareköküne kadar kontrol edin. Programınız biraz daha hızlı hesaplayacaktır. Ben de bu şekilde çözmüştüm.

# coding:utf-8
# @coderistan
# asal bölenlerin en büyüğünü bulmak
from math import sqrt

def next_prime(max_number):
    for i in range(3,max_number):
        if(i%2==0):
            continue
        else:
            find=True
            for k in range(3,int(sqrt(i))):
                if(i%k==0):
                    find=False
                    break
            if(find):
                yield i

def hesapla(sayi):
    asal = next_prime(max_number=10000)
    result = 0
    siradaki_asal=2
    
    while(sayi>1):
        if(sayi%siradaki_asal==0):
            result = siradaki_asal if(siradaki_asal!=result and siradaki_asal>result) else result
            sayi=sayi/siradaki_asal
        else:
            siradaki_asal=next(asal)
    return result

print(hesapla(600851475143))