Substring primes

Generic solution for any base >= 2.

func split_at_indices(array, indices) {
 
    var parts = []
    var i = 0
 
    for j in (indices) {
        parts << [array[i..j]]
        i = j+1
    }
 
    parts
}
 
func consecutive_partitions(array, callback) {
    for k in (0..array.len) {
        combinations(array.len, k, {|*indices|
            var t = split_at_indices(array, indices)
            if (t.sum_by{.len} == array.len) {
                callback(t)
            }
        })
    }
}
 
func is_substring_prime(digits, base) {
 
    for k in (^digits) {
        digits.first(k+1).digits2num(base).is_prime || return false
    }
 
    consecutive_partitions(digits, {|part|
        part.all { .digits2num(base).is_prime } || return false
    })
 
    return true
}
 
func generate_from_prefix(p, base, digits) {
 
    var seq = [p]
 
    for d in (digits) {
        var t = [d, p...]
        if (is_prime(t.digits2num(base)) && is_substring_prime(t, base)) {
            seq << __FUNC__(t, base, digits)...
        }
    }
 
    return seq
}
 
func substring_primes(base) {     # finite sequence for each base >= 2
 
    var prime_digits = (base-1 -> primes)   # prime digits < base
 
    prime_digits.map  {|p| generate_from_prefix([p], base, prime_digits)... }\
                .map  {|t| digits2num(t, base) }\
                .sort
}
 
for base in (2..20) {
    say "base = #{base}: #{substring_primes(base)}"
}

Output:

Last updated

Was this helpful?