|
@@ -0,0 +1,57 @@
|
|
|
+import scala.actors.Futures._;
|
|
|
+
|
|
|
+object FastPower {
|
|
|
+ /**
|
|
|
+ * Calculate a power of two fast.
|
|
|
+ */
|
|
|
+ def fastPow(x: Int, n: Int): Long = {
|
|
|
+ var result = 1L;
|
|
|
+
|
|
|
+ val b = n.toBinaryString.reverse;
|
|
|
+ for(d <- 0 until b.length()) {
|
|
|
+ if(b.charAt(d).equals('1')){
|
|
|
+ result *= scala.math.pow(x,
|
|
|
+ scala.math.pow(2, d)).toLong;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Calculate a power of two fast and use Futures.
|
|
|
+ */
|
|
|
+ def fastPowParallel(x: Int, n: Int): Long = {
|
|
|
+ var result = 1L;
|
|
|
+ val b = n.toBinaryString.reverse;
|
|
|
+ val tasks = for (d <- 0 until b.length())
|
|
|
+ yield future
|
|
|
+ {
|
|
|
+ var interim = 0L;
|
|
|
+ if (b.charAt(d).equals('1')){
|
|
|
+ interim = scala.math.pow(x,
|
|
|
+ scala.math.pow(2, d)).toLong;
|
|
|
+ }
|
|
|
+
|
|
|
+ interim;
|
|
|
+ }
|
|
|
+
|
|
|
+ val futureRes = awaitAll(20000L, tasks: _*);
|
|
|
+
|
|
|
+ futureRes.foreach { res =>
|
|
|
+ res match {
|
|
|
+ case Some(x: Long) => if (x > 0)
|
|
|
+ result *= x
|
|
|
+ case None => throw new
|
|
|
+ Exception("error")
|
|
|
+ };
|
|
|
+ }
|
|
|
+
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ def main(args: Array[String]) {
|
|
|
+ println(fastPowParallel(2, 9));
|
|
|
+ // => 512
|
|
|
+ }
|
|
|
+}
|