《程序员的数学1》读书笔记整理



前言


因为感觉数学不是太好,计算机方面又需要数学的知识,但是直接看数学的教材又看不太懂,加上也不想从事数学方面的工作,就看看《程序员的数学》来了解一下,它对于很多人可能是一本很基础的书籍,但对我来讲再合适不过。

这也是一本很有名的书籍,每个国家的书籍都会带有不同的特点,而日本书带给我最大的印象,就是通俗,好玩,甚至说是啰嗦,有的时候看日本人写的书籍,感觉翻来覆去那几个观点反复论证,生怕你听不懂了。

所以我相信这本书会让我有一些收获的,起码,我相信他想教给我的,我肯定能看懂。

我的章节安排也是按照书中的章节安排来做的,但是我并不平铺直叙的说书中的内容,而是说一些我的感受,或者总结书中的知识点,对于你而言,就是了解一下,如果你有和我一样的需求,或者你对此干兴趣的话,也推荐你去看这本书。 毕竟,这是我总结的,是我的东西,你看的是我总结的东西,肯定会味同嚼蜡,很枯燥,而书中是极其有趣的。


0的故事——无即是有


10进制计数法是我们平时使用的比较多的

  1. 使用的数字有0、1、2、3、4、5、6、7、8、9十个数字
  2. 数位从右往左分别表示个位、十位、百位、千位……

我们以2503这个数为例子。 2503表示的是以2、5、0、3这4个数字组成的一个称作2503的数。
只是因为数位不同而意义不同:

  • 2表示“1000的个数”
  • 5表示“100的个数”
  • 0表示“10的个数”
  • 3表示“1的个数”

那么2503就应该是2 * 1000 + 5 * 100 + 0 * 10 + 3 * 1 =2 * 103 + 5 * 102 + 0 * 101 + 3 * 100
                         = 2000 + 500 + 0 + 3
                         =2503

我们可以看到千位、百位、十位、个位分别可以称作103、102、101、100位,10进制计数法的数位全是10n的形式,这个10称作10进制计数法的基数或底。

基数的右上角的数字,我们称为指数,是从右向左为0、1、2、3这样有规律的顺次排列的。

2进制计数法是计算机在处理数据时所有的计数法

  1. 使用的数字只有,0、1,共2种,
  2. 从右往左分别表示1位、2位、4位、8位……

用2进制计数法来数数,首先是0,然后是1,接下来不是2,而是在1上面进位变成10,然后是11,100,101……

由10进制的原理相通:
以1100这个数字为例,各个数位也都有不同的意义,从左往右依次为:

  • 1表示“8的个数”
  • 1表示“4的个数”
  • 0表示“2的个数”
  • 0表示“1的个数”

也就是说2进制的1100是1个8、 1个4、 0个2、和0个1累加的结果,即8 + 4 + 0 + 0 = 12 。
所谓的8 4 2 1,就是23、 22、21、20

2是2进制的基数或底。


基数转换

如果把10进制中的12转换为2进制,只需要将12反复地除以2(12除以2,商为6;6再除以2,商为3;3再除以2……),并写出余数是“1”还是“0”,余数为0则表示除完了,随后再将每步所得的余数逆向排列,由此就得到2进制表示了。


按位计数法

上面的10进制和2进制一般被称作按位计数法,除了十进制和2进制外还有很多种类的按位计数法,比如编程中也常常使用8进制和16进制计数法。

8进制计数法的特征如下:

  1. 使用的数字有0、1、2、3、4、5、6、7共8种数字
  2. 从右往左分别是80、81、82、83的位……(基数是8)

16进制计数法的特征如下:

  1. 使用的数字有0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F共16种
  2. 从右往左分别是160、161、162、163的位……(基数是16)
  3. 我们可以看到,在16进制计数法中,使用ABCDE(有时也用abcde)来表示10以上的数字

由此,我们可以推出
N进制计数法的特征如下:

1.使用的数字有0、1、2、3、……、N - 1,共N种
2. 从右往左分别是N0、N1、N2、N3的位……(基数是N)



不适用按位计数法的罗马数字


按位计数法在生活中最为常见,但实际上在我们身边也有不按位计数法的例子,比如**罗马计数法**,至今罗马数字还常常出现在钟表表盘上。


