Brilliant numbers

func is_briliant_number(n) {
    n.is_semiprime && (n.factor.map{.len}.uniq.len == 1)
}
 
func brilliant_numbers_count(n) {
 
    var count = 0
    var len = n.isqrt.len
 
    for k in (1 .. len-1) {
        var pi = prime_count(10**(k-1), 10**k - 1)
        count += binomial(pi, 2)+pi
    }
 
    var min = (10**(len - 1))
    var max = (10**len - 1)
 
    each_prime(min, max, {|p|
        count += prime_count(p, max `min` idiv(n, p))
    })
 
    return count
}
 
say "First 100 brilliant numbers:"
 
100.by(is_briliant_number).each_slice(10, {|*a|
    say a.map { '%4s' % _}.join(' ')
})
 
say ''
 
for n in (1 .. 12) {
    var v = (10**n .. Inf -> first_by(is_briliant_number))
    printf("First brilliant number >= 10^%d is %s", n, v)
    printf(" at position %s\n", brilliant_numbers_count(v))
}

Output:

Last updated

Was this helpful?