格基规约算法:数学基础
本篇主要介绍学习格密码必备的格论知识,以下内容为理解格基规约算法必备的数学基础。
文章目录
- 欧氏空间
- 欧氏空间和范数
- 向量空间
- 欧氏空间
- 子空间的正交补
- 施密特正交化
- 格论基础
- 格的相关概念
- 格和格基
- 基本域和体积(volume)
- 整格(integral lattice)
- 格上的短向量
- 逐次最小长度(successive minima)
- 短向量的长度
- 参考资料
欧氏空间
想理解格基约化算法,首先必须理解施密特正交化。有了向量空间,就可以在空间中随意对向量进行数乘和加减法(怎么做都不会跑出这个空间)。再定义向量的长度和夹角,施密特正交化就显得很自然了。
欧氏空间和范数
向量空间
向量空间的定义保证了向量的数乘和加减法有很好的性质。具体定义略,可参阅蓝以中的《高等代数简明教程》等。
欧氏空间
欧氏空间:设V\,V\,V是实数域R\,\mathbb{R}\,R上的向量空间。如果V\,V\,V内任意两个向量α,β\,\alpha,\ \beta\,α, β都按某一法则对应于R\mathbb{R}R内一个唯一确定的数,记作⟨α,β⟩\,\langle\alpha,\beta\rangle\,⟨α,β⟩,且满足以下三个条件:
- 对任意k1,k2∈R\,k_1,k_2\in\mathbb{R}\,k1,k2∈R和任意α1,α2,β∈V\,\alpha_1,\alpha_2,\beta\in V\,α1,α2,β∈V,有
⟨k1α1+k2α2,β⟩=k1⟨α1,β⟩+k2⟨α2,β⟩;\left\langle{k_1\alpha}_1+k_2\alpha_2,\beta\right\rangle=\ k_1\left\langle\alpha_1,\beta\right\rangle+\ k_2\left\langle\alpha_2,\beta\right\rangle; ⟨k1α1+k2α2,β⟩= k1⟨α1,β⟩+ k2⟨α2,β⟩; - 对任意α,β∈V\,\alpha,\ \beta\in V\,α, β∈V,有
⟨α,β⟩=⟨β,α⟩;\left\langle\alpha,\beta\right\rangle=\ \langle\beta,\alpha\rangle; ⟨α,β⟩= ⟨β,α⟩; - (非退化性)对任意α∈V\,\alpha\in V\,α∈V,有⟨α,α⟩≥0\,\left\langle\alpha,\alpha\right\rangle \geq 0\,⟨α,α⟩≥0,且⟨α,α⟩=0\,\left\langle\alpha,\alpha\right\rangle = 0\,⟨α,α⟩=0的充分必要条件是α=0,\,\alpha=0,α=0,
则称⟨α,β⟩\,\left\langle\alpha,\beta\right\rangle\,⟨α,β⟩为向量α,β\,\alpha,\ \beta\,α, β的内积。VV\,V称为欧几里得空间,简称欧氏空间。
内积是一种具有非退化性的双线性映射,与密码学中常用的双线性对非常类似。
取Rm\mathbb{R}^{m} \,Rm的内积为向量的点乘,可以验证向量空间Rm\, \mathbb{R}^m\,Rm是欧氏空间。
对于Rm\mathbb{R}^mRm中的向量α\,\alpha\,α,定义其欧氏范数为∥α∥=⟨α,α⟩\, \left\| \alpha \right\| = \sqrt{\left\langle\alpha,\alpha\right\rangle} \,∥α∥=⟨α,α⟩。实际上,欧氏范数就是平时所说的向量长度。
向量的欧氏范数计算方法是对其各分量的平方和开方,因此也称2−\, 2 - \,2−范数。格密码中还会用到∞−\, \infty \,-∞−范数。在本篇中,“范数”默认指欧氏范数。
子空间的正交补
正交补:设V\,V\,V是一个n\,n\,n维欧氏空间,M\,M\,M是它的一个子空间,易知M\,M\,M关于V\,V\,V的内积也成一欧氏空间。定义M⊥⊂V\,M^\bot\!\subset V\,M⊥⊂V为M⊥={α∈V:∀β∈M,⟨α,β⟩=0},M^\bot=\left\{\alpha\in V:\forall\beta\in M,\left\langle\alpha,\beta\right\rangle=0\right\}, M⊥={α∈V:∀β∈M,⟨α,β⟩=0},称M⊥\,M^\bot\,M⊥为M\,M\,M的正交补。M⊥\,M^\bot\,M⊥关于V\,V\,V中向量的加法及数乘运算显然封闭,故M⊥\,M^\bot\,M⊥也为V\,V\,V的子空间。
为了从几何的角度理解正交补,不妨思考一下R2\,\mathbb{R}^{2}\,R2和R3\,\mathbb{R}^{3}\,R3中过原点的直线、平面的正交补分别是什么。
施密特正交化
在欧氏空间Rm\,\mathbb{R}^m\,Rm中有施密特正交化方法。施密特正交化方法是由一个线性无关向量组得到一个正交向量组的方法,并且输入的向量组和输出的向量组张成的是同一个向量空间。格基约化算法的思路与施密特正交化相似并且算法中会调用施密特正交化,因此理解向量空间中的施密特正交化方法是理解格基约化算法的一个关键。设b1,…,bn\,\mathbf{b}_1,\ldots,\mathbf{b}_n\,b1,…,bn 为Rm\,\mathbb{R}^m\,Rm上一组线性无关的向量,施密特正交化方法如下:
令b1∗=b1,\,\mathbf{b}_1^\ast=\mathbf{b}_1,b1∗=b1, 依次计算bi∗=bi−∑j=1i−1μi,jbj∗,i>1\, \mathbf{b}_i^\ast=\mathbf{b}_i-\sum_{j=1}^{i-1}{\mu_{i,j}\mathbf{b}_j^\ast},\quad i>1\,bi∗=bi−∑j=1i−1μi,jbj∗,i>1,其中μi,j=⟨bi,bj∗⟩⟨bj∗,bj∗⟩,1≤j\,\mu_{i,j}=\frac{\left\langle\mathbf{b}_i,\mathbf{b}_j^\ast\right\rangle}{\left\langle\mathbf{b}_j^\ast,\mathbf{b}_j^\ast\right\rangle}\ ,\ 1\le j\,μi,j=⟨bj∗,bj∗⟩⟨bi,bj∗⟩ , 1≤j。那么b1∗,⋯,bn∗\,\mathbf{b}_1^\ast,\cdots,\mathbf{b}_n^\ast\,b1∗,⋯,bn∗就是Rm\,\mathbb{R}^m\,Rm上的一组正交向量。
核心思路:先选b1∗=b1\,\mathbf{b}_1^\ast=\mathbf{b}_1b1∗=b1作为基准,然后将b2\, \mathbf{b}_2 \,b2分解为与b1\, \mathbf{b}_1 \,b1平行和正交的两个分量,只保留正交的那个分量。
更进一步的理解是,bi∗\mathbf{b}_i^\ast\,bi∗是bi\, \mathbf{b}_i\,bi在∑j=1i−1Rbj=∑j=1i−1Rbj∗\, \sum_{j=1}^{i-1}{\mathbb{R}\mathbf{b}}_j=\sum_{j=1}^{i-1}{\mathbb{R}\mathbf{b}_j^\ast}∑j=1i−1Rbj=∑j=1i−1Rbj∗ 的正交补上的投影。理解这一点才能搞懂格基约化算法的具体细节和优化。
格论基础
格的相关概念
格和格基
格:给定nnn个线性无关的向量b1,…,bn∈Rm\mathbf{b}_1,\ldots,\mathbf{b}_n\in\mathbb{R}^mb1,…,bn∈Rm,则称其整系数线性组合构成的集合
L=∑i=1nbi⋅Z={∑i=1ncibi:ci∈Z}\mathcal{L}=\sum_{i=1}^{n}\mathbf{b}_i\cdot\mathbb{Z}=\left\{\sum_{i=1}^{n}{c_i\mathbf{b}_i}:c_i\in\mathbb{Z}\right\}L=i=1∑nbi⋅Z={i=1∑ncibi:ci∈Z}
为Rm\mathbb{R}^mRm上的格。我们称L\mathcal{L}L的秩为nnn,L\mathcal{L}L的维数为mmm。我们称上述格的定义中出现的b1,…,bn\mathbf{b}_1,\ldots,\mathbf{b}_nb1,…,bn为格L\mathcal{L}L的一组基,简称格基。
记B=(b1,…,bn)\ \mathbf{B}={(\mathbf{b}}_1,\ldots,\mathbf{b}_n) B=(b1,…,bn),称B\mathbf{B}B为基矩阵,那么格L\mathcal{L}L可以进一步表示为
L=∑i=1nbi⋅Z={Bx:x∈Zn}\mathcal{L}=\sum_{i=1}^{n}\mathbf{b}_i\cdot\mathbb{Z}=\{\mathbf{B}x:x\in\mathbb{Z}^n\}L=∑i=1nbi⋅Z={Bx:x∈Zn}
可以验证L\, \mathcal{L}\,L为Rm\,\mathbb{R}^{m}\,Rm的离散加法子群。与向量空间Rm\mathbb{R}^mRm类似地,格L\mathcal{L}L的基不止一个。事实上[3],任意一个秩为1的格有两组基,而秩大于等于2的格有无数组基。取格L\mathcal{L}L的任意两组基,一组基矩阵可由另一组基矩阵左乘一个幺模矩阵U\mathbf{U}U得到,U\mathbf{U}U是两个格基之间的过渡矩阵。
基本域和体积(volume)
称格L\mathcal{L}L的一组格基围成的基本平行体为格L\mathcal{L}L的基本域,其严谨定义如下。
基本域:设L\mathcal{L}L为一个nnn维的格,且L\mathcal{L}L的一组基为v1,v2,…,vn\mathbf{v}_1,\mathbf{v}_2,\ldots,\mathbf{v}_nv1,v2,…,vn。则格L\mathcal{L}L(就格基v1,v2,…,vn\mathbf{v}_1,\mathbf{v}_2,\ldots,\mathbf{v}_nv1,v2,…,vn而言)的基本域F\mathcal{F}F为
F(v1,…,vn)={t1v1+t2v2+⋯+tnvn:0≤ti<1}\mathcal{F}\left(\mathbf{v}_1,\ldots,\mathbf{v}_n\right)=\left\{t_1\mathbf{v}_1+t_2\mathbf{v}_2+\cdots+t_n\mathbf{v}_n:0\le t_i<1\right\}F(v1,…,vn)={t1v1+t2v2+⋯+tnvn:0≤ti<1}
之后定义格L\mathcal{L}L的行列式如下。
行列式:设L\mathcal{L}L为一个nnn维的格,其基本域为F\mathcal{F}F,则称F\mathcal{F}F的体积(volume)为格L\mathcal{L}L的行列式,记作det(L)=Vol(F)\det{\left(\mathcal{L}\right)}=\mathrm{Vol}\left(\mathcal{F}\right)det(L)=Vol(F)。设B=(b1,…,bn)为L\mathbf{B}={(\mathbf{b}}_1,\ldots,\mathbf{b}_n)为\mathcal{L}B=(b1,…,bn)为L的一组基,根据det(L)\det{\left(\mathcal{L}\right)}det(L)的几何含义可知det(L)=∣det(B)∣\det{\left(\mathcal{L}\right)}=\left|\det{\left(\mathbf{B}\right)}\right|det(L)=∣det(B)∣。由此易知,虽然det(L)\det{\left(\mathcal{L}\right)}det(L)被定义F\mathcal{F}F的体积,且F\mathcal{F}F与选取的格基有关,但**det(L)\det{\left(\mathcal{L}\right)}det(L)是格L\mathcal{L}L的一个不变量**。即任意选取格L\mathcal{L}L的基本域(或者说选取格L\mathcal{L}L的任何一个格基),det(L)\det{\left(\mathcal{L}\right)}det(L)的值都相同。这也是我们将其记为det(L)\det{\left(\mathcal{L}\right)}det(L)的理由:其值只与格L\mathcal{L}L本身有关。
整格(integral lattice)
密码学中的运算对象基本都是整数,因此实际应用中往往使用整格(integral lattice),其定义如下:若格L\mathcal{L}L中任意向量的坐标,其每个分量均为整数,则称格L\mathcal{L}L为整数格。当L\mathcal{L}L为整格时,L\mathcal{L}L是Zm\mathbb{Z}^mZm的加法子群。
整格有时候也称为整数格(integer lattice)。
格上的短向量
格上的最短向量问题(SVP)是格密码方案安全性基于的难题,也是在格密码和传统公钥密码分析时常使用的问题。SVP及近似SVP问题正是格基约化算法求解的问题。
为了更好地描述格上短向量的长度,首先给出逐次最小长度的概念。
逐次最小长度(successive minima)
逐次最小长度:设L\mathcal{L}L是Rm\mathbb{R}^mRm中秩为nnn的格,设λ1,…,λn∈R\lambda_1,\ldots,\lambda_n\in\mathbb{R}λ1,…,λn∈R,若λi(1≤i≤n)\lambda_{i}\left(1\le i\le n\right)λi(1≤i≤n)为满足以下条件的最小值:
存在iii个线性无关的的向量v1,…,vi∈L\mathbf{v}_1,\ldots,\mathbf{v}_i\in\mathcal{L}v1,…,vi∈L,使得vj≤λi(1≤j≤i)v_j ≤λ_i (1≤j≤i)vj≤λi(1≤j≤i)
则称λ1,…,λn\lambda_1,\ldots,\lambda_nλ1,…,λn为L\mathcal{L}L的逐次最小长度。为了表明λi\lambda_iλi是格L\mathcal{L}L的逐次最小长度,记λi=λi(L)\lambda_i=\lambda_i(\mathcal{L})λi=λi(L)。
用通俗的语言来讲,λ1\lambda_1λ1是L\mathcal{L}L中非零最短向量的长度,λ2\lambda_2λ2是所有非零向量长度中(并列)第二小的长度。这就是逐次最小长度的意义。
短向量的长度
为了让读者对λ1\lambda_1λ1的大小有一个认识,这里给出一系列相关定理来描述λ1\lambda_1λ1的上界。首先给出Minkowski定理作为引理。
Minkowski定理:设L\mathcal{L}L是Rm\mathbb{R}^mRm中的格,S⊂RmS \subset \mathbb{R}^mS⊂Rm是一个关于原点对称的可测凸集,若SSS的体积为Vol(S)≥2mdet(L)\mathrm{Vol}\left(S\right)\geq2^m\mathrm{det}\left(\mathcal{L}\right)Vol(S)≥2mdet(L),则S∩L\, S\cap\mathcal{L}\,S∩L中有非零向量。
解读:看起来有些高深,但是在L=Z2\mathcal{L} = \mathbb{Z}^{2}L=Z2中是显然的。要想让对称的凸集SSS尽量大,且S∩L=0\ S\cap\mathcal{L}\ = \mathbf{0} S∩L =0,那么正方形应该是最好的选择,此时Vol(S)=22det(L)\mathrm{Vol}\left(S\right) = 2^2\mathrm{det}\left(\mathcal{L}\right)Vol(S)=22det(L)。类似地,在L=Zm\mathcal{L} = \mathbb{Z}^{m}L=Zm选取超立方体是最好的。照此思路,L\mathcal{L}L为整数格时Minkowski定理也是很显然的。这样就理解了密码学所用的格中该定理成立。
利用Minkowski定理可证明下面的Minkowski第一定理(一些文献称其为Hermite定理)。
Minkowski第一定理:设L\mathcal{L}L是Rm\mathbb{R}^mRm中秩为nnn的格,则λ1(L)≤ndet(L)1/n\lambda_1\left(\mathcal{L}\right) \leq \sqrt n\mathrm{det}(L)^{1/n}λ1(L)≤ndet(L)1/n。称ndet(L)1/n\sqrt n\mathrm{det}(L)^{1/n}ndet(L)1/n为λ1(L)\lambda_1\left(\mathcal{L}\right)λ1(L)的Minkowski’s bound。
解读:如果L=Zn\mathcal{L} = \mathbb{Z}^{n}L=Zn,那么det(L)1/n\mathrm{det}(L)^{1/n}det(L)1/n就是超立方体SSS的边长,而ndet(L)1/n\sqrt n\mathrm{det}(L)^{1/n}ndet(L)1/n就是它的对角线长度。由于对角线的另一端就是一个格点,因此λ1(L)≤ndet(L)1/n\lambda_1\left(\mathcal{L}\right) \leq \sqrt n\mathrm{det}(L)^{1/n}λ1(L)≤ndet(L)1/n。
以上两个解读参考了Steven Yue的笔记,笔记的这部分写的很好推荐看一下。
对于λ1(L)\lambda_1\left(\mathcal{L}\right)λ1(L),我们还能得到比Minkowski’s bound更好的理论上界。下面给出Hermite因子的概念。
Hermite因子:给定格的维度nnn,定义Hermite因子γn∈R\gamma_n\in\mathbb{R}γn∈R为满足以下条件的最小值:
对于任意维度为nnn的格L\mathcal{L}L,存在v∈L\, \mathbf{v}\in\mathcal{L}\,v∈L满足∥v∥2≤γndet(L)2/n\ \left\|\mathbf{v}\right\|^{2} ≤γ_{n}\det{(L)}^{2/n} ∥v∥2≤γndet(L)2/n。称γndet(L)1/n\sqrt{\gamma_n}\mathrm{det}\left(\mathcal{L}\right)^{1/n}γndet(L)1/n为λ1(L)\ \lambda_1\left(\mathcal{L}\right) \, λ1(L)的Hermite bound。
根据定义可知,Hermite因子的大小只与nnn有关,目前我们只知道γn\gamma_nγn在 1≤n≤81\le n\le 81≤n≤8 和 n=24n=24n=24 时的精确值:
γ22=43,γ33=2,γ44=4,γ55=8,γ66=643,γ77=64,γ88=256,γ24=4\gamma_2^2=\frac{4}{3},\gamma_3^3=2,\gamma_4^4=4,\gamma_5^5=8,\gamma_6^6=\frac{64}{3},\gamma_7^7=64,\gamma_8^8=256,\gamma_{24}=4γ22=34,γ33=2,γ44=4,γ55=8,γ66=364,γ77=64,γ88=256,γ24=4
在格密码学中我们更关心nnn较大(n>200)(n > 200)(n>200)时γn\gamma_nγn的值,此时γn\gamma_nγn满足n2πe≤γn≤nπe.\ \frac{n}{2\pi e}\le\gamma_n\le\frac{n}{\pi e} \ . 2πen≤γn≤πen .
由Hermite因子能够得到比Minkowski’s bound更精确的λ1\lambda_1λ1上界。以维度为n=2n=2n=2的格L\mathcal{L}L为例,Minkowski’s bound告诉我们λ1(L)<2det(L)1/2\ \lambda_{1}\left(\mathcal{L}\right)<\sqrt2\mathrm{det}(L)^{1/2} λ1(L)<2det(L)1/2 ,而由Hermite因子可得λ1(L)<4/3det(L)1/2\lambda_{1} \left(\mathcal{L}\right) < \sqrt{4/3} \mathrm{det}\left(\mathcal{L}\right)^{1/2}λ1(L)<4/3det(L)1/2。
下面的高斯启发函数与Hermite因子的下界很好地对应了起来。
高斯启发函数(Gaussian Heuristic):GH(L)=n2πedet(L)1/nGH(\mathcal{L})= \sqrt{\frac{n}{2\pi e}}\mathrm{det}(\mathcal{L})^{1/n}GH(L)=2πendet(L)1/n
上述GH函数只能用于估计高维格的λ1(L)\lambda_1\left(\mathcal{L}\right)λ1(L),在低维格中有另一个公式。然而低维格一般只在公钥密码分析中用的比较多,并且很多公钥密码分析中采用的是Minkowski’s bound作为假设。因此这里不给出(其实就是不想起敲公式了) ,具体可以看An Introduction to Mathematical Cryptography的相关小节。
我们往往不知道某个高维格的λ1(L)\, \lambda_1\left(\mathcal{L}\right)\,λ1(L)到底是多少,因此我们用GH(L)GH(\mathcal{L})GH(L)作为参考。在[SVP Challenge (latticechallenge.org)]中,若格基中最短向量的范数小于1.05GH(L)1.05GH(\mathcal{L})1.05GH(L),就视为成功求解了SVP。
如果以上内容还有疑问,可以看看 An Introduction to Mathematical Cryptography 这本书的相关章节,也可以看看这个视频:数学潜水艇:初等数论、初等群论
参考资料
蓝以中. 高等代数简明教程.下册, 2002.
王小云, 王明强, 孟宪萌. 公钥密码学的数学基础, 2013.
Hoffstein J , Pipher J C , Silverman J H . An Introduction to Mathematical Cryptography, 2014.
Galbraith S D . Mathematics of Public Key Cryptography: Lattices. 2012.
Steven Yue的笔记
Coinc1dens’s blog
格基规约算法:数学基础相关推荐
- 格基规约算法:算法详解
本文详细了介绍原始格基规约算法,并简单介绍目前对算法的改进.这些改进算法非常实用,被广泛应用于密码分析中. 阅读本篇前需要先了解格论,可以先看看格基规约算法:数学基础 文章目录 原始格基规约算法 高斯 ...
- 格密码LLL算法:如何解决最短向量SVP问题(2)
目录 一. LLL约化基的第一条向量 二. LLL算法 三. LLL算法的正确性 四. 分析算法运行的时间 4.1 算法迭代的次数与M呈现多项式时间关系. 4.2 算法每次迭代的时间与M呈现多项式时间 ...
- 格密码LLL算法:如何解决最短向量SVP问题(1)
目录 前言 一. LLL算法的应用 二. 格基约化 总结 前言 在本节中,提出一个解决最短向量(SVP)问题的算法.在1982年,A.K.Lenstra,H.W.Lenstra,Jr和L.lovasz ...
- 格密码LLL算法:如何解决最短向量SVP问题(3)(完结篇)
目录 一. 运算每个正交基过程是多项式时间 二. 对原格基的操作都为多项式时间 三. 算法总运行时间 四. 开放性问题 一. 运算每个正交基过程是多项式时间 在运算正交基对应的系数时,依据克莱姆定理, ...
- 基2FFT算法matlab程序编写,频率抽取(DIF)基2FFT算法的MATLAB实现
频率抽取(DIF)基2FFT算法和时间抽取(DIT)基2FFT算法是两种等价的FFT算法,其相同之处: (1)DIF与DIT两种算法均为原位运算. (2)DIF与DIT运算量相同. 不同之处: (1) ...
- 两个重要极限_算法数学基础-概率论最重要两个结论:大数定律及中心极限定理...
到这一章,概率的基本概念我们已经梳理完了.这些概念构建起来的概率空间给了我们强有力的分析不确定性的工具,概念非常重要只有对概念有准确的理解才能应用好这些有力的工具.数学是很抽象的东西,他源于实践但高于 ...
- 基2FFT算法matlab程序编写,按时间抽取的基2FFT算法分析及MATLAB实现
按时间抽取的基2FFT 算法分析及MATLAB 实现 1 DIT-FFT 算法的基本原理 有限长序列x (n )的N 点DFT 定义为:∑-==10 )()(N n n k N W n x k X , ...
- DIT和DIF的基2FFT算法
根据课本上分析的DIT和DIF的步骤以及特点,写了两个DIF和DIT的基2fft算法. DIT和DIF,为了方便编程,对于前者将输入按倒位序重新排列,输出几位自然顺序排列:后者的话,输入为自然顺序,输 ...
- 【图像重建】基于matlab布雷格曼迭代算法集合ART算法CT图像重建【含Matlab源码 1905期】
一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[图像重建]基于matlab布雷格曼迭代算法集合ART算法CT图像重建[含Matlab源码 1905期] 获取代码方式2: 通过订阅紫极神光 ...
最新文章
- CSS3学习手记(1) 选择器
- Android Handler 流程解析
- 服务器被修改,我的世界
- 树莓派进阶之路 (019) - 树莓派通过filezilla,samba与PC文件共享(转)
- 在python语言中不能作为变量名的是什么_4、 在 Python 中可以使用 if 作为变量名。 (1.0分)_学小易找答案...
- python接口自动化测试一:http协议
- Python多处理示例
- Array类型的扩展
- linux常用文件及作用总结(profile/.bashrc等)
- 刘意 java基础视频_传智播客 2015年 刘意_Java基础视频-深入浅出精华版 笔记(day21~day23)(2016年4月8日13:28:21)...
- 利用c语言实现函数信号发生器,基于51单片机函数信号发生器完整论文下载 带源码 原理图...
- C# 填充Excel
- 高效能人士的第三个习惯——要事第一
- 微信公众号吸粉软件助你快速增加粉丝数和文章阅读量!
- 2021毛概知识点章节整理(完整版)
- python 十进制转二进制
- 汽车行业深度报告-特斯拉生产制造革命:一体化压铸
- Sass - 变量($)
- 【LeetCode717】1比特与2比特字符
- eclipse 优化。
热门文章
- pdf压缩文件怎么压缩最小,pdf大小超过上传大小不能上传怎么压缩?
- html缩小照片尺寸像素不变,怎么把图片变小 像素不变
- Java代码实现数字签名验证
- WINDOWS系统“资源管理器”进程选项关闭之后的解决方法
- 用计算机归零,电脑计算器里的清零键是哪个?
- 在a标签中使用javascript
- 【Python 实战基础】如何绘制树状图展示Python数据分析师的知识结构
- 详解电容触控芯片与指纹芯片的研发与生产流程
- qq iphone for android,QQ for iPhone/Android v8.2.8 正式版发布
- 同步六进制加法计数电路(D触发器)