Chapter 4 基于难解计算(Intractable Computation)的密码学

John Nash提出一个观点:如果破解一个密码算法的计算耗费时间很长,那么这个密码算法从实用的角度上是安全的。这里的安全并非某种攻击无法发生,而是即使发生了要破解密码也开销极大,也就是”难解“。这一观点是超越是跨时代的,在现代密码学中十分重要。

文章目录

  • Chapter 4 基于难解计算(Intractable Computation)的密码学
    • 一、”难解“(Computationally Infeasible)的定义
    • 二、”成功概率极低“(negligible)的定义
    • 三、不可区分(Indistinguishability)的定义
      • 1、定义
      • 2、Bad-Event引理
    • 四、不可区分的实例
      • 1、生日悖论(birthday problem)
      • 2、一对不可区分库:均匀采样、不重复选

一、”难解“(Computationally Infeasible)的定义

这里关注的是攻击算法的时间开销,定量上用渐进运行时间来衡量。

定义4.1 多项式时间算法是指存在一个常数c,c>0c,c>0c,c>0,对于所有输入(字符串)xxx,算法都能在O(∣x∣c)O(|x|^c)O(∣x∣c)步内完成。

多项式时间算法具有封闭性:一个多项式时间算法运行多项式次,整个过程依然是多项式时间。

密码算法拥有一个安全参数λ\lambdaλ(security parameter),一般指的是密钥长度是λ\lambdaλ-bit,用于衡量破解该算法的复杂度。值得注意的是,一个大小为N的数,在计算机中只需要用log⁡2N\log_2Nlog2​N-bit表示。

二、”成功概率极低“(negligible)的定义

在安全性上,我们既无需考虑时间开销大的攻击,也不需要考虑成功概率极低的攻击。下面将对成功概率极低(negligible)进行正式定义。

定义4.2 一个函数fff是成功概率极低的(negligible),当且仅当对所有的多项式p(λ)p(\lambda)p(λ),都有lim⁡λ→∞p(λ)f(λ)=0\lim_{\lambda \rightarrow\infin}p(\lambda)f(\lambda)=0limλ→∞​p(λ)f(λ)=0。

这里的f(λ)f(\lambda)f(λ)就是函数的成功概率。这个定义意味着f(λ)f(\lambda)f(λ)比多项式更快速趋向0(比如12λ\frac{1}{2^\lambda}2λ1​),因此可以视为非常小。

推论:如果对任意整数ccc,有lim⁡λ→∞λcf(λ)=0\lim_{\lambda \rightarrow\infin}\lambda^cf(\lambda)=0limλ→∞​λcf(λ)=0,那么fff是成功概率极低的(negligible)。

**推论证明:**假设fff满足lim⁡λ→∞λcf(λ)=0\lim_{\lambda \rightarrow\infin}\lambda^cf(\lambda)=0limλ→∞​λcf(λ)=0这一性质,那么对于每一个多项式ppp,记其最高次为ddd,有lim⁡λ→∞p(λ)f(λ)=lim⁡λ→∞p(λ)λd+1⋅λd+1f(λ)=(lim⁡λ→∞p(λ)λd+1)⋅(lim⁡λ→∞λd+1f(λ))=0\lim_{\lambda \rightarrow\infin}p(\lambda)f(\lambda)=\lim_{\lambda \rightarrow\infin} \frac{p(\lambda)}{\lambda^{d+1}}\cdot\lambda^{d+1}f(\lambda) =(\lim_{\lambda \rightarrow\infin} \frac{p(\lambda)}{\lambda^{d+1}})\cdot(\lim_{\lambda \rightarrow\infin}\lambda^{d+1}f(\lambda))=0limλ→∞​p(λ)f(λ)=limλ→∞​λd+1p(λ)​⋅λd+1f(λ)=(limλ→∞​λd+1p(λ)​)⋅(limλ→∞​λd+1f(λ))=0。因此根据定义4.2,fff是negligible。

在此基础上,我们认为如果两个函数的成功概率之差极低(也就是两者发生概率极其相似),那么这两个函数是近似的。

