77 lines
2.0 KiB
Java
77 lines
2.0 KiB
Java
import java.awt.Color;
|
|
import java.awt.Graphics;
|
|
import java.awt.image.BufferedImage;
|
|
import java.io.File;
|
|
import java.io.IOException;
|
|
import java.util.List;
|
|
|
|
import javax.imageio.ImageIO;
|
|
|
|
public final class GoldbachsComet {
|
|
|
|
public static void main(String[] aArgs) {
|
|
initialisePrimes(2_000_000);
|
|
|
|
System.out.println("The first 100 Goldbach numbers:");
|
|
for ( int n = 2; n < 102; n++ ) {
|
|
System.out.print(String.format("%3d%s", goldbachFunction(2 * n), ( n % 10 == 1 ? "\n" : "" )));
|
|
}
|
|
|
|
System.out.println();
|
|
System.out.println("The 1,000,000th Goldbach number = " + goldbachFunction(1_000_000));
|
|
|
|
createImage();
|
|
}
|
|
|
|
private static void createImage() {
|
|
final int width = 1040;
|
|
final int height = 860;
|
|
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
|
|
Graphics graphics = image.getGraphics();
|
|
graphics.setColor(Color.WHITE);
|
|
graphics.fillRect(0, 0, width, height);
|
|
|
|
List<Color> colours = List.of( Color.BLUE, Color.GREEN, Color.RED );
|
|
for ( int n = 2; n < 2002; n++ ) {
|
|
graphics.setColor(colours.get(n % 3));
|
|
graphics.fillOval(n / 2, height - 5 * goldbachFunction(2 * n), 10, 10);
|
|
}
|
|
|
|
try {
|
|
ImageIO.write(image, "png", new File("GoldbachsCometJava.png"));
|
|
} catch (IOException ioe) {
|
|
ioe.printStackTrace();
|
|
}
|
|
}
|
|
|
|
private static int goldbachFunction(int aNumber) {
|
|
if ( aNumber <= 2 || aNumber % 2 == 1 ) {
|
|
throw new AssertionError("Argument must be even and greater than 2: " + aNumber);
|
|
}
|
|
|
|
int result = 0;
|
|
for ( int i = 1; i <= aNumber / 2; i++ ) {
|
|
if ( primes[i] && primes[aNumber - i] ) {
|
|
result += 1;
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
|
|
private static void initialisePrimes(int aLimit) {
|
|
primes = new boolean[aLimit];
|
|
for ( int i = 2; i < aLimit; i++ ) {
|
|
primes[i] = true;
|
|
}
|
|
|
|
for ( int n = 2; n < Math.sqrt(aLimit); n++ ) {
|
|
for ( int k = n * n; k < aLimit; k += n ) {
|
|
primes[k] = false;
|
|
}
|
|
}
|
|
}
|
|
|
|
private static boolean[] primes;
|
|
|
|
}
|