From 8a8eec83112c9147e2fff5f60371814c46cb1729 Mon Sep 17 00:00:00 2001 From: Jordi Aranda Date: Tue, 4 Mar 2014 00:07:00 +0100 Subject: [PATCH 1/2] P31 to P36 --- micro/s99/jaranda/.cache | Bin 0 -> 5223 bytes micro/s99/jaranda/.gitignore | 7 ++- .../jaranda/.worksheet/src/s99.dummy.scala | 10 ++++ micro/s99/jaranda/project/plugins.sbt | 2 +- .../src/main/scala/s99/Arithmetic.scala | 48 ++++++++++++++++++ .../jaranda/src/main/scala/s99/Lists.scala | 8 --- micro/s99/jaranda/src/main/scala/s99/dummy.sc | 11 ++++ .../src/test/scala/s99/ArithmeticSpec.scala | 29 +++++++++++ .../jaranda/src/test/scala/s99/Lists.scala | 8 --- 9 files changed, 104 insertions(+), 19 deletions(-) create mode 100644 micro/s99/jaranda/.cache create mode 100644 micro/s99/jaranda/.worksheet/src/s99.dummy.scala create mode 100644 micro/s99/jaranda/src/main/scala/s99/Arithmetic.scala create mode 100644 micro/s99/jaranda/src/main/scala/s99/dummy.sc create mode 100644 micro/s99/jaranda/src/test/scala/s99/ArithmeticSpec.scala diff --git a/micro/s99/jaranda/.cache b/micro/s99/jaranda/.cache new file mode 100644 index 0000000000000000000000000000000000000000..6dbf3e54b511e7bf5964f8e8604679e96d44879c GIT binary patch literal 5223 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 literal 0 HcmV?d00001 diff --git a/micro/s99/jaranda/.gitignore b/micro/s99/jaranda/.gitignore index bd60b44..61ccb68 100644 --- a/micro/s99/jaranda/.gitignore +++ b/micro/s99/jaranda/.gitignore @@ -10,5 +10,8 @@ project/boot/ project/plugins/project/ # Scala-IDE specific -.idea -.idea_modules +.scala_dependencies + +.settings +.classpath +.project diff --git a/micro/s99/jaranda/.worksheet/src/s99.dummy.scala b/micro/s99/jaranda/.worksheet/src/s99.dummy.scala new file mode 100644 index 0000000..c4b580a --- /dev/null +++ b/micro/s99/jaranda/.worksheet/src/s99.dummy.scala @@ -0,0 +1,10 @@ +package s99 + +import s99.Arithmetic._ + +object dummy {;import org.scalaide.worksheet.runtime.library.WorksheetSupport._; def main(args: Array[String])=$execute{;$skip(81); + + println(315.primeFactors);$skip(111); val res$0 = + + List(3,3,4,5).groupBy(f => f).map(fl => (fl._1, (fl._1, fl._2.size))).values.toList.sortWith(_._1 < _._1);System.out.println("""res0: List[(Int, Int)] = """ + $show(res$0))} +} diff --git a/micro/s99/jaranda/project/plugins.sbt b/micro/s99/jaranda/project/plugins.sbt index a90e4d1..b7c5598 100644 --- a/micro/s99/jaranda/project/plugins.sbt +++ b/micro/s99/jaranda/project/plugins.sbt @@ -1,2 +1,2 @@ -addSbtPlugin("com.github.mpeltonen" % "sbt-idea" % "1.5.2") +addSbtPlugin("com.typesafe.sbteclipse" % "sbteclipse-plugin" % "2.4.0") diff --git a/micro/s99/jaranda/src/main/scala/s99/Arithmetic.scala b/micro/s99/jaranda/src/main/scala/s99/Arithmetic.scala new file mode 100644 index 0000000..e622b25 --- /dev/null +++ b/micro/s99/jaranda/src/main/scala/s99/Arithmetic.scala @@ -0,0 +1,48 @@ +package s99 + +import scala.annotation.tailrec + +object Arithmetic { + + implicit def int2MyInt(i: Int) = new MyInt(i); + + class MyInt(val i: Int) { + + val primes: Stream[Int] = 2 #:: 3 #:: 5 #:: 7 #:: 11 #:: 13 #:: Stream.from(17).filter(_.isPrime) + + def isPrime: Boolean = { + (2 to math.sqrt(i).toInt).filter(n => i % n == 0).length == 0 + } + + def isCoprimeTo(n: Int): Boolean = { + gcd(i, n) == 1 + } + + def totient: Int = { + (1 to i).filter(i.isCoprimeTo(_)).length + } + + def primeFactors: List[Int] = { + @tailrec + def primeFactorsRec(n: Int, ps: Stream[Int], factors: List[Int]) : List[Int] = { + if (n.isPrime) n :: factors + else if (n % ps.head == 0) primeFactorsRec(n / ps.head, ps, ps.head :: factors) + else primeFactorsRec(n, ps.tail, factors) + } + primeFactorsRec(i, primes, Nil).reverse + } + + def primeFactorMultiplicity: List[(Int,Int)] = { + val factorsMultiplicity = i.primeFactors.groupBy(f => f).map(f1 => (f1, (f1._1, f1._2.size))).values.toList + factorsMultiplicity.sortWith(_._1 < _._1) + } + + } + + def gcd(a: Int, b: Int) : Int = (a,b) match { + case (a, 0) => a + case _ => gcd(b, a%b) + } + +} + diff --git a/micro/s99/jaranda/src/main/scala/s99/Lists.scala b/micro/s99/jaranda/src/main/scala/s99/Lists.scala index 88033c2..05576b8 100644 --- a/micro/s99/jaranda/src/main/scala/s99/Lists.scala +++ b/micro/s99/jaranda/src/main/scala/s99/Lists.scala @@ -2,14 +2,6 @@ package s99 import scala.annotation.tailrec -/** - * Created with IntelliJ IDEA. - * User: jaranda - * Date: 05/01/14 - * Time: 09:47 - * To change this template use File | Settings | File Templates. - */ - object Lists { /** diff --git a/micro/s99/jaranda/src/main/scala/s99/dummy.sc b/micro/s99/jaranda/src/main/scala/s99/dummy.sc new file mode 100644 index 0000000..dbffffd --- /dev/null +++ b/micro/s99/jaranda/src/main/scala/s99/dummy.sc @@ -0,0 +1,11 @@ +package s99 + +import s99.Arithmetic._ + +object dummy { + + println(315.primeFactors) //> List(3, 3, 5, 7) + + List(3,3,4,5).groupBy(f => f).map(fl => (fl._1, (fl._1, fl._2.size))).values.toList.sortWith(_._1 < _._1) + //> res0: List[(Int, Int)] = List((3,2), (4,1), (5,1)) +} \ No newline at end of file diff --git a/micro/s99/jaranda/src/test/scala/s99/ArithmeticSpec.scala b/micro/s99/jaranda/src/test/scala/s99/ArithmeticSpec.scala new file mode 100644 index 0000000..a4adfd2 --- /dev/null +++ b/micro/s99/jaranda/src/test/scala/s99/ArithmeticSpec.scala @@ -0,0 +1,29 @@ +package s99 + +import org.scalatest.FunSuite + +class ArithmeticSpec extends FunSuite { + + import s99.Arithmetic._; + + test("Determine whether a given integer number is prime.") { + assert{ 7.isPrime == true } + } + + test("Determine the greatest common divisor of two positive integer numbers.") { + assert{ gcd(36, 63) == 9 } + } + + test("Determine whether two positive integer numbers are coprime.") { + assert{ 35.isCoprimeTo(64) } + } + + test("Determine the prime factors of a given positive integer.") { + assert{ 315.primeFactors == List(3, 3, 5, 7) } + } + + test("Determine the prime factors of a given positive integer (2).") { + assert{ 315.primeFactorMultiplicity == List((3,2), (5,1), (7,1)) } + } + +} \ No newline at end of file diff --git a/micro/s99/jaranda/src/test/scala/s99/Lists.scala b/micro/s99/jaranda/src/test/scala/s99/Lists.scala index 1662ec1..bafa697 100644 --- a/micro/s99/jaranda/src/test/scala/s99/Lists.scala +++ b/micro/s99/jaranda/src/test/scala/s99/Lists.scala @@ -3,14 +3,6 @@ package s99 import org.scalatest.matchers.ShouldMatchers import org.scalatest.FlatSpec -/** - * Created with IntelliJ IDEA. - * User: jaranda - * Date: 05/01/14 - * Time: 10:27 - * To change this template use File | Settings | File Templates. - */ - class ListsSpec extends FlatSpec with ShouldMatchers { "Lists problems set" should "find the last element of a list" in { From 6a5d06cf2535e8daed7cd1d2b67379c1b9698cb7 Mon Sep 17 00:00:00 2001 From: Jordi Aranda Date: Sun, 9 Mar 2014 20:18:32 +0100 Subject: [PATCH 2/2] P31 to P39 --- .../s99/jaranda/src/main/scala/s99/Arithmetic.scala | 12 ++++++++++-- micro/s99/jaranda/src/main/scala/s99/dummy.sc | 3 +++ .../jaranda/src/test/scala/s99/ArithmeticSpec.scala | 12 ++++++++++++ 3 files changed, 25 insertions(+), 2 deletions(-) diff --git a/micro/s99/jaranda/src/main/scala/s99/Arithmetic.scala b/micro/s99/jaranda/src/main/scala/s99/Arithmetic.scala index e622b25..28da9d3 100644 --- a/micro/s99/jaranda/src/main/scala/s99/Arithmetic.scala +++ b/micro/s99/jaranda/src/main/scala/s99/Arithmetic.scala @@ -5,10 +5,10 @@ import scala.annotation.tailrec object Arithmetic { implicit def int2MyInt(i: Int) = new MyInt(i); + + val primes: Stream[Int] = 2 #:: 3 #:: 5 #:: 7 #:: 11 #:: 13 #:: Stream.from(17).filter(_.isPrime) class MyInt(val i: Int) { - - val primes: Stream[Int] = 2 #:: 3 #:: 5 #:: 7 #:: 11 #:: 13 #:: Stream.from(17).filter(_.isPrime) def isPrime: Boolean = { (2 to math.sqrt(i).toInt).filter(n => i % n == 0).length == 0 @@ -22,6 +22,10 @@ object Arithmetic { (1 to i).filter(i.isCoprimeTo(_)).length } + def totientImproved : Int = { + i.primeFactorMultiplicity.map( n => (n._1 - 1) * math.pow((n._1),(n._2 - 1)) ).reduce( (n , m) => n * m).intValue(); + } + def primeFactors: List[Int] = { @tailrec def primeFactorsRec(n: Int, ps: Stream[Int], factors: List[Int]) : List[Int] = { @@ -44,5 +48,9 @@ object Arithmetic { case _ => gcd(b, a%b) } + def listPrimesInRange(r: Range) : List[Int] = { + primes.dropWhile(_ < r.head).takeWhile(_ <= r.last).toList + } + } diff --git a/micro/s99/jaranda/src/main/scala/s99/dummy.sc b/micro/s99/jaranda/src/main/scala/s99/dummy.sc index dbffffd..cbde7e0 100644 --- a/micro/s99/jaranda/src/main/scala/s99/dummy.sc +++ b/micro/s99/jaranda/src/main/scala/s99/dummy.sc @@ -8,4 +8,7 @@ object dummy { List(3,3,4,5).groupBy(f => f).map(fl => (fl._1, (fl._1, fl._2.size))).values.toList.sortWith(_._1 < _._1) //> res0: List[(Int, Int)] = List((3,2), (4,1), (5,1)) + + listPrimesInRange(7 to 31) //> res1: List[Int] = List(7, 11, 13, 17, 19, 23, 29, 31) + } \ No newline at end of file diff --git a/micro/s99/jaranda/src/test/scala/s99/ArithmeticSpec.scala b/micro/s99/jaranda/src/test/scala/s99/ArithmeticSpec.scala index a4adfd2..567a1ae 100644 --- a/micro/s99/jaranda/src/test/scala/s99/ArithmeticSpec.scala +++ b/micro/s99/jaranda/src/test/scala/s99/ArithmeticSpec.scala @@ -18,6 +18,10 @@ class ArithmeticSpec extends FunSuite { assert{ 35.isCoprimeTo(64) } } + test("Calculate Euler's totient function phi(m).") { + assert{ 10.totient == 4 } + } + test("Determine the prime factors of a given positive integer.") { assert{ 315.primeFactors == List(3, 3, 5, 7) } } @@ -26,4 +30,12 @@ class ArithmeticSpec extends FunSuite { assert{ 315.primeFactorMultiplicity == List((3,2), (5,1), (7,1)) } } + test("Calculate Euler's totient function phi(m) (improved)."){ + assert{ 10.totientImproved == 4 } + } + + test("Given a range of integers by its lower and upper limit, construct a list of all prime numbers in that range.") { + assert{ listPrimesInRange(7 to 31) == List(7, 11, 13, 17, 19, 23, 29, 31) } + } + } \ No newline at end of file