Factorial primes: Difference between revisions
Content deleted Content added
Rswalsh0509 (talk | contribs) 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> |
||