The arithmetic sequence, 1487, 4817, 8147, in which each of the terms increases by 3330, is unusual in two ways: (i) each of the three terms are prime, and, (ii) each of the 4-digit numbers are permutations of one another.
There are no arithmetic sequences made up of three 1-, 2-, or 3-digit primes, exhibiting this property, but there is one other 4-digit increasing sequence.
What 12-digit number do you form by concatenating the three terms in this sequence?
Ruby: Running time = 0.0s
+-#PrimeList
class PrimeList
@@primes=[2,3,5,7,11,13,17,19]
def initialize
@next=-1
end
def last
return 0 if @next==-1
PrimeList.get(@next)
end
def getNext
PrimeList.get(@next+=1)
end
def [](i)
PrimeList.get(i)
end
def PrimeList.isPrime?(n)
if(@@primes[-1] >= n)
return true if @@primes.index n
return false
end
p=PrimeList.new
sq=Math.sqrt(n)
while(p.last<=sq)
return false if n % (p.getNext)==0
end
true
end
def PrimeList.get(i)
PrimeList.gen while @@primes.length<=i
@@primes[i]
end
def PrimeList.getPrimeNear(n)
PrimeList.gen until n<@@primes[-1]
@@primes[PrimeList.primeIndexNear(n)]
end
private
def PrimeList.primeIndexNear(n)
return 0 if n<@@primes[0]
return [-1] if n>@@primes[-1]
PrimeList.getIndexNear(@@primes,n)
end
def PrimeList.getIndexNear(list,n)
return 0 if list.length==1
if(list.length==2)
avg=(list[0]+list[1])/2.0
return 1 if n>avg
return 0
end
splitAfter=list.size/2
return PrimeList.getIndexNear(list[0..splitAfter],n) if n<list[splitAfter]
return splitAfter+1+PrimeList.getIndexNear(list[(splitAfter+1)..-1],n) if n>list[splitAfter+1]
avg=(list[splitAfter]+list[splitAfter+1])/2
return splitAfter+1 if n>avg
splitAfter
end
def PrimeList.gen
add=@@primes[-1]
cands=Set.new(1..(5*add)){|i|2*i+add}
theBegin=add+2
theEnd=11*add
highest=Math.sqrt(theEnd).to_i
upTo=PrimeList.primeIndexNear(highest)
upTo-=1 if @@primes[upTo]>highest
@@primes[1..upTo].each do |mult|
((theBegin-theBegin%mult)..(theEnd-theEnd%mult + mult)).step(mult){|i|cands.delete i}
end
@@primes=@@primes+cands.to_a.sort
end
end
+-#dig_split
def dig_split(n)
s=n.to_s
s.split("").map{|i|i.to_i}
end
def p49
ps=[]
p=PrimeList.new
p.getNext while p.last<1000
ps.push(p.last)
ps.push(p.getNext) while ps.last<10000
ps.pop
categories=Hash.new([])
ps.each{|i|categories[dig_split(i).sort]+=[i]}
categories.reject!{|k,v|v.length<3}
categories.delete([1,4,7,8])
while(categories.size>1)
categories.each_pair do |k,v|
unless v[2]-v[1]==v[1]-v[0]
if(v.length>3)
v.shift
else
categories[k]=nil
end
end
categories.reject!{|k,v|not v}
end
end
puts categories.values.first.sort.join("")
end