Eisenstein primes

class Eisenstein(a, b, w = (-1 + sqrt(3).i)/2) {
    method norm {
        a**2 - a*b + b**2
    }

    method to_s {
        sprintf('%+8.4f%+8.4fi', reals(a + b*w))
    }
}

var E = []

for e in (-10..10 ~X -10..10 -> map_2d {|x,y| Eisenstein(x,y) }) {
    var c = [e.a,e.b].map{.abs}.max
    if (
        ((0 ~~ [e.a, e.b]) || (e.a == e.b)) ?
        (c.is_congruent(2,3) && c.is_prime) : e.norm.is_prime
    ) {
        E << e
    }
}

E.sort_by { .norm }.first(100).slices(4).each {|s|
    say s.join('  ')
}

Output:

Last updated

Was this helpful?