| R J Cano on Wed, 19 Apr 2017 11:01:38 +0200 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
| 4 Gigabytes of RAM are not enough! |
Greetings, This time featuring a problem that seems to be a RAM-memory's pacman monster... Briefly: If you are looking for arbitrary symmetric/antisymmetric patterns inside the first N!-1 terms of oeis.org A217626, ...for N>6 the problem becomes (yet inclusive if having a very simple and efficient script!) intractable due there is no enough RAM to complete the corresponding report... Attached to this mail comes a PARI/GP script which can be used to appreciate that issue. The usage is simple, load it and set: p=vecDiff(A217626_vec_1(7)); then run the following search&report: q=Patterns(p,1,5,1); Which tells Patterns( ) to search for any pattern of size 5, and exclusively (e=1) size 5, For example the pattern [1,9,2,9,1] or the first 3!-1 terms of A217626 should be present (7-3+1)! = 120 times; However: The execution crashes before allowing us to verify that!!, giving up due lacking of stack. Cheers, Remy P.S.: Of course, this is not the fault of PARI/GP at all!, ... I only wish to call the attention of someone else with access to more powerful computing resources than me in the hope he/she/they be able of resuming the streak of discoveries on those sequences (A215940, A217626, and its higher differences).
/* (PARI-GP) R. J. Cano, Apr 19 2017 */
A215940_vec_1(n,{B=10})={my(u=n!-1); my(x=numtoperm(n, 0), y, z=vector(u),i:small);i=0;for(j=0, u, y=numtoperm(n, j)-x; z[i++]=fromdigits(vector(#x-1, k, vecsum(y[1..k])), B)); z}
A217626_vec_1(n,{B=10})={my(u=n!-1); my(x=numtoperm(n, 0), y, z=vector(u),i:small);i=0;for(j=1, u, y=numtoperm(n, j)-x; z[i++]=fromdigits(vector(#x-1, k, vecsum(y[1..k])), B); x+=y); z}
\\ kth differences of a vector iff it has enough elements (at least k+1);
vecDiff(v,{k=1})={
if((1+k<=#v)&&#v,
if(!k,
return(v)
);
if(1==k,
return(vector(#v-1,j,v[j+1]-v[j]))
);
my( f=(-1)^(k%2) );
my( w=f*vector(#v-k,j,sum(i=0,k,((-1)^(i%2))*binomial(k,i)*v[j+i])) );
if(type(v)==type(w),
w
,
w~
)
,
[]
)
}
\\ A215940_vec_0(n,{B=10})=APLPsignature_vec(n,B,0);
\\ A217626_vec_0(n,{B=10})=APLPsignature_vec(n,B,1);
\\ "APLP" is the acronym für "(A)rithmetic (P)rogression (L)exicographical (P)ermutations signature";; "tilauksen" is the Finnish für "order" like in "second order ODE".
isSubseq(b,a)={if(#b<=#a,my(t:small,L:list);t=0;L=List();while(#b-1+t++<=#a,if(a[t..t+#b-1]==b,listput(L,t)));return(L),return([]))}
palindrome(n,{B=10},{e=0})={e=!!e;my(v=digits(n,B),t=(-1)^e);my(w=vector(2*(#v+e)-#v%2));for(j=1,#v,w[j]=v[j];w[1+#w-j]=t*v[j]);fromdigits(w,B)}
antipalindrome(n,{B=10})=palindrome(n,B,1);
Symmetry(s0,{r=0},{leastSize=1},{e=0},{xX=0})={
if(s0==[],return(1));
if(leastSize-1<#s0,
if(!r,
my(c:small, t=(-1)^( (!vecsum(s0)) %2) );
c=0;
while(c++<=#s0\2,
if(s0[c]!=t*s0[1+#s0-c],return(0))
);
return(t)
,
my(a:list,w:small,t:small,q:small);
a=List();
w=leastSize-1;
while(w++<=#s0,
t=0;
while(#s0>=w-1+t++,
q=Symmetry(s0[t..(t+w-1)],0,leastSize,0,0);
if(q&&(!e||(e&&(w==leastSize))),listput(a,[q,w,t]);if(e&&xX,return(Vec(a))));
\\ # By expecting an empty result,
) \\ # finishes as soon as a counter-example
); \\ # is found.
/* * / return(Vec(a)) / * */
/* */ return(a) /* */
)
,
return(0);
)
}
\\ Patterns() is a convenient and useful modification applied to Symmetry.
Patterns(s0,{r=0},{leastSize=2},{e=0},{xX=0})={if(leastSize-1<#s0,if(!r,my(t=(-1)^((!vecsum(s0))%2),lambda,c:small,lookup:small);lambda=[];c=0;while(c++<=#s0\2,if(s0[c]!=t*s0[1+#s0-c],return(0)));return(t),my(a:list,w:small,t:small,q:small);a=List();w=leastSize-1;while(w++<=#s0,t=0;while(#s0>=w-1+t++,lambda=s0[t..(t+w-1)];q=Patterns(lambda,0,leastSize,0,0);if(q&&(!e||(e&&(w==leastSize))),lookup=-1;for(k=1,#a,if(a[k][1]==lambda,lookup+=k+1;break));if(lookup==-1,listput(a,[lambda,List(t)]),listput(a[lookup][2],t));if(e&&xX,return(Vec(a))));));/* * /return(Vec(a))/ * *//* */return(a)/* */ ),return(0);)}
/*EOF*/