63 lines
1.8 KiB
Scala
63 lines
1.8 KiB
Scala
import scala.collection.mutable
|
|
|
|
object BlumInteger extends App {
|
|
var blums = new Array[Int](50)
|
|
var blumCount = 0
|
|
val lastDigitCounts = mutable.Map[Int, Int]()
|
|
var number = 1
|
|
|
|
while (blumCount < 400_000) {
|
|
val prime = leastPrimeFactor(number)
|
|
if (prime % 4 == 3) {
|
|
val quotient = number / prime
|
|
if (quotient != prime && isPrimeType3(quotient)) {
|
|
if (blumCount < 50) {
|
|
blums(blumCount) = number
|
|
}
|
|
lastDigitCounts(number % 10) = lastDigitCounts.getOrElse(number % 10, 0) + 1
|
|
blumCount += 1
|
|
if (blumCount == 50) {
|
|
println("The first 50 Blum integers:")
|
|
blums.grouped(10).foreach(group => println(group.map(i => f"$i%3d").mkString(" ")))
|
|
println("")
|
|
} else if (blumCount == 26828 || blumCount % 100_000 == 0) {
|
|
println(f"The ${blumCount}th Blum integer is: $number%7d")
|
|
if (blumCount == 400_000) {
|
|
println("\nPercent distribution of the first 400000 Blum integers:")
|
|
lastDigitCounts.foreach { case (key, count) =>
|
|
println(f" ${count.toDouble / 4000}%6.3f%% end in $key")
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
number += (if (number % 5 == 3) 4 else 2)
|
|
}
|
|
|
|
def isPrimeType3(aNumber: Int): Boolean = {
|
|
if (aNumber < 2) return false
|
|
if (aNumber % 2 == 0) return aNumber == 2
|
|
if (aNumber % 3 == 0) return aNumber == 3
|
|
|
|
var divisor = 5
|
|
while (divisor * divisor <= aNumber) {
|
|
if (aNumber % divisor == 0) return false
|
|
divisor += 2
|
|
}
|
|
aNumber % 4 == 3
|
|
}
|
|
|
|
def leastPrimeFactor(aNumber: Int): Int = {
|
|
if (aNumber == 1) return 1
|
|
if (aNumber % 2 == 0) return 2
|
|
if (aNumber % 3 == 0) return 3
|
|
|
|
var divisor = 5
|
|
while (divisor * divisor <= aNumber) {
|
|
if (aNumber % divisor == 0) return divisor
|
|
divisor += 2
|
|
}
|
|
aNumber
|
|
}
|
|
}
|