W

威尔·尼科尔斯

二进制编码素数签名

素数签名是描述一个数的素数因式分解的一种方法。例如,28的素数因式分解是22可以抽象成7个p2(其中p是不同的素数)或p12p2(其中p1p2是不同的素数。)

二进制编码

另一种表示素因式分解的方法是将其编码为二进制,其中每个二进制数字表示素数分解的一个元素。为了做到这一点,我们需要将每个二进制“column”分配给一个元素(比如p1,p12,p2等等)。

让我们从数字1开始。为了我们的目的1的主签名是{},因为它不包含素数因子。2和3的素数签名是{1},表示只存在一个素数因子。4有一个{2}的素数签名,因为它是素数的平方。

因此,我们可以将最右边的二进制列赋给p1,其中p1表示唯一的素数,第二个(从右起)二进制列p12,表示素数的平方。我们来看看:

表1

数量素因式分解主签名p12p1
11p10{}00
22p1{1}01
p1{1}01
42×2个p12{2}10
55p1{1}01

 

我们遇到的下一个新素数签名是6的{1,1}。6的素因式分解是p1p2,所以我们需要一个p2也:

表2

数量素因式分解主签名p2 p12p1
62×3个p1p2{1,1}101
77p1{1}001

 

继续,我们看到7(素数签名{1})然后是8(素数签名{3})。我们不需要为p1,不过,既然我们已经p12p1,我们只需在每一列中加上“1”来表示p1.

表3

数量素因式分解主签名p2 p12p1
82×2×2p1{3}011

 

事实上,我们只需要添加表单中的新列p2n,其中p是独一无二的n是非负整数。因此,既然我们知道了所有需要添加的列,问题就变成了:我们应该按什么顺序添加它们?

跳过我们已经看到的素数签名,我们发现接下来需要的列是p1416岁,那么p30块钱p2236岁。

表4

数字-
ber公司
素因式分解主签名 p22p p14p2 p12p1
162×2×2×2p14{_4_}_001000
302×3×5pp2p1{1,1,1}010101
362×2×3×3p22p12{2,2}100010

 

下表列出了所需的前48个二进制列、需要添加该列的素数签名及其素数签名。为了简洁起见,长素数签名如{1,1,1,1,1}显示为6{1},这意味着素数签名由6个素数签名组成。

表5

最小的pn需要列的最小数目数的素数签名
1p122{1}
2p12224{2}
p26{1,1}
4p142416{_4_}_
5p530{1,1,1}
6p22236{2,2}
7p47210{1,1,1,1}
8p1828256{8}
9p252900{2,2,2}
10p2441296年{4,4}
11p5112310个{1,1}
12p61330030元6{1}
13p427244100个{2,2,2,2}
14p11621665536个{16}
15p717510510号7{1}
16p454810000个{4,4,4}
17p2881679616个{8,8}
18p52112533.61万{2,2,2,2}
19p8199699690个8{1}
20p923223092870号9{1}
21p62132901800900个6{2}
22p44741944810000个{4,4,4,4}
23p1322324294967296{32}
24p10296469693230{1}
25p113120056049013011{1}
26p72172260620460100号7{2}
27p8586561亿{8,8,8}
28p21616282110907456{16,16}
29p1237742073813481012{1}
30p541142847396321万{4,4,4,4}
31p82192940839860961008{2}
32p1341~3.04250264×101413{1}
33p1443~1.30827613×101614{1}
34p92232~4.97704286×10169{2}
35p1547~6.14889783×101715{1}
36p64134~8.13244863×10176{4}
37p4878~3.78228594×1018{8,8,8,8}
38p164264~1.84467441×1019{64}
39p1653~3.25891585×101916{1}
40p102292~4.18569305×101910{2}
41p1759~1.92276035×102117{1}
42p112312~4.02245102×102211{2}
43p74174~6.79230242×10227{4}
44p1861~1.17288381×102318{1}
45p16516~4.30467210×1023{16,16,16}
46p1967~7.85832155×102419{1}
47p23232~7.95866111×1024{32,32}
48p20715065万~735万2520{1}

 

上表中的所有数字都采用了2n,其中是一个原始数(维基百科对原始文献有一个概述在这里),和n是非负整数。

下表是表示前53个唯一素数签名的最小整数。它们的素数签名被转换成二进制编码,然后二进制被转换成十进制。因此,每个唯一的素数签名都可以表示为单个整数。

