count_of_smooth_numbers_2.sf 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637
  1. #!/usr/bin/ruby
  2. # Count the number of B-smooth numbers <= n.
  3. func smooth_count(n, k) {
  4. var sum = n.ilog2+1
  5. if (k == 2) {
  6. return sum
  7. }
  8. for p in (primes(3,k)) {
  9. with (idiv(n,p)) {|t|
  10. sum += ((t <= p) ? t : __FUNC__(t,p))
  11. }
  12. }
  13. return sum
  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]