定义4.3 如果f,g:N→Rf,g:N\rightarrow Rf,g:N→R是两个函数,f≈gf\approx gf≈g当且仅当∣f(λ)−g(λ)∣|f(\lambda)-g(\lambda)|∣f(λ)−g(λ)∣是negligible的。

这里的∣f(λ)−g(λ)∣|f(\lambda)-g(\lambda)|∣f(λ)−g(λ)∣又称为用于区分这两个函数的advantage(没有找到合适的中文翻译)。

三、不可区分(Indistinguishability)的定义

1、定义

在第二章时定义过库的等价性(Interchangeable),那么在定义了negligible之后就可以定义库的不可区分性——虽然不可区分比等价的条件稍弱,但是在考虑negligible的安全性上是足够的。

定义4.4 两个库是不可区分的(Indistinguishable,Lleft≈~LrightL_{left}\widetilde\approx L_{right}Lleft​≈Lright​),当且仅当对于所有多项式时间的程序AAA都有Pr[A⋄Lleft⇒true]≈Pr[A⋄Lright⇒true]Pr[A\diamond L_{left} \Rightarrow true]\approx Pr[A\diamond L_{right} \Rightarrow true]Pr[A⋄Lleft​⇒true]≈Pr[A⋄Lright​⇒true]。

与等价性类似,不可区分也有传递性,以及一个连接的性质:如果Lleft≈~LrightL_{left}\widetilde\approx L_{right}Lleft​≈Lright​,则L∗⋄Lleft≈~L∗⋄LrightL^*\diamond L_{left}\widetilde\approx L^*\diamond L_{right}L∗⋄Lleft​≈L∗⋄Lright​。

2、Bad-Event引理

引理4.1(Bad-Event) 两个库各加入一个名为bad的变量并初始化为0。若两个库的代码除了bad=1时的部分外完全相同,那么
∣Pr[A⋄Lleft⇒1]−Pr[A⋄Lright⇒1]∣≤Pr[A⋄Lleftsetsbad=1].|Pr[A \diamond L_{left} ⇒ 1] − Pr[A \diamond L_{right} ⇒ 1]|\le Pr[A \diamond L_{left} \quad sets\quad bad = 1]. ∣Pr[A⋄Lleft​⇒1]−Pr[A⋄Lright​⇒1]∣≤Pr[A⋄Lleft​setsbad=1].

其实这里bad的引入只是为了更形象地说明,如果两个库运行不一致时就是bad event。实际上,这里可以理解为,两个库运行结果不一样的概率,小于等于某个库的代码运行到导致结果不一样的地方(sets bad)的概率,因为此外所有代码都是相同的。

比如下面这两个库,可以发现导致结果不一样的就是return true那里,因此可以标注为set bad=1。由于是均匀采样,可以知道set bad的概率为12λ\frac{1}{2^\lambda}2λ1​。利用上述引理,可以发现这两个库的概率之差小于等于12λ\frac{1}{2^\lambda}2λ1​,根据定义4.4和定义4.2,这两个库不可区分——也就是盲猜(左边随机猜x)基本上是猜不中(右边永远return false)的。

