发件人:“Tim Peters”关于序列A005421、A005245、A005520-----------------------------------------我正在致力于Python 2.4的发布,现在和再次随机选择一个“更多”序列作为有趣的来源实施压力测试序列A005421如下:>>%S A005421 1,1,1,1,2,3,2,6,6,7,14,16,20,34,42,56,84108152214295,>%电话A005421 3985697631094147520582878392954937691050114707,>%U A00542120476,28226,39287,54817,75619,105584,146910,203294,283764,394437,547485,7638211061367年>%N A005421复杂性N的数量。>%D A005421 D.A.Rawsthorne,需要多少个1?,小谎。夸脱。27(1989), 14-17. ....>Eric Weisstein的页面http://mathworld.wolfram.com/IntegerComplexity.html给出了足够的信息来理解它:整数n的复杂度是只使用加法、乘法和括号表示它。这不允许1的并置形成较大的整数,因此,对于例子,2 = 1+1具有复杂性2,但11没有(“粘贴在一起”两个1不是允许的操作)。该页上还有其他示例。这是用于计算此值的Python程序。#斯隆A005421。定义驱动器(n、n2全部、sofar):断言n>0如果n==1:结果=n2全部[1]其他:#选择一个点,然后选择+或*。#“Pick a spot”表示选择表达式树的根,#i 1在左边的子项中,n-i 1在右边的子项中。#由于+和*是可交换的,因此只有#需要考虑拆分——拆分(i,n-i)收益率#与拆分(n-i,i)相同的总和和乘积。#Trickier:我们不需要考虑所有可能的整数#由i 1组成,我们只需要考虑带有#复杂性i.如果x+y或x*y具有复杂性n,#x必须具有复杂性i和y复杂性n-i(否则#相同的总和或乘积可以用少于n个1的数量产生)。#OTOH,如果x具有复杂性i和y n-i,则x+y或x*y可能具有#复杂性<n。例如,c(1)=1和c(5)=5,但c(1*5)#c(1+5)都是5,而不是6。结果=set()push=结果添加对于范围(1,n//2+1)中的i:对于n2all[i]中的x:对于n2all[n-i]中的y:对于x+y中的z,x*y:如果z不在sofar中:推(z)返回结果定义main():#将int n映射到复杂性n的int k集合。这意味着k#表示至少需要n个1,使用+*和parens。n2all={1:集合([1])}#到目前为止找到的所有int的集合。sofar=设置([1])对于范围(1,50)内的n:此=驱动器(n、n2全部、sofar)n2all[n]=这个至此|=print n,len(this),lenmain()"""1 1 1个2 1 23 1 34 1 45 2 66 3 97 2 118 6 179 6 2310 7 3011 14 4412 16 6013 20 8014 34 11415 42 15616 56 21217 84 29618 108 40419 152 55620 214 77021 295 106522 398 146323 569 203224 763 279525 1094 388926 1475 536427 2058 742228 2878 1030029 3929 1422930 5493 1972231 7669 2739132 10501 3789233 14707 5259934 20476 7307535 28226 10130136 39287 14058837 54817 19540538 75619 27102439 105584 37660840 146910 52351841 203294 72681242 283764 101057643 394437 140501344 547485 195249845 763821 271631946 1061367 377768647 1476067 525375348 2057708 731146149 2861449 10172910"""