这个网站是由捐款支持的OEIS基金会.

用户:M.F.Hasler/代表大数字

来自OeisWiki
跳转到:航行,搜索

在一些情况下,例如,当处理以base-N表示的排列或数字的序列时,人们通常希望能够表示大于9的数字(当然,以明确的方式)。在这里,我提出了几个切实可行的解决办法。这也提供了一种用前导零表示数字的方法。

基本问题

在OEIS中,序列被记录为可能有符号整数的列表,用十进制表示法书写,没有前导零。当然,十进制表示法允许以小于9的基数写入整数,但对于以b>9为基数的整数,如果数字以十进制形式写入并只是串联起来,则无法进行明确的解释;例如,“10”可能是一个数字“10”(在某些基数大于10的情况下)或数字“1”后跟数字“0”(在基数13中表示13)。类似地,“111”可以是数字“1”后跟数字“11”或相反的数字,表示1 x 12+11=23或更大的11 x 12+1=133,以12为基数。

众所周知的标准方法是使用大写或小写字母A,B,C。。。为了表示数字10、11、12,…,但由于上述原因,这在OEIS(数据段和b文件)中是不可能的。

另一个问题是由于无法记录“前导零”,例如,无法列出“0123”的排列,甚至连初始项都不能列出。在这种精确的情况下,可以通过将所有数字移动1来避免这个问题,也就是说,列出“1234”的排列,但这并不总是一个有效的解决方案。

不带数字的术语0

一个非常简单的解决方案

我在看序列的时候会考虑到这些因素A247701号仅在非零位数处出现。这是一个非常简单的解决问题的方法:

编码d>9的数字的一种可能是将它们写成(d-9k)*10^k,即9*k<d<9*k+10,即d=10为“10”,d=11为“20”,…,d=18为“90”,然后d=19为“100”,d=20为“200”,等等。

这个解在许多情况下非常方便,特别是当基b=9的极限很快达到时,需要一个广义的表示法,但基b=19超出了实际需要。这种情况经常发生,因为通常情况下,术语的数量会从9个增加到现在!=362880(在许多方面可以认为是小的)到19!=121645100408832000,这已经相当大了,例如,远远超出了数据库未来几年的容量(以字节为单位)。

这也是一个非常自然的解决方案,从这个意义上说,数字10是简单而完全明确地表示为“10”。(当然,要理解的是,数字必须从右向左解码,即首先查找(最右边的)“0”和数字在它前面根据编码方案分组。)

当d=18时,这无疑是可能的最紧凑的表示法,因为很明显,>9的数字不能用单个数字编码,因此至少需要两个数字,而且所提供的解决方案仍然保持在这个最小界限上。

较大数字的替代解决方案

超过d=18(尤其是超过d=27表示为“900”),越来越多的“未使用”数字“0”看起来是在浪费空间。 如果要频繁地对较大的数字进行编码,在现有标准的启发下,有两种可能的解决方案:(1)为每个“转义字符0”保留多个附加数字,或(2)使用一个数字(或多个数字)来确定字符的“宽度”。

复制块大小

对于d>27,避免使用第一种编码方案会出现的大量数字“0”的一种可能性是,在每个额外的“0”中保留两倍的位数。更明确地说,

x0,1<=x<=9,如前所述,表示10到18范围内的数字x+9,
 yx00,0<=y<=9,1<=x<=9,如上所述(x=0仍被禁止),将意味着从19到108的90个可能数字中的一个,
 zzzx000,000<=zzz<=999,表示109到9108(*)

等:如果有L个连续的“0”,则2^(L-1)个字符(十进制的其左边的数字)将被组合在一起。任何其他乘数m>2都可以选择,如果这在给定的情况下更有用的话。

(*)这里没有前导零的问题:如果“扩展宽度”数字是数字中的第一个数字,则不会写入前导0,不会造成歧义,但是如果前面有任何其他数字,则会按照指示将其全宽写入。

(**)必须遵守“0”字符串前面的最后一个数字必须非零的约束,以保持明确的解释。因此,yx的允许值为01,…,09,11,…19,21等,对于zzzx,可以使用0001,…,0009,0011,…,0099,0101,…,0999,1001,…,9989,9991,…,9999。zzz中的“0”不会因为数字的全局从右向左解析而引起歧义。

指定块大小

作为使用“计数标记0”来指示扩展数字的重复块大小/“宽度”的另一种选择,可以使用一个十进制数字来使该大小精确,同样可以通过各种方式:

yx0,其中0<=x<=9表示为“扩展数字”y>=0保留的字符数。

或者x(m)中的x(m)可以表示更多的字符,除了x(m)可以表示更多的数字(w),其中x(m)可以表示更多的字符。

  • 由于数字1..9已经用非扩展表示法表示,y=0可以再次表示10(或0,如果需要),等等。对于x>1,取决于w(x)的公式,y=0可以表示下一个较大的数字,而这个数字不能用较小的x表示(参见下面的示例),除非允许对同一个数字进行多次表示为了使编码和解码更容易。
  • 在这种情况下,y可能有尾随的0而不存在歧义的风险。
  • x=9(或x=0)可用于切换到进一步的扩展编码方案,其中y不仅表示数字的值,而且还指定了被视为扩展数字一部分的字符数。

示例

  • w(x)=x,(“00”;“010”,“110”,“210”,…,“910”;“0020”,“0120”,…,“9920”;“00030”99930“;…”999999999 0“)
21,120;10,119;10,119;10,120…可以代表。。1119年。。。1111111119≈1.1e9)。
我们可以检查“代码”中的前导零消失这一事实,并不会给表示数字带来问题:“纯文本”(原始数字)中的前导零是不相关的,并且在知道应该存在的位数的情况下,可以重建前导非零扩展数字代码中可能缺少的“0”。
前导零不能这样编码。如果需要,可以将“010”保留为零,并将大于9的所有数字的代码移动一位。
  • 当w(x)=2^x时,“00”将无效,不能用于表示0,因为2^0=1位数应位于该值的左侧。
(“0010”。”9910“;“000020”。”999920“)可以表示数字(10。。109;110。。10109)等。

比较分析

后一种编码方案似乎比“重复块大小”编码方案更可取,因为它允许以更灵活和可调整的方式确定“扩展数字”中的字符数,而不需要在2位大小写之外需要更多的空间,也不需要排除y中的尾随0。

根据应用的不同,on应该在后一个方案(方便地选择w(x))和第一个也是最简单的方案之间进行选择,可能使用“00”的固定约定来引入进一步的扩展方案(例如后一个方案用0替换为“00”)。

编码数字0

前面所有的方案都使用数字“0”作为“转义符”来引入多字符数字编码,因此它不能单独用于数字0的编码。通常,将所有数字移一位(例如,列出“1234”而不是“0123”的排列)是不可取的。

在这种情况下,最自然的解决方案似乎是使用上面提出的d=10的代码来编码数字0,并将剩余的代码移动一位,例如在第一个方案中,“10”将编码d=0,“11”将编码d=10,“12”将编码d=11等。

工具书类

另请参见

作者身份

本页的第一个版本是由M、 哈斯勒2014年10月5日11:09(UTC-400)

M、 哈斯勒,用户:M.F.Hasler/代表大数字.— 来自在线整数序列百科全书®Wiki(OEIS®Wiki)。[https://oeis.org/wiki/User:M.\u F.\u Hasler/representating_large_数字]