引理证明:下面使用条件概率进行证明。定义事件BleftB_{left}Bleft​是LleftL_{left}Lleft​在运行中设置bad=1,BrightB_{right}Bright​是LrightL_{right}Lright​在运行中设置bad=1。对于任何一个程序AAA,根据全概率公式有
Pr[A⋄Lleft⇒1]=Pr[A⋄Lleft⇒1∣Bleft]Pr[Bleft]+Pr[A⋄Lleft⇒1∣Bleft‾]Pr[Bleft‾]Pr[A⋄Lright⇒1]=Pr[A⋄Lright⇒1∣Bright]Pr[Bright]+Pr[A⋄Lright⇒1∣Bright‾]Pr[Bright‾]Pr[A \diamond L_{left} \Rightarrow 1]=Pr[A \diamond L_{left} \Rightarrow 1|B_{left}]Pr[B_{left}]+Pr[A \diamond L_{left} \Rightarrow 1|\overline{B_{left}}]Pr[\overline{B_{left}}]\\ Pr[A \diamond L_{right} \Rightarrow 1]=Pr[A \diamond L_{right} \Rightarrow 1|B_{right}]Pr[B_{right}]+Pr[A \diamond L_{right} \Rightarrow 1|\overline{B_{right}}]Pr[\overline{B_{right}}]\\ Pr[A⋄Lleft​⇒1]=Pr[A⋄Lleft​⇒1∣Bleft​]Pr[Bleft​]+Pr[A⋄Lleft​⇒1∣Bleft​​]Pr[Bleft​​]Pr[A⋄Lright​⇒1]=Pr[A⋄Lright​⇒1∣Bright​]Pr[Bright​]+Pr[A⋄Lright​⇒1∣Bright​​]Pr[Bright​​]
其中Pr[Bleft]=Pr[Bright]Pr[B_{left}]=Pr[B_{right}]Pr[Bleft​]=Pr[Bright​],这是因为在进入bad=1之前所有代码都是一样的。故记 p∗=defPr[Bleft]=Pr[Bright]p^*\overset{def}=Pr[B_{left}]=Pr[B_{right}]p∗=defPr[Bleft​]=Pr[Bright​],这个概率正是运行到bad=1即bad event发生的概率。因此advantage计算如下:
∣Pr[A⋄Lleft⇒1]−Pr[A⋄Lright⇒1]∣=∣Pr[A⋄Lleft⇒1∣Bleft]Pr[Bleft]+Pr[A⋄Lleft⇒1∣Bleft‾]Pr[Bleft‾]−Pr[A⋄Lright⇒1∣Bright]Pr[Bright]+Pr[A⋄Lright⇒1∣Bright‾]Pr[Bright‾]∣=∣p∗(Pr[A⋄Lleft⇒1∣Bleft]−Pr[A⋄Lright⇒1∣Bright])+(1−p∗)(Pr[A⋄Lleft⇒1∣Bleft‾]−Pr[A⋄Lright⇒1∣Bright‾])∣=p∗∣Pr[A⋄Lleft⇒1∣Bleft]−Pr[A⋄Lright⇒1∣Bright]∣\begin{aligned} |Pr[A \diamond L_{left} ⇒ 1] − Pr[A \diamond L_{right} ⇒ 1]|=&|Pr[A \diamond L_{left} \Rightarrow 1|B_{left}]Pr[B_{left}]+Pr[A \diamond L_{left} \Rightarrow 1|\overline{B_{left}}]Pr[\overline{B_{left}}]\\ &-Pr[A \diamond L_{right} \Rightarrow 1|B_{right}]Pr[B_{right}]+Pr[A \diamond L_{right} \Rightarrow 1|\overline{B_{right}}]Pr[\overline{B_{right}}]|\\ \\ =&|p^*(Pr[A \diamond L_{left} \Rightarrow 1|B_{left}]-Pr[A \diamond L_{right} \Rightarrow 1|B_{right}])\\ &+(1-p^*)(Pr[A \diamond L_{left} \Rightarrow 1|\overline{B_{left}}]-Pr[A \diamond L_{right} \Rightarrow 1|\overline{B_{right}}])|\\\\ =&p^*|Pr[A \diamond L_{left} \Rightarrow 1|B_{left}]-Pr[A \diamond L_{right} \Rightarrow 1|B_{right}]| \end{aligned} ∣Pr[A⋄Lleft​⇒1]−Pr[A⋄Lright​⇒1]∣===​∣Pr[A⋄Lleft​⇒1∣Bleft​]Pr[Bleft​]+Pr[A⋄Lleft​⇒1∣Bleft​​]Pr[Bleft​​]−Pr[A⋄Lright​⇒1∣Bright​]Pr[Bright​]+Pr[A⋄Lright​⇒1∣Bright​​]Pr[Bright​​]∣∣p∗(Pr[A⋄Lleft​⇒1∣Bleft​]−Pr[A⋄Lright​⇒1∣Bright​])+(1−p∗)(Pr[A⋄Lleft​⇒1∣Bleft​​]−Pr[A⋄Lright​⇒1∣Bright​​])∣p∗∣Pr[A⋄Lleft​⇒1∣Bleft​]−Pr[A⋄Lright​⇒1∣Bright​]∣​
最后一步的化简是因为Pr[A⋄Lleft⇒1∣Bleft‾]−Pr[A⋄Lright⇒1∣Bright‾]=0Pr[A \diamond L_{left} \Rightarrow 1|\overline{B_{left}}]-Pr[A \diamond L_{right} \Rightarrow 1|\overline{B_{right}}]=0Pr[A⋄Lleft​⇒1∣Bleft​​]−Pr[A⋄Lright​⇒1∣Bright​​]=0:在没有bad=1的条件下,两个库的代码时一致的,因此两个概率相等。至此,由于∣Pr[A⋄Lleft⇒1∣Bleft]−Pr[A⋄Lright⇒1∣Bright]∣≤1|Pr[A \diamond L_{left} \Rightarrow 1|B_{left}]-Pr[A \diamond L_{right} \Rightarrow 1|B_{right}]|\le1∣Pr[A⋄Lleft​⇒1∣Bleft​]−Pr[A⋄Lright​⇒1∣Bright​]∣≤1,因此得到
∣Pr[A⋄Lleft⇒1]−Pr[A⋄Lright⇒1]∣≤p∗=defPr[A⋄Lleftsetsbad=1]|Pr[A \diamond L_{left} ⇒ 1] − Pr[A \diamond L_{right} ⇒ 1]|\le p^*\overset{def}= Pr[A \diamond L_{left} \quad sets\quad bad = 1] ∣Pr[A⋄Lleft​⇒1]−Pr[A⋄Lright​⇒1]∣≤p∗=defPr[A⋄Lleft​setsbad=1]
证毕。

