Factors of a Mersenne number: Difference between revisions

→‎{{header|Scala}}: migrate to Scala 2.13
(→‎{{header|Scala}}: migrate to Scala 2.13)
Line 2,528:
 
===Full-blown version===
<lang Scala>/** Find factors of a Mersenne number
/** Find factors of a Mersenne number
*
* The implementation finds factors for M929 and further.
*
* @example M59 = 2^059 - 1 = 576460752303423487 ( 2 msec)
* @example = 179951 × 3203431780337.
*/
object FactorMersenneFactorsOfAMersenneNumber extends App {
 
val two: BigInt = 2
 
def sieve(nums: Stream[Int]): Stream[Int] =
Stream.cons(nums.head, sieve((nums.tail) filter (_ % nums.head != 0)))
// An infinite stream of primes, lazy evaluation and memo-ized
val oddPrimes = sieve(StreamLazyList.from(3, 2))
def primes = sieve(2 #:: oddPrimes)
 
def mersennesieve(pnums: LazyList[Int]): LazyList[Int] = (two pow p) - 1
StreamLazyList.cons(nums.head, sieve((nums.tail) filter (_ % nums.head != 0)))
 
def primes: LazyList[Int] = sieve(2 #:: oddPrimes)
 
def factorMersenne(p: Int): Option[Long] = {
Line 2,555:
 
// Build a stream of factors from (2*p+1) step-by (2*p)
def s(a: Long): StreamLazyList[Long] = a #:: s(a + (2 * p)) // Build stream of possible factors
 
// Limit and Filter Stream and then take the head element
Line 2,561:
e.headOption
}
 
def mersenne(p: Int): BigInt = (two pow p) - 1
 
// Test
(primes takeWhile (_ <= 97)) ++ List(929, 937) foreach { p => { // Needs some intermediate results for nice formatting
val nMersenne = mersenne(p);
{ // Needs some intermediate results for nice formatting
val nMersenne = mersenne(p); val lit = f"${nMersenne}%30d"
val preAmble = f"${s"M${p}"}%4s = 2^$p%03d - 1 = ${lit}%s"
 
val datum = System.nanoTime
val result = factorMersenne(p)
val mSec = ((System.nanoTime - datum) / 1.e0e+6).round
 
def decStr = { if (lit.length > 30) f"(M has ${lit.length}%3d dec)" else "" }
def sPrime = { if (resultlit.isEmptylength > 30) f"(M ishas a${lit.length}%3d Mersenne prime number.dec)" else " " * 28 }
}
 
def sPrime: String = {
println(f"$preAmble${sPrime} ${f"($mSec%,1d"}%13s msec)")
if (!result.isEmpty) " is a Mersenne prime number." else " " * 28
println(f"${decStr}%-17s = ${result.get} × ${nMersenne / result.get}")
}
 
println(f"$preAmble${sPrime} ${f"($mSec%,1d"}%13s msec)")
if (result.isDefined)
println(f"${decStr}%-17s = ${result.get} × ${nMersenne / result.get}")
}
}
}
}</lang>
{{out}}
<pre style="height:40ex;overflow:scroll"> M2 = 2^002 - 1 = 3 is a Mersenne prime number. (63 msec)
92

edits