分页: 1 / 1

#1 我研究了一下Collatz猜想

发表于 : 2024年 5月 12日 15:09
TheMatrix
Collatz猜想是说:从一个数出发,能除以2就除以2,不能除以2就乘3加1。最后总能回到1。

代码: 全选

def collatz(n,a,b):
    result = [n]
    while len(result) < 200 and n != 1:
        n = n//a if n%a==0 else b*n+1
        result.append(n)
    return result
    
def run():
    result = collatz(47,2,3)
    for item in result: 
        print(item)

run()
我研究了一下,用a替换2,用b替换3。发现这么几个现象:
1,2是必须的。别的a迭代越来越大。
2,3也是必须的。别的b迭代也越来越大。
3,加1也是必须的,加别的迭代也是越来越大。
4,b=ka+1的话,增加的速度能慢一点。b != ka+1的话,增加速度基本上和一直乘以b差不多。

#2 Re: 我研究了一下Collatz猜想

发表于 : 2024年 5月 13日 16:22
FoxMe
赞认真:D

#3 Re: 我研究了一下Collatz猜想

发表于 : 2024年 5月 13日 22:11
TheMatrix

代码: 全选

def collatz(n,a,b):
    result = [n]
    while len(result) < 200 and n != 1:
        n = n//a if n%a==0 else int(b*n)//a*a
        result.append(n)
    return result
    
def run():
    result = collatz(147, 7, 13.37)
    for item in result: 
        print(item)

run()
可以变成一个动力学问题。

#4 Re: 我研究了一下Collatz猜想

发表于 : 2024年 5月 14日 17:15
TheMatrix
TheMatrix 写了: 2024年 5月 13日 22:11 可以变成一个动力学问题。
这为什么是动力学呢?

代码: 全选

def collatz(n,a,b):
    result = [n]
    while True:
        if len(result) >= 200:
            return (result, -1)
        #n = n//a if n%a==0 else b*n+2
        n = n//a if n%a==0 else int(b*n)//a*a
        if n in result:
            return (result, n)
        result.append(n)
    
def run():
    result, x = collatz(143, 7, 12.1)
    for item in result: 
        print(item)
    print((len(result), x))

run()
也就是两个数(a,b),不一定是整数了,它们以一定的方式,作用在一个初始数上,得到一个序列,一个确定的序列。看这个序列会不会重复。

以“一定的方式”是什么意思呢?这里面有任意性,但是它是可描述的,可计算的。

“看序列会不会重复”,有点像无限循环或者不循环小数。

这就是动力学。动力学在物理学中,是指有“力”来决定运动轨迹的,“力”在这里是另一层次的变量,可以叫隐变量。而在数学中,动力学主要指迭代。迭代像一个发动机,发生器。更广义可以指时间演化,时间可以是一个index,一个数而已。

#5 Re: 我研究了一下Collatz猜想

发表于 : 2024年 5月 14日 22:25
TheMatrix
TheMatrix 写了: 2024年 5月 14日 17:15

代码: 全选

def collatz(n,a,b):
    result = [n]
    while True:
        if len(result) >= 200:
            return (result, -1)
        #n = n//a if n%a==0 else b*n+2
        n = n//a if n%a==0 else int(b*n)//a*a
        if n in result:
            return (result, n)
        result.append(n)
    
def run():
    result, x = collatz(143, 7, 12.1)
    for item in result: 
        print(item)
    print((len(result), x))

run()
看来要出现混沌与分形啊。

定义:初始数 n=37, a=2, 对于大于等于3的实数b, 定义一个整数值的函数 f(b),为如下迭代的数列的循环项的长度(如果不循环则为无穷):

n = n//a if n%a==0 else int(b*n)//a*a

#6 Re: 我研究了一下Collatz猜想

发表于 : 2024年 5月 18日 20:53
TheMatrix
TheMatrix 写了: 2024年 5月 13日 22:11
可以变成一个动力学问题。
Quote Bing Copilot:
Proving boundedness for all Collatz sequences remains an open problem.
这应该主要是一个动力学问题。

#7 Re: 我研究了一下Collatz猜想

