Ewald求和在分子静电势能计算中的应用
技术背景
分子动力学模拟中,计算周期性边界条件的静电势常被视作计算的瓶颈之一。形式上是比较容易的,例如不考虑周期性边界条件的话,静电势能就是:
\]
如果考虑周期性边界条件,那么静电势能变为:
\]
且不说对无穷个盒子的叠加,就算是单个的盒子,也是\(O(N^2)\)的计算复杂度,这也是求解困难的原因。在分子动力学中,为了简化这个计算量,使用了三种思想:傅里叶变换、Ewald Summation以及Particle Mesh的方法,本文主要涉及傅里叶变换与Ewald求和计算的部分。
周期性电势
首先我们从物理概念上理解静电势能项的含义:单一的电荷\(q_i\)会在空间中形成一个电势\(V_i\),当另一个电荷\(q_j\)位于\(V_i\)对应的电场中时,就会受到静电相互作用,其能量为\(E_{ij}\)。因为无穷远处的静电势能为0,这也就以为着,如果我们需要将\(q_j\)从原始的位置推到无穷远之外,就需要\(E_{ij}\)的能量。这个思路告诉我们,可以先计算电势\(V_i\),再计算电势能\(E_{ij}\),也就是这个东西:
\]
如果考虑上周期性边界条件就是:
\]
因为这个无穷多的求和没办法直接计算,只能明确电势具有周期性:\(V_i(\mathbf{r})=V_i(\mathbf{r}+\mathbf{n}\mathbf{L})\)。
静电场泊松方程
空间中的电荷\(i\)在\(\mathbf{r}\)处的电势,由泊松方程给出:
\]
其中\(\Delta\)是拉普拉斯算子,\(\rho_i\)表示电荷密度。如果考虑一个点电荷的的情况,那么就有:\(\rho_i(\mathbf{r})=q_i\delta(\mathbf{r}-\mathbf{r}_i)\)。进而写出欧几里得空间中的泊松方程:
\]
其中\(\nabla^2V_i(\mathbf{r})=\frac{\partial^2V_i(\mathbf{r})}{\partial x^2}+\frac{\partial^2V_i(\mathbf{r})}{\partial y^2}+\frac{\partial^2V_i(\mathbf{r})}{\partial z^2}\)。再考虑周期性边界条件,每个盒子中都有一个点电荷\(q_i\),于是方程应该写为:
\]
傅里叶空间泊松方程
对上述单点形式的泊松方程的两边同时进行傅里叶变换(关于傅里叶变换的理解,可以参考前序文章1和前序文章2,有比较详细的原理介绍和相关代码实现)有:
\]
先使用分部积分计算左边中的一项:
\int\frac{\partial^2V_i(\mathbf{r})}{\partial x^2}e^{-2\pi j\mathbf{k}\cdot\mathbf{r}}d\mathbf{r}&=\left.\frac{\partial V_i(\mathbf{r})}{\partial x}e^{-2\pi j\mathbf{k}\cdot\mathbf{r}}\right|_{-\infty}^{\infty}+2\pi jk_x\int\frac{\partial V_i(\mathbf{r})}{\partial x}e^{-2\pi j\mathbf{k}\cdot\mathbf{r}}d\mathbf{r}
\end{align*}
\]
需要注意的是,这里\(\frac{\partial V_i(\mathbf{r})}{\partial x}=F_i(\mathbf{r})\)的物理意义是作用力,那么我们就可以取第一类边界条件:
\]
这样根据微分的定义有:
\]
上面这个极限代入了\(V_i(\mathbf{r})\)的单点形式,其意义为,位于\(\mathbf{r}_i\)处的点电荷\(q_i\),在无穷远处生成的电场为0,对无穷远处的电荷\(q_{\infty}\)的作用力也是0,这里不考虑周期性边界条件。则有:
\int\frac{\partial^2V_i(\mathbf{r})}{\partial x^2}e^{-2\pi j\mathbf{k}\cdot\mathbf{r}}d\mathbf{r}&=2\pi jk_x\int\frac{\partial V_i(\mathbf{r})}{\partial x}e^{-2\pi j\mathbf{k}\cdot\mathbf{r}}d\mathbf{r}\\
&=2\pi jk_x\left[\left.V_i(\mathbf{r})e^{-2\pi j\mathbf{k}\cdot\mathbf{r}}\right|_{x=-\infty}^{x=\infty}+2\pi jk_x\int V_i(\mathbf{r})e^{-2\pi j\mathbf{k}\cdot\mathbf{r}}d\mathbf{r}\right]\\
&=-4\pi^2k_x^2V_i(\mathbf{k})
\end{align*}
\]
同理可得泊松方程左侧形式为:
\]
而右侧形式需要用到狄拉克函数的抽样特性:
\]
即:
\]
得到傅里叶空间的单点泊松方程:
\]
倒易空间
涉及到傅里叶空间,我们很自然的想到使用固体物理学的倒易空间变换,也就是把周期性盒子当作一个原胞。根据倒易空间(也叫\(\mathbf{k}\)空间)晶格矢(倒格矢)定义有:
\]
其中:
\delta_{i,j}=\left\{
\begin{matrix}
1, i=j\\
0, i\neq j
\end{matrix}
\right.
\]
按照我们常用的长方体周期性边界条件:
\mathbf{L}=(L_x,L_y,L_z)=\mathbf{L}_1+\mathbf{L}_2+\mathbf{L}_3\\
\mathbf{L}_1 = (L_x,0,0)\\
\mathbf{L}_2 = (0,L_y,0)\\
\mathbf{L}_3 = (0,0,L_z)
\end{matrix}
\]
可以计算得:
\frac{2\pi}{\Omega}(\mathbf{L}_2\times\mathbf{L}_3)=\frac{\pi L_yL_z}{\Omega L_x}\mathbf{L}_1=\frac{2\pi}{L_x^2}\mathbf{L}_1
\]
其中\(\Omega\)表示周期性盒子的体积,类似的有:
\frac{2\pi}{L_y^2}\mathbf{L}_2
\]
以及
\frac{2\pi}{L_z^2}\mathbf{L}_3
\]
经过倒易空间变换之后,原胞体积从\(\Omega=L_xL_yL_z\)变成:\(\Omega^*=\frac{(2\pi)^3}{L_xL_yL_z}\)。因为在前一步傅里叶空间的泊松方程中我们注意到\(\mathbf{k}\)前面总是带了一个\(2\pi\),这里不妨使用倒易晶格矢的定义对\(\mathbf{k}\)的形式做一个简化:
\]
这样一来傅里叶空间的泊松方程可以简写为:
\]
其中\(k^2=|\mathbf{k}|^2=\frac{4\pi^2m_1^2}{L_x^2}+\frac{4\pi^2m_2^2}{L_y^2}+\frac{4\pi^2m_3^2}{L_z^2}\),可以实现实空间到倒易空间的变换。
衰减函数构造
对于上述傅里叶变换之后的单点电势的形式,即使我们对整个\(\mathbf{k}\)空间进行积分,也是一个发散的结果。所以这里用到了一个非常特别的思想,由Edwald提出,把静电能量项分为远程相互作用项和短程相互作用项,分别在倒易空间和实空间收敛,这样就可以精确计算静电能。实际操作的时候有不同的推导过程,我们这里引用一种比较“数学”的推导方法(参考链接1)。
首先我们构造一个衰减函数\(e^{-k^2t}\),这个衰减函数有个特性是:
\]
这样我们就可以用这个积分形式替换掉傅里叶-泊松方程中的\(\frac{1}{k^2}\)项:
\]
因为这里使用的是从0到无穷大的一个积分形式,那么我们就可以实现一个截断,将其划分成两个积分的加和,假如我们在\(\eta\)处做一个截断,则有:
\]
这里取短程(Short Term)相互作用为:
\]
以及长程(Long Term)相互作用为:
\]
短程作用项计算
按照预期,划分了短程作用项和长程作用项之后,应该可以得到一个实空间收敛的短程相互作用,我们对短程作用做一个逆傅里叶变换:
V_i^S(\mathbf{r})&=\frac{1}{k_xk_yk_z}\sum_{\mathbf{k}}V_i^S(\mathbf{k})e^{i\mathbf{k}\cdot\mathbf{r}}\\
&=\frac{q_i}{k_xk_yk_z\epsilon_0}\sum_{\mathbf{k}}e^{j\mathbf{k}\cdot(\mathbf{r}-\mathbf{r}_i)}\int_0^{\eta}e^{-k^2t}dt\\
&=\frac{q_i}{k_xk_yk_z\epsilon_0}\int_0^{\eta}\sum_{\mathbf{k}}e^{j\mathbf{k}\cdot(\mathbf{r}-\mathbf{r}_i)}e^{-k^2t}dt
\end{align*}
\]
很明显,积分内的求和项是一个指数平方函数的离散傅里叶变换。而我们可以知道,正态分布函数\(f(\xi)=\frac{1}{\sqrt{2\pi}\sigma}e^{-\frac{\xi^2}{2\sigma^2}}\)的傅里叶变换和逆傅里叶变换不改变其分布形式:
F(k)&=\int f(\xi)e^{-jk\xi}d\xi\\
&=\frac{1}{\sqrt{2\pi}\sigma}\int e^{\frac{-\xi^2-2jk\xi\sigma^2}{2\sigma^2}}d\xi\\
&=\frac{1}{\sqrt{2\pi}\sigma}\int e^{\frac{-\xi^2-2jk\xi\sigma^2-(jk\sigma^2)^2+(jk\sigma^2)^2}{2\sigma^2}}d\xi\\
&=\frac{1}{\sqrt{2\pi}\sigma}e^{\frac{(jk\sigma^2)^2}{2\sigma^2}}\int e^{-\frac{(\xi+jk\sigma^2)^2}{2\sigma^2}}d\xi
\end{align*}
\]
由于积分项只是一个实空间的积分,其本质还是一个正态分布函数的积分,我们知道其积分结果是一个常数,所以有:
\]
也是一个正态分布,只是其均方差从\(\sigma\)变成了\(\frac{1}{\sigma}\),也就是其积分结果为:
\]
同样的道理我们也可以计算得,正态分布函数得逆傅里叶变换结果也依然是一个正态分布函数,其均方差也是\(\frac{1}{\sigma}\)。
那么回到短程静电势,先做个变量替换\(t=\frac{\sigma^2}{2},\sigma\geq0\),则有\(dt=\sigma d\sigma,\sigma_{t=\eta}=\sqrt{2\eta},\sigma_{t=0}=0\)。此时短程相互作用势为:
V_i^S(\mathbf{r})&=\frac{q_i}{k_xk_yk_z\epsilon_0}\int_{0}^{\sqrt{2\eta}}\left(\sum_{\mathbf{k}}e^{j\mathbf{k}\cdot(\mathbf{r}-\mathbf{r}_i)}e^{-\frac{k^2\sigma^2}{2}}\right)\sigma d\sigma\\
&=\frac{q_i}{\epsilon_0}\int_{0}^{\sqrt{2\eta}}\frac{e^{-\frac{(\mathbf{r}-\mathbf{r}_i)^2}{2\sigma^2}}}{N_{coe}}\sigma d\sigma
\end{align*}
\]
这里\(N_{coe}\)是一个用于归一化正态分布的常数:
N_{coe}&=\int_{\mathbf{r}}e^{-\frac{\left|\mathbf{r}-\mathbf{r}_i\right|}{2\sigma^2}}d\mathbf{r}\\
&=\int_{-\infty}^{\infty}e^{-\frac{(z-z_i)^2}{2\sigma^2}}\left[\int_{-\infty}^{\infty}e^{-\frac{(y-y_i)^2}{2\sigma^2}}\left(\int_{-\infty}^{\infty}e^{-\frac{(x-x_i)^2}{2\sigma^2}}dx\right)dy\right]dz\\
&=(2\pi\sigma^2)^{\frac{3}{2}}
\end{align*}
\]
所以有:
V_i^S(\mathbf{r})&=\frac{q_i}{\epsilon_0}\int_{0}^{\sqrt{2\eta}}\frac{e^{-\frac{(\mathbf{r}-\mathbf{r}_i)^2}{2\sigma^2}}}{(2\pi\sigma^2)^{\frac{3}{2}}}\sigma d\sigma\\
&=\frac{q_i}{(2\pi)^{\frac{3}{2}}\epsilon_0}\int_{0}^{\sqrt{2\eta}}\frac{e^{-\frac{(\mathbf{r}-\mathbf{r}_i)^2}{2\sigma^2}}}{\sigma^2} d\sigma
\end{align*}
\]
这里用一个变量替换:\(y=-\frac{|\mathbf{r}-\mathbf{r}_i|}{\sqrt{2}\sigma}\),则有:\(\sigma=-\frac{|\mathbf{r}-\mathbf{r}_i|}{\sqrt{2}y}\),其微分变换形式为:\(d\sigma=\frac{|\mathbf{r}-\mathbf{r}_i|}{\sqrt{2}y^2}dy\),其边界为:\(y_{\sigma=\sqrt{2\eta}}=-\frac{|\mathbf{r}-\mathbf{r}_i|}{2\sqrt{\eta}},y_{\sigma=0}=-\infty\),代入得:
V_i^S(\mathbf{r})&=\frac{q_i}{(2\pi)^{\frac{3}{2}}\epsilon_0}\int_{-\infty}^{-\frac{|\mathbf{r}-\mathbf{r}_i|}{2\sqrt{\eta}}}\frac{\sqrt{2}e^{-y^2}}{|\mathbf{r}-\mathbf{r}_i|} dy\\
&=\frac{q_i}{2\pi^{\frac{3}{2}}\epsilon_0|\mathbf{r}-\mathbf{r}_i|}\int_{-\infty}^{-\frac{|\mathbf{r}-\mathbf{r}_i|}{2\sqrt{\eta}}}e^{-y^2}dy\\
&=\frac{q_i}{2\pi^{\frac{3}{2}}\epsilon_0|\mathbf{r}-\mathbf{r}_i|}\int_{\frac{|\mathbf{r}-\mathbf{r}_i|}{2\sqrt{\eta}}}^{+\infty}e^{-y^2}dy
\end{align*}
\]
此时使用一个误差函数\(Erfc(y)=\frac{2}{\sqrt{\pi}}\int_{y}^{\infty}e^{-x^2}dx\)代入进行替换:
\]
因为\(\eta\)是我们手动引入的一个常数参量,如果考虑\(\eta=\frac{\sigma^2}{2}\),那么形式就变成了:
\]
这个形式的短程相互作用势,表示的是单个盒子内的单个带电粒子\(q_i\)在\(\mathbf{r}\)处的电势,如果考虑周期性边界条件,则形式需要变为:
\]
这个形式的相互作用势相比于原始形式\(V_i(\mathbf{r})=\frac{1}{4\pi\epsilon_0}\sum_{\mathbf{n}}\frac{q_i}{\left|\mathbf{r}-\mathbf{r}_i+\mathbf{n}\mathbf{L}\right|}\)而言,使用了一个误差函数对实空间做了一个截断:
\]
从而只需要计算有限\(\mathbf{n'}\)的周期性盒子即可。因为这里截断的是距离\(d_{\mathbf{n}}=|\mathbf{r}-\mathbf{r}_i+\mathbf{n}\mathbf{L}|\),可以用达朗贝尔判别法证明短程相互作用势在实空间的收敛性(按一般性取法先令一个\(\delta>0\)):\(\lim_{l_{\mathbf{n}}\rightarrow\infty}\frac{Erfc(\frac{l_{\mathbf{n}}+\delta}{\sqrt{2}\sigma})l_{\mathbf{n}}}{(l_{\mathbf{n}}+\delta)Erfc(\frac{l_{\mathbf{n}}}{\sqrt{2}\sigma})}=\lim_{l_{\mathbf{n}}\rightarrow\infty}\frac{Erfc\left(\frac{l_{\mathbf{n}+\delta}}{\sqrt{2}\sigma}\right)}{Erfc\left(\frac{l_{\mathbf{n}}}{\sqrt{2}\sigma}\right)}=e^{-\frac{\delta^2}{2\sigma^2}}\lim_{l_{\mathbf{n}}\rightarrow\infty}e^{-\frac{l_{\mathbf{n}}\delta}{\sigma^2}}=e^{-\frac{\delta^2}{2\sigma^2}}<1\)。即:电势的短程相互作用在实空间收敛。得到短程相互作用电势的形式之后,可以进一步计算短程相互作用的电势能:
\]
长程作用项计算
前面得到长程相互作用电势形式为:
\]
同样使用短程作用项中的取值\(\eta=\frac{\sigma^2}{2}\)。做一个逆傅里叶变换变回实空间:
\]
类似的可以根据达朗贝尔判别方法证明该式收敛。并且参考前面倒易空间中的\(\mathbf{k}\)的定义有:
\]
也就是长程相互作用项可以略去周期性盒子的求和项,因此长程相互作用电势能的形式为:
\]
后面这两个求和的内容形式是两个平面波函数的内积,其物理意义为把实空间的一个固定电荷按照概率幅分配到不同的倒易空间的格点上,可以定义一个倒易空间的电荷分布函数:
\]
则可以进一步简化长程相互作用势能的写法:
\]
需要注意的一点是,虽然这里的长程相互作用势能是收敛的,但是其中包含了点电荷\(i\)对\(\mathbf{r}_i\)处产生的电势能(需要去除)。而此前计算短程相互作用时可以得到的误差函数形式的长程相互作用形式:
V_i^L(\mathbf{r})&=\sum_{\mathbf{n}}\frac{q_i}{4\pi\epsilon_0|\mathbf{r}-\mathbf{r}_i-\mathbf{nL}|}-V_i^S(\mathbf{r})\\
&=\sum_{\mathbf{n}}\frac{q_i}{4\pi\epsilon_0|\mathbf{r}-\mathbf{r}_i-\mathbf{nL}|}Erf\left(\frac{|\mathbf{r}-\mathbf{r}_i-\mathbf{nL}|}{\sqrt{2}\sigma}\right)
\end{align*}
\]
虽然不收敛,但是如果在这里取一个\(\mathbf{r}=\mathbf{r}_i,\mathbf{nL}=0\),也就是前面提到的电荷自我相互作用,则长程相互作用形式变为:
\]
则可以得到在倒易空间的长程相互作用项中需要扣除的自我相互作用项为:
\]
总电势能
经过前面的计算,我们已经分别得到了实空间收敛的短程相互作用项、倒易空间收敛的长程相互作用项以及长程相互作用项中需要扣除的一个自我相互作用项,那么可以汇总电势能为:
E&=E^S+E^L-E^{self}\\
&=\sum_{\mathbf{n}}\sum_{i=0}^{N-2}\sum_{j=i+1}^{N-1}\frac{q_iq_j}{4\pi\epsilon_0|\mathbf{r}_j-\mathbf{r}_i+\mathbf{n}\mathbf{L}|}Erfc\left(\frac{|\mathbf{r}_j-\mathbf{r}_i+\mathbf{n}\mathbf{L}|}{\sqrt{2}\sigma}\right)+\sum_{|\mathbf{n}|>0}\frac{q_i^2}{4\pi\epsilon_0|\mathbf{n}\mathbf{L}|}Erfc\left(\frac{|\mathbf{n}\mathbf{L}|}{\sqrt{2}\sigma}\right)\\
&+\frac{1}{2k_xk_yk_z\epsilon_0}\sum_{|\mathbf{k}|>0}\frac{e^{-\frac{\sigma^2 k^2}{2}}}{k^2}\left|S(\mathbf{k})\right|^2\\
&-\frac{1}{4\pi\epsilon_0}\frac{1}{\sqrt{2\pi}\sigma}\sum_{i=0}^{N-1}q_i^2
\end{align*}
\]
总结概要
本文介绍了Ewald求和计算方法在周期性边界条件下计算静电势能的方法。周期性的静电势函数并不是一个空间收敛的函数,通过Ewald求和可以将静电势切分为短程相互作用和长程相互作用,两项分别在实空间和倒易空间(或称傅里叶空间、k空间等)收敛。然后就可以进一步进行截断,用更少的代价获得更高精度的电势能计算结果。
版权声明
本文首发链接为:https://www.cnblogs.com/dechinphy/p/ewald.html
作者ID:DechinPhy
更多原著文章:https://www.cnblogs.com/dechinphy/
请博主喝咖啡:https://www.cnblogs.com/dechinphy/gallery/image/379634.html
参考链接
Ewald求和在分子静电势能计算中的应用的更多相关文章
- JAX-MD在近邻表的计算中,使用了什么奇技淫巧?(一)
技术背景 JAX-MD是一款基于JAX的纯Python高性能分子动力学模拟软件,应该说在纯Python的软件中很难超越其性能.当然,比一部分直接基于CUDA的分子动力学模拟软件性能还是有些差距.而在计 ...
- FPGA计算中定标与位扩展的实现
我不知道名字取对没有,在FPGA计算中有时往往需要在不溢出的情况下将数扩大,从而获得更好的计算精度. 比如.在一个8位宽的系统中,将x=0000_0010,算术左移m=5位之后得到xt=0100_00 ...
- Hadoop计算中的Shuffle过程(转)
Hadoop计算中的Shuffle过程 作者:左坚 来源:清华万博 时间:2013-07-02 15:04:44.0 Shuffle过程是MapReduce的核心,也被称为奇迹发生的地方.要想理解Ma ...
- Java使用极小的内存完成对超大数据的去重计数,用于实时计算中统计UV
Java使用极小的内存完成对超大数据的去重计数,用于实时计算中统计UV – lxw的大数据田地 http://lxw1234.com/archives/2015/09/516.htm Java使用极小 ...
- 算法笔记_031:计算中值和选择问题(Java)
目录 1 问题描述 2 解决方案 2.1 计算中值问题 2.2 选择问题 1 问题描述 中值问题是求一个n个数列表中某一数组下标k,它要求该下标元素比列表中的一半元素大,又比另一半元素小,这个中 ...
- 商业计算中Java高精度计算BigDecimal类
<Effective Java> 第48条:如果需要精确的答案,请避免使用float和double. 如果我们编译运行下面这个程序会看到什么?public class Test{ p ...
- AI芯片:高性能卷积计算中的数据复用
随着深度学习的飞速发展,对处理器的性能要求也变得越来越高,随之涌现出了很多针对神经网络加速设计的AI芯片.卷积计算是神经网络中最重要的一类计算,本文分析了高性能卷积计算中的数据复用,这是AI芯片设计中 ...
- 技术分享预告丨k3s在边缘计算中的应用实践
技术分享是在[Rancher官方微信技术交流群]里以图文直播+QA实时互动的方式,邀请国内已落地经验的公司或团队负责人分享生产落地的最佳实践.记得添加微信小助手(微信号:rancher2)入群,实时参 ...
- 孪生网络(Siamese Network)在句子语义相似度计算中的应用
1,概述 在NLP中孪生网络基本是用来计算句子间的语义相似度的.其结构如下 在计算句子语义相似度的时候,都是以句子对的形式输入到网络中,孪生网络就是定义两个网络结构分别来表征句子对中的句子,然后通过曼 ...
- python3在科学计算中的三种常用数据结构
在科学研究中,数据运算是必不可少的,下面介绍python语言在科学计算中常用的数据结构和运算函数. 主要数据结构: (1)列表,用中括号表示,元素之间逗号分隔,每个元素可以是数字,字符,也可以是列表, ...
随机推荐
- emojiCTF2024
emojiCTF2024 WEB http 题目: 思路: 修改 UA 头为 EMOJI_CTF_User_Agent_v1.0:User-Agent: EMOJI_CTF_User_Agent_ ...
- Jmeter函数助手19-machineName
machineName函数用于获取当前计算机的用户名. 存储结果的变量名(可选)
- 【ElasticSearch】03 部署
Windows集群部署: 把包解压成三个节点 [kibana-7.16.3-windows-x86_64.zip] - Node-1001 - Node-1002 - Node-1003 修改集群的配 ...
- 神州笔记本 —— HASEE神州 —— 用户手册(使用功能键)—— 笔记本电脑功能键
功能键功能: FN+f1 启动/关闭 触摸板 FN+f2 启动/关闭 屏幕背光 FN+f3 启动/关闭 喇叭和外接耳机 FN+f5 减低音量 FN+f6 提高音量 FN+f7 切换屏幕 FN+f8 降 ...
- 【转载】 Tensorboard:PermissionError: [Errno 13] Permission denied: ‘/tmp/.tensorboard-info/pid-46614.info‘
版权声明:本文为CSDN博主「时光碎了天」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明.原文链接:https://blog.csdn.net/u013289254/ ...
- 记一次失败记录: MindSpore1.3.0 GPU 源码安装 —— Ubuntu18.04系统 (最终安装结果为失败)
官网地址: https://www.mindspore.cn/install 系统:Ubuntu18.04 硬件: i7-9700k CPU 2060super nvidia显卡 由于考虑到minds ...
- 在WSL Ubuntu中设置sshd自启动
参考: https://blog.csdn.net/android_cai_niao/article/details/128490566 ------------------------------- ...
- 简单易懂的BFS
最近学习BFS,看到许多教程都用C++内置的queue,但其实还有更简单的方法. 先了解概念:BFS与DFS不同,举个例子: 我们来用DFS遍历这棵树:A.B.D.E.G.C.F 但我们用BFS遍历这 ...
- [学习笔记] 丢番图方程 & 同余 & 逆元 - 数论
首先,他们几个有着极大的相似性.另外,他们的各自的思想都能够很好的服务于另外几个,有助于加深理解. 文中有些letax公式抽风了,全屏之后应该能看得见-- 线性丢番图方程 丢番图不是个图啊!他是个ma ...
- ARM架构及ARM指令集、Thumb指令集你了解多少?
https://www.sohu.com/a/339622340_100281310 1991 年ARM 公司成立于英国剑桥,在成立后的那几年,ARM业绩平平,工程师们也人心惶惶,害怕随时都会失业.在 ...