四、不可区分的实例

许多密码算法需要均匀采样字符串,而在前几章中并没有说明如果均匀采样的密钥重复了能否保证安全性。因此在此将证明均匀采样和不重复选取这个两种方法(可以视为两个库)是不可区分的。不过在此之前,先介绍生日悖论(birthday problem)。

1、生日悖论(birthday problem)

生日悖论是指在qqq个人(相当于在一年的日期中均匀采样)中存在两人生日相同的概率有多大。一般人认为这个概率很小,但事实上随着qqq的增大,这个概率很快就已经较高(q=70q=70q=70的时候概率已达到99.9%!)。

我们将这样的概率称之为生日概率(birthday probability),并记为BirthdayProb(q,N)BirthdayProb(q,N)BirthdayProb(q,N),其中qqq就是总人数,NNN是取值数(在生日问题下N=365N=365N=365)。那么上述概率也等价于下面这个程序返回值为1的概率:

定理4.2 BirthdayProb(q,N)=1−∏i=1q−1(1−iN)BirthdayProb(q,N)=1-\prod_{i=1}^{q-1}(1-\frac{i}{N})BirthdayProb(q,N)=1−∏i=1q−1​(1−Ni​)

**定理证明:**要计算这个概率,可以计算它的补,也就是上述程序中的每一对i、ji、ji、j都不相同。对于上面的程序B(q,N)B(q,N)B(q,N),对于最外层循环每一轮,也就是每一次(第一次除外)sis_isi​取值,要想与前面的值不重复(前面的每个值也要求不重复),只有N−(i−1)N-(i-1)N−(i−1)种选择,所以概率就是N−(i−1)N=1−i−1N\frac{N-(i-1)}{N}=1-\frac{i-1}{N}NN−(i−1)​=1−Ni−1​。由于每一轮是独立的,因此概率可以相乘。而要想没有重复,就需要每一轮都没有重复,故计算如下:
BirthdayProb(q,N)=1−Pr[B(q,N)==0]=1−(1−1N)(1−2N)...(1−q−1N)=1−∏i=1q−1(1−iN)\begin{aligned} BirthdayProb(q,N)=&1-Pr[B(q,N)==0]\\ =&1-(1-\frac{1}{N})(1-\frac{2}{N})...(1-\frac{q-1}{N})\\ =&1-\prod_{i=1}^{q-1}(1-\frac{i}{N}) \end{aligned} BirthdayProb(q,N)===​1−Pr[B(q,N)==0]1−(1−N1​)(1−N2​)...(1−Nq−1​)1−i=1∏q−1​(1−Ni​)​

