generate_primes_with_a_given_digit_sum.sf 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. #!/usr/bin/ruby
  2. # Daniel "Trizen" Șuteu
  3. # Date: 06 July 2021
  4. # https://github.com/trizen
  5. # Generate prime numbers that have a given digit sum (in a given base) below a given bound.
  6. # See also:
  7. # https://oeis.org/A106763 -- Primes with digit sum = 25.
  8. # https://rosettacode.org/wiki/Primes_which_sum_of_digits_is_25
  9. func generate_from_prefix(limit, digitsum, p, base, digits, t=p) {
  10. var seq = [p]
  11. digits.each {|d|
  12. var num = (p*base + d)
  13. num <= limit || return seq
  14. var sum = (t + d)
  15. sum <= digitsum || return seq
  16. seq << __FUNC__(limit, digitsum, num, base, digits, sum)\
  17. .grep { .is_prime }...
  18. }
  19. return seq
  20. }
  21. func primes_with_digit_sum(limit, digitsum = 25, base = 10, digits = @(^base)) {
  22. digits.grep { _ > 0 }\
  23. .map { generate_from_prefix(limit, digitsum, _, base, digits)... }\
  24. .grep { .sumdigits(base) == digitsum }\
  25. .sort
  26. }
  27. say primes_with_digit_sum(5000)
  28. __END__
  29. [997, 1699, 1789, 1879, 1987, 2689, 2797, 2887, 3499, 3697, 3769, 3877, 3967, 4597, 4759, 4957, 4993]