37 lines
795 B
Text
37 lines
795 B
Text
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))
|
|
}
|