表6

数量素因式分解主签名二元的 十进制的
2p1{1}000000000011
4p12{2}000000000102
6p1p2{1,1}000000001015
8p1{3}00000000011
12p12p2{1,2}000000001106
16p14{_4_}_000000010008
24p1p2{1,3}000000001117
30p1p2p{1,1,1}0000001010121
32p15{5}000000010019
36p12p22{2,2}0000010001034
48p14p2{1,4}0000000110012
60p12p2p{1,1,2}0000001011022
64p16{6}0000000101010
72p1p22{2,3}0000010001135
96p15p2{1,5}0000000110113
120p1p2p{1,1,3}0000001011123
128p17{7}0000000101111
144p14p22{2,4}0000010100040
180p12p22p{1,2,2}0000011001050
192p16p2{1,6}0000000111014
210p1p2pp4{1,1,1,1}0000101010185
216p1p2{3,3}0000010011139
240p14p2p{1,1,4}0000001110028
256p18{8}00010000000128
288p15p22{2,5}0000010100141
360p1p22p{1,2,3}0000011001151
384p17p2{1,7}0000000111115
420p12p2pp4{1,1,1,2}0000101011086
432p14p2{3,4}0000010110044
480p15p2p{1,1,5}0000001110129
512p19{9}00010000001129
576p16p22{2,6}0000010101042
720p14p22p{1,2,4}0000011100056
768p18p2{1,8}00010000100132
840p1p2pp4{1,1,1,3}0000101011187
864p15p2{3,5}0000010110145
900p12p22p2{2,2,2}00100100010290
960p16p2p{1,1,6}0000001111030
1024p110{10}00010000010130
1080p1p2p{1,3,3}0000011011155
1152p17p22{2,7}0000010101143
1260p12p22pp4{1,1,2,2}00001110010114
1296p14p24{4,4}01000001000520
1440p15p22p{1,2,5}0000011100157
1536p19p2{1,9}00010000101133
1680p14p2pp4{1,1,1,4}0000101110092
1728p16p2{3,6}0000010111046
1800p1p22p2{2,2,3}00100100011291
1920p17p2p{7,1}0000001111131
2048p111{11}00010000011131
2160p14p2p{1,3,4}0000011110060
2304p18p22{2,8}00010100000160
2310p1p2pp4p5{1,1}100010101011109

 

由此我们可以看出,每个整数都可以转换成另一个表示其素数签名的整数:2表示1,6表示5,以此类推。以下是以这种方式转换的前30个整数的表格:

表7

数量编码
10
21
1
42
51
65
71
8
92
105
111
126
131
145
155
   
数量编码
168
171
186
191
206
215
225
231
247
252
265
27
286
291
3021

 

虽然我们可以将任何正整数转换成另一个表示其二进制编码素数签名的整数,但我们不能总是执行反向操作。有些代码是无效的,因为它们表示“非规范化”的素数签名。例如,十进制4(二进制100)对应于p2既然有一个p2但是没有p1在这种表示法中,它永远不会是“前向”转换的结果。但是,可以将无效反向操作的结果表示为零,因为没有有效的素数签名在解码时会转换为0。

下面是前几个整数的表,以及它们所代表的素数签名。最右边的列显示由编码的素数签名表示的最小数字,如果编码的素数签名无效,则显示0。

表8

数量解码
011
12,3,5,7。。。2
24,9,25,49。。。4
8,27,125。。。8
4无效:p2,但不是p10
56,10,14,15。。。6
612,18,20,28。。。12
724,40,54,56。。。24
816,81。。。16
932243。。。32
1064729。。。64
111282187。。。128
1248,80,112。。。48
13486年。。。96
141921458。。。192
153844374。。。384
16-20岁无效:p,但不是p20
2130,42,70。。。30
2260,84,90。。。60
23120270。。。120
24-27日无效:p,但不是p20
28240810。。。240
294802430。。。480
309607290。。。960
31192021870。。。1920
32-33岁无效:p22,但不是p120
3436,100。。。36
3572,108。。。72
36-38岁无效:p2,但不是p10
392161000。。。216
40144324。。。144

 

反复“编码”或“解码”一个数字会给我们一些有趣的结果。零是一个零,因为一个“零”不再有效。由于0是对1进行编码的结果,而1是对质数进行编码时的结果,因此大多数小整数很快就会陷入“死胡同”:

