first(n) = {gen = List(); seeds = List([2]); res = vector(n + 1, i, oo); process(2, 0); for(i = 0, oo, seeds = getseeds(i); \\print(seeds); if(#seeds == 0, return(res[^1]) , for(j = 1, #seeds, process(seeds[j], i+1); ); ); ); } children(n, ulim) = {my(c = List()); for(i = 1, min(n, ulim\n)-1, if(res[n*(i+1)]==oo, listput(c, n*(i+1)) ) ); c } process(n, val) = {my(i, c); res[n] = min(val, res[n]); c = children(n, #res); for(i = 1, #c, process(c[i], val); ) } getseeds(n) = { my(seeds = List()); for(i = 1, #res-1, if(res[i] == n, if(res[i-1] == oo, listput(seeds, i-1); ); if(res[i+1] == oo, listput(seeds, i+1); ); ) ); listsort(seeds, 1); if(#seeds > 0 && seeds[1] == 1, listpop(seeds, 1)); seeds }