/************************************************************************ 程序:自相关范围EIS条目:%N A005434长度为N的相关。该程序计算[Guibas,Odlyzko 1981]的kappa序列这里称为s(n),即自相关函数的范围对于长度n的单词,二进制单词给出的范围与较大的相同字母[Guibas,Odlyzko 1981,Thm 5.1]。下界(偏s(n)的count)是具有简单递归的序列g(n)。g(n)=和{0<=k0和g(0)=1。序列h(n)给出了上界对于n>0和h(0)=1,h(n)=2和{0<=k<2n/3}h(k)。阿希姆·弗拉门坎普认为G(n)是一个上限。G(n)=2和{0<=k0和G(0)=1。定理:[Guibas,Odlyzko 1981,Thm 6.1]g(n)<=s(n)<=h(n)这意味着1/(2*ln(2))*ln1/(2*ln(2))=0.72134752 1/(2%ln(1.5))=1.23315173推测:【弗拉门坎普1984年】g(n)<=s(n)<=g(n)这意味着ln(s(n))=1/(2*ln(2))*ln(n)^2+O(ln(n))表:n 1 2 3 4 5 6 7 9 10 11 13 14 15 16 17 18 20 21 22 24 25电话:1 2 3 4 6 8 10 13 17 21 27 30 37 47 57 62 75 87 102 116 135 180 194 220克(n)1 1 3 3 5 5 7 10 13 13 18 23 30 37 47 57 70G(n)2 2 6 61010 22 22 34 54 74 74118118162 230 298 298 406 406 514电话设c(k)=ln(s(k))/ln(k)^2k总和s(i)s(k)c(k)2 i<=k 3 2 1.4426954 10 4 0.7213488 47 13 0.59317816 345 62 0.53688132 4132 479 0.51382364 81137 5651 0.499505128 2581347 105413 0.491273256 134363131 3140766 0.486519512 11680244730 154546957 0.4845221024 1735856893587 12851613139 0.48447525 1609 220 0.52056250 26585 2249 0.504331100 712107 35200 0.493635200 31043203 887146 0.487877400 2242057514 36367661 0.484967800 274557525473 2502703116 0.484303125 2581347 95457 0.491855250 116394821 2778997 0.486694500 9938264716 134123964 0.4845581000 1449582463459 10949207362 0.48445096 579093 29604 0.494193192 24515676 723768 0.488119384 1717635518 28836089 0.485091768 203765388274 1922204117 0.484295我计算了n=1..1025时的s(n)。对于这些值c(k)>=c(2k)c(k)>=c(2k+1)有效。但这距离Guibas和Odlyzko的射程很远。!!! 这是一个小数字的效果!!!序列g(n)=g_1/2(n)作为s(n)的下界。对于较小的值,g(n)/s(n)似乎会得到0,但实际上我们推测它将在极限中得到1。设c(k)=ln(g(k))/ln(k)^2k克(k)c(k)1 1 --2 1 04 2 0.3606748 5 0.37220416 18 0.37599632 101 0.38423164 914 0.394178128 13669 0.404503256 346002 0.414784512 15125861 0.4248031024 1160259474 0.4344212048 158179790181 0.4435724096 38738590246802 0.4522338192 17197434971491685 0.46040816384 13946948553384470418 0.46811532768 20801852501722154798437 0.47537865536 57394092679599617426401170 0.482227131072 294440200461527865557589036389 0.488689262144 2821322906713566368577851632986002 0.494791524288 50696230714615530782170397980860222821 0.5005601048576 1714436281238833563429247726066516726196114 0.5060212097152 109468016758840716037232125004455181509123771749 0.5111954194304 13235341870130346943270413920397922419167756292269970 0.5161058388608 3038154089380384403189378033688960310709428246395156303205 0.520770设c(k)=ln(G(k))/ln(k)^2k G(k)c(k)1 2 --2 2 1.4427004 6 0.9323288 22 0.71484416 118 0.62059732 1046 0.57884864 15702 0.558590128 399190 0.547833256 17449814 0.542289512 1336408406 0.5399551024 181971731798 0.5396392048 44543346365782 0.5405974096 19775048447292758 0.5423588192 16041676322957890902 0.54462616384 23933078568108290692438 0.54720432768 66046901446088494993855830 0.54996665536 338861259594750332197920265558 0.552826131072 3246951705295431411825013405865302 0.555726262144 58340594755827510290776270175897736534 0.558625524288 1972776438659273563037657824675546034165078 0.5614971048576 125952271100667647110015343508146950147805631830 0.5643232097152 15227345601001005831201353121509502093685898136081750 0.5670904194304 3495266605472441219429226674304715303240299252189429585238 0.5697918388608 1526923948378492639896463764987834122332457857439516072961463638 0.572420g(q,s,n)的近似值:和g(q,s,n)=s和{0<=k#定义M 1030#定义无符号int无符号d[M],j[M];双重计数[M];#如果为0#定义Put if(n<10){int i;for(i=1;i<=h;i++)putchar(d[i]+'0');putchar/*d[i]是两位之间的距离*//*构造(a):a=0;对于(i=1;i<=h;i++)a=(2*a+1)<<(d[i]-1)*/#其他#定义Put#结尾void number_of_different(无符号最大值){ 无符号h,n,k;#定义可除(d[k+1]==1||!(d[k]%d[k+1])对于(k=最大值;k>=0;k--)计数[k]=0;n=0;h=0;j[0]=0;用于(;){ h++;d[h]=1;j[h]=++n;计数[n]+=1;卖出;while(n2) {k=h-2;做{如果(j[k]==n&&可整除)转到有效;}而(--k>0);} j[h]+=2;d[h]+=1;n++;对于(k=h-1;k>0;k--)如果(j[k]==n-2)转到有效;计数[n]+=1;卖出;} 有效期:做{而(j[h]==n--)如果(--h==0)返回;j[h]-=2;d[h]-=1;}而(j[h-1]==n&&d[h]==1);} } #不可分割的int main(int argc,char**argv){ 无符号max,k;双倍总计=0;如果(argc>1){如果(1!=扫描(argv[1],“%u”,最大值(&max))return fprintf(stderr,“非法参数:无数字%s\n”,argv[1]),2;} 其他{ printf(“二进制字的自相关范围。\n有多少个字母?”);扫描(“%u”,&max);} 如果(最大值>M-1)return fprintf(stderr,“单词太长。最多%u个字母。\n”,M-1),1;不同数量(最大);对于(k=1;k<=最大值;k++){ printf(“%5d%12.0lf\n”,k,计数[k]);总数+=计数[k];} printf(“总计%.0lf\n”,总计);返回0;}