Здравейте, Вече публикувано е четъврто домашно. Срокът за неговото решение е 03.05.
Четвърто домашно
Да се имплементира генератор-функция primes, която итерира всички прости числа в нарастващ ред
Пример
p = semi_primes()
print(next(p)) # 2
2
print(next(p)) # 3
3
print(next(p)) # 5
5
print(next(p)) # 7
7
print(next(p)) # 11
11
print(next(p)) # 13
Не трябва ли да е p = primes() :?
Да, трябва да е primes() и semiprimes(). Виж теста:
"primes = solution.primes()" "semiprimes = solution.semiprimes()"
:)
import unittest import solution
class PrimesTest(unittest.TestCase): def test_first_few_primes(self): primes = solution.primes() self.assertEqual(2, next(primes)) self.assertEqual(3, next(primes)) self.assertEqual(5, next(primes)) self.assertEqual(7, next(primes)) self.assertEqual(11, next(primes)) self.assertEqual(13, next(primes))
def test_first_few_semi_primes(self): semiprimes = solution.semiprimes() self.assertEqual(4, next(semiprimes)) self.assertEqual(6, next(semiprimes)) self.assertEqual(9, next(semiprimes)) self.assertEqual(10, next(semiprimes)) self.assertEqual(14, next(semiprimes)) self.assertEqual(15, next(semiprimes))
if name == 'main': unittest.main()
Да, това го видях и аз, просто ги поправям за условието :)
Пуснах pull request в git за грешката в условието/в примера: semi_primes() -> primes()
В този ред на мисли: Очевидно се случва да допускаме грешки в условието или тестовете. Тези неща ги качваме тук: https://github.com/fmi/python-homework/tree/master/2012/04
Правите си регистрация, използвате бутончето "Edit this file", след което ни пишете тук, какво се оправили(както е направила Стела). Поощряваме подобна помощ.
Важно ли е времето за което ще генерираме числата да речем до 10 000 000? Тук вече става въпрос за някои доста интересни оптимизации, които да приложим ...
Предполага се че unit тестовете имат някакъв timeout, но вярвам, че ако не ги генерира за повече от 10 минути няма да има проблем.
А пък ти оптимизациите си ги направи и без това, така, за кеф. :P
10 минути за всички semiprimes до 10 000 000 ? Иска ми се да го видя :D
Хората с i7 да идват :D
semiprimes - трудно, но вярвам, че е постижимо. primes - за доста по-малко от 10 минути и то без големи усилия.
И все пак - 10 минути беше изстрел в мрака.
semiprimes - стана за 4 сек. :) над 10 000 000 Intel i5 :D
Pic or it didn't happen!
Редакция: http://oeis.org/A001358/b001358.txt
Намерих едно сайтче, на което има стабилно количество от semiprim-вете. Ако и вие, като мен, си мислите, че може да не ви работи съвсем както трябва втория генератор му хвърлете едно око. Има им номера и стойността, така че лесно се сравнява дали вашето n-то число е вярно ;)
На мен ми помогна да си открия грешка
:)
Прочети пак условието и разгледай материалите за генератори(евентуално в разбъркан ред)
def naturals(): # дефиниране на генератор функция number = 1 while True: yield number # магията става тук - това ще изплюе стойност и ще остане в готовност да продължи изпълнението от следващия ред number += 1
--- Example usage:
n = naturals() # инстанциране на генератор обект for a in range(100): print(next(n), end=', ') # next(n) връща изпълнението в генератор до получаване на стойност чрез ключовата дума yield
Редакция: Отказвам се. Днес не ми върви със стилизирането :)
Редакция 2: Оп, схванах го. Това е пример за простичък генератор и използването му. Този тук генерира естествени числа и колкото и пъти да викаш next(n) ще ти връща следващото естествено число(ако имаше безкрайни нерви и изчислителен ресурс).
Както и да е, разгледай материалите, особено ако не си присиствал на лекциите по темата. Още имаш време да направиш достатъчно читаво решение и за двете. Успех :)
Използвай генератори.
А ако искаш да видиш всички прости числа, използвай неограничени ресурси, безкрайно време, и си готов.
Е, срокът мина, интересно ми е какви алгоритми са ползвали другите?
Решенията са тук - http://fmi.py-bg.net/tasks/4/solutions
@Дейвид Представа си нямам как работи primecheck-a ти, но като го гледам ми хрумват оптимизации, за които вече е късно.
И все пак, semiprimes не ти ли работи само до 10000 ?
Прави комбинации от първите 10000 прости числа. (Всяко по всяко и ти вади сортиран списък с резултати) Но цялата бързина идва от оптимизацията на 1вата функция.
Изпускаш факта, че в момента, в който прехвърлиш 2 * 97 = 194 започваш да изпускаш полупрости и макар наистина да връщаш такива и то подредени изобщо не са коректни... Освен това така както си го написал си ограничен до 325 полупрости, които както вече споменах дори не са първите 325 такива ;)
Пето домашно? :)
Трябва да сте влезли в системата, за да може да отговаряте на теми.