Find largest left truncatable prime in a given base
func lltp(n) {
var b = 1
var best = nil
var v = (n-1 -> primes)
while (v) {
best = v.max
b *= n
v.map! { |vi|
{|i| i*b + vi }.map(1..^n).grep{.is_prime}...
}
}
return best
}
for i in (3..17) {
printf("%2d %s\n", i, lltp(i))
}
Output:
3 23
4 4091
5 7817
6 4836525320399
7 817337
8 14005650767869
9 1676456897
10 357686312646216567629137
11 2276005673
12 13092430647736190817303130065827539
13 812751503
14 615419590422100474355767356763
15 34068645705927662447286191
16 1088303707153521644968345559987
17 13563641583101
Alternative solution:
func digits2num(digits, base) {
digits.map_kv {|k,v| base**k * v }.sum
}
func generate_from_suffix(p, base) {
var seq = [p]
for n in (1 ..^ base) {
var t = [p..., n]
if (is_prime(digits2num(t, base))) {
seq << __FUNC__(t, base)...
}
}
return seq
}
func left_truncatable_primes(base) {
var prime_digits = (base-1 -> primes)
prime_digits.map {|p| generate_from_suffix([p], base)... }\
.map {|t| digits2num(t, base) }\
.sort
}
for n in (3..11) {
var ltp = left_truncatable_primes(n)
say ("There are #{'%4d' % ltp.len} left-truncatable primes in base #{'%2d' % n}, where largest is #{ltp.max}")
}
Output:
There are 3 left-truncatable primes in base 3, where largest is 23
There are 16 left-truncatable primes in base 4, where largest is 4091
There are 15 left-truncatable primes in base 5, where largest is 7817
There are 454 left-truncatable primes in base 6, where largest is 4836525320399
There are 22 left-truncatable primes in base 7, where largest is 817337
There are 446 left-truncatable primes in base 8, where largest is 14005650767869
There are 108 left-truncatable primes in base 9, where largest is 1676456897
There are 4260 left-truncatable primes in base 10, where largest is 357686312646216567629137
There are 75 left-truncatable primes in base 11, where largest is 2276005673