Day4 Hailstone

简介: Day4 Hailstone

算法目录


希尔顿序列(Hailstone Sequence


希尔顿序列(Hailstone Sequence)问题(即考拉兹猜想,又称奇偶归一猜想,冰雹猜想)作为一个著名的数学问题,其正确与否至今都未能得到证明。即:对任一正整数 n,若为偶数则除以 2,若为奇数则乘 3 再加 1,最后 n 总会变为 1。其表达式如下所示:

2021012320161273.png


举个例子


20210123210458139.png


问题的特殊之处在于:尽管很容易将这个问题讲清楚,但直到今天仍然不能保证这个问题的算法对所有可能的输入都有效——即至今没有人证明对所有的正整数该过程都终止。

import numpy as np
import matplotlib.pyplot as plt
def hailstone(n):
    length = 1
    while(1<n):
        if n%2 == 0:
            n = n/2
        else:
            n = n*3 + 1
        length += 1
    return length
x = [n for n in range(10000)]
y = [hailstone(h) for h in x]
plt.scatter(x,y)
plt.xticks(np.arange(min(x),max(x)+1,1000))
plt.xlabel('n')
plt.ylabel('hailstone(n)')
plt.show()

我们可以看出来,因为最后的图形貌似冰雹,所以被称为Hailstone Sequence

但是我们一直有一个问题,是否存在一些数,可以使得while循环一直执行下去,也就是说这个函数到底满不满足有穷性?意思是对于任意的n,while循环都会执行有限次而退出吗?

可惜至今学术界都无法证明对于任意的n,一定满足:hailstone(n)< ∞


算法的主要特点有时并不容易证明。例如,人们通常认为算法的有穷性是最容易判断的,其实不然。由于 无法证明上述程序的 “有穷性”,故 不能称该程序是一个算法。可见证明算法有穷性的困难。


20210123202433445.png


Collatz 猜想


有一个很有意思的问题,我们这样实验:

def hailstone(n):
    length = 1
    seq = []
    while(1 < n):
        if n % 2 == 0:
            n = n//2
            seq.append(n)
        else:
            n = n * 3 + 1
            seq.append(n)
        length += 1
    return length,seq
print(hailstone(7))
print(hailstone(17))
print(hailstone(103))

打印结果如下,数字7,17,103的 Hailstone 序列长度分别为 17, 13, 88,最惊奇的是:每个这

种序列的最后三个数一定是4,2,1

20210123205446405.png

感兴趣的可一直向右滑动,查看序列的结尾是不是4,2,1这个周期!

并且已经得出:无论使用什么起始值,每个hailstone 序列最终都将停留在4、2、1个周期上。

计算机甚至已经检查了所有起始值(最大到5 × 260)(一个 19 位数字),并发现最终出现4、2、1个周期。

但是很遗憾:依然没有科学家能够证明所有序列都是这种情况。

这个开放问题在数学家 Lothar Collatz 于 1937 年首次提出该问题之后被称为 Collatz猜想。

令人惊讶的是,即使是最好的数学家都无法回答,如此简单的形成序列的公式也会引发一个问题。


强悍的27


冰雹的最大魅力在于不可预知性。英国剑桥大学教授John Conway找到了一个自然数27。虽然27是一个貌不惊人的自然数,但是如果按照上述方法进行运算,则它的上浮下沉异常剧烈:首先,27要经过77步骤的变换到达顶峰值9232,然后又经过34步骤到达谷底值1。全部的变换过程(称作“雹程”)需要111步,其顶峰值9232,达到了原有数字27的342倍多,如果以瀑布般的直线下落(2的N次方)来比较,则具有同样雹程的数字N要达到2的111次方。其对比何其惊人!

但是在1到100的范围内,像27这样的剧烈波动是没有的(54等27的2的次方倍数的数除外)


27的归一步数要经过多次剧烈波动的奇偶变换,其路径呈不光滑锯齿


20210123210338679.png


每日一句


Winners do what losers don’t want to do.(胜利者做失败者不愿意做的事!)

相关文章
|
7月前
|
XML Java 数据格式
Spring注解开发管理第三方bean及依赖注入
Spring注解开发管理第三方bean及依赖注入
123 0
|
7月前
|
Kubernetes 安全 API
Cilium 系列 -3-Cilium 的基本组件和重要概念
Cilium 系列 -3-Cilium 的基本组件和重要概念
|
搜索推荐 Java 索引
Spring Boot中的ElasticsearchRepository
Spring Boot中的ElasticsearchRepository
|
2月前
|
机器学习/深度学习 人工智能 网络协议
|
3月前
|
XML Java 关系型数据库
springboot 集成 mybatis-plus 代码生成器
本文介绍了如何在Spring Boot项目中集成MyBatis-Plus代码生成器,包括导入相关依赖坐标、配置快速代码生成器以及自定义代码生成器模板的步骤和代码示例,旨在提高开发效率,快速生成Entity、Mapper、Mapper XML、Service、Controller等代码。
springboot 集成 mybatis-plus 代码生成器
|
4月前
|
负载均衡 监控 持续交付
|
7月前
|
存储 Rust 安全
Rust标准库概览:集合、IO、时间与更多
本文将带领读者深入了解Rust标准库中的一些核心模块,包括集合类型、输入/输出处理、时间日期功能等。我们将通过实例和解释,探讨这些模块如何使Rust成为高效且安全的系统编程语言。
|
6月前
|
SQL 算法 大数据
深入解析力扣184题:部门工资最高的员工(子查询与窗口函数详解)
深入解析力扣184题:部门工资最高的员工(子查询与窗口函数详解)
|
编解码
FFT_频谱分析(数字信号处理)
用FFT对信号作频谱分析是学习数字信号处理的重要内容。经常需要进行谱分析的信号是模拟信号和时域离散信号。对信号进行谱分析的重点在于频谱分辨率及分析误差。频谱分辨率D和频谱分析的点数N直接相关,其分辨率为2π/N 。因此2π/N≤D,可以据这个公式确定频率的分辨率。 FFT分析频谱的误差在于得到的是离散谱,而信号(非周期信号)是连续谱,只有当N较大时,离散谱的包络才能逼近于连续谱。因此N要适当选择大一些。 周期信号的频谱是离散谱,只有用整数倍周期的长度作FFT,得到的离散谱才能代表周期信号的频谱。如果不知道信号周期,可以尽量选择信号的观察时间长一些。 对模拟信号进行谱分析时,首先要按照
680 1
FFT_频谱分析(数字信号处理)
|
7月前
|
人工智能 自然语言处理 JavaScript
国内唯一!通义灵码入选全球智能编码助手使用率 TOP 榜单
国内唯一!通义灵码入选全球智能编码助手使用率 TOP 榜单
515 20