关于Collat​​z假设(3n +1)中序列的形成

我被诸如Collat​​z问题之类的任务所吸引。 它们很容易制定和完善您的头脑,尤其是算法思维,这对程序员非常有用。

该任务的制定非常简单:
取任何自然数n。 如果是偶数,则将其除以2,如果是奇数,则将其乘以3并加1(我们得到3n +1)。 我们对结果编号执行相同的操作,依此类推。

Collat​​z的假设是,无论我们采用什么初始数字n,迟早我们都会得到一个。

从算法上看,它看起来像这样:

while (number > 1) { if (number % 2 === 0) number = number / 2; else number = 3 * number +1; } 

例如,取n = 5。 它是奇数,这意味着我们将对奇数执行操作,即3n +1 =>16。16是偶数,即我们将对偶数执行操作,即n / 2 => 8 => 4 => 2 => 1。
在n = 5处形成的序列:16、8、4、2、1。

我请你原谅我的数学知识,如果我在某个地方犯了错误,请告诉我。

让我们挑出关于单元的信息总数和关于单元的真实信息数。 表示这些步骤。

考虑n = 7的序列:
22、11、34、17、52、26、13、40、20、10、5、16、8、4、2、1。
一共有16个步骤,而实际投入另一个数字集的实际步骤是其中的5个:
7、11、17、13、5。
真正的步数Sa(n)是达到整数所需的操作数3n +1 。

表格示例清楚地说明了这个想法:
锡(0)锡(1)锡(2)锡(3)锡(4)锡(5)锡(6)锡(7)锡(8)锡(9)锡(10)锡(11)锡(12)
2531711792533435739105
410634221418岁4965岁865978203
820123523151950668711479209
16211368442836516789115153210
324024694529日3798130182118156211
6442267046303899131173119157406
128804875885672100132174228158407
2568452136905874101133177229305409
5128553138926077102134178230306418

在这样的表中,订单及其自身的模式已经可见。
如您所见,两个的幂永远不会变成奇数,因此归结为简单的除法。
Sa(0)的序列仅由1个公式形成。

P(0,k)=2∗2k


无需采取真正的步骤;通过简单的划分,一切都会减少为统一。
知道这一点后,您可以从表中删除所有为2的倍数的数字。
锡(0)锡(1)锡(2)锡(3)锡(4)锡(5)锡(6)锡(7)锡(8)锡(9)锡(10)锡(11)锡(12)
531711792533435739105
2113352315194965岁875979203
8553694529日37516789115153209
3411137593617799131173119157211
136521314118111781101133177229305407

现在,要抓住模式变得更加困难,但是只有一种。 现在最有趣的是序列的形成。 不仅如此,5之后的下一个数字是21,之后是85。
实际上, Sa(1)是序列A002450 (0、1、5、21、85、341、1365、5461、21845、87381 ...)。 它由以下公式组成:

P(k)=4k−1 over3


可以通过递归公式描述相同的序列:

P(k)=4k0+1,其中 k0=


P(1)=4∗1+1=5;
P(5)=4∗5+1=21;
P(21)=4∗21+1=85;
依此类推...

尽管可以无限期地进行,但已建立了一系列第一步。 让我们继续第二步。 可以从奇数公式表达到步骤2的过渡公式。
知道我们将分享结果 3n+1几次,它可以写成 22 alpha在哪里  alpha-师数。

P(k)=3n+1 over22 alpha;22 alphaP(k)=3n+1;3n=22 alphaP(k)−1;


最终公式采用以下形式:

n(P(k), alpha)=22 alphaP(k)−1 over3;


我们还针对  beta喜欢 22 alpha+ beta这样就发生了将数字不是3的倍数除以3的选择。

n(P(k), alpha, beta)=22 alpha+ betaP(k)−1 over3;


让我们检查一下公式,因为alpha未知,请检查5个连续的alpha:

n(5, alpha, beta)=22 alpha+ beta∗5−1 over3;


n(5,0,1)=(20+1∗5−1)/3=3.
n(5,1,1)=(22+1∗5−1)/3=13.
n(5,2,1)=(25∗5−1)/3=53.
n(5,3,1)=(27∗5−1)/3=213.
n(5,4,1)=(29∗5−1)/3=853.

因此,第二步的顺序开始形成。 但是,应该注意的是113不是按顺序排列的,重要的是要记住该公式是从5计算得出的。

n = 113实际上:
n(85,0,2)=(20+2∗85−1)/3=113.

