最小复杂序列
快速链接: MCS源代码 许可证(知识共享署名-非商业4.0国际版)
这是我所说的整数序列的列表“经典”定义。这些几乎包括所有的数字序列为古代文化所知(最显著的例外是数字)。还有许多其他的方法也同样简单定义。示例包括:
- 自然数:0,1,2,3,4,5,6,7。。。
- 方块:0、1、4、9、16、25、36、49。。。(以及其他有“形象化”的解释)
- 2:1、2、4、8、16、32、64……的幂。。。
- 斐波那契数列:0,1,1,2,3,5,8,13。。。
- 阶乘:1,1,2,6,24,120,720。。。
本页的主题是一类更广泛的递归关系比2第-阶线性递归页面,但不够宽,无法包含上的重复公式我的加速序列页面.
我的综合序列页面范围更广指向其他子类别上的许多其他专门页面的指针序列。
目录
目录中的序列类型
序列编号系统的详细说明
C源代码
表中使用的排序
主表
每页底部都有主表的索引。
统计
脚注
序列定义的类型
使用了以下大类序列定义:
直接:每个术语A类N个直接根据公式计算涉及N个但不取决于顺序。
(如果定义为E类N个=2N个.)
一阶递归1:初始期限后A类0,后续条款A类N个+1根据公式定义A类N个(可能还涉及N个).
(如果定义为F类0=1,F类N个=N个 F类N个-1和偶数,如果定义为E类0=0,E类N个=2+E类N个-1注意,相同的序列可以既有直接定义又有重复定义。)
二阶递归1:在两个初始条款之后A类0和A类1,后续条款A类N个+1定义为公式涉及A类N个-1,也可能A类N个和/或N个.
(这一类包括斐波那契数列,F类0=0,F类1=1,F类无+1=F类N个+F类N个-1。它包括所有2第-描述的顺序线性递归序列在这里但是还有很多其他的,比如MCS54400型,这是非线性的因为它的公式有一个不适用N个术语。).
三阶递归1:在三个初始条款之后A类0,A类1和A类2,后续条款A类无+1根据公式涉及A类N个-2,也可能A类N个,A类N个-1,和/或N个.
所有公式都是包含常数系数的项的总和乘以N个零或更多之前的条款。此表显示了使用的组合:
|
最初的
条款 | | 系数
| | | 1 N个 N个2 N个三
|
A类0 | | A类N个 不适用N个
|
A类1 | | A类N个-1 不适用N个-1
|
A类2 | | A类N个-2
| |
直接公式只使用第一行;一阶递推公式使用前两行,依此类推。
霍拉达姆层序
一些序列属于一个更窄定义的类别由霍拉达姆研究并具有一些有趣的特性。他们是更充分地讨论了我的线性递归页码:霍拉达姆序列.
卢卡斯序列
第2个第-订单卢卡斯数列s是另一个狭义的线性递归关系的范畴。再次,请参阅我的线性复发页面:卢卡斯序列.
序列ID号
每个序列定义都有一个标识号唯一指定初始项(如果有)和公式。所有ID数字以字母开头MCS公司(对于最小复杂序列)后跟一个或多个十进制数字。十进制数字由以下步骤:
1.序列类型、初始值(如需要)和系数编码为领域,通过使用系数直接作为字段值,或使用转换表确保“默认”系数的字段值为0。
2.字段被哈夫曼编码为二进制字符串。
3.将二进制字符串连接成单个位字符串。
4.位字符串被修改为截断的 位字符串.
5.截断的位字符串被视为单个正整数;这是序列 数和十进制表示将此整数的MCS公司生成序列ID号。
步骤1:字段
第一个字段给出了上面定义的序列类型:4用于直接,3对1标准-订单重复,2对2第-订单重复和1代表3第个-订单重复。在此之后,有几个系数的更多字段,按此处显示的顺序:
对于直接定义:K(K),C类N个,C类N个2,C类N个三
对于1标准-订单重复:K(K),C类A类N个,C类N个,C类不适用N个,C类N个2,C类N个三,A类0
对于2第-订单重复:K(K),C类A类N个,C类N个,C类A类N个-1,C类不适用N个,C类N个2,C类N个三,C类不适用N个-1,天1,A类0
对于3第个-订单重复:K(K),C类A类N个,C类N个,C类A类N个-1,C类不适用N个,C类N个2,C类A类N个-2,C类不适用N个-1,C类N个三,天2,天1,A类0
哪里天1=A类1-A类0-1和天2=A类2-A类1-1
第二步:哈夫曼编码
然后将所有字段转换为一个或多个二进制数字根据下表:
0 → 0
1 → 100
2 → 1010
-2 → 10110
4个→ 101110
-4个→ 1011110
-5 → 1011111
-1 → 110
3 → 1110
5 → 111100
6 → 1111010
-6 → 1111011
-3 → 111110
7 → 111111000
8 → 111111001
x→ 111111 01x(用于未来扩展)
-7 → 111111100
-8 → 111111101
x个→ 11111111 x(用于未来扩展)
然后,将经过编码的字段串联起来,形成位字符串。该表由正常的哈夫曼统计部门生成基于所有序列中系数值的频率复杂性得分(见下文)为9或更低的定义;然后为了减少长度,尽可能减少长度平均总比特串长度;然后重新排序,以便较短(更常见)的位字符串以0结尾,因此较大系数映射到较大的比特串。
步骤3-4:截断的位字符串和序列号
要生成截断的位字符串,首先添加一个初始的1(因为否则,在转换位字符串时,初始0将丢失到十进制整数)。然后删除任何尾随的0(没有由于如下所述,在总是假设结束,并允许未来扩展)。然后是单曲尾部1被删除(同样不会丢失信息,因为此时,我们知道至少有一个尾随1)。位字符串然后转换为十进制,就像它是二进制整数一样。"MCS公司"后跟这个十进制数的是序列ID号。没有零添加;序列号的位数可变。在一般来说,定义更简单的序列将具有更小的序列数字。
未来扩张
对于序列生成器的未来扩展,序列类型为其他未使用1到4(这意味着当前没有以10开头的位字符串,对应于介于2N个和3×2N个-1为所有人N个; 加上其他较小的范围定义类似)。这为定义新的序列类型提供了空间和公式,而不必使用长序列ID号。这些新的序列类型可以使用任何编码,甚至放弃接下来几段中给出的要求,太长了因为所有0的位字符串仍然未定义(因为它会导致0或空序列号)。
可以在现有系数的末尾添加其他字段列表。例如N个4可以添加术语序列具有C类N个4系数为0。任何新字段和相应的公式项将用以下公式定义兼容性。(这里有一个例子:假设已经决定允许系数AN个成为一个分数。这需要一个新的“分母C类A类N个“术语。其有用值为正整数;值1是没有影响的值。所以,1英寸该系数将被编码为字段值0;越高值2、3、4、5。。。可以编码为1、-1、2、3等。为了最大限度地利用哈夫曼油田长度。)因为哈夫曼表映射为0→0和尾随的0是在转换为十进制序列ID之前丢弃,很容易确保可以添加任意数量的额外0字段,而不会影响结果序列ID号。即使在假设之后N个4和“分母C类A类N个“添加了术语,所有以前定义的序列仍将具有相同的ID号。
此外,对于任何新字段,可以使用不同的Huffman表或者扩展甚至可以使用非哈夫曼类型的编码,只要当前定义的所有序列号都会导致当前定义的序列。(例如,假设决定常数,N个,N个2和N个三每个术语都应该有一个可选因子-1N个在这种情况下,最好的方法是添加4个字段,每个字段正好1位宽(或单个字段为4位)。对于向后兼容性,位值0表示没有因子-1N个; 所有序列号都将被解释为在位字符串的末尾有这个额外的4位。)
根据定义,当以十进制表示,如MCS027。这些用于手动指定的序列号,如Sloane数据库中的序列号(除仍然没有固定数量的数字)。因此,为了找出MCS027或MCS0143的定义,您必须查看数据库。(目前不存在这样的数据库,但它是预计这些将用于附加注释和交叉引用,例如记录多个不同的序列的等价定义;下面是一个示例。)
笔记
尽管如此,序列号不受评分系统的影响计分系统影响主菜单中列出的顺序表。然而,系数之间存在大致的相关性评分系统中的值权重及其哈夫曼符号长度。
别名
一些序列显示为多个序列号-初始大号打印的序列号,后跟“(别名…)”其他序列号。别名代表不同的公式创建相同序列的。下面是两个定义的例子被视为别名的:
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, ...
220万加元:A类N个=N个(得分:1)
-1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, ...
MCS886型:A类N个=N个-1(得分:2)
这些序列被认为是等价的,因为它们仅在以下方面有所不同MCS886开头的首字母-1。在主表中,它们是两者都列在下面220万加元.未选择编号MCS220因为220小于886,但因为MCS220的复杂性较低得分(1比2)。
为了匹配别名,任何初始的-1、0或1术语都是忽略,但所有其他术语都很重要,包括-1、0或1发生在2级或2级以上的第一项之后的项。
大多数情况下,别名的序列号会大不相同,如MCS220和MCS886的示例所示。然而,在极少数情况下序列号非常接近(如MCS860675和MCS860676系列卢卡斯数字的两个版本差异仅为首字母“1”)。另一个好奇(这很容易如果您查看编码方案,请参见220万加元=N个,MCS440系列=N个2和MCS880型=N个三虽然这里没有列出,但MCS110是N个0.
示例
斐波那契数具有二阶递归定义:A类0=0;A类1=1;A类N个+1=A类N个+A类N个-1. The需要编码的系数是:序列类型=2;K(K)=0;C类A类N个=1;C类N个=0;C类A类N个-1=1;C类不适用N个=0;C类N个2=0;C类N个三=0;C类不适用N个-1=0;A类1-A类0-1=0;A类0=0。因此,编码之前的字段是:2,0, 1, 0, 1, 0, 0, 0, 0, 0, 0. 根据哈夫曼表,这将成为位字符串1.1010.0.100.0.100.0.0.0.0.0(添加初始1后)。然后去掉尾随的零,然后单个尾随的1是下降,达到1.10100.100.0或1101001000;这已转换为十进制,给出值840。所以,斐波那契的这个定义编号为序列号MCS456。
请注意,有些序列有多个定义。例如自然数可以定义为直接序列:A类N个=N个.使用此定义,位字符串为1.10110.0.100.0,序列为编号为MCS108。然而,自然数也可以由1标准-订单重复A类0=0;A类N个+1=A类N个+ 1. 通过这个定义,位字符串为1.1110.100.100.0.0.0,序列号码是MCS244。正如您所料,第一个定义具有较低的复杂度得分,如主表所示。
复杂性得分
每个序列定义都有一个复杂性得分基于项的数量及其系数的大小。基本思想是取公式中的项数,再加上初始项加上任何系数(系数1不计数)。过了一会儿,我把分数计算得有点复杂了更好地处理2第-和3第个-排序递归公式。
有关其工作原理的示例,请浏览下表搜索“分数:3”等。
主表包括那些复杂度较高的序列至5。
高效实施
我已经编写了一个高效的搜索引擎来查找MCS序列匹配给定的查询,结果按复杂性得分排序。这个源代码如下:
麦克斯芬德。c(c)
rpm类型。小时
整型128.c
整数128.h
类型_s16.h
类型_s32.h
类型_s64.h
构建说明
这些说明适用于UNIX、Linux或MacOS(使用终端或外壳窗口)。
将每个源文件保存在计算机上,然后删除".txt文件“从每个源文件名称的末尾开始。将它们到如下设置的目录中。的名称目录“include”很重要,但您可以为“开发”和“mcs”(如果您愿意):
发展包括rpm类型.h整型128.c整数128.h类型_s16.h类型_s32.h类型_s64.hmcs公司麦克斯芬德。c(c)
然后从内部开发/mcs目录中,使用以下命令:
g++-c-m64/包括/int128.c-o int128.og++-m64-I./包括mcsfind.c-lm int128.o-o mcsfind
如果编译成功,您应该能够执行MCS搜索方式如下:
$时间/mcsfind-w1 2 3 5 92, 3, 5, 9, 17, 33, 65, 129, 257, 513, 1025, 2049, 4097, 8193, 16385,32769, 65537, 131073, 262145, 524289, 1048577, 2097153, 4194305,8388609, 16777217, ...MCS252546:A[0]=2;A[N]=2A[N-1]-1(分数:4)1, 2, 3, 5, 9, 15, 25, 43, 73, 123, 209, 355, 601, 1019, 1729, 2931,4969, 8427, 14289, 24227, 41081, 69659, 118113, 200275, 339593,575819, 976369, ...MCS802976:A[0]=1;A[1]=2;A[2]=3;A[N]=A[N-1]+2A[N-3](得分:5分)1, 1, 2, 3, 5, 9, 18, 39, 89, 209, 498, 1195, 2877, 6937, 16738,40399、97521、235425、568354、1372115、3312565、7997225、19306994,46611191, 112529353, ...MCS6904326:A[0]=1;A[1]=1;A[K+1]=2A[K]+A[K-1]-K(得分:5) 实际0m0.008s用户0m0.006s系统0米0.002秒$
这个麦克斯芬德命令有许多选项,并包含内置帮助。收件人查看内置帮助,使用命令./mcsfind--帮助
性能
使用--report-all和-n选项,以及厕所中的工具UNIX,可以测量mc查找生成这个N个“最简单”的序列。例如,命令:
时间mcs-ls20--report-all-n10000 | wc
可能会证明这一点麦克斯芬德用了0.326秒生成10000序列。在下表中,我测量了序列数,以及所用的时间,对于-最小二乘法选项,其中设置上限分数在所有的生成的序列。示例命令为:
时间mcs--report-all-ls8|wc
|
最高得分 | n个 | 时间 | 序列/秒
| 三 | 73 | 0.180万 | 405 | 4 | 328 | 0.112秒 | 2929 | 5 | 1316 | 0.161秒 | 8174 | 6 | 4905 | 0.204秒 | 24040 | 7 | 17278 | 0.567秒 | 30470 | 8 | 58170 | 1.308秒 | 44470 | 9 | 265303 | 6.605秒 | 40170 | 10 | 866247 | 17.398秒 | 49790 | 11 | 1805961 | 43.129秒 | 41870 | 12 | 9727114 | 196.153秒 | 49590 | 13 | 24867423 | 555.400秒 | 44770 | 14 | 73177857 | 1447.398秒 | 50560 | 15 | 73177857 | |
| 16 | 242924041 | 4938.383秒 | 49190 | |
所有测试都在2.16 GHz Nehalem Xeon工作站上运行,但当运行奇数条目时,工作站更加繁忙这些是序列/秒列。我希望如此任何速度为2 GHz或更快的CPU都不会有问题或在几秒钟或更长时间内超过40000个序列/秒。
还要注意,最高得分为15的结果与16.这是评分算法和系数限制的结果震级;没有得分在范围内的序列(14..15].
表中使用的排序
我使用N.J.A.Sloane最初确定的订单[1].
这里的序列是按字典顺序显示的,好像是负号符号和任何前导的-1、0或1术语均被忽略。例如,“1,-1,-2, 1, 6, 5, -6, ...“被视为开始”2、1、6、5、6。。。".
特别注意,任何别名(请参见在上面)是被认为是相同的,并按原样列在一起在斯隆的书中([1]和[2]).
。转到第2页. . .最后一页(第30页)
快速索引:
序列开始2,0,。。。
序列开始2、1,。。。
起始序列2,2,0;2,2,1,... ; 等。
开始于2,2,4,…的序列;2,2,5,... ; 等。
开始于2,3,0…的序列;2,3,1,... ; 等。
开始于2,3,4…的序列;2,3,5,... ; 等。
序列开始于2、4、,。。。
序列开始于2,5;2,6,... 和2,7,。。。
序列开始于2,8;2,9,... ; 等。
序列开始3,0;3,1,... ; 等。
序列开始于3,4;3,5,... ; 等。
序列开始于3,8;3,9;等。
序列开始4,0;4,1,... ; 等。
序列开始4、6、;4,7,... ; 等。
序列开始5,。。。
序列开始6;7,... ; 等。
此页面是用“令人尴尬的可读性”标记语言编写的右侧TF,部分章节上次更新时间为2024年3月2日。 第30节