#!/usr/bin/ruby
require('Imager');
var (n=512, start=1, file='ulam.png');
ARGV.getopt(
'n=i' => \n,
's=i' => \start,
'f=s' => \file,
);
func cell(n, x, y, start) {
y -= (n >> 1);
x -= (n-1 >> 1);
var l = 2*(x.abs > y.abs ? x.abs : y.abs);
var d = (y > x ? (l*3 + x + y) : (l - x - y));
(l-1)**2 + d + start - 1;
}
var black = %s'Imager::Color'.new('#000000');
var white = %s'Imager::Color'.new('#FFFFFF');
var img = %s'Imager'.new(xsize => n, ysize => n, channels => 1);
img.box(filled => 1, color => white);
for y=(^n), x=(^n) {
var v = cell(n, x, y, start);
if (v.is_prime) {
img.setpixel(x => x, y => y, color => black);
}
}
img.write(file => file);