ONLY DO WHAT ONLY YOU CAN DO

こけたら立ちなはれ 立ったら歩きなはれ

Scala で Project Euler Problem 21

scala> def get_prime_factor(map:collection.mutable.Map[Long, Long], n: Long, factor: Long = 2) {
     |     if  (n  >= factor) {
     |         if (n % factor != 0 )
     |             get_prime_factor(map, n, factor + 1)
     |         else {
     |             if (map.contains(factor))
     |                 map(factor) += 1
     |             else
     |                 map += factor -> 1
     |
     |             get_prime_factor(map, n / factor, factor)
     |         }
     |     }
     | }
get_prime_factor: (map: scala.collection.mutable.Map[Long,Long], n: Long, factor: Long)Unit

scala> val map = collection.mutable.Map[Long, Long] ()
map: scala.collection.mutable.Map[Long,Long] = Map()

scala> get_prime_factor(map, 28)

scala> map
res1: scala.collection.mutable.Map[Long,Long] = Map(7 -> 1, 2 -> 2)
scala> map.transform((k,v) => (math.pow(k, v + 1) - 1).toLong / (k - 1))
res2: map.type = Map(7 -> 8, 2 -> 7)

scala> map.values
res3: Iterable[Long] = HashMap(8, 7)

scala> map.values.reduceLeft(_*_)
res4: Long = 56
scala> def sum_of_proper_divisors(n:Long):Long = {
     |     var map = collection.mutable.Map[Long, Long] ()
     |     get_prime_factor(map, n)
     |     if (map.size == 0) 0
     |     else {
     |         map.transform((k,v) => (math.pow(k, v + 1) - 1).toLong / (k - 1))
     |         map.values.reduceLeft(_*_) - n
     |     }
     | }
sum_of_proper_divisors: (n: Long)Long
scala> sum_of_proper_divisors(220)
res5: Long = 284

scala> sum_of_proper_divisors(284)
res6: Long = 220
scala> var ami_list:List[Long] = List()
ami_list: List[Long] = List()

scala> for (i <- 1 to 10000) {
     |     val n = sum_of_proper_divisors(i)
     |     if (i != n) {
     |         val m = sum_of_proper_divisors(n)
     |         if (i == m) ami_list = n::ami_list
     |     }
     | }

scala> ami_list
res8: List[Long] = List(6232, 6368, 5020, 5564, 2620, 2924, 1184, 1210, 220, 284)

scala> ami_list.sum
res9: Long = 31626