square-full_numbers.sf 1008 B

1234567891011121314151617181920212223242526272829303132
  1. #!/usr/bin/ruby
  2. # Fast algorithm for generating all the square-full numbers <= n.
  3. # A positive integer n is square-full, if for every prime p that divides n, so does p^2.
  4. # These are numbers of the form: a^2 * b^3, for a,b >= 1.
  5. # See also:
  6. # The distribution of square-full integers, by H.-Q. Liu.
  7. # OEIS:
  8. # https://oeis.org/A001694 -- Powerful (square-full) numbers.
  9. # https://oeis.org/A118896 -- Number of powerful numbers <= 10^n.
  10. func squarefull_numbers(n) { # square-full numbers <= n
  11. var squarefull = []
  12. n.iroot(3).each_squarefree {|b|
  13. var t = b**3
  14. for a in (1 .. isqrt(idiv(n, t))) {
  15. squarefull << (t*a*a)
  16. }
  17. }
  18. return squarefull.sort
  19. }
  20. say squarefull_numbers(1e3)
  21. __END__
  22. [1, 4, 8, 9, 16, 25, 27, 32, 36, 49, 64, 72, 81, 100, 108, 121, 125, 128, 144, 169, 196, 200, 216, 225, 243, 256, 288, 289, 324, 343, 361, 392, 400, 432, 441, 484, 500, 512, 529, 576, 625, 648, 675, 676, 729, 784, 800, 841, 864, 900, 961, 968, 972, 1000]