23 lines
663 B
Ruby
23 lines
663 B
Ruby
require 'prime'
|
|
|
|
def achilles?(n)
|
|
exponents = n.prime_division.map(&:last)
|
|
exponents.none?(1) && exponents.inject(&:gcd) == 1
|
|
end
|
|
|
|
def 𝜑(n)
|
|
n.prime_division.inject(1){|res, (pr, exp)| res * (pr-1) * pr**(exp-1) }
|
|
end
|
|
|
|
achilleses = (2..).lazy.select{|n| achilles?(n) }
|
|
|
|
n = 50
|
|
puts "First #{n} Achilles numbers:"
|
|
achilleses.first(n).each_slice(10){|s| puts "%9d"*s.size % s}
|
|
|
|
puts "\nFirst #{n} strong Achilles numbers:"
|
|
achilleses.select{|ach| achilles?(𝜑(ach)) }.first(n).each_slice(10){|s| puts "%9d"*s.size % s }
|
|
|
|
puts
|
|
counts = achilleses.take_while{|ach| ach < 1000000}.map{|a| a.digits.size }.tally
|
|
counts.each{|k, v| puts "#{k} digits: #{v}" }
|