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?