Problem 46: Goldbach's Other Conjecture
9 = 7 + 2 x 12
15 = 7 + 2 x 22
21 = 3 + 2 x 32
25 = 7 + 2 x 32
27 = 19 + 2 x 22
33 = 31 + 2 x 12
It turns out that the conjecture was false. What is the smallest odd composite that cannot be written as the sum of a prime and twice a square?
The Catch
How to tell when an odd composite number cannot be written as the sum of a prime and twice a square.
The Light
To prove Goldbach wrong, we have to find the first instance where an odd number cannot be written as the sum of a prime and twice a square. The algorithm to check whether an odd number satisfies the above condition is fairly simple: for every odd number n, start substracting prime numbers p from a list of prime numbers, one at a time (p ≤ n). If the difference is not twice a square, the corresponding number n will be the first instance to disprove Goldbach's other conjecture. In order to implement this algorithm, we need to:
- Provide a list of prime numbers. This can be done using the Sieve of Eratosthenes discussed in Problem 35.
- Check whether a quantity x is twice a square. Utilize the discussion of inverse functions in Problem 42, x is twice a square if sqrt(x/2) is an integer.
The Code
import java.util.*;
public class Problem46
{
public static void main(String[] args)
{
List primeList = new ArrayList();
primeList = generatePrimes(10000);
for(double i = 33.0;; i += 2.0)
{
boolean flag = false;
for(int index = 0; primeList.get(index) <= i; index++)
{
if(isTwiceASquare(i - primeList.get(index)))
{
flag = true;
break;
}
}
if(!flag)
{
System.out.println(i);
break;
}
}
}
public static boolean isTwiceASquare(double n)
{
double square = Math.sqrt(n/2.0);
return square == (int)square;
}
public static List generatePrimes(int max)
{
boolean[] isComposite = new boolean[max + 1];
for (int i = 2; i * i <= max; i++)
{
if (!isComposite [i])
for (int j = i; i * j <= max; j++)
{
isComposite [i*j] = true;
}
}
ArrayList list = new ArrayList();
for (int i = 2; i <= max; i++)
{
if (!isComposite [i])
list.add(new Integer(i));
}
return list;
}
}