##作者:Antti Karttunen(电子邮件:his-firstname.his-surname@gmail.com)#2008年左右和2014年7月20日新的装饰器CachedMatchesFrom0等##(作为一个概念证明,它也可以在Python中工作)##公共领域-请随时使用和改进这些想法#(希望同样开源)Python/Sage库等。#至少:找到一个可以任意存储的合适整数类型#不丢失任何精度的大整数!##完成后,还可以从# https://github.com/karttu/IntSeq/blob/master/src/transforms.scm#到Python,例如RECORD-POS、DISTINCT-POS(使用哈希表而不是向量)#等。##另请参阅:# http://www.luschny.de/blog/The_Unofficial_Guide_to_Coding_for_The_OEIS.html###matching1pos重命名为CachedMatchesFrom0##说:从memotest导入*从数组导入*定义gen_n_items(n,item):对于xrange(n)中的i:产量(项)#与Sage中的CachedFunction大致相同:定义备忘录(有趣):最大内存大小=131#072未填充=0Lmemo=数组('L')定义包装器(n):memsiznow=长度(备忘录)if None==n:return(memo)#用于调试elif n>=memsiznow:新闻大小=最小值(最大内存大小,最大值(n+1,2*memsiznow))memo.extend(gen_n_items(新闻大小-消息大小,未填写))res=备忘录[n]如果(notfilled==res):res=乐趣(n)备忘录[n]=res返回(res)else:返回(res)返回包装器#最初的部分递归实现:#这大致对应于该IntSeq-library中的(MATCHING-POS 10 fun)。def CachedMatchesFrom0_recursive_implementation(有趣):未填充=0Lmemo=数组('L')定义包装器(n):memsiznow=长度(备忘录)if None==n:return(memo)#用于调试elif n>=memsiznow:新闻大小=最大值(n+1,2*memsiznow)memo.extend(gen_n_items(新闻大小-消息大小,未填写))res=备忘录[n]if(notfilled==res):#还没有在备忘录中?if 1==n:#如果调用者询问满足条件的第一个数字,则从n=1开始搜索。i=0else:#否则,从找到满足条件的上一个术语的过去开始搜索#注意:如果以非单调顺序计算术语并且“向前看得太多”,则此堆栈可能溢出:i=1+包装(n-1)#然后开始搜索与条件匹配的下一个正整数:为True时:如果有趣(i):备忘录[n]=i返回(i)else:#继续搜索。。。i=i+1else:return(res)#我们已经记住了这个术语,只需将其返回即可。返回包装器#即使在计算第一个术语a(10000)时,此版本仍然有效#搜索并记忆所有值a(0)。。a(9999)内部,在循环中。#这大致对应于我的IntSeq-library中的(MATCHING-POS 10 fun)。#从整数k开始搜索,结果fun(k)=True,从k=0开始,#找到的第一个值是定义函数的(1)的值。def CachedMatchesFrom0(有趣):未填充=0L备忘录=数组('L',[0])定义包装器(n):memsiznow=长度(备忘录)if None==n:return(memo)#用于调试elif n>=memsiznow:#我们必须为memo-vector分配更多空间。在这里假设#再生成本很高,所以我们正在以成倍增长的规模进行。#(我不确定这是否真的适用于Python-arrays#在这种情况下,为要添加的每个元素调用gen_n_items迭代器):新闻大小=最大值(n+1,2*memsiznow)memo.extend(gen_n_items(新闻大小-消息大小,未填写))um=备忘录[0]if(n<=um):return(memo[n])#之前已经计算过,从memo中获取值。else:#还没有出现在备忘录中?如果0==um:i=-1#备注仍然为空?然后我们从i=0开始搜索。else:i=memo[um]#否则从与条件匹配的最新整数后的一个开始。#然后搜索与条件匹配的下一个正整数:while um<n:#直到我们最终找到第n个匹配项为止。i=i+1if-fun(i):#如果整数i与条件匹配,um=um+1#更新备忘录中最高计算项的索引memo[um]=i#并将i存储到memo-vector中的剧院位置memo[0]=um#更新备忘录的“有效大小”。(此处um=n)。return(i)#将找到的i返回给调用者。返回包装器#此版本大致对应于IntSeq-library中的(MATCHING-POS 1 1 fun):#从整数k开始搜索,结果为fun(k)=True,从k=1开始,#找到的第一个值是定义函数的(1)的值。def CachedMatchesFrom1(有趣):未填充=0Lmemo=数组('L',[0])定义包装器(n):memsiznow=长度(备忘录)if None==n:return(memo)#用于调试elif n>=memsiznow:#我们必须为备忘录向量分配更多的空间。在这里假设#再生成本很高,所以我们正在以成倍增长的规模进行。#(我不确定这是否真的适用于Python-arrays#在这种情况下,为要添加的每个元素调用gen_n_items迭代器):新闻大小=最大值(n+1,2*memsiznow)memo.extend(gen_n_items(新闻大小-消息大小,未填写))um=备忘录[0]if(n<=um):return(memo[n])#之前已经计算过,从memo中获取值。else:#还没有出现在备忘录中?#获取与条件匹配的最新正整数(已被记忆)i=memo[um]#注意,如果um=0,那么memo[0]=0,i也将为0。#然后搜索与条件匹配的下一个正整数:while um<n:#直到我们最终找到第n个匹配项为止。i=i+1if-fun(i):#如果整数i与条件匹配,um=um+1#更新备忘录中计算出的最高术语的索引memo[um]=i#并将i存储到memo-vector中的剧院位置memo[0]=um#更新备忘录的“有效大小”。(此处um=n)。return(i)#将找到的i返回给调用者。返回包装器###########################################################################使用示例####例如,试试fibo(47)。(最后一个适合长!)@已记录定义fibo(n):“Fibonakin luvut,A000045.”如果(n<2):返回(n)else:返回(fibo(n-2)+fibo@已记录定义A001477(n):“”以有趣的方式计算非负整数。“”如果(n<2):返回(n)else:返回(A001477(n-1)+(A001447(n-2))#A224694:对n进行编号,使n^2 AND n=0,其中AND是按位逻辑AND运算符。定义为_A224694(n):“”n满足:n^2 AND n=0吗?“”返回(0==((n*n)&n))@从0缓存匹配定义A224694(n):“”对n进行编号,使n^2 AND n=0,其中AND是按位逻辑AND运算符。“”返回(is_A224694(n))#这是为了测试递归的极限:@从m0_recursive_implementation缓存匹配定义A224694_with_recursive_implementation(n):“”对n进行编号,使n^2 AND n=0,其中AND是按位逻辑AND运算符。“”返回(is_A224694(n))#A213382:数字n,使n^n mod(n+2)=n。定义为_A213382(n):“”“n满足:n^n mod(n+2)=n?”“”#print“调用is_A213382 with n=”,n返回(n==(n**n%(n+2))@缓存的匹配项From1定义A213382(n):返回@从m0_recursive_implementation缓存匹配定义A213382_with_recursive_implementation(n):“”数字n,使n^n mod(n+2)=n“”返回(is_A213382(n))#[A213382_with_recursive_implementation(10-n)for n in range(10)]#用n=1调用is_A213382#用n=2调用is_A213382#用n=3调用is_A213382# ...#用n=53调用is_A213382#调用is_A213382,n=54#用n=55调用is_A213382#[55、49升、37升、31升、19升、16升、13升、7升、4升、1升]# #A213382(无)#数组('L',[0L])#A213382(1)#用n=1调用is_A213382#1升#A213382(5)#用n=2调用is_A213382#用n=3调用is_A213382# ...#调用is_A213382,n=14#用n=15调用is_A213382#用n=16调用is_A213382#16升#A213382(无)#阵列('L',[5L,1L,4L,7L,13L,16L])#>>>[A213382(10-n),n在范围(10)内]#调用n=17的is_A213382#用n=18调用is_A213382#用n=19调用is_A213382#用n=20调用is_A213382#用n=21调用is_A213382# ...#调用n=52的is_A213382#用n=53调用is_A213382#调用n=54的is_A213382#用n=55调用is_A213382#[55升、49升、37升、31升、19升、16升、13升、7升、4升、1升]#>>>[A213382(10-n),n在范围(10)内]#[55升、49升、37升、31升、19升、16升、13升、7升、4升、1升]# >>> # #[A224694(n+1)表示范围(20)内的n]#[0L、2L、4L、8L、10L、12L、16L、18L、24L、26L、32L、34L、36L、40L、44L、48L、50L、56L、64L、66L]#A224694_with_recursive_implementation(无)#数组('L')#>>>[A224694_with_recursive_implementation(10-n)for n in range(10)]#[26、24L、18L、16L、12L、10L、8L、4L、2L、0]#>>>A224694_with_recursive_implementation(无)#阵列('L',[0L,0L,2L,4L,8L,10L,12L,16L,18L,24L,26L])#[A224694_with_recursive_implementation(n+1)for n in range(20)]#[0、2、4L、8L、10L、12L、16L、18L、24L、26L、32L、34L、36L、40L、44L、48L、50L、56L、64L、66L]#注:#A224694(10000)#快速返回691968L#(参见。https://oeis.org/A224694/b224694.txt )#但是#>>>A224694_with_recursive_implementation(10000)#结果:#RuntimeError:cmp中超过了最大递归深度#经过长时间的倾卸,如:#包装器中的文件“memotest.py”第69行#i=1+包装(n-1)#