Prime numbers whose neighboring pairs are tetraprimes

func display(arr, p, f, g, type, limit, display_primes) {

    var s = arr.map(f).grep{.is_prime}
    print "Found #{s.len.commify} primes under #{limit.commify} whose #{type} neighboring pair are tetraprimes"

    if (display_primes) {
        say ':'
        s.slices(10).each{.map { "%#{limit.len+1}s" % _ }.join.say }
    }

    with (p) {|p|
        var c = s.count {|a| is_div(g(a), p) || is_div(g(g(a)), p) }
        say "\nof which #{c.commify} have a neighboring pair one of whose factors is #{p}.\n"
    }

    var D = s.diffs

    func median(a) {
        var l = a.len
        var j = l>>1
        l.is_even ? ((a[j-1] + a[j]) >> 1) : a[j]
    }

    say("Minimum gap between those #{s.len.commify} primes: ", D.min)
    say("Median  gap between those #{s.len.commify} primes: ", median(D.sort))
    say("Maximum gap between those #{s.len.commify} primes: ", D.max)
    say ''
}

for limit in (1e5, 1e6, 1e7) {
    var arr = 4.squarefree_almost_primes(limit).cons(2).grep_2d{|a,b| b-a == 1 }
    display(arr, 7, {.last.inc},  {.dec}, "preceding", limit, limit <= 1e5)
    display(arr, 7, {.first.dec}, {.inc}, "following", limit, limit <= 1e5)
}

Output:

Last updated

Was this helpful?