Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 用Lucas寻找mersene素数–;莱默素性检验_Scala_Math_Primes - Fatal编程技术网

Scala 用Lucas寻找mersene素数–;莱默素性检验

Scala 用Lucas寻找mersene素数–;莱默素性检验,scala,math,primes,Scala,Math,Primes,我想在Scala中实现一个流,用于使用Lucas-Lehmer素性测试查找Mersenne素数。我已经: object Main { //Mersenne Numbers: def msrn():Stream[BigInt] = 7#::msrn.map(_*2+1) def s():Stream[BigInt] = 14 #:: s.map(n => n*n-2) lazy val zips = s.zip(msrn) def main(args: Array[Str

我想在Scala中实现一个
,用于使用Lucas-Lehmer素性测试查找Mersenne素数。我已经:

object Main {
  //Mersenne Numbers:
  def msrn():Stream[BigInt] = 7#::msrn.map(_*2+1)
  def s():Stream[BigInt] = 14 #:: s.map(n => n*n-2)
  lazy val zips = s.zip(msrn)
  def main(args: Array[String]) {
     zips take 7 foreach println
  }
}
我现在需要做的是找到所有梅森数(msrn中的元素),它将
s
中的元素分开,并将它们写入
流中

编辑:解决它:

object Main {
  def msrn():Stream[BigInt] = 7#::msrn.map(_*2+1)
  def s():Stream[BigInt] = 14 #:: s.map(n => n*n-2)
  lazy val zips = s.zip(msrn).filter(x=>x._1%x._2==0)
  def mersennePrimeStream():Stream[BigInt] = zips.map(x => x._2)
  def main(args: Array[String]) {
     mersennePrimeStream take 4 foreach println
  }
}

但是,有没有办法使它变短?

如果计算s序列与测试的Mersenne数的模,速度会快得多:

object Main {
  def s(k: Int, m: BigInt) = Iterator.iterate(BigInt(14))(n => (n * n - 2) % m) drop k next
  lazy val msrn: Stream[(Int,BigInt)] = (0,BigInt(7)) #:: msrn.map(t => (t._1 + 1, t._2 * 2 + 1))
  val mersennePrimeStream = msrn filter(x => s(x._1, x._2) % x._2 == 0) map (_._2)
  def main(args: Array[String]) = mersennePrimeStream take 10 foreach println
}

谢谢!惊人的答案。