>>138344
>Python ma wbudowany operator na potęgowanie jak wklepiesz x**y to Ci wyskoczy x do y.
dzięki za przypomnienie, chociaż z tego co kojarzę to po prostu skrót do 'pow()'
U mnie też działa po przerobieniu na iterację
class p46():
def oblicz(self, n, prime):
kw2x = lambda x : 2*pow(x,2)
x = 1
wynik = 0
while wynik <= n:
wynik = prime + kw2x(x)
if wynik == n: return [prime, x]
elif wynik > n:
try: prev_prime = sympy.prevprime(prime)
except ValueError as e:
if e.__str__()=='no preceding primes': return []
return self.oblicz(n, prev_prime)
x+=1
def start(self):
t1 = time()
n = 2
while True:
if not sympy.primetest.isprime(n) and n % 2 != 0:
wynik = self.oblicz(n, sympy.prevprime(n))
if not wynik:
print('Liczby nie można przedstawić jako sumy liczby pierwszej i dwukrotności kwadratu: ' + str(n))
print('Ukończono w: {} s'.format(round(time()-t1, 6)))
return
# else: print('{} = {} + 2* {}^2'.format(str(n), str(wynik[0]) , str(wynik[1])))
n+=1
Twój kod działa szybciej
λ pyth euler_anon.py
Solution is: 5777. Time: 0.156236 s
>>> p46.start()
Liczby nie można przedstawić jako sumy liczby pierwszej i dwukrotności kwadratu: 5777
Ukończono w: 0.765576 s
Ja nastawiłem się na jakąś ogromną liczbę jak w poprzednim zadaniu i w takim przypadku generowanie, sortowanie i przeszukiwanie całej listy liczb pierwszych byłoby kosztowne. Wystarczy zmienić w twoim kodzie na (10**6) i rozwiązanie zajmuje 8.3 s.
Dobry tred.
Jakby spadał to fajnie by było przenieść na /id.