我被诸如Collatz问题之类的任务所吸引。 它们很容易制定和完善您的头脑,尤其是算法思维,这对程序员非常有用。
该任务的制定非常简单:
取任何自然数n。 如果是偶数,则将其除以2,如果是奇数,则将其乘以3并加1(我们得到3n +1)。 我们对结果编号执行相同的操作,依此类推。
Collatz的假设是,无论我们采用什么初始数字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) |
---|
2 | 5 | 3 | 17 | 11 | 7 | 9 | 25 | 33 | 43 | 57 | 39 | 105 |
4 | 10 | 6 | 34 | 22 | 14 | 18岁 | 49 | 65岁 | 86 | 59 | 78 | 203 |
8 | 20 | 12 | 35 | 23 | 15 | 19 | 50 | 66 | 87 | 114 | 79 | 209 |
16 | 21 | 13 | 68 | 44 | 28 | 36 | 51 | 67 | 89 | 115 | 153 | 210 |
32 | 40 | 24 | 69 | 45 | 29日 | 37 | 98 | 130 | 182 | 118 | 156 | 211 |
64 | 42 | 26 | 70 | 46 | 30 | 38 | 99 | 131 | 173 | 119 | 157 | 406 |
128 | 80 | 48 | 75 | 88 | 56 | 72 | 100 | 132 | 174 | 228 | 158 | 407 |
256 | 84 | 52 | 136 | 90 | 58 | 74 | 101 | 133 | 177 | 229 | 305 | 409 |
512 | 85 | 53 | 138 | 92 | 60 | 77 | 102 | 134 | 178 | 230 | 306 | 418 |
在这样的表中,订单及其自身的模式已经可见。
如您所见,两个的幂永远不会变成奇数,因此归结为简单的除法。
Sa(0)的序列仅由1个公式形成。
无需采取真正的步骤;通过简单的划分,一切都会减少为统一。
知道这一点后,您可以从表中删除所有为2的倍数的数字。
锡(0) | 锡(1) | 锡(2) | 锡(3) | 锡(4) | 锡(5) | 锡(6) | 锡(7) | 锡(8) | 锡(9) | 锡(10) | 锡(11) | 锡(12) |
---|
| 5 | 3 | 17 | 11 | 7 | 9 | 25 | 33 | 43 | 57 | 39 | 105 |
| 21 | 13 | 35 | 23 | 15 | 19 | 49 | 65岁 | 87 | 59 | 79 | 203 |
| 85 | 53 | 69 | 45 | 29日 | 37 | 51 | 67 | 89 | 115 | 153 | 209 |
| 341 | 113 | 75 | 93 | 61 | 77 | 99 | 131 | 173 | 119 | 157 | 211 |
| 1365 | 213 | 141 | 181 | 117 | 81 | 101 | 133 | 177 | 229 | 305 | 407 |
现在,要抓住模式变得更加困难,但是只有一种。 现在最有趣的是序列的形成。 不仅如此,5之后的下一个数字是21,之后是85。
实际上,
Sa(1)是序列
A002450 (0、1、5、21、85、341、1365、5461、21845、87381 ...)。 它由以下公式组成:
可以通过递归公式描述相同的序列:
依此类推...
尽管可以无限期地进行,但已建立了一系列第一步。 让我们继续第二步。 可以从奇数公式表达到步骤2的过渡公式。
知道我们将分享结果
几次,它可以写成
在哪里
-师数。
最终公式采用以下形式:
我们还针对
喜欢
这样就发生了将数字不是3的倍数除以3的选择。
让我们检查一下公式,因为alpha未知,请检查5个连续的alpha:
因此,第二步的顺序开始形成。 但是,应该注意的是113不是按顺序排列的,重要的是要记住该公式是
从5计算得出的。
n = 113实际上:
总结一下:
来自很多 由功能产生 来自集合中的每个元素 。
知道这一点后,您仍然可以通过删除所有alpha倍数来缩短表格。
锡(0) | 锡(1) | 锡(2) | 锡(3) | 锡(4) | 锡(5) | 锡(6) | 锡(7)... |
---|
| 5 | 3 | 17 | 11 | 7 | 9 | ... |
| | 113 | 75 | 201 | 267 | 715 | ... |
| | 227 | 151 | 401 | 1073 | 1425 | ... |
为了清楚起见,下面是一个示例,说明如何从
从产生集合的元素
对于从0到4的alpha。
P(k)= 3 | P(k)= 113 | P(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 ...
而且,去除度
我们得到:
17、75、151 ...
也就是说,它可以归结为:
为什么在某个地方 在某处 ?返回序列A002450。 有一个有趣的依赖项:
-不产生子序列。
-产生子序列
。
-产生子序列
。
一个数字只有3个潜在的子数组。
如果应用于递归公式,则:
功能介绍 在哪里 -3的任意倍数构成一个空集⨂。
功能介绍 在哪里 -生成的任何数字 在 形成属于自然数N的数字K的集合。
功能介绍 在 形成属于自然数N的数字L的集合。
显然,这可以某种程度上简化为更严格和基于证据的表述。
实际上,这就是在Collatz假设中形成序列的方式。
剩下一个细节。 有必要从我们获得的集合中的绝对步骤中恢复完整的集合。
赔率公式:
除了奇数以外,还需要还原很多偶数。 为此,请回忆公式:
剩下的只是将所有关联在一起:
最终版本:
因此,任何k都可以生成一个序列。
反之亦然,任何自然数绝对属于 ?
如果是这样,那么Collatz完全有可能是正确的。
对于javascript函数实现的最终示例:
function collatsSequence( number, sequenceLength, alpha, epsilon ) {