baalazamon baalazamon - 11 days ago 9
Scala Question

FP LCM in scala in 1 line

I am trying to implement LCM in one line in Scala.

This is how I've implemented it with 2 functions:

def gcd(a: BigInt, b: BigInt):BigInt=if (b==0) a.abs else gcd(b, a%b)
def lcm(list: Seq[BigInt]):BigInt=list.foldLeft(BigInt(1))((a, b) => (a/gcd(a,b))*b)


How would you convert gcd into a lambda inside lcm?

Answer

You need a GCD calculation that isn't recursive.

def lcm(list: Seq[BigInt]):BigInt=list.foldLeft(1:BigInt){(a,b) => b*a / Stream.iterate((a,b)){case (x,y) => (y, x%y)}.dropWhile(_._2 != 0).head._1.abs}

(Here it is in a slightly more readable format.)

def lcm(list: Seq[BigInt]):BigInt=list.foldLeft(1:BigInt){
  (a, b) => b * a /
  Stream.iterate((a,b)){case (x,y) => (y, x%y)}.dropWhile(_._2 != 0).head._1.abs
}