美文网首页具体数学
具体数学第三章笔记及习题解答

具体数学第三章笔记及习题解答

作者: 古剑诛仙 | 来源:发表于2019-08-29 19:26 被阅读0次

    离散数学是跟整数有关的数学,也是计算机科学的基础,本章就着重于讲述如何将分数转化为整数的技巧

    底和顶

    我们使用以下标记
    \lfloor x\rfloor=小于或等于x的最大整数
    \lceil x\rceil=大于或等于x的最小整数

    下面是一个函数的示意图


    image.png

    我们可以得出一个恒等式
    \lceil x\rceil- \lfloor x\rfloor=[x不是整数]
    这是因为当x为整数时,\lceil x\rceil=\lfloor x\rfloor=x,当x不为整数时,\lceil x\rceil-\lfloor x\rfloor=1
    同样的很明显有
    x-1<\lfloor x\rfloor\leq x\leq \lceil x\rceil<x+1
    \lfloor -x\rfloor=-\lceil x\rceil,\lceil -x\rceil=-\lfloor x\rfloor

    为了更直观的理解底和顶,可以通过以下不等式(其实就是上面不等式的变形,n表示一个整数)
    \lfloor x\rfloor=n \Leftrightarrow x-1<n\leq x<n+1\tag{1}
    \lceil x\rceil=n \Leftrightarrow n-1<x\leq n<x+1\tag{2}

    同时像\lfloor x+n\rfloor=\lfloor x\rfloor+n,\lceil x+n\rceil=\lceil x\rceil+n,可以将整数项挪入和挪出底或顶,但像\lceil nx\rceil\neq n\lceil x\rceil,\lfloor nx\rfloor\neq n\lfloor x\rfloor则不可以

    同样可以总结出以下几个不等式
    x<n\Leftrightarrow \lfloor x\rfloor<n\tag{3}
    n<x\Leftrightarrow n<\lceil x\rceil\tag{4}
    x\leq n\Leftrightarrow \lfloor x\rfloor\leq n\tag{5}
    n\leq x\Leftrightarrow n\leq \lceil x\rceil\tag{6}

    我们把x,\lfloor x\rfloor间的差称为x的分数部分\{x\}=x-\lfloor x\rfloor,同时称\lfloor x\rfloorx的整数部分

    x=\lfloor x\rfloor+\{x\}y=\lfloor y\rfloor+\{y\},有
    \lfloor x+y\rfloor=\lfloor x\rfloor+\lfloor y\rfloor+\lfloor {\{x\}}+{\{y\}}\rfloor
    0\leq{\{x\}} +{\{y\}}<2,故有

    \lfloor x+y\rfloor等于\lfloor x\rfloor+\lfloor y\rfloor\lfloor x\rfloor+\lfloor y\rfloor+1
    \lceil x+y\rceil等于\lceil x\rceil+\lceil y\rceil\lceil x\rceil+\lceil y\rceil-1

    底和顶的应用

    任意一个整数写成二进制表示需要多少位?
    经过简单的验证,我们可以通过\lfloor \lg n\rfloor+1\lceil \lg(n+1)\rceil两种位数表示(这里默认的底显然是2)

    而对于多个底或者顶的表达式,形如\lfloor \lceil x\rceil \rfloor这样的内层是底或者顶外层多个底或者顶的表达式,可以把外层的底或者顶省略掉而不改变表达式的值

    我们尝试证明以下命题
    \lfloor \sqrt{\lfloor x\rfloor} \rfloor=\lfloor \sqrt x\rfloor,x\geq 0

    在证明其存在或不存在时,我们可以首先猜测一个可能的值,试图找一个反例去否定命题,一是因为否定更加容易,二是因为在寻找反例中,我们会有机会寻找到证明的方法。这个例子中,无论怎么尝试,是找不出反例来的。

    如果我们借助微积分来证明,首先将x分解为整数和分数部分,用牛顿二项式定理将其展开,但展开后过于复杂不好处理

    我们换一种方式,先去掉原式左部分中外部的底和根号,然后去掉内层的底,最后将外层的符号还原回去最后得到右部分

    首先设m=\lfloor \sqrt{\lfloor x\rfloor} \rfloor,根据性质1,有m\leq \sqrt{\lfloor x \rfloor}<m+1
    由于不等式三个值都是正的,将其平方,得m^2\leq \lfloor x \rfloor<(m+1)^2
    对这个不等式左边使用性质6,右边使用性质3,则有m^2\leq x <(m+1)^2
    再同时开方得m\leq \sqrt x<m+1,利用性质1,\lfloor \sqrt x\rfloor=m
    即左式等于右式,命题得证

    在以上证明中,并没有严重依赖平方根的性质,我们把这个命题推广:
    f(x)是任意一个具有如下性质且在实数区间连续的单调递增函数
    f(x)=整数\quad \Rightarrow\quad x=整数

    只要f(x),f(\lfloor x\rfloor),f(\lceil x\rceil)都有定义,则有
    \lfloor f(x)\rfloor=\lfloor f(\lfloor x\rfloor)\rfloor,\lceil f(x)\rceil=\lceil f(\lceil x\rceil)\rceil

    下面是对顶的证明,底的证明类似

    x=\lceil x\rceil,显然是成立的,否则x<\lceil x\rceil,由于f(x)单调递增,\lceil \rceil非减,于是f(x)<f(\lceil x\rceil),\lceil f(x)\rceil\leq \lceil f(\lceil x\rceil)\rceil

    如果\lceil f(x)\rceil<\lceil f(\lceil x\rceil)\rceil,因为f(x)的连续性以及其必备的性质,必然存在一个整数y,使得x\leq y<\lceil x\rceil,f(y)=\lceil f(x)\rceil成立,但显然这样的数并不存在,于是命题得证

    这个定理有如下一个应用特例
    如果m,n为整数且分母n为正,则有
    {\left\lfloor\frac{x+m}{n}\right\rfloor}={{\left\lfloor\frac{\lfloor x\rfloor+m}{n}\right\rfloor}}, {\left\lceil\frac{x+m}{n}\right\rceil}={{\left\lceil\frac{\lceil x\rceil+m}{n}\right\rceil}}
    例如令m=0,则\Big\lfloor\big\lfloor\lfloor x/10\rfloor/10\big\rfloor/10\Big\rfloor=\lfloor x/1000 \rfloor,三次用10来除并抛弃个位数字,与用1000来除并抛弃余数,结果是一样的
    \lfloor x/1000 \rfloor=\lfloor \frac{x/100}{10} \rfloor=\Big\lfloor\frac{\lfloor x/100 \rfloor}{10}\Big\rfloor=\cdots重复下去即可得到左式结果

    image.png
    image.png

    在了解上面对于数学问题水平的定义之上,我们研究一下以下等式等号成立的条件
    \lceil \sqrt{\lfloor x\rfloor}\rceil{\stackrel{?}{=}} \lceil \sqrt x \rceil ,x\geq 0
    我们在尝试几个数后发现,有时等号成立,有时不成立,以水平4的角度去寻找等号成立的条件会发现:
    m^2<x<m^2+1时,等号左边为m,右边则为m+1,等号不成立
    m^2+1\leq x \leq (m+1)^2时,等号成立
    因此我们可以说等号成立的充要条件为:x为整数或者\sqrt{\lfloor x\rfloor}不为整数

    现在我们从区间的角度数一数其中的整数个数。我们知道开区间(a,b)表示满足a<x<b的所有x取值,闭区间[a,b]表示满足a\leq x\leq b的所有x取值,而半开半闭区间同理。事实上,两个同类型的半开半闭区间可以很方便的相加,但显然开区间和闭区间不能随便这么做。于是我们先从半开半闭区间研究。

    a,b都为整数时,显然在区间[a,b)内的整数有a,a+1,\dots,b-1b-a个;区间(a,b]内的整数有a+1,\dots,bb-a个。
    a,b为任意实数时,根据我们之前了解到的底和顶的性质,有
    a\leq n<b \Leftrightarrow \lceil a\rceil\leq n<\lceil b\rceil
    a< n\leq b \Leftrightarrow \lfloor a\rfloor< n\leq\lfloor b\rfloor

    从而得出[a,b)包含\lceil b\rceil-\lceil a\rceil个整数,(a,b]包含\lfloor b\rfloor-\lfloor a\rfloor个整数,类似的[a,b]包含\lfloor b\rfloor-\lceil a\rceil+1个整数,(a,b)包含\lceil b\rceil-\lfloor a\rfloor-1个整数

    这里规定一个习惯,对[a,b)用顶来表示,对(a,b]用底来表示,用表格来总结一下

    区间 包含整数的个数 条件
    [a,b] \lfloor b\rfloor-\lceil a\rceil+1 a\leq b
    [a,b) \lceil b\rceil-\lceil a\rceil a\leq b
    (a,b] \lfloor b\rfloor-\lfloor a\rfloor a\leq b
    (a,b) \lceil b\rceil-\lfloor a\rfloor-1 a<b

    下面我们看一个具体的例子来验证我们所总结的内容
    计算1~1000中(包含两端)的整数个数,其满足\lfloor \sqrt[3]{n}\rfloor \Big|n,也就是一个数n能被它的立方根的底整除的条件
    我们把个数设为S,则有
    \begin{align}S&=\sum_{1\leq n\leq 1000}[\lfloor \sqrt[3]{n}\rfloor \Big|n]\\&=\sum_{k,m,n}[k^3\leq n<(k+1)^3][n=km][1\leq n\leq 1000]\\ &=1+\sum_{k,m}[k^3\leq km<(k+1)^3][1\leq k<10]\quad\text{这里将n=1000的情况单独列出}\\ &=1+\sum_{k,m}[m\in[k^2,\frac{(k+1)^3}{k})][1\leq k<10]\\ &=1+\sum_{1\leq k<10}(\lceil k^2+3k+3+\frac{1}{k}\rceil-\lceil k^2\rceil)\\ &=1+\sum_{1\leq k<10}\lceil 3k+3+\frac{1}{k}\rceil\\ &=1+\sum_{1\leq k<10}(3k+4)\\ &=1+\frac{7+31}{2}\times 9=172 \end{align}
    注意到注释部分,之所以这么做是想要使得k的取值范围变成一个半开半闭的区间,把n=1000单独列出来后,就可以做到这一点,之后使用上面表格中的性质就很方便了。

    下面我们把1000这个具体的数字变成代数N,同样的条件,我们来计算一下结果

    我们设K^3\leq N<(K+1)^3,也就是说K=\lfloor \sqrt[3]{N}\rfloorK是小于或等于N的立方根最大的整数,则根据上面我们计算的经验
    \begin{align}S'&=\sum_{1\leq k<K}(3k+4)+\sum_m [K^3\leq Km\leq N]\\ &=\frac{(7+3K+1)(K-1)}{2}+\sum_m\big[m\in[K^2,\frac{N}{K}]\big]\\ &=\frac{3}{2}K^2+\frac{5}{2}K-4+\sum_m\big[m\in[K^2,\frac{N}{K}]\big] \end{align}
    后面的和式等于\lfloor \frac{N}{K}\rfloor-\lceil K^2\rceil +1=\lfloor \frac{N}{K}\rfloor-K^2+1
    故最后的答案为
    S'=\lfloor \frac{N}{K}\rfloor+\frac{1}{2}K^2+\frac{5}{2}K-3,K=\lfloor \sqrt[3]{N}\rfloor

    这样就得出了一个一般性的答案

    观察这个公式前两项近似于N^\frac{2}{3}+\frac{1}{2}N^\frac{2}{3}=\frac{3}{2}N^\frac{2}{3},而其余项可记做O(N^\frac{1}{3}),在N足够大的情况下,是可以忽略的,但在取一些不够大的值时,如果需要精确的数据,不可以随便忽略

    下面我们讲一个新的概念:

    一个实数a的谱是整数组成的一个无限多重(元素可重复,数论里有讲)集合
    Spec(a)=\{\lfloor a\rfloor,\lfloor 2a\rfloor,\lfloor 3a\rfloor,\dots\}
    例如1 \over 2的谱就是\{0,1,1,2,2,3,3,\dots\}
    谱有一个基本的性质,就是当a\neq b时,Spec(a)\neq Spec(b),其证明如下:

    假设a<b,则存在一个正整数m使得m(b-a)\geq 1,即mb-ma\geq 1\lfloor mb\rfloor>\lfloor ma\rfloor,显然Spec(b)有少于m个元素\leq \lfloor ma\rfloor,而Spec(a)至少有m个这样的元素

    下面我们看一下谱一个有趣的性质,比如观察下面两个谱
    \begin{align}Spec(\sqrt 2)&=\{1,2,4,5,7,8,9,11,12,14,15,16,18,19,21,22,24,\dots\}\\ Spec(2+\sqrt 2)&=\{3,6,10,13,17,20,23,27,30,34,37,40,44,47,51,\dots\} \end{align}

    观察到Spec(2+\sqrt 2)的第n个元素恰好比Spec(\sqrt 2)的第n个元素大2n,同时更惊人的是全体正整数是Spec(2+\sqrt 2)Spec(\sqrt 2)的不相交并集,我们称这两个谱构成了正整数的一个划分

    其证明思路就是对任意正整数n,我们计算Spec(\sqrt 2)中有多少个元素是\leq n的,以及Spec(2+\sqrt 2)中有多少个元素是\leq n的,然后将两个值相加,如果等于n,则命题得证

    \alpha是正数,Spec(\alpha)\leq n的元素个数是
    \begin{align}N(\alpha,n)&=\sum_{k>0}\big[\lfloor k\alpha \rfloor\leq n\big]\\ &=\sum_{k>0}\big[\lfloor k\alpha \rfloor< n+1\big]\\ &=\sum_{k>0}\big[ k\alpha < n+1\big]\\ &=\sum_k [0<k<\frac{n+1}{\alpha}]\\ &=\lceil \frac{n+1}{\alpha}\rceil-1 \end{align}
    在上面的推导中,有两处值得注意,首先有
    m\leq n \Leftrightarrow m<n+1,m,n均为整数
    这一步将\leq改为<,根据性质3,可以将底去掉
    同时我们限定k>0求和而非k\geq 1,这是因为(0,\frac{n+1}{\alpha})[1,\frac{n+1}{\alpha})区别的地方是\frac{n+1}{\alpha}有可能小于1,前者更加准确

    下面我们套用这个公式,计算N(\sqrt 2,n)+N(2+\sqrt 2,n)的结果
    \Bigg\lceil\frac{n+1}{\sqrt 2}\Bigg\rceil-1+\Bigg\lceil\frac{n+1}{2+\sqrt 2}\Bigg\rceil-1
    注意到\frac{n+1}{\sqrt 2}在n为整数时必定不为整数,于是顶减1正好为底,于是可以化为
    \Bigg\lfloor\frac{n+1}{\sqrt 2}\Bigg\rfloor+\Bigg\lfloor\frac{n+1}{2+\sqrt 2}\Bigg\rfloor

    进一步化为
    \frac{n+1}{\sqrt 2}-\{ \frac{n+1}{\sqrt 2} \}+\frac{n+1}{2+\sqrt 2}-\{\frac{n+1}{2+\sqrt 2}\}
    由于有恒等式
    \frac{1}{\sqrt 2}+\frac{1}{2+\sqrt 2}=1
    所以原式可以化为
    n+1-\{ \frac{n+1}{\sqrt 2} \}-\{\frac{n+1}{2+\sqrt 2}\}
    也就是说只要我们证明
    \{ \frac{n+1}{\sqrt 2} \}+\{\frac{n+1}{2+\sqrt 2}\}=1
    原式也就等于n了
    我们设两个非整数a=\frac{n+1}{\sqrt 2},b=\frac{n+1}{2+\sqrt 2},显然有a+b=n+1,这两个数的整数部分的和显然是n,分数部分的和显然就是1了,故命题得证

    底和顶的递归式

    含有底或顶的递归关系经常在计算机科学中出现,因为很多以分而治之为基础的算法,会把一个大小为n的问题转化为n的几分之一(取整)的多个小问题。例如给n个记录排序的一种方法是把它们分为两个近乎相等的部分,一部分大小为\lceil \frac{n}{2}\rceil,另一部分大小为\lfloor \frac{n}{2}\rfloor,显然我们知道n=\lceil \frac{n}{2}\rceil+\lfloor \frac{n}{2}\rfloor。在每一部分被分别排序后(切分过的部分自然也可以循环的切分为两部分),通过每一步做至多n-1次比较,最后将这些记录合并成最后的排序,这样一来,我们设最终的比较次数最多为f(n),则有

    • f(1)=0
    • f(n)=f(\lceil \frac{n}{2}\rceil)+f(\lfloor \frac{n}{2}\rfloor)+n-1,n>1

    这里稍微解释一下为什么两个已排序的几乎等长(其实以最坏情况考虑,等长不等长结果是一样的)数组(为了叙述的习惯,叫数组比较顺口)需要至多n-1次比较才能将两者合并为一个已排序的数组。我们惯用的方法是将两个数组两端(或者是最大或者是最小,这里举例用最小的)的元素进行比较,较小的放入新的存储结果的数组并改变这个数组的端点(角标向后移一位),较大的其数组端点保持不变,重复以上步骤直至两个数组中有一个没有元素,将另一个的数组中所有剩余的元素依次序放入新数组,结束整个步骤。显然每次比较会在新数组中填入一个元素,至多n-1次比较后,一定会有一个数组元素为空,此时不再需要比较,直接将最后的元素填入新数组就结束了。

    这个递归式的解在习题34中,我们提前把答案写出来
    f(n)=\sum_{k=1}^{n}\lceil \lg k\rceil
    其封闭形式的计算如下:
    我们设m=\lceil \lg n\rceil,则f(2^m)=\sum_{k=1}^{2^m}\lceil \lg k\rceil,显然当k\in(2^{i-1}+1,2^i]时,\lceil \lg k\rceil=i,这个区间有2^{i-1}个整数,故和式可改写为
    f(2^m)=\sum_{k=1}^{2^m}\lceil \lg k\rceil=\lceil \lg 1\rceil+\lceil \lg 2\rceil+\sum_3^4\lceil \lg k\rceil+\cdots+\sum_{2^{m-1}+1}^{2^m}\lceil \lg k\rceil
    \sum_{2^{m-1}+1}^{2^m}\lceil \lg k\rceil可以化为m\times 2^{m-1},故原式可进一步化为
    f(2^m)=\sum_{k=1}^{m}k2^{k-1}
    这个和式我们第二章有讲,这里直接给出答案
    f(2^m)=\sum_{k=1}^{m}k2^{k-1}=(m-1)2^m+1

    现在我们反过来计算f(n)
    要知道2^m\geq n的,所以我们有
    f(n)=f(2^m)-(2^m-n)m
    注意这里(2^m-n)m式中的(2^m-n)表示我们多计算了多少次,m代表此时对应的\lceil \lg k\rceil
    所以最后化简得到
    f(n)=mn-2^m+1,m=\lceil \lg n\rceil
    也就是说最终是一个比较次数为n\lg n复杂度的算法

    如果感兴趣的话,我们再来看一下如何证明这个答案就是我们需要的答案


    image.png

    绕了这么大一圈,我们回头看一下第一章的约瑟夫问题

    • J(1)=1
    • J(2n)=2J(n)-1,n>0
    • J(2n+1)=2J(n)+1,n>0

    此时我们可以更准确的将最基本的情况归纳为以下递归式

    • J(1)=1
    • J(n)=2J(\lfloor \frac{n}{2}\rfloor)-(-1)^n,n>1

    同时如果我们把条件变成每隔2人杀死一人,那么我们最终得到递归式

    J_3(n)=\Bigg(\bigg\lceil\frac{3}{2}J_3\Big(\Big\lfloor \frac{2}{3}n\Big\rfloor\Big)+a_n\bigg\rceil \mod n\Bigg)+1
    n\mod 3=0,1,2a_n=-2,1,-\frac{1}{2}
    这个递归式有着分数、底和顶,想要化简不是一件容易的事,我们在下面给出一种更好的解决方案,同时附上其相应的java代码

    我们规定每当循环中,一个人幸存了,就把他的号码替换为最大的号码加1,这样1号,2号跳过,于是变成了n+1,n+2号,3号被杀,4号5号变成了n+3,n+4,以此类推...3k+13k+2号变成n+2k+1,n+2k+2号。最终是3n号被处死,比如当n=10时,有下图

    image.png
    所以如果我们能算出标号为的人最初的号码,就可以获得我们想要的答案

    当某时刻任意一个还活着的人的号码为N时,如果N>n,则他必定有一个以前的号码,则根据我们上文的规定,有N=n+2k+1或者N=n+2k+2,于是有k=\lfloor (N-n-1)/2\rfloor,而这个人之前的号码分别可能为3k+13k+2,用一个式子来表示这两种情况可以通过3k+(N-n-2k)=k+N-n
    再把kN,n表示,则上式可以写做\lfloor (N-n-1)/2\rfloor+N-n,之后只需要不断把这个之前的号码以如上步骤循环迭代下去,直至这个号码\leq n,则这个号码就是最后活下去的人刚开始的编号
    综上我们可以写出伪代码

    \begin{split}&N=3n;\\ &while \quad &N>n\\ &do\quad &N=\lfloor (N-n-1)/2\rfloor+N-n\\ &J_3(n)=N \end{split}

    虽然我们以上面的方式去设计算法,肯定是可以解出最后的答案的,但这个式子还是太复杂,我们尝试去简化这个算法
    我们用D=3n+1-N来替换N作为迭代的值,有N=3n+1-D,则我们根据上文中N的迭代式从而写出D的迭代式
    D=3n+1-\bigg(\bigg\lfloor\frac{(3n+1-D)-n-1}{2}\bigg\rfloor+(3n+1-D)-n\bigg)\\=n+D-\bigg\lfloor\frac{2n-D}{2}\bigg\rfloor=D-\bigg\lfloor\frac{-D}{2}\bigg\rfloor=D+\bigg\lceil\frac{D}{2}\bigg\rceil=\bigg\lceil\frac{3}{2}D\bigg\rceil

    此时我们将算法改写为:
    \begin{split}&D=1;\\ &while &D\leq 2n\\ &do &D=\bigg\lceil\frac{3}{2}D\bigg\rceil\\ &J_3(n)=3n+1-D \end{split}

    在上一种算法中,N3n迭代减到小于等于n,算法结束
    而现在这种算法,D从1迭代增到大于2n,算法结束

    事实上,我们可以通过类似的推理获得一个结论:
    当每隔q-1个人就杀掉一人,幸存者J_q(n)可以使用以下方式计算
    \begin{split}&D=1;\\ &while &D\leq (q-1)n\\ &do &D=\bigg\lceil\frac{q}{q-1}D\bigg\rceil\\ &J_3(n)=qn+1-D \end{split}
    注意到这种算法的复杂度为
    \log_{\frac{q}{q-1}}(q-1)n
    使用换底公式可以化为
    \frac{\ln(q-1)n}{\ln\frac{q}{q-1}}=\frac{\ln(q-1)+\ln n}{\ln q-\ln (q-1)}
    显然除了\ln n之外,其余都是常数,所以复杂度是\ln n

    下面我们看一下常见的解约瑟夫问题的算法,同时我们对其复杂度进行分析
    这里我们用m表示数到几的人被杀,n表示一共多少人
    先看一种最普通的解法:通过对环形单向链表的节点进行删除获得最后结果,其具体步骤如下:

    1. 如果链表节点数为1,或者m的值小于1,则直接返回
    2. 在环形单向链表中不断循环遍历每个节点,在此过程中,让节点报数
    3. 当报数从1到m时,删除报数为m的节点
    4. 删除节点后,注意要保持链表的环形状态

    我们看一下具体的代码实现

    相关文章

      网友评论

        本文标题:具体数学第三章笔记及习题解答

        本文链接:https://www.haomeiwen.com/subject/dcousctx.html