Euler 012 ruby Solution

Highly divisible triangular number

Problem

https://projecteuler.net/problem=12

The sequence of triangle numbers is generated by adding the natural numbers. So the 7th triangle number would be

\[1 + 2 + 3 + 4 + 5 + 6 + 7 = 28\]

The first ten terms would be:

\[1, 3, 6, 10, 15, 21, 28, 36, 45, 55, ...\]

Let us list the factors of the first seven triangle numbers:

1: 1
3: 1,3
6: 1,2,3,6
10: 1,2,5,10
15: 1,3,5,15
21: 1,3,7,21
28: 1,2,4,7,14,28

We can see that 28 is the first triangle number to have over five divisors.

What is the value of the first triangle number to have over five hundred divisors?

Answer: 76576500

Solution

  1. divisors.rb
# /lib/core_extensions/integer/divisors.rb
require 'prime'

# Divisor extension for Integer
module Divisors
  def divisor_count
    sum = 1
    # see https://en.wikipedia.org/wiki/Divisor_function
    prime_division.each do |x|
      sum *= (x[1] + 1)
    end
    sum
  end
end

# Integer mixin
class Integer
  include Divisors
end
  1. euler012.rb
#!/usr/bin/env ruby
require 'core_extensions/integer/divisors'

# @see http://en.wikipedia.org/wiki/Triangular_number
def triangle(num)
  return 3 if num == 1
  ((num + 1) * num) / 2
end

def highest_divisible_triangular_number(stop)
  i = 1
  i += 1 while triangle(i).divisor_count < stop
  triangle(i)
end

puts highest_divisible_triangular_number(500) if __FILE__ == $PROGRAM_NAME

See Also