(phixonline)-->
constant limz = {1,1,8,9,18,64} -- found by experiment
procedure untouchable(integer n, cols=0, tens=0)
atom t0 = time(), t1 = t0+1
bool tell = n>0
n = abs(n)
sequence sums = repeat(0,n+3)
for i=1 to n do
integer p = get_prime(i)
if p>n then exit end if
sums[p+1] = 1
sums[p+3] = 1
end for
sums[5] = 0
integer m = floor(log10(n))
integer lim = limz[m]*n
for j=2 to lim do
integer y = sum(factors(j,-1))
if y<=n then
sums[y] = 1
end if
if platform()!=JS and time()>t1 then
progress("j:%,d/%,d (%3.2f%%)\r",{j,lim,(j/lim)*100})
t1 = time()+1
end if
end for
if platform()!=JS then progress("") end if
if tell then
printf(1,"The list of all untouchable numbers <= %d:\n",{n})
end if
string line = " 2 5"
integer cnt = 2
for t=6 to n by 2 do
if sums[t]=0 then
cnt += 1
if tell then
line &= sprintf("%,8d",t)
if remainder(cnt,cols)=0 then
printf(1,"%s\n",line)
line = ""
end if
end if
end if
end for
if tell then
if line!="" then
printf(1,"%s\n",line)
end if
printf(1,"\n")
end if
string t = elapsed(time()-t0,1," (%s)")
printf(1,"%,20d untouchable numbers were found <= %,d%s\n",{cnt,n,t})
for p=1 to tens do
untouchable(-power(10,p))
end for
end procedure
untouchable(2000, 10, 6-(platform()==JS))