2 added 1206 characters in body

# Python 3Python, 45 bytes

lambda n:-~n&n<all(n%i for i in range(2,n))<n


Try it online!

### How it works

The three terms of the chained comparison

-~n&n<all(n%i for i in range(2,n))<n


do the following:

• -~n&n computes the bitwise AND of n + 1 and n. Since n consists solely of 1 bits if it is a Mersenne number, the bitwise AND will return 0 if (and only if) this is the case.

• all(n%i for i in range(2,n)) returns True if and only if n mod i is non-zero for all values of i in [2, …, n - 1], i.e., if and only if n has no positive divisors apart from 1 and n.

In other words, all returns True if and only if n is a composite number, i.e., n is either 1 or a prime.

• n is self-explanatory.

The chained comparison returns True if and only if the individual comparisons do the same.

• Since all returns either True/1 or False/0, -~n&n<all(n%i for i in range(2,n)) can only return True if -~n&n yields 0 (i.e., if n is a Mersenne number) and all returns True (i.e., if n either 1 or a prime).

• The comparison all(n%i for i in range(2,n))<n holds whenever n > 1, but since all returns True if n = 1, it does not hold in this case.

# Python 3, 45 bytes

lambda n:-~n&n<all(n%i for i in range(2,n))<n


Try it online!

# Python, 45 bytes

lambda n:-~n&n<all(n%i for i in range(2,n))<n


Try it online!

### How it works

The three terms of the chained comparison

-~n&n<all(n%i for i in range(2,n))<n


do the following:

• -~n&n computes the bitwise AND of n + 1 and n. Since n consists solely of 1 bits if it is a Mersenne number, the bitwise AND will return 0 if (and only if) this is the case.

• all(n%i for i in range(2,n)) returns True if and only if n mod i is non-zero for all values of i in [2, …, n - 1], i.e., if and only if n has no positive divisors apart from 1 and n.

In other words, all returns True if and only if n is a composite number, i.e., n is either 1 or a prime.

• n is self-explanatory.

The chained comparison returns True if and only if the individual comparisons do the same.

• Since all returns either True/1 or False/0, -~n&n<all(n%i for i in range(2,n)) can only return True if -~n&n yields 0 (i.e., if n is a Mersenne number) and all returns True (i.e., if n either 1 or a prime).

• The comparison all(n%i for i in range(2,n))<n holds whenever n > 1, but since all returns True if n = 1, it does not hold in this case.

1

# Python 3, 45 bytes

lambda n:-~n&n<all(n%i for i in range(2,n))<n


Try it online!