发表于 : 2024年 5月 19日 11:54
TheMatrix
TheMatrix 写了: 2024年 5月 18日 20:53 Quote Bing Copilot:
Proving boundedness for all Collatz sequences remains an open problem.
这应该主要是一个动力学问题。
bounded则一定循环,因为一个整数sequence bounded的话,它只有有限个数,所以sequence一定循环。反之循环也一定bounded。

Collatz猜想是说这些sequence不但循环(bounded),而且循环到 "4 -> 2 -> 1"的轨迹。证明bounded应该是第一步。

#8 Re: 我研究了一下Collatz猜想

发表于 : 2024年 5月 19日 12:04
TheMatrix
TheMatrix 写了: 2024年 5月 19日 11:54 bounded则一定循环,因为一个整数sequence bounded的话,它只有有限个数,所以sequence一定循环。反之循环也一定bounded。

Collatz猜想是说这些sequence不但循环(bounded),而且循环到 "4 -> 2 -> 1"的轨迹。证明bounded应该是第一步。
稍微试一下就能得到一个印象:不仅3x+1会循环,3x+3, 3x+5,...都会循环。也就是这里面重要的是3x。

3x再加上一个数(necessarily奇数),使它成为一个偶数,然后再挤出2的因子 - 不是除以2,是挤出2的因子 - 可以除以2多次。这样上一次,再下至少一次,上上下下,最后会循环。

5x+1就不行了。因为上的幅度太大,下一次不够,下两次也不够,最后就越来越大,不能循环了。

#9 Re: 我研究了一下Collatz猜想

发表于 : 2024年 5月 19日 12:22
TheMatrix
TheMatrix 写了: 2024年 5月 19日 12:04 稍微试一下就能得到一个印象:不仅3x+1会循环,3x+3, 3x+5,...都会循环。也就是这里面重要的是3x。

3x再加上一个数(necessarily奇数),使它成为一个偶数,然后再挤出2的因子 - 不是除以2,是挤出2的因子 - 可以除以2多次。这样上一次,再下至少一次,上上下下,最后会循环。

5x+1就不行了。因为上的幅度太大,下一次不够,下两次也不够,最后就越来越大,不能循环了。
如果把一个数看成是一个起始点,把迭代看成是一个时间演化的推进器,得到的sequence是一个轨迹,循环的话就叫一个orbit。研究orbit的形态与分类,就是数学中的动力学(dynamics)。

数学中的动力学应该属于一种分析的方法。但是比分析更专门一些:因为它研究迭代发生的细节。比如非线性动力学,迭代由一个非线性函数发生,比如x2,这么一个innocent的函数,它就是非线性。迭代一下,完了,混沌了。

“挤出2的因子”,听起来还是innocent,但是它实际上highly highly nonlinear。这已经不是分析中的,可以由微分方程刻画的非线性了。这是代数非线性,有点类似于一种折叠。分析上的非线性至少是光滑的,这个是折叠,还带棱角的。所以就难了。

#10 Re: 我研究了一下Collatz猜想

发表于 : 2024年 5月 19日 12:47
TheMatrix
TheMatrix 写了: 2024年 5月 19日 12:22 如果把一个数看成是一个起始点,把迭代看成是一个时间演化的推进器,得到的sequence是一个轨迹,循环的话就叫一个orbit。研究orbit的形态与分类,就是数学中的动力学(dynamics)。

数学中的动力学应该属于一种分析的方法。但是比分析更专门一些:因为它研究迭代发生的细节。比如非线性动力学,迭代由一个非线性函数发生,比如x2,这么一个innocent的函数,它就是非线性。迭代一下,完了,混沌了。

“挤出2的因子”,听起来还是innocent,但是它实际上highly highly nonlinear。这已经不是分析中的,可以由微分方程刻画的非线性了。这是代数非线性,有点类似于一种折叠。分析上的非线性至少是光滑的,这个是折叠,还带棱角的。所以就难了。
动力学研究的都是非线性。线性的是trivial,不需要研究。

动力学是看一步迭代的细节,看一步迭代在多大程度上能对长程轨迹有所限制。能得到的任意一个限制,都是对长程的贡献。比如最后的orbit的集合,如果能说其中某一种orbit不可能出现,这就是贡献。

“挤出2的因子”这个操作,在编程上是个if-else操作,没有解析表达式。这是最难的。每次乘以3再加1之后,平均能除以几个2?