count_of_smooth_numbers.sf 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637
  1. #!/usr/bin/ruby
  2. # Daniel "Trizen" Șuteu
  3. # Date: 19 May 2020
  4. # https://github.com/trizen
  5. # Count the number of B-smooth numbers <= n.
  6. func smooth_count(n, p) {
  7. if (p == 2) {
  8. return 1+n.ilog2
  9. }
  10. var q = p.prev_prime
  11. 0..n.ilog(p) -> sum {|k|
  12. __FUNC__(idiv(n, p**k), q)
  13. }
  14. }
  15. for p in (primes(15)) {
  16. var arr = 10.range.map {|n| smooth_count(10**n, p) }
  17. assert_eq(arr, 10.range.map {|n| p.smooth_count(10**n) })
  18. say ("Ψ(10^n, #{p}) for n < 10: ", arr)
  19. }
  20. __END__
  21. Ψ(10^n, 2) for n < 10: [1, 4, 7, 10, 14, 17, 20, 24, 27, 30]
  22. Ψ(10^n, 3) for n < 10: [1, 7, 20, 40, 67, 101, 142, 190, 244, 306]
  23. Ψ(10^n, 5) for n < 10: [1, 9, 34, 86, 175, 313, 507, 768, 1105, 1530]
  24. Ψ(10^n, 7) for n < 10: [1, 10, 46, 141, 338, 694, 1273, 2155, 3427, 5194]
  25. Ψ(10^n, 11) for n < 10: [1, 10, 55, 192, 522, 1197, 2432, 4520, 7838, 12867]
  26. Ψ(10^n, 13) for n < 10: [1, 10, 62, 242, 733, 1848, 4106, 8289, 15519, 27365]
  27. Ψ(10^n, 17) for n < 10: [1, 10, 67, 287, 945, 2579, 6179, 13389, 26809, 50351]
  28. Ψ(10^n, 19) for n < 10: [1, 10, 72, 331, 1169, 3419, 8751, 20198, 42950, 85411]