12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758 |
- 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
- }
- }
|