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.(胜利者做失败者不愿意做的事!)

相关文章
|
8月前
|
搜索推荐 Java 索引
Spring Boot中的ElasticsearchRepository
Spring Boot中的ElasticsearchRepository
|
4天前
|
XML Java 数据格式
Spring注解开发管理第三方bean及依赖注入
Spring注解开发管理第三方bean及依赖注入
59 0
|
6月前
|
存储 传感器 数据可视化
3D目标检测数据集 KITTI(标签格式解析、3D框可视化、点云转图像、BEV鸟瞰图)
本文介绍在3D目标检测中,理解和使用KITTI 数据集,包括KITTI 的基本情况、下载数据集、标签格式解析、3D框可视化、点云转图像、画BEV鸟瞰图等,并配有实现代码。
556 0
|
9月前
|
缓存 JSON 前端开发
什么是请求头?常见的请求头有哪些?
请求头(Request Headers)是在HTTP协议中用于传递关于请求的额外信息的部分。它包含了客户端(通常是浏览器或应用程序)与服务器之间进行通信所需的元数据
3739 1
|
10月前
|
Cloud Native 开发者
上海站丨云原生开源开发者沙龙开放报名(周日场)
上海站丨云原生开源开发者沙龙开放报名(周日场)
上海站丨云原生开源开发者沙龙开放报名(周日场)
|
JavaScript 前端开发 Java
一文快速上手Vue(上)
一文快速上手Vue(上)
一文快速上手Vue(上)
|
弹性计算 编解码 运维
全景剖析阿里云容器网络数据链路(二)—— Terway ENI
本系列联合作者 容器服务 @谢石 近几年,企业基础设施云原生化的趋势越来越强烈,从最开始的IaaS化到现在的微服务化,客户的颗粒度精细化和可观测性的需求更加强烈。容器网络为了满足客户更高性能和更高的密度,也一直在高速的发展和演进中,这必然对客户对云原生网络的可观测性带来了极高的门槛和挑战。为了提高云原生网络的可观测性,同时便于客户和前后线同学增加对业务链路的可读性
801 0
全景剖析阿里云容器网络数据链路(二)—— Terway ENI
CodeBlocks导入第三方库的详细简单过程
CodeBlocks导入第三方库的详细简单过程
720 0
CodeBlocks导入第三方库的详细简单过程
|
存储 缓存 移动开发
浏览器缓存机制(三):本地存储
浏览器缓存机制(三):本地存储
157 0
|
存储 缓存 前端开发
浏览器缓存机制(一):概述
浏览器缓存机制(一):概述
112 0