kempner_binomial_numbers.sf 1.0 KB

1234567891011121314151617181920212223242526272829303132333435363738
  1. #!/usr/bin/ruby
  2. # Daniel "Trizen" Șuteu
  3. # Date: 08 January 2019
  4. # https://github.com/trizen
  5. # a(n) = smallest positive integer k such that n divides binomial(n+k, k).
  6. # Sequence inspired by the Kempner numbers:
  7. # https://oeis.org/A002034
  8. # https://en.wikipedia.org/wiki/Kempner_function
  9. # Identity for prime powers:
  10. # a(p^k) = p^k * (p^k - 1), for p^k a prime power.
  11. # Lower bound formula for a(n). Let:
  12. # f(n, p^k) = p^k * (p^k - n/p^k)
  13. # if n = p1^e1 * p2^e2 * ... * pu^eu,
  14. # then a(n) >= max( f(n,p1^e1), f(n,p2^e2), ..., f(n,pu^eu) ).
  15. func f(n) {
  16. (^Inf -> first_by {|k| n `divides` binomial(n+k, k) })
  17. }
  18. func g(n) { # g(n) <= f(n)
  19. n.factor_map{ |p,k|
  20. p**k * (p**k - n/(p**k))
  21. }.max
  22. }
  23. say 30.of { f(_+2) }
  24. say 30.of { g(_+2) }
  25. __END__
  26. f(n) = [2, 6, 12, 20, 3, 42, 56, 72, 15, 110, 6, 156, 35, 12, 240, 272, 63, 342, 12, 33, 99, 506, 40, 600, 143, 702, 21, 812, 24, 930]
  27. g(n) = [2, 6, 12, 20, 3, 42, 56, 72, 15, 110, 4, 156, 35, 10, 240, 272, 63, 342, 5, 28, 99, 506, 40, 600, 143, 702, 21, 812, -5, 930]