I have since developed an algorithm which is faster than GIMPS, please see below for the (Java) code:- import java.math.BigInteger; public class Mersenne7 { static BigInteger zero = new BigInteger("0"); static BigInteger one = new BigInteger("1"); static BigInteger two = new BigInteger("2"); static BigInteger three = new BigInteger("3"); public static void main (String args[]) throws java.io.IOException { String sInput; char c; while (true) { StringBuffer sbInput = new StringBuffer(); while (Character.isDigit(c=(char)System.in.read())) sbInput.append(c); while (c!='\n') c=(char)System.in.read(); sInput=sbInput.toString(); BigInteger n = new BigInteger(sInput); BigInteger m = new BigInteger("0"); while (true) { if (isprime(n)) { System.out.print(n.toString() + '\r'); m = mersenne(n); if (isprime(m)) System.out.println(n.toString()); } n = n.add(one); } } } static BigInteger mersenne(BigInteger n) { BigInteger mersenne = new BigInteger("1"); BigInteger i = new BigInteger("0"); while (i.compareTo(n) < 0) { mersenne = mersenne.multiply(two); i = i.add(one); } mersenne = mersenne.subtract(one); return mersenne; } static boolean isprime(BigInteger n) { boolean prime = true; BigInteger wanless = new BigInteger("2"); // workaround - apparent java bug in modPow - JGW if (n.compareTo(one) == 0) return false; if (n.compareTo(two) == 0) return true; if (n.remainder(two).compareTo(zero) == 0) return false; // end workaround while (wanless.compareTo(n) < 0) wanless = wanless.multiply(two); if (three.modPow(n.multiply(wanless), n).compareTo(three.modPow(wanless, n)) == 0) prime = true; else prime = false; return prime; } }