Primes which contain only one odd digit
func primes_with_one_odd_digit(upto, base = 10) {
upto = prev_prime(upto+1)
var list = []
var digits = @(^base)
var even_digits = digits.grep { .is_even }
var odd_digits = digits.grep { .is_odd && .is_coprime(base) }
list << digits.grep { .is_odd && .is_prime && !.is_coprime(base) }...
for k in (0 .. upto.ilog(base)) {
even_digits.variations_with_repetition(k, {|*a|
next if (a.last == 0)
var v = a.digits2num(base)
odd_digits.each {|d|
var n = (v*base + d)
list << n if (n.is_prime && (n <= upto))
}
})
}
list.sort
}
with (1e3) {|n|
var list = primes_with_one_odd_digit(n)
say "There are #{list.len} primes under #{n.commify} which contain only one odd digit:"
list.each_slice(9, {|*a| say a.map { '%3s' % _ }.join(' ') })
}
say ''
for k in (1..8) {
var count = primes_with_one_odd_digit(10**k).len
say "There are #{'%6s' % count.commify} such primes <= 10^#{k}"
}Output:
Last updated
Was this helpful?