39 lines
1.1 KiB
Text
39 lines
1.1 KiB
Text
local int = require "int"
|
|
local fmt = require "fmt"
|
|
|
|
local limit <const> = 1e10
|
|
local primes = int.primes(limit, true)
|
|
local orm25 = {}
|
|
local j = limit / 10
|
|
local count = 0
|
|
local counts = {}
|
|
for i = 1, #primes - 2 do
|
|
local p1 = primes[i]
|
|
local p2 = primes[i + 1]
|
|
local p3 = primes[i + 2]
|
|
if (p2 - p1) % 18 != 0 or (p3 - p2) % 18 != 0 then continue end
|
|
local key1 = 1
|
|
for int.digits(p1) as dig do key1 *= primes[dig + 1] end
|
|
local key2 = 1
|
|
for int.digits(p2) as dig do key2 *= primes[dig + 1] end
|
|
if key1 != key2 then continue end
|
|
local key3 = 1
|
|
for int.digits(p3) as dig do key3 *= primes[dig + 1] end
|
|
if key2 == key3 then
|
|
if count < 25 then orm25:insert(p1) end
|
|
if p1 >= j then
|
|
counts:insert(count)
|
|
j *= 10
|
|
end
|
|
count += 1
|
|
end
|
|
end
|
|
counts:insert(count)
|
|
print("Smallest members of first 25 Ormiston triples:")
|
|
fmt.tprint("%10s ", orm25:mapped(|e| -> fmt.int(e)), 5)
|
|
print()
|
|
j = limit / 10
|
|
for i = 1, #counts do
|
|
fmt.print("%s Ormiston triples before %s", fmt.int(counts[i]), fmt.int(j))
|
|
j *= 10
|
|
end
|