smallest_number_with_exactly_n_divisors.sf 698 B

123456789101112131415161718192021222324252627282930313233
  1. #!/usr/bin/ruby
  2. #
  3. ## https://rosettacode.org/wiki/Sequence:_smallest_number_with_exactly_n_divisors
  4. #
  5. func n_divisors(threshold, least_solution = Inf, k = 1, max_a = Inf, solutions = 1, n = 1) {
  6. if (solutions == threshold) {
  7. return n
  8. }
  9. if (solutions > threshold) {
  10. return least_solution
  11. }
  12. var p = k.prime
  13. for a in (1 .. max_a) {
  14. n *= p
  15. break if (n > least_solution)
  16. least_solution = __FUNC__(threshold, least_solution, k+1, a, solutions * (a + 1), n)
  17. }
  18. return least_solution
  19. }
  20. assert_eq(gather {
  21. say (take(n_divisors(15)))
  22. say (take(n_divisors(60)))
  23. say (take(n_divisors(1000)))
  24. }, [144, 5040, 810810000])