как упростить функцию фильтр
есть генератор простых чисел:
def prime_numbers_generator(n):
prime_numbers = []
for number in range(2, n + 1):
for prime in prime_numbers:
if not number % prime:
break
else:
prime_numbers.append(number)
yield number
for number in prime_numbers_generator(n=1000):
print(number)
и есть функция, которая выводит числа мерсенна
import math
from itertools import takewhile
def is_prime(n):
return not any(True for i in range(2, math.ceil(math.sqrt(n))) if n % i == 0)
def perfects ():
i = 2
while True:
mersenne = 2**i - 1
if is_prime(mersenne):
yield 2**(i-1)*mersenne
i += 1
if __name__ == '__main__':
limit = 10000
for i in takewhile(lambda n: n <= limit, perfects()):
print (i)
Подскажите, как можно упростить этот код и сделать одну короткую функцию фильтр, которая будет брать из генератора значения и если попадается число мерсенна, то выдается true?
Ответы (1 шт):
Автор решения: vp_arth
→ Ссылка
[x for x in prime_generator() if (x+1)&x == 0]
Число Мерсенна: x = 2**n - 1
Тогда x+1 = 2**n
x = 111...111
x+1 = 1000...000
(x+1)&x = 0000...000