根据定理4.2可以得到生日概率的上下界,而且我们更关注的是qqq远小于NNN的情况。

定理4.3 若q≤2Nq\le \sqrt{2N}q≤2N​,以下不等式成立:
0.632q(q−1)2N≤BirthdayProb(q,N)≤q(q−1)2N0.632\frac{q(q-1)}{2N}\le BirthdayProb(q,N) \le \frac{q(q-1)}{2N} 0.6322Nq(q−1)​≤BirthdayProb(q,N)≤2Nq(q−1)​
上述不等式也说明了生日概率的紧确界为Θ(q2N)\Theta(\frac{q^2}{N})Θ(Nq2​)。

定理证明:

首先证明上界。这里用到一个不等式(对非负数x,y):(1−x)(1−y)=1+xy−(x+y)≥1−(x+y)(1-x)(1-y)=1+xy-(x+y)\ge1-(x+y)(1−x)(1−y)=1+xy−(x+y)≥1−(x+y)。更一般地,有∏i=1n(1−xi)≥1−∑i=1nxi\prod_{i=1}^n(1-x_i)\ge1-\sum_{i=1}^nx_i∏i=1n​(1−xi​)≥1−∑i=1n​xi​。这个推广在前一步的基础上也较好证明,因为可以把前一步的(x+y)(x+y)(x+y)当作一个新的x′x'x′,再次进行类似的放缩。利用此不等式,可以证明:
BirthdayProb(q,N)=1−∏i=1q−1(1−iN)≤1−(1−∑i=1q−1iN)=1−(1−q(q−1)2N)=q(q−1)2NBirthdayProb(q,N)=1-\prod_{i=1}^{q-1}(1-\frac{i}{N}) \le1-(1-\sum_{i=1}^{q-1}\frac{i}{N}) =1-(1-\frac{q(q-1)}{2N})=\frac{q(q-1)}{2N} BirthdayProb(q,N)=1−i=1∏q−1​(1−Ni​)≤1−(1−i=1∑q−1​Ni​)=1−(1−2Nq(q−1)​)=2Nq(q−1)​
下面证明下界。这里运用到另一个不等式:当0≤x≤10\le x\le10≤x≤1时,1−x≤e−x≤1−0.632x1-x\le e^{-x}\le1-0.632x1−x≤e−x≤1−0.632x。这里的0.6320.6320.632即1−1e1-\frac{1}{e}1−e1​,也就是在x=1x=1x=1处恰好1−kx=e−x1-kx=e^{-x}1−kx=e−x的kkk的取值。

利用此不等式,可以证明(根据q≤2Nq\le \sqrt{2N}q≤2N​,有q(q−1)2N≤1\frac{q(q-1)}{2N}\le12Nq(q−1)​≤1):
BirthdayProb(q,N)=1−∏i=1q−1(1−iN)≥1−∏i=1q−1(e−iN)=1−e−∑i=1q−1iN=1−e−q(q−1)2N≥1−(1−0.632q(q−1)2N)=0.632q(q−1)2N\begin{aligned} BirthdayProb(q,N)=&1-\prod_{i=1}^{q-1}(1-\frac{i}{N})\\ \ge&1-\prod_{i=1}^{q-1}(e^{-\frac{i}{N}}) =1-e^{-\sum_{i=1}^{q-1}\frac{i}{N}} =1-e^{-\frac{q(q-1)}{2N}}\\ \ge&1-(1-0.632\frac{q(q-1)}{2N})=0.632\frac{q(q-1)}{2N} \end{aligned} BirthdayProb(q,N)=≥≥​1−i=1∏q−1​(1−Ni​)1−i=1∏q−1​(e−Ni​)=1−e−∑i=1q−1​Ni​=1−e−2Nq(q−1)​1−(1−0.6322Nq(q−1)​)=0.6322Nq(q−1)​​

2、一对不可区分库:均匀采样、不重复选

下面给出均匀采样(Lsamp−LL_{samp-L}Lsamp−L​)和不重复选(Lsamp−RL_{samp-R}Lsamp−R​)库的定义。可以看到不重复选就是把选过的RRR除去。