表9

起始号码结果“编码”序列
11,0
22,1,0
3,1,0
44,2,1,0
66,5,1,0
77,1,0
88,3,1,0
99,2,1,0
1010,5,1,0

 

还需要进行更多的调查,看看是否有任何数字没有触及这个死胡同(例如,如果它们进入一个重复的循环)

下表显示了当我们反复“解码”一个数字时会发生什么。这里我们假设对一个数字进行解码,得到一个素数签名与所编码内容相匹配的最小数,如果编码无效,则为零。

表10

起始号码结果“解码”序列
00,1,2,4,0。。。
3,8,16,0。。。
55,6,12,48,0。。。
77,24,0。。。
99,32,0。。。
1010,64,0。。。
1111,128,256,0。。。
1313,96,0。。。
1414,192,0。。。
1515384,0。。。

 

在这里,经过反复的“解码”,一个无效的素数签名很快被发现,序列进入一个循环:0,1,2,4,0,1,2,4,0。。。这里还需要进行更多的调查,以确定是否存在其他可能出现的循环,或者甚至可能是一个无休止的非循环序列。后者似乎不太可能,因为一个数字成为无效的素数签名代表的可能性越大。

 

另一种方法

为了解决非规范化素数签名的问题,需要一种不同的方法。而不是使用p1,p12p2作为前三列,我们可以使用p1,p12p1p2.

同样,不是p作为第五列,我们可以使用p1p2p。这将确保没有包含pn作为一个不包含pn-1号(其中n大于1)。

下表使用此方案,从上表(表6)中生成不同的二进制和十进制输出:

表11

数量素因式分解主签名二元的 十进制的
2p1{1}000000000011
4p12{2}000000000102
6p1p2{1,1}000000001004
8p1{3}00000000011
12p12p2{1,2}000000001015
16p14{_4_}_000000010008
24p1p2{1,3}000000001106
30p1p2p{1,1,1}0000001000016
32p15{5}000000010019
36p12p22{2,2}0000010000032
48p14p2{1,4}000000001117
60p12p2p{1,1,2}0000001000117
64p16{6}0000000101010
72p1p22{2,3}0000010000133
96p15p2{1,5}0000000110012
120p1p2p{1,1,3}0000001001018
128p17{7}0000000101111
144p14p22{2,4}0000010001034
180p12p22p{1,2,2}0000001010020
192p16p2{1,6}0000000110113
210p1p2pp4{1,1,1,1}0000100000064
216p1p2{3,3}0000010010036
240p14p2p{1,1,4}0000001001119
256p18{8}00010000000128
288p15p22{2,5}0000010001135
360p1p22p{1,2,3}0000001010121
384p17p2{1,7}0000000111014
420p12p2pp4{1,1,1,2}0000100000165
432p14p2{3,4}0000010010137
480p15p2p{1,1,5}0000001100024
512p19{9}00010000001129
576p16p22{2,6}0000010100040
720p14p22p{1,2,4}0000001011022
768p18p2{1,8}0000000111115
840p1p2pp4{1,1,1,3}0000100001066
864p15p2{3,5}0000010011038
900p12p22p2{2,2,2}00100000000256
960p16p2p{1,1,6}0000001100125
1024p110{10}00010000010130
1080p1p2p{1,3,3}0000011000048
1152p17p22{2,7}0000010100141
1260p12p22pp4{1,1,2,2}0000100010068
1296p14p24{4,4}01000000000512
1440p15p22p{1,2,5}0000001011123
1536p19p2{1,9}00010000100132
1680p14p2pp4{1,1,1,4}0000100001167
1728p16p2{3,6}0000010011139
1800p1p22p2{2,2,3}00100000001257
1920p17p2p{7,1}0000001101026
2048p111{11}00010000011131
2160p14p2p{1,3,4}0000011000149
2304p18p22{2,8}0000010101042
2310p1p2pp4p5{1,1}100000000001024
2520p1p22pp4{1,1,2,3}0000100010169
2592p15p24{4,5}01000000001513
2880p16p22p{1,2,6}0000001110028

 

如表7所示,我们可以将每个整数转换成另一个表示其素数签名的整数:

表12

数量编码
10
21
1
42
51
64
71
8
92
104
111
125
131
144
154
   
