Cullen and Woodall numbers: Difference between revisions
Content added Content deleted
(Add PARI/GP implementation) |
(Add Scala implementation) |
||
Line 1,547: | Line 1,547: | ||
First 12 Woodall primes in terms of n: |
First 12 Woodall primes in terms of n: |
||
2 3 6 30 75 81 115 123 249 362 384 462 |
2 3 6 30 75 81 115 123 249 362 384 462 |
||
</pre> |
|||
=={{header|Scala}}== |
|||
{{trans|Java}} |
|||
<syntaxhighlight lang="Scala"> |
|||
import java.math.BigInteger |
|||
import scala.annotation.tailrec |
|||
object CullenAndWoodhall extends App { |
|||
val Certainty = 20 |
|||
var number: BigInteger = _ |
|||
var power: BigInteger = _ |
|||
var count: Int = _ |
|||
var primeIndex: Int = _ |
|||
sealed trait NumberType |
|||
case object Cullen extends NumberType |
|||
case object Woodhall extends NumberType |
|||
numberSequence(20, Cullen) |
|||
numberSequence(20, Woodhall) |
|||
primeSequence(5, Cullen) |
|||
primeSequence(12, Woodhall) |
|||
def numberSequence(aCount: Int, aNumberType: NumberType): Unit = { |
|||
println(s"\nThe first $aCount $aNumberType numbers are:") |
|||
numberInitialise() |
|||
(1 to aCount).foreach { _ => |
|||
print(nextNumber(aNumberType).toString + " ") |
|||
} |
|||
println() |
|||
} |
|||
def primeSequence(aCount: Int, aNumberType: NumberType): Unit = { |
|||
println(s"\nThe indexes of the first $aCount $aNumberType primes are:") |
|||
primeInitialise() |
|||
@tailrec |
|||
def findPrimes(): Unit = { |
|||
if (count < aCount) { |
|||
if (nextNumber(aNumberType).isProbablePrime(Certainty)) { |
|||
print(primeIndex + " ") |
|||
count += 1 |
|||
} |
|||
primeIndex += 1 |
|||
findPrimes() |
|||
} |
|||
} |
|||
findPrimes() |
|||
println() |
|||
} |
|||
def nextNumber(aNumberType: NumberType): BigInteger = { |
|||
number = number.add(BigInteger.ONE) |
|||
power = power.shiftLeft(1) |
|||
aNumberType match { |
|||
case Cullen => number.multiply(power).add(BigInteger.ONE) |
|||
case Woodhall => number.multiply(power).subtract(BigInteger.ONE) |
|||
} |
|||
} |
|||
def numberInitialise(): Unit = { |
|||
number = BigInteger.ZERO |
|||
power = BigInteger.ONE |
|||
} |
|||
def primeInitialise(): Unit = { |
|||
count = 0 |
|||
primeIndex = 1 |
|||
numberInitialise() |
|||
} |
|||
} |
|||
</syntaxhighlight> |
|||
{{out}} |
|||
<pre> |
|||
The first 20 Cullen numbers are: |
|||
3 9 25 65 161 385 897 2049 4609 10241 22529 49153 106497 229377 491521 1048577 2228225 4718593 9961473 20971521 |
|||
The first 20 Woodhall numbers are: |
|||
1 7 23 63 159 383 895 2047 4607 10239 22527 49151 106495 229375 491519 1048575 2228223 4718591 9961471 20971519 |
|||
The indexes of the first 5 Cullen primes are: |
|||
1 141 4713 5794 6611 |
|||
The indexes of the first 12 Woodhall primes are: |
|||
2 3 6 30 75 81 115 123 249 362 384 462 |
|||
</pre> |
</pre> |
||