I saw an interesting challenge on SoloLearn about writing code to find all the Mersenne primes up to a number. I started by writing a function to test to see if the given number was a prime.

function returns True or False

"""

def primeTest(input):

factorList = []

for x in range (1,input+1):

if input % x == 0:

factorList.append(x)

if len(factorList)== 2:

return True

else:

return False

It is not perhaps the most elegant solution, but it appears to be fully functional.

I then moved on, using my function above to test to see if a given input was a Mersenne Prime.

If it is a prime the number is tested to see if it is a mersenne prime.

Function returns True or False

"""

def mersennePrimeTest(input):

if primeTest(input) == False:

return False

else:

powerOfTwo = input + 1

index = log(powerOfTwo,2)

if index % 1 == 0:

return True

else:

return False

I then put these together and produced this code to test all the numbers between 1 and 10000 to see if they were Mersenne Primes.

to see if they are a Mersenne prime

Function returns a list of Mersenne primes.

"""

def findAllMersennePrimesUpto(max):

primeList = []

for x in range(1,max+1):

if mersennePrimeTest(x)== True:

primeList.append(x)

print(primeList)

The above code works, but it not particularly efficient and it is doing a lot of work that is redundant. I decided to change my approach and to check all the 2^{n}-1 which were below the value of max.

"""

def findMersennePrimes(max):

maxIndex = int(log(max,2))

workingnumber = 1

primeList = []

for x in range (maxIndex):

workingnumber = workingnumber * 2

if primeTest(workingnumber-1) == True:

primeList.append(workingnumber-1)

print(primeList)

I found that this version was much faster.