总结一下:
来自很多 Sa(n+1)由功能产生 n(P(k), alpha, beta)来自集合中的每个元素 Sa(n)。
知道这一点后,您仍然可以通过删除所有alpha倍数来缩短表格。
锡(0)锡(1)锡(2)锡(3)锡(4)锡(5)锡(6)锡(7)...
53171179...
11375201267715...
22715140110731425...

为了清楚起见,下面是一个示例,说明如何从 萨(2)从产生集合的元素 萨(3)对于从0到4的alpha。
P(k)= 3P(k)= 113P(k)= 227
3从α= 0生成:
没事

从α= 1得到的13产生:
17
69
277
1109
4437

来自α= 2的53生成:
35
141
565
2261
9045

213从α= 3生成:
没事

α= 4的853生成:
1137
4549
18197
72789
291157

从α= 0产生的113
75
301
1205
4821
19285

α= 1的453生成:
没事

1813从α= 2生成:
2417
9669
38677
154709
618837

7253从α= 3生成:
4835
19341
77365
309461
1237845

来自α= 4的29013生成:
没事

从α= 0产生227:
151
605
2421
9685
38741

从α= 1生成909:
没事

3637从α= 2生成:
4849
19397
77589
310357
1241429

14549从α= 3生成:
9699
38797
155189
620757
2483029

来自α= 4的58197生成:
没事


结合这些集合,我们从Sa(3)得到集合:
17,35,69,75,141,151,277,301,565,605,1109,1137,1205,2261,2275,2417,2421,4437,4549,4821,4835,4849,9045,9101,9669, 9685、9699、17749、18197、19285、19341、19397、19417 ...
而且,去除度  alpha>0我们得到:
17、75、151 ...
也就是说,它可以归结为:

n(P(k), beta)=2 betaP(k)−1 over3;



为什么在某个地方  beta=2在某处  beta=1?

返回序列A002450。 有一个有趣的依赖项:

P(m)=(43m−1)/3-不产生子序列。
P(m)=(43m+1−1)/3-产生子序列  beta=2。
P(m)=(43m+2−1)/3-产生子序列  beta=1。

一个数字只有3个潜在的子数组。
如果应用于递归公式,则:
功能介绍 n( gamma, alpha, beta)在哪里 \伽玛-3的任意倍数构成一个空集⨂。

A(n( gamma), alpha, beta)=
功能介绍 n( lambda, alpha, beta)在哪里  lambda-生成的任何数字 \伽玛在  beta=2形成属于自然数N的数字K的集合。

K(n(P( gamma), alpha,2))⊆N
功能介绍 n(P( lambda), alpha, beta)在  beta=1形成属于自然数N的数字L的集合。

L(n(P( lambda), alpha,1))⊆N.

显然,这可以某种程度上简化为更严格和基于证据的表述。

实际上,这就是在Collat​​z假设中形成序列的方式。
剩下一个细节。 有必要从我们获得的集合中的绝对步骤中恢复完整的集合。

赔率公式:

n(P(k), alpha, beta)=22 alpha+ betaP(k)−1 over3;


除了奇数以外,还需要还原很多偶数。 为此,请回忆公式:

P(0,k)=2∗2k


剩下的只是将所有关联在一起:

n(P(k), alpha, beta, epsilon)=22 alpha+ betaP(k)−1 over3∗2 epsilon。


最终版本:

n(k, alpha, beta, epsilon)=2 epsilon22 alpha+ beta(4k+1)−1 over3;


因此,任何k都可以生成一个序列。
反之亦然,任何自然数绝对属于 n(k)?
如果是这样,那么Collat​​z完全有可能是正确的。

对于javascript函数实现的最终示例:

 function collatsSequence( number, sequenceLength, alpha, epsilon ) { //     , //  number let set = []; //    while (number % 2 === 0) number /= 2; //    , //   number,  sequenceLength for (let k = 0; k < sequenceLength; k++) { //    alpha for (let a = 0; a < alpha; a++) { //  ,  if (number % 3 === 0) break; //   beta = 1 let numWithBeta = (number * 2 ** (2 * a + 1) - 1) / 3; //      3  beta === 1 //     3  beta === 2 if (Math.floor(numWithBeta) !== numWithBeta) //   beta = 2 numWithBeta = (number * 2 ** (2 * a + 2) - 1) / 3; //      epsilon for (let e = 0; e < epsilon; e++) set.push(numWithBeta * 2 ** e); } //      number = number * 4 + 1; } return set; } console.log( collatsSequence(5, 5, 2, 2) ); // [ 3, 6, 13, 26, 113, 226, 453, 906, 227, 454, 909, 1818 ] 

Source: https://habr.com/ru/post/zh-CN419075/


All Articles