罗马计数法的特征如下:

  • 数位没有意义,只表示数字本身
  • 没有0
  • 使用I(1)、V(5)、X(10)、L(50)、C(100)、D(500)、M(1000)

表示3的话,就是III,也就是3个1叠在后面。
表示6的话,不是IIIIII,而是需要把IIIII表示为V,所以是VI。
表示61的话,就是LXI,表示为50 + 10 + 1 = 61。 实际上就是从左到右累加的结果

这就是罗马数字的加法,大的放左边,小的放右边,表示加法,把挨个表示的数字加起来

而罗马数字的减法,就是大的放右边,小的放左边,表示减法。VI表示5 + 1,IV则表示 5 - 1

比如:

  • 200 + 10 -3 + 50 - 6怎么表示呢?
    应该是CCLIIIIVX = CCLI
    首先CCL代表100 + 100 + 50.
    IIIIVX可以拆解为IIIIV和X
    IIIIV是一个加法,加起来是1 + 1 + 1 + 1 + 5 = 9.
    9在X(10)的左边,说明是减法,所以IIIV(9)X(10) = I(1)
    所以答案是CCLI



指数法则


我记得刚开始学习指数的时候,接触的都是平方,后来能接触到一些立方,但诸如N0这种是在最后面学习的,记得书上只有一句话——任何数的0次方都等于1

对当时的我而言,这句话只是几个字而已。。。就以10为基数演示,102是2个10相乘,100不应该是0个10相乘吗?怎么会是1呢?

那么为什么N0=1呢?还是拿10为基数演示:

众所周知,103是1000,102是100,101是10,那么我们能推出100是多少吗?

  我们可以看到,每当10的指数减1,数就变为原先的10分之1,因此,100就是1, 那么10n(n包括0)可以遵循下面的规律:

指数每减1,数字就变为原来的10分之1,那么我们也可以推出Nn的规律,指数每减1,数字就变为原来的N分之1.

