как упростить функцию фильтр

есть генератор простых чисел:

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
→ Ссылка