(PARI){arons(v)=/*返回v*/local(x=[],pv=1,px=1,n=1,i=0,k,l)的Aronson变换;l=matsize(v)[2];
/*初始项:*/if(n<v[pv],n+=1;while(n==v[pv,n+=1;pv+=1);x=连接(x,n);n+=1;i+=1,而(n<l)&(v[pv]==n),x=concat(x,n);n+=1;pv+=1;i+=1));
/*诱导:*/while(abs(pv)<=l&&n<v[l],k=x[i];n=k;pv=isin(i+1,v,l,pv);
/*如果(i+1)在v*/if(k==i,n+=1;如果(pv<0,pv=abs(pv))中,pv>0;当(pv>0,n+=1;pv=isin(n,v,l,pv))时,px=isin(i+1,x,i,px);如果(px>0,pv=-abs(pv);而(pv<0,n+=1;pv=isin(n,v,l,pv)),pv=abs(pv);而(pv>0,n+=1;pv=isin(n,v,l,pv));x=连接(x,n);i+=1)/*打印(i);*/返回(x)}
{isin(x,v,l,poi)=/*如果x整数位于长度为l的v单调向量中,函数将返回一个正的“poi”,否则返回一个负值。(poi是指针,用于加速。建议在输入中使用最后一个返回值)*/
poi=abs(poi);如果(poi==1&x<v[1],返回(-poi),如果(x<v[poi],而(x<v[poi]&&poi>1,poi-=1);如果(x<>v[poi],poi*=-1),如果(x>v[Pio],而(x>v[poi]&&poi<l,poi+=1);如果(x<>v[poi],poi*=-1));返回(poi)}
|