本网站由以下捐款支持:OEIS基金会.

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

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

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

基本问题

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

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

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

无数字0的术语

一个非常简单的解决方案

我在研究序列时考虑到了这些因素1974年2月其中只出现非零数字。在这种情况下,针对所宣布的问题存在一个极其简单的解决方案:

将数字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(*)范围内的数字

etc.:如果有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>0从字面上给出了字符的数量(0在这里没有多大意义,除了00可以表示数字0),要么通过一些适当的公式为y保留另一个数量w(x)的(前面的)字符,例如w(x)=m*x或w(x)=m^x(其中x=0也有意义),其中m=2或更多。

  • 由于数字1..9已经用非趋势表示法表示,因此y=0可以再次表示10(或零,如果需要的话)等。对于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”;…“9999999 0”)
可以表示数字(0;10,11,12,…,19;20,21,…,119;120..1119;…11111111 9≈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,并将其余代码移位1,例如,在第一种方案中,“10”将编码数字d=0,“11”将编码d=10,“12”将编码d=11,等等。

工具书类

另请参见

作者身份

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

M.F.Hasler,用户:M._F._Hasler/Representing_large_digits.-来自整数序列在线百科全书®(OEIS®)wiki。可在https://oeis.org/wiki/用户:M._F._Hasler/Representing_large_digits