那么我们保持住这个逻辑,再往下纵深,10-1是什么? 同样套用上面的规则(指数每减1,数字就变为原来的10分之1

原来10-1 为1/10是非常理所应当的事情。

接下来我们再用相同的方法,推一下20的值,10n的时候,指数每减1,值就变为原来的1/10,很自然的想到,2n的时候,指数每减1,值就变为原来的1/2.

再往下纵深,2-1就是20的1/2,也就是20除以2。

在从前的时候,我们记忆诸如100的值,是靠对公理的记忆,但是现在当我们重新捋出100的逻辑之后,我们让规则变得更简单了,我们在以后的学习中,更需要考虑的是,如何对一种现象进行适当的定义,以期让规则变得更简单。 这就从记忆力的问题转变为了想象力的问题,这种思维方式是这样的:“以简化规则为目标去定义值”

到这里,之前的这些“规则”我们就取名为“指数法则”,接下来我们需要把这一部分的数学规则更抽象一些,就能得到指数法则的表达式了。
                    Na * Nb = Na+b

当我乍一看到这个表达式的时候,我还不太清楚它和前面的指数演变规律有什么联系,我们就看下面的演变,100是1,指数加1,相当于在原来的基础上乘10,那么:
101 = 1 * 10 = 100 * 101 = 100+1.
102 = 1 * 10 * 10 = 100 * 101 * 101 我们在上一个式子已经算得100 * 101 = 101
那么,100 * 101 * 101 = 101 * 101 = 101+1.

同理:

103 = 1 * 10 * 10 * 10 = 100 * 101 * 101 * 101 = 102 * 101 = 102+1.

这样,我们就证明了Na * Nb = Na+b.

在我当年,直接给我这样一个表达式的时候,我只是把它背了下来而已,但是这样层层的递进再去理解的时候,会发现指数法则的模型抽取原来是如此的合理。


0所起的作用


1、占位

例如用10进制表示2503,这里面的0表示十位“没有”,虽说“没有”,但是这个0不能省略,如果省略了,就变成了253,那就是另一个数字了,在按位计数法中,数位具有很重要的意义,0的作用就是占着一个位置以保证数位高于它的数字不会产生错位。

2、统一标准,简化规则

以2503举例,可以变成2 * 103 + 5 * 102 + 0 * 101 + 3 * 10 0 = 2503

如果没有规定N0 = 1. 我们就必须特别处理“1”这个数字,0在这里起到了标准化的作用。


人类的极限和构造的发现


数学表示法的历史

古埃及人: 使用5进制和10进制混合的计数法,不是按位计数法,不存在0,将数字记在一种纸莎草纸上。

巴比伦人: 在黏土板上用棱形记号来表示数,他们使用表示1和10的两种棱形记号来表示1~59,并通过记号所在的位置来表示60n的数位,由此10进账和60进账混合的按位计数法就诞生了,现在通用的1小时为60分钟,1分钟未60秒的时间换算就是源于巴比伦的60进制计数法。 另外因为黏土板和纸莎草纸有所不同,很难写多种白吐司的记号,因此,巴比伦人需要以尽可能少的记号来表示数,也许正因此,才促成了按位计数法的产生。

古希腊人: 不仅仅把数字当做运算工具,还在其中注入哲学真理。他们将图形、宇宙、音乐与数字相关联。

玛雅人: 数数时从0开始,使用的是20进制计数法。

罗马人: 使用5进制和10进制混用的罗马数字。将1、5、10、50、100、500、1000表示为I、V、X、L、C、D、M. 比如IV表示4,IX表示9. 将数字列在左侧表示减法的表示法是后来制定的,古罗马时并不这样用。

印度人: 印度人在引进巴比伦的按位计数法的时候,把“0”也引了进去,而且采用的是10进制计数法。现在我们使用的0~9,被称为阿拉伯数字而不是印度数字,也许是因为将印度数字传入西欧的是阿拉伯学者的缘故吧。

为了超越人类的极限

接下来为什么人类需要发明计数法呢?

以罗马数字为例,将5表示为V,不过好像将5表示为IIIII也可以,但是这种方法的弊端在于数越大就越难处理,比如IIIIIIIIII和IIIIIIIIIII哪个大?不能马上得知。而X和XI就能马上比较谁大谁小。
这就是前辈们创造出的“单元”的概念。假如要表示“十二”,比起IIIIIIIIIIII,用XII比较方便,若使用按位计数法,写成“12”则更方便。

10进制计数法和按位计数法都是因为人类的能力有限,所以面对大的数字必须简便的表示,而如今,我们的数据越来越大了,按位计数法也显得力不从心了,10000000000000和100000000000000哪个大呢?很难一眼看出来,这时候,指数表示法显得异常重要,如果把刚才的两个数字表示为1012 和 1013就可以一眼看出后者比较大。

其实,现代我们用计算机来解决人类难以处理的大规模问题,我们绞尽脑汁地思考如何在短时间内解决大规模问题,“要解决大问题,就将它分解为多个小“单元”,如果小“单元”还是很大,那就继续分解成更小的“单元”,直到问题最终解决”,这种方法至今通用,比如在编写大程序的时候,一般会分解成多个小程序(模块)来开发。

这就是问题分解法



逻辑——真与假的二元世界








我的总结与思考


噢!原来是这样啊……


我数学不好的本质是什么呢?可能是因为我的数学底子太差,我的数学大厦搭建的歪七扭八,很多基本的概念都理不清楚,说不明白,也不知所以然,对我而言,很多的公理,真的只是一些文字的堆积而已,我从未在老师讲过之后,去探索一下人类探寻这些如此直白的简单的公理花费了多少精力,又有多少故事在其中,这一定是很有趣的,书上的那些数学大拿们,在我的脑中也不会如此的没有生机了。

而本书在开篇就给我带来了这样一种感觉——“当我看到讲指数的时候,我心里想,讲的也太基础了吧,这谁不会啊,但是就是这样一个我们再熟悉不过的概念,当我读过之后,我也仍感觉:噢!原来是这样啊……”。 它会让我一次又一次的感觉,原来我从前对这个这么直白的概念的了解始终差一层,这样很多个直白的概念,差了一层之后,偏差之千里了,数学怎么能学好呢?




祝秋安

未完待续。。。

猜你喜欢

转载自blog.csdn.net/qq_29582443/article/details/107972042