趣味数学与C++

本文介绍了有趣的克拉兹问题,一个至今未解的数学猜想,及其与编程的结合。通过C++展示了如何用不同编程方法实现克拉兹问题的算法,包括无结构编程、结构化编程、递归、面向对象和泛型编程,揭示了数学与编程的紧密联系和无穷魅力。
摘要由CSDN通过智能技术生成

引子

有些人认为自己已经厌倦了数学,因为人们需要灵活的大脑才能领会一些数学问题。但对于每个人来说,并不是数学的每个领域都是那么麻烦和令人厌倦的,即使对数学基础不好的人也是如此。数学的其中一个领域――数论,对数学学的不多的普通人来说,也许会有很大的吸引力。

数论是研究整数性质的一个学科,这也许是数学中的最古老的学科,它被具有“数学王子”之称的数学家高斯称为“数学中的女王”,因为很多数学领域都是为了解决数论上的问题而出现的。实际上,学习数论并不需要有专业的数学基础。你可能会对数学的各个领域都比较了解,如果那样的话,你会发现数论的精彩。数论被认为是“纯粹的数学”,因为在过去的日子里,人们无法将数论应用在除数学之外的其它领域。但是在现在的实际生活中,我们可以看到对数论的很多应用,比如密码的编解码、随机数产生器、错误检查、信息安全等领域,我们都可以看到数论的影子。直至今日,数论仍然是一门令人着迷的数学,因为在这个领域中有很多未解之迷等待着人们的解决。或许,即使随着数学理论研究的发展和相关技术的进步,人们也无法找到这些未解之迷的答案。

对数论的所有研究都是为了漂亮地证明各种数学问题,或者通过已知的基本定理解决更加复杂的问题。有意思的是,即使在数论上你未能证明一个命题是正确的,你仍然可以在实际生活中去应用它。举个例子,大家所熟知的RSA加密算法就是基于一个假设:如果一个数是两个以上的大素数的乘积,那么我们很难将这个大数分解。

详细内容

现在我们要用一个简单的方法来讨论数论。这是关于一个有趣的问题――克拉兹问题(Collatz problem)的一番讨论,在这其中我们会用到很多种编程技术。克拉兹问题的特殊之处在于――尽管我们很容易将这个问题讲清楚,但直到今天我们仍不能保证这个问题的算法对所有可能的输入都管用。这个问题也被叫做hailstone问题、3n+1问题、Hasse算法问题、Kakutani算法问题、Thwaites猜想或者Ulam问题。这个问题是由L. Collatz在1937年提出的。

一句话,这是一个非常简单的问题。取一个数(译者注:严格地说,这个数是正整数)作为输入,如果这个数是偶数,就将它除以2,否则就将它乘以3后再加1。(译者注:这是一个数列计算问题,用数学的语言就是,如果Xn是这个数列的第n项,而且Xn为偶数,那么这个数列的第n+1项Xn+1=(Xn)/2,如果Xn为奇数,则Xn+1=3(Xn)+1,其中n为不小于0的整数,数列的第一项X0可以取任意正整数)。这个猜想的命题是:无论你取哪一个(正整)数作为输入,然后求这个数列后面的项,总会有某些项等于1(译者注:确切的说无论取哪一个正整数,总能使这个数列达成1-4-2的循环,即数列中有一项等于1之后,下一项就是4,然后下一项是2,然后又是1、4、2、……。当然在本文中,作者并没有打算讨论那么多)。时至今日,仍然没有人能证明这个命题是正确的,尽管现在通过计算机,已经用大量的数据检查了这个命题,所有的这些数据都通过了这个命题的测试。而这个命题的证明对人们来说确实是一个挑战,而如果有人能证明这个问题,那么他无疑将会受到整个数学界的青睐。

如果将正整数n作为数列的第一个元素,那么这个数列的元素总能达到1,而数列中元素的个数就是这个数列的周期。比如你输入5的话,那么就有如下的序列:
5 16  8  4  2  1

那么这个数列的周期是6。这个序列被称为hailstone序列(或3n+1序列)。
用来产生这个数列的算法是非常简单的:

算法A (产生3n+1序列的算法)
A1. [输入n]
A2. [算法结束条件] If n = 1 then exit
A3. [检查n] If n is even then n := n / 2 else n := n * 3 + 1
A4. [得出序列中的下一个元素后] Go to A2.

很好,现在就开始实现这个算法吧。在这里,我尝试着用多种编程方式来实现这个算法,以便使整个过程显得有趣。

使用无结构编程的方法

这也许是在计算机上最基础的编程方法了,因为不需要定义过程(译者注:除了main之外)或是其它的什么东西。使用这种方式的问题是,在对代码的管理和重用方面会有所困难,因为用这种方法编出来的程序没有抽象层,因此如果使用这种方法来进行大规模编程会是十分困难的。

#include <iostream>
using std::cout;
using std::endl;

int main(int argc, char* a

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值