数量编码
168
171
185
191
205
214
224
231
246
252
264
27
285
291
3016

 

利用这个方案,我们可以将任何大于1的整数转换成一个唯一的整数,这个整数代表其二进制编码的素数签名。我们也可以对任何大于零的整数执行反向操作。为了确保反向操作返回唯一的整数,我们使用与指定素数签名匹配的最小整数。例如,4(十进制)等于100(二进制),这表示{1,1}的素数签名。与素数签名匹配的最小整数是2×3,即6。

下面是使用新方案的前几个整数的表,以及它们所代表的素数签名。粗体数字表示由编码的素数签名表示的最小数字。

表13

编码主签名解码
0{}1
1{1}2,3,5,7,11。。。
2{2}49,25,49,121。。。
{3}827,125,343。。。
4{1,1}6,10,14,15。。。
5{1,2}1218,20,28。。。
6{1,3}2440,54,56。。。
7{1,4}48,80,112,162。。。
8{_4_}_1681,625。。。
9{5}32,243。。。
10{6}64729。。。
11{7}128,2187年。。。
12{1,5}96224,160。。。
13{1,6}192,320,448。。。
14{1,7}384,640896。。。
15{1,8}7681280年,1792年。。。
16{1,1,1}3042岁,70岁。。。
17{1,1,2}6084岁,90岁。。。
18{1,1,3}120,168,264。。。
19{1,1,4}240,336,528。。。
20{1,2,2}180252300。。。
21{1,2,3}360,504,792。。。
22{1,2,4}720,1008。。。
23{1,2,5}14402016年。。。
24{1,1,5}480,672。。。
25{1,1,6}9601344年。。。
26{7,1}1920,2688。。。
27{1,1,8}3840,5376。。。
28{1,2,6}2880,4032。。。
29{1,2,7}5760,8064。。。
30{1,2,8}1152016128年。。。
31{1,2,9}23040,32256。。。
32{2,2}36,100,196,225。。。
33{2,3}72,200,392。。。
34{2,4}144,400,784。。。
35{2,5}288,800,1568。。。
36{3,3}216,1000。。。
37{3,4}432,2000年。。。
38{3,5}864,4000。。。
39{3,6}1728,8000。。。
40{2,6}5761600年。。。

 

和以前一样,我们可以重复地“编码”一个数字,首先确定它的素数签名,然后确定唯一引用该素数签名的整数。例如,我们可以对数字18进行编码,首先确定它的素数签名是{1,2},然后确定映射到素数签名{1,2}的唯一整数是5(见表13)然后我们可以对数字5重复这个过程,它的素数签名是{1},它被编码为数字1。再次重复,数字1变成素数签名{},它变成0,是映射到{}的“空”素数签名的唯一整数。

因此,从18开始,我们得到序列18,5,1,0。一旦我们达到零,就不能再进行编码了。下表显示了某些起始整数可以找到的“编码”序列的一些示例:

表14

起始号码结果“编码”序列
11,0
22,1,0
3,1,0
44,2,1,0
50,0,1
66,4,2,1,0
77,1,0
88,3,1,0
99,2,1,0
1010,4,2,1,0
1111,1,0
1212,5,1,0

 

注意,所有以质数开头的序列都有三个元素:起始数,1,然后是0。更长的序列可能是以除{1}以外的素数签名开头的。似乎所有序列(除了以0开头的一个元素序列)都将以1结尾,后跟0。

类似地,可以通过反复“解码”一个数字来生成序列。这里,我们从一个整数开始,例如4。从表13我们可以确定这个整数映射到素数签名{1,1},与该素数签名匹配的最小数字是6(2×3)。然后我们可以重复这个过程:6映射到素数签名{1,3}(同样,参考表13),映射到该签名的最小数字是24。重复这个过程我们可以看到从4开始的序列是4,6,24,480。。。

与所有以0结尾的“编码”序列不同,“解码”序列似乎越来越高。下表包括“解码”序列的一些示例:

表15

起始号码结果“解码”序列
00,1,2,4,6,24,480,17418240001。。。
3,8,16,30,11520。。。
55,12,96,7560。。。
77,48,1080,39916800。。。
99,32,36,216,25804800。。。
1010,64,210,6451200。。。
111590,1590,1590,1590,1590,159,900。。。
131319253760。。。

 

有关素数签名的更多序列,请参见素签名的迭代映射第页。

 

验证此页