func almost_primes(a, b, k) { a = max(2**k, a) var arr = [] func (m, lo, k) { var hi = idiv(b,m).iroot(k) if (k == 1) { lo = max(lo, idiv_ceil(a, m)) each_prime(lo, hi, {|p| arr << m*p }) return nil } each_prime(lo, hi, {|p| var t = m*p var u = idiv_ceil(a, t) var v = idiv(b, t) next if (u > v) __FUNC__(t, p, k-1) }) }(1, 2, k) return arr.sort } for k in (1..5) { var (x=10, lo=1, hi=2) var arr = [] loop { arr += almost_primes(lo, hi, k) break if (arr.len >= x) lo = hi+1 hi = 2*lo } say arr.first(x) }