显然这两个库并不等价。一个简单的区分程序就是多次选取,如果有重复的返回值为真,否则为假。均匀采样的返回值为真的概率不为零,但是不重复选是永远返回假的,因此两个库不等价。

但是这两个库是不可区分的,它们的advantage正好是生日概率。

定理4.4 对于所有采样qqq次的程序AAA,均匀采样和不重复选(如上图定义)的advantage≤BirthdayProb(q,2λ)\le BirthdayProb(q,2^\lambda)≤BirthdayProb(q,2λ)。结合定理4.3可以知道advantage的紧确界为Θ(q22λ)\Theta(\frac{q^2}{2^\lambda})Θ(2λq2​),按照定义4.4,两个库不可区分。

**定理证明:**只需证明advantage的上界是生日概率。这里用到如下两个中间库,显然Lsamp−L≡Lhyb−L,Lsamp−R≡Lhyb−RL_{samp-L}\equiv L_{hyb-L},L_{samp-R}\equiv L_{hyb-R}Lsamp−L​≡Lhyb−L​,Lsamp−R​≡Lhyb−R​。因此原本两个库的advantage可以转化为这两个中间库的advantage。

根据引理4.1(bad event),advantage≤\le≤Lhyb−LL_{hyb-L}Lhyb−L​设置bad=1的概率。于Lhyb−LL_{hyb-L}Lhyb−L​而言,bad=1当且仅当取到重复的数值的概率,如果是采样qqq次,那么概率就是BirthdayProb(q,2λ)BirthdayProb(q,2^\lambda)BirthdayProb(q,2λ)。证毕。

定理价值:

这一对不可区分库说明了以后再讨论安全性时,均匀采样不必考虑重复值的问题,因为这两者之间的差别是negligible的。此外,如果安全性证明中运用到了生日概率的上下界来证明不可区分,需要注意定理4.3中强调过q≤2Nq\le \sqrt{2N}q≤2N​。也就是说当qqq超过这个值2λ+1∼2λ2\sqrt{2^{\lambda+1}}\sim2^{\frac{\lambda}{2}}2λ+1​∼22λ​时就不能证明安全了,相当于安全参数仅有λ2\frac{\lambda}{2}2λ​——具有这样性质的安全性称为birthday bound security

定理拓展:

假设RRR中放置了一些取值(数量为多项式量级)。那么均匀采样和不允许取RRR中取值的采样(如下图定义),也是不可区分的。

简单证明:假设程序AAA调用qqq次,每次的RRR中值的数量为nin_ini​。那么类似定理4.4的证明过程,可以知道它们advantage≤1−∏i=1q(1−ni2λ)\le 1-\prod_{i=1}^{q}(1-\frac{n_i}{2^\lambda})≤1−∏i=1q​(1−2λni​​)。若∑i=1qni≤2λ\sum_{i=1}^qn_i\le 2^\lambda∑i=1q​ni​≤2λ(这个其实用来满足证明下界中用到的x≤1x\le 1x≤1;而且由于nin_ini​是多项式量级,这个前提是能满足的),类似定理4.3可以得到0.632∑i=1qni2λ≤0.632\frac{\sum_{i=1}^qn_i}{2^\lambda}\le0.6322λ∑i=1q​ni​​≤advantage≤∑i=1qni2λ\le\frac{\sum_{i=1}^qn_i}{2^\lambda}≤2λ∑i=1q​ni​​(与定理4.3相比,其实就是N=2λN=2^\lambdaN=2λ,分子是求和)。由于nin_ini​都是多项式量级,因此根据定义4.2可知advantage是negligible的,因此两个库不可区分。

