Чуть-чуть упростил:
Код:
default(parisizemax,2^8*10^6)
n=10
m=20
size=vector(2^n,i,0)
size[2]=2^(n-1)
size[3]=floor(2^n/3)
for(i=4,2^n,size[i]=floor(size[i-1]*(i-1)/i))
ps=vector(m,i,vector(size[i]*i,j,0))
for(j=1,2,ps[2][j]=j)
for(j=3,size[2]*2,ps[2][j]=j-(-1)^j)
vs=vector(m,i,vector(size[i],j,vector(i,k,0)))
vs1=vector(m,i,vector(size[i],j,vector(i,k,0)))
f(q,n,m)=my(s=Set(vs[q][n]));s=setunion(s,Set(m));s[setsearch(s,m)-1]
\\ блок #3
for(i=3,3,for(j=1,size[i],for(k=1,i,vs[i][j][k]=ps[i-1][i*(j-1)+k])))
for(i=3,3,for(k=1,i,vs1[i][1][k]=vs[i][1][k]))
for(i=3,3,for(j=2,size[i],for(k=1,i,vs1[i][j][k]=if(k==1,vecmax(vs[i][j]),f(i,j,vs1[i][j][k-1])))))
for(i=3,3,for(j=1,size[i]*i,ps[i][j]=vs1[i][(j-1)\i+1][(j-1)%i+1]))
Изменения относительно незначительные.
Я пробовал запускать сразу
Код:
for(i=3,m,for(j=1,size[i],for(k=1,i,vs[i][j][k]=ps[i-1][i*(j-1)+k])))
for(i=3,m,for(k=1,i,vs1[i][1][k]=vs[i][1][k]))
for(i=3,m,for(j=2,size[i],for(k=1,i,vs1[i][j][k]=if(k==1,vecmax(vs[i][j]),f(i,j,vs1[i][j][k-1])))))
for(i=3,m,for(j=1,size[i]*i,ps[i][j]=vs1[i][(j-1)\i+1][(j-1)%i+1]))
Программа успешно выполняет циклы для
. Однако я предполагал, что при
за значением
ps[i-1][i*(j-1)+k] она полезет в последний цикл при
, откуда за значением
vs1[i][(j-1)\i+1][(j-1)%i+1] она полезет в третий цикл при
и т.д. Вместо этого она сначала отрабатывает весь первый цикл, затем весь второй и т.д.
Можно ли реализовать что-то вроде
Код:
for(i=3,m,
{
for(j=1,size[i],for(k=1,i,vs[i][j][k]=ps[i-1][i*(j-1)+k]))
for(k=1,i,vs1[i][1][k]=vs[i][1][k])
for(j=2,size[i],for(k=1,i,vs1[i][j][k]=if(k==1,vecmax(vs[i][j]),f(i,j,vs1[i][j][k-1]))))
for(j=1,size[i]*i,ps[i][j]=vs1[i][(j-1)\i+1][(j-1)%i+1])
})
Если да, то какой синтаксис для этого надо использовать?