#!/usr/bin/ruby

func binprime(p) {
    p >= 2 || return false;
    range(1, p>>1).each { |i|
        (binomial(p, i) % p) && return false;
    };
    return true;
}

func coef(n, e) {
    (e == 0) && return "#{n}";
    (n == 1) && (n = "");
    (e == 1) ? "#{n}x" : "#{n}x^#{e}";
}

func binpoly(p) {
    join(" ", coef(1, p), p.range.reverse.map {|i|
        join(" ", %w(+ -)[(p-i)&1], coef(binomial(p, i), i));
    }...);
}

say "expansions of (x-1)^p:";
10.range.each { |i| say binpoly(i) };
say "Primes to 80: [#{(2..80).grep { binprime(_) }}]";