Factorial primes: Difference between revisions

Content deleted Content added
Added Common Lisp implementation without advanced primality testing.
Add Kotlin implementation
Line 938: Line 938:
872! + 1 -> 19723152008295244962...00000000000000000001 (2188 digits)
872! + 1 -> 19723152008295244962...00000000000000000001 (2188 digits)
974! - 1 -> 55847687633820181096...99999999999999999999 (2490 digits)
974! - 1 -> 55847687633820181096...99999999999999999999 (2490 digits)
</pre>

=={{header|Kotlin}}==
Similar to Java implementation, but using Kotlin's String templates, overloaded BigInteger operators and an extension function to make the code easier to read:
<syntaxhighlight lang="kotlin">
import java.math.BigInteger
import java.math.BigInteger.ONE

enum class Difference(private val displayText: String) {
MINUS_ONE("- 1"), PLUS_ONE("+ 1");

override fun toString(): String {
return displayText
}
}

fun main() {
var currentFactorial = ONE
var highestFactor = 1L
var found = 0

while(found < 30) {
if ((currentFactorial - ONE).isProbablePrime(25)) {
printlnFactorialPrime(currentFactorial - ONE, highestFactor, Difference.MINUS_ONE)
found++
}
if ((currentFactorial + ONE).isProbablePrime(25)) {
printlnFactorialPrime(currentFactorial + ONE, highestFactor, Difference.PLUS_ONE)
found++
}

highestFactor++
currentFactorial *= BigInteger.valueOf(highestFactor)
}
}

fun printlnFactorialPrime(factorialPrime: BigInteger, base: Long, difference: Difference) =
println("${base}! $difference = ${factorialPrime.shortenIfNecessary()}")

fun BigInteger.shortenIfNecessary(): String {
val digits = toString()
val length = digits.length
return if (length <= 40) {
digits
} else {
"${digits.take(20)}...${digits.takeLast(20)} ($length digits)"
}
}
</syntaxhighlight>{{out}}

<pre>
1! + 1 = 2
2! + 1 = 3
3! - 1 = 5
3! + 1 = 7
4! - 1 = 23
6! - 1 = 719
7! - 1 = 5039
11! + 1 = 39916801
12! - 1 = 479001599
14! - 1 = 87178291199
27! + 1 = 10888869450418352160768000001
30! - 1 = 265252859812191058636308479999999
32! - 1 = 263130836933693530167218012159999999
33! - 1 = 8683317618811886495518194401279999999
37! + 1 = 13763753091226345046...79581580902400000001 (44 digits)
38! - 1 = 52302261746660111176...24100074291199999999 (45 digits)
41! + 1 = 33452526613163807108...40751665152000000001 (50 digits)
73! + 1 = 44701154615126843408...03680000000000000001 (106 digits)
77! + 1 = 14518309202828586963...48000000000000000001 (114 digits)
94! - 1 = 10873661566567430802...99999999999999999999 (147 digits)
116! + 1 = 33931086844518982011...00000000000000000001 (191 digits)
154! + 1 = 30897696138473508879...00000000000000000001 (272 digits)
166! - 1 = 90036917057784373664...99999999999999999999 (298 digits)
320! + 1 = 21161033472192524829...00000000000000000001 (665 digits)
324! - 1 = 22889974601791023211...99999999999999999999 (675 digits)
340! + 1 = 51008644721037110809...00000000000000000001 (715 digits)
379! - 1 = 24840307460964707050...99999999999999999999 (815 digits)
399! + 1 = 16008630711655973815...00000000000000000001 (867 digits)
427! + 1 = 29063471769607348411...00000000000000000001 (940 digits)
469! - 1 = 67718096668149510900...99999999999999999999 (1051 digits)
</pre>
</pre>