【Joy of Cryptography 读书笔记】Chapter 4 基于难解计算(Intractable Computation)的密码学相关推荐

  1. 【Joy of Cryptography 读书笔记】Chapter 6 伪随机函数(Pseudorandom Function)分组密码(Block Cipher)

    Chapter 6 伪随机函数(Pseudorandom Function)&分组密码(Block Cipher) 文章目录 Chapter 6 伪随机函数(Pseudorandom Func ...

  2. 【Joy of Cryptography 读书笔记】Chapter 1 一次性密码本(one-time pad)Kerckhoffs原则

    Chapter 1 一次性密码本(one-time pad)&Kerckhoffs原则 文章目录 Chapter 1 一次性密码本(one-time pad)&Kerckhoffs原则 ...

  3. 【Joy of Cryptography 读书笔记】Chapter 2 可证明安全(Provable Security)基础

    Chapter 2 可证明安全(Provable Security)基础 要想证明安全性,首先需要对安全进行定义,才能证明某一个方法能够保证什么安全性,或者说明它为什么不安全.毕竟密码学并不能解决所有 ...

  4. 【Joy of Cryptography 读书笔记】Chapter 8 分组密码的工作模式(Modes of Operation)

    Chapter 8 分组密码的工作模式(Modes of Operation) 文章目录 Chapter 8 分组密码的工作模式(Modes of Operation) 一.常见的工作模式 1.EBC ...

  5. 《C++捷径教程》读书笔记--Chapter 16--模板(完结)

    //--<C++捷径教程>读书笔记--Chapter 16--模板(完结) //--Chapter 16--模板 //--04/16/2006 Sun. //--Computer Lab ...

  6. 《C++捷径教程》读书笔记--Chapter 14--继承(完结)

    //--<C++捷径教程>读书笔记--Chapter 14--继承(完结) //--Chapter 14--继承 //--04/14/2006 Friday //--Computer La ...

  7. 《C++捷径教程》读书笔记--Chapter 10--结构与联合

    //--<C++捷径教程>读书笔记--Chapter 10--结构与联合 //--Chapter 10--结构与联合 //--11/24/2005 Thurs. //--Computer ...

  8. [The Path to QUANT] 《Volatility Trading》by Euan Sinclair 读书笔记 Chapter 3

    <Volatility Trading> by Euan Sinclair Chapter 3 收益率和波动率的典型事实 典型事实列表 波动率并非常数 收益率分布 成交量和波动率 波动率分 ...

  9. # [读书笔记1]:工业互联网边缘计算在离散制造业应用展望

    [读书笔记]: 工业互联网边缘计算在离散制造业应用展望1 1.离散制造业数字化转型面临的挑战 1.1离散制造业发展现状及需求 工业现场数据类型异构混杂,缺少完整的数据集成应用架构 行业内大部分设备和产 ...

最新文章

  1. 王茂霖:数据挖掘提分三板斧!
  2. 快讯 | 首期“医工结合系列研讨会”汇聚清华力量,共促医工融合发展
  3. c/c++ ide clion安装编译器
  4. Git提交到多个远程仓库
  5. “设为桌面图标”的ASP源代码
  6. pycharm/pytorch OSError: 页面文件太小,无法完成操作(改变虚拟内存大小)
  7. android 粘性service,Android服务1 Service
  8. c# 判断是否为数组_c# – 如何检查反射类型是否为数组
  9. 新建和删除文件夹js代码
  10. java class文件常量池_《Java虚拟机原理图解》 1.2.3、Class文件中的常量池详解(下)...
  11. java Unicode转UTF-8代码
  12. Java程序员是如何面试上阿里巴巴,如何拿到年薪50W
  13. 微信小程序常用api及语法
  14. 【社招Java】腾讯、阿里,疯狂java讲义第五版pdf百度云
  15. 项目管理-----整合项目资源
  16. 名师工作室php,名师工作室
  17. 线性代数06 矩阵的逆以及求法
  18. phpstudy8.1安装duxcms3.1.3
  19. 商标注册证的查询方法
  20. CMake引入三方库

热门文章

  1. 14天阅读挑战赛(学习建议)
  2. 告诉你如何应对HR索要薪资证明!
  3. 新“内卷”席卷科技圈?Google CEO 要求 174000 员工提高工作效率!
  4. 动态小米官网页面设计(内含最详细实现的源码)
  5. JQuery写农场的小游戏
  6. 用scrapy爬取Kelly Blue Book二手车网数据
  7. linx6.0.80 凝思安全操作系统安装注意事项
  8. Ubuntu18.04安装firefox火狐浏览器失败
  9. 保险人生(一) 基本知识
  10. Serv-U 15 在 IE 8+ 中兼容性视图下显示不正常的解决方案