Coprime triplets

func coprime_triplets(callback) {

    var (
        list = [1,2],
        a = 1,
        b = 2,
        k = 3,
        seen = Set()
    )

    loop {
        for (var n = k; true; ++n) {
            if (!seen.has(n) && is_coprime(n, a) && is_coprime(n, b)) {

                list << n
                seen << n

                callback(list) && return list

                (a, b) = (b, n)

                while (seen.has(k)) {
                    seen.remove(k++)
                }

                break
            }
        }
    }
}

say "Coprime triplets before first term is > 50:"
coprime_triplets({|list|
    list.tail >= 50
}).first(-1).slices(10).each { .«%« '%4d' -> join(' ').say }

say "\nLeast Coprime triplets that encompass 1 through 50:"
coprime_triplets({|list|
    list.sort.first(50) == @(1..50)
}).slices(10).each { .«%« '%4d' -> join(' ').say }

say "\n1001st through 1050th Coprime triplet:"
coprime_triplets({|list|
    list.len == 1050
}).last(50).slices(10).each { .«%« '%4d' -> join(' ').say }

Output:

Last updated

Was this helpful?