UralPrimeSpiral

ウラムの螺旋のプログラム.

import java.awt.*;
import javax.swing.*;

public class UlamPrimeSpiral extends JFrame {
    final int size = 1001;
    final int max = size * size;

    Image image;
    boolean prime;
    int x, y;
    int move = {1,0,0,1,-1,0,0,-1};
    
    void sieve() {
        prime = new boolean[max + 1];
        prime[1] = false;
        for(int i = 2 ; i < max ; i++)
            prime[i] = (i == 2 || i % 2 != 0) ? true : false;
        for(int i = 3 ; i * i <= max ; i += 2)
            if(prime[i])
                for(int j = i ; i * j <= max ; j += 2)
                    prime[i * j] = false;
    }

    class ImageCanvas extends Canvas {
        public void paint(Graphics g){
            sieve();

            g.setColor(Color.WHITE);
            g.fillRect(0, 0, size, size);
            g.setColor(Color.RED);
            
            x = y = size / 2;
            int k = 0, num = 1;
            
            for(int step = 1 ; true ; step++, k = (k + 2) % 4) {
                for(int i = 0 ; i < 2 ; i++) {
                    for(int j = 0 ; j < step ; j++) {
                        if(prime[num++]) g.fillRect(x, y, 1, 1);
                        x += move[(i + k) * 2];
                        y += move[(i + k) * 2 + 1];
                        if(x >= size) return;
                    }
                }
            }
        }
    }
    
    UlamPrimeSpiral() {
        Canvas c = new ImageCanvas();
        getContentPane().add(c);
        
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setTitle("UlamPrimeSpiral");
        setVisible(true);
        setSize(size, size);
    }
    
    public static void main(String[] args) {
        new UlamPrimeSpiral();
    }
}