################################################################################(* NJAS在seqfan列表上请求的Maple程序https://oeis.org/A038219 ; WFL于2019年5月25日修订的版本成本计算存储O(n),运行时间O(n m);推测后缀m和序列n的长度要求2<n<2^(m+1);***Apple iMac性能:时间50+10秒,空间200 Mb,n<1048576;统计数据与哑时间O(n^2 log n)程序一致,n≤50000;电动势[n]中的一次性序列保持,n=0时为哨兵;*) 重新启动;lhi:=21;#后缀长度绑定---USER!!nhi:=2^(lhi-1)-1;#序列长度---USER!!如果为true,则#初始化序列循环pow2:=数组(0..lhi+1,[seq(2^m,m=0.lhi+1)]);#功率2[m]=2^memf:=数组(0..nhi,[seq(-1,i=0..nhi]);#顺序(可选)电动势[0]:=-1;电动势[1]:=0;电动势[2]:=1;电动势[3]:=0;#预设术语suff:=2;#当前后缀010作为二进制整数ssucc:=数组(0..powe2[lhi+1]-1,[seq(-1,i=0..powe2[lhi+1]-1)]);#suc[2^m+s]=位后继后缀s长度m#在最近一次出现时,-1表示未设置成功[2+0]:=1;成功[2+1]:=0;成功[4+1]:=0;#后缀后继者0(1),1(0),01(0)图1:n:=3;#执行序列循环:索引nlmax:=0;#先前最大后缀长度m而n<nhi和lmax<lhi-do n:=n+1;m:=lhi;#当前后缀长度当suc[pow2[m]+(suff-mod-pow2[m])]<0dom:=m-1od时;lmax:=最大值(lmax,m);emfn:=1-suc[pow2[m]+(suff-mod-pow2[m])];k从min(lhi,n-1)乘以-1到1dosuc[pow2[k]+(suff-mod-pow2[k]):=emfn-od;suff:=(suff*2+emfn)mod pow2[lhi];#下一个后缀emf[n]:=emfn;#记录下一学期(可选)日期:如果lmax=lhi,则#报告中止打印(“超出后缀绑定”)elif n<>nhi那么打印(“序列长度不正确”)else打印(“序列完成”)fi;#k因子单词的频率(可选)k_hi:=4;对于k从0到khi-do打印(k);打印(转换([seq([seq[i+j-1],j=1..k)],i=1.nhi+1-k)],多集),集))od:(* 0{[[], 1048576]}1{[[0],524175],[[1], 524400]}2{[[0, 0], 261978],[[0, 1], 262197],[[1, 0], 262196],[[1, 1], 262203]}{[[0, 0, 0], 130918],[[0, 0, 1], 131060],[[0, 1, 0], 131059],[[0, 1, 1], 131137],[[1, 0, 0], 131060],[[1, 0, 1], 131136],[[1, 1, 0], 131137],[[1, 1, 1], 131066]}4{[[0, 0, 0, 0], 65440],[[0, 0, 0, 1], 65478],[[0,0,1,0],65512],[[0, 0, 1, 1], 65548],[[0, 1, 0, 0], 65495],[[0, 1, 0, 1], 65564],[[0, 1, 1, 0], 65586],[[0, 1, 1, 1], 65551],[[1, 0, 0, 0], 65478],[[1, 0, 0, 1], 65582],[[1, 0, 1, 0], 65546],[[1, 0, 1, 1], 65589],[[1, 1, 0, 0], 65565],[[1,1,0,1],65572],[[1, 1, 1, 0], 65551],[[1, 1, 1, 1], 65515]}*) ################################################################################(* NJAS在seqfan列表上请求的Maple程序https://oeis.org/A038219 ; WFL于2019年5月25日修订的版本成本计算存储O(n),运行时间O(n m);猜测后缀m和序列n的长度需要2<n<2^(m+1);***苹果iMac性能:时间50+10秒,空间200 Mb,适用于n<1048576;统计数据与哑时间O(n^2 log n)程序一致,n≤50000;电动势[n]中的一次性序列保持,n=0时为哨兵;*) 重新启动;lhi:=21;#后缀长度绑定---USER!!nhi:=2^(lhi-1)-1;#序列长度---USER!!inf:=0;sup:=nhi;#初始化统计信息(可选)lsubl:=数组([seq(m,m=1..lhi)]):#后缀长度mnctsub:=数组([seq(inf,m=1..lhi)]):#count n给定mnlosubl:=数组([seq(sup,m=1..lhi)]):#min n给定mnhisubl:=数组([seq(inf,m=1..lhi)]):#max n给定m如果为true,则#初始化序列循环pow2:=数组(0..lhi+1,[seq(2^m,m=0..lhi+1]);#功率2[m]=2^memf:=数组(0..nhi,[seq(-1,i=0..nhi]);#顺序(可选)电动势[0]:=-1;电动势[1]:=0;电动势[2]:=1;电动势[3]:=0;#预设术语suff:=2;#当前后缀010为二进制整数s成功:=数组(0..pow2[lhi+1]-1,[seq(-1,i=0..pow2[lhi+1]-1)]);#suc[2^m+s]=位后继后缀s长度m#在最近一次出现时,-1表示未设置成功[2+0]:=1;成功[2+1]:=0;成功[4+1]:=0;#后缀后继者0(1),1(0),01(0)图1:n:=3;#执行序列循环:索引nlmax:=0;#先前最大后缀长度m而n<nhi和lmax<lhi-do n:=n+1;m:=lhi;#当前后缀长度当suc[pow2[m]+(suff-mod-pow2[m])]<0dom:=m-1od时;lmax:=最大值(lmax,m);emfn:=1-suc[pow2[m]+(suff-mod-pow2[m])];k从min(lhi,n-1)乘以-1到1dosuc[pow2[k]+(suff-mod-pow2[k]):=emfn-od;suff:=(suff*2+emfn)mod pow2[lhi];#下一个后缀emf[n]:=emfn;#记录下一学期(可选)nlosubl[m]:=分钟(nlosubl[m],n);#更新统计信息(可选)nhisubl[m]:=最大值(nhisubl[m],n);nctsub[m]:=nctsub[m]+1;日期:如果lmax=lhi,则#报告中止打印(“超出后缀绑定”)那么elif n<>nhi打印(“序列长度不正确”)else打印(“序列完成”)fi;转换(lsubl,列表);#打印统计信息(可选)转换(nctsub,list);convert(nlosul,列表);转换(nhisubl,列表);(对于m>lhi-3?#,*#计数为部分[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21] [3, 5, 9, 17, 33, 65, 129, 257, 513, 1025, 2049, 4097, 8193, 16385, 32769, 65537, 131073, 262145, 519887, 4381, 0] [4, 6, 10, 19, 36, 40, 117, 188, 416, 759, 1911, 3979, 4176, 10349, 21962, 49207, 128749, 155515, 425847, 811728, 1048575] [7, 16, 25, 63, 105, 231, 459, 884, 1803, 2684, 6713, 10914, 29159, 62429, 81393, 237614, 512857, 927085, 1048575, 1048493, 0] *) ################################################################################(* 尊敬的Neil:,请参阅所附的E-M序列改进算法的Maple演示。时间~O(n log n)算术运算:1分钟内一百万项。如果(稀疏的)文档证明不足,请告诉我!我避免在过程中封装生成器,因为在实践中,一个认真的用户可能需要访问其内部。确定m和n边界值的必要性可以是以进一步复杂化为代价进行规避。可能可以将时间提高到O(n loglog n)左右,依靠更详细的分析和/或未经证实的推测;但目前看来,这似乎涉及给百合花镀金。。。恭喜你,弗雷德[EM_demo.txt]2019年5月26日*) ################################################################################