实话实说,我自学(肝)了两天才学会这两个随机算法

记录:

Miller-Rabin

她是一个素数判定的算法。

首先需要知道费马小定理

\[a^{p-1}\equiv1\pmod{p}\quad p\in prime
\]

和二次探测定理

\[x=1 \ or \ p-1 \iff x^2\equiv1\pmod{p}\quad p\in prime,0\leqslant x<p
\]

Miller-Rabin(设要被检验的数为 \(n\),\(n\leqslant2 \ or \ 2\nmid n\) 的情况请特判):

  1. 将 \(n-1\) 拆成 \(2^{cnt}\times m\quad (2\nmid m)\) 的形式,并随机选出一个整数 \(a\) ,构造此 Miller 序列
\[\begin{aligned} M_i&=a^{2^i\times m}\pmod{n}\quad (0\leqslant i\leqslant cnt) \\ &=\begin{cases} a^m\pmod{n} & i=0 \\ M_{i-1}^2\pmod{n} & i>0 \end{cases} \end{aligned}
\]
  1. 由于费马小定理,若 \(M_{cnt}\ne1\),则 \(n\) 一定不是素数;若 \(M_{cnt}=1\),则 \(n\) 可能是素数。

  2. 若 \(n\) 没有被第二步筛掉,即还有机会是素数,则研究 \(M_{cnt-1}\):若

    \(M_{cnt-1}=1 \ or \ n-1\),则二次探测定理成立, \(n\) 可能是素数;否则二次探测定理不成立, \(n\) 一定不是素数。

  3. 若 \(M_{cnt-1}=n-1\) ,则接下来不能用二次探测定理判定了,直接返回 \(n\) 为素数。

  4. 若 \(n\) 没有被第三步筛掉,即还有机会是素数,则研究 \(M_{cnt-2}\):若

    \(M_{cnt-2}=1 \ or \ n-1\),则二次探测定理成立, \(n\) 可能是素数;否则二次探测定理不成立, \(n\) 一定不是素数。

  5. 递归地使用第四第五两步,若到了 \(M_0\) 还没有出结果,即 \(M_i=1\quad (0\leqslant i\leqslant cnt)\) ,则返回 \(n\) 为素数。

  6. 重复多次上述过程,即 \(a\) 多次随机。只有当每次结果都返回是素数时,最终判定结果才是素数,否则不是素数。

举个例子,

若要判定 \(561=3\times11\times17\) 是否为素数:

\(561-1=560=2^4\times35,cnt=4,m=35\)。\(a\) 取 \(8\),则构造的 Miller 序列分别为:

\[M_0=a^{2^0\times 35}\pmod{561}=461
\]
\[M_1=a^{2^1\times 35}\pmod{561}=463
\]
\[M_2=a^{2^2\times 35}\pmod{561}=67
\]
\[M_3=a^{2^3\times 35}\pmod{561}=1
\]
\[M_4=a^{2^4\times 35}\pmod{561}=1
\]

发现 \(M_2\) 和 \(M_3\) 不满足二次探测定理,断定了 \(561\) 不是素数,事实确实如此。

  1. inline bool MR(ll n){//Miller-Rabin
  2. #define Times 80//检验次数
  3. if(n<2 || !(n&1))return (n==2);//特判
  4. ll a,b,m=n-1,cnt=0;//cnt:2因子的个数
  5. while(!(m&1)){
  6. cnt++;
  7. m>>=1;
  8. }
  9. uid(R,1,n-1);//随机数init,这里用mt19937
  10. For(i,1,Times){
  11. a=Rand(R);//随机值
  12. a=pw(a,m,n);//快速幂
  13. For(j,1,cnt){
  14. b=a*a%n;//此时b为M_j,a为M_{j-1}
  15. if(b==1 && a!=1 && a!=n-1)//二次探测定理都不行qwq
  16. return false;
  17. a=b;
  18. }
  19. if(b!=1)//费马小定理都不行qwq
  20. return false;
  21. }
  22. return true;
  23. }

发现这样常数太大,若将 Times 调小,则有些素数会误判。

优化

选取几个特定的优秀的素数作为 \(a\),此时还要特判这些素数

  1. inline bool mr(ll n,ll c){//用c来筛n
  2. ll k=n-1,cnt=0;
  3. while(!(k&1)){
  4. k>>=1;
  5. cnt++;
  6. }
  7. ll x=pw(c,k,n),y=x;
  8. if(x==1) return true;
  9. while(cnt--){
  10. y=pw(x,2,n);
  11. if(y==1 && x!=n-1 && x!=1) return false;
  12. x=y;
  13. if(x==1) return true;
  14. }
  15. return false;
  16. }
  17. vector<ll> pr={2,3,5,7,13331,998244353}; //素数选得好,AC不能少
  18. inline bool MR(ll x){
  19. if(x<2) return false;
  20. for(ll i:pr) if(x==i) return true;
  21. for(ll i:pr) if(!mr(x,i)) return false;
  22. return true;
  23. }

Pollard-Rho

她是一个分解大合数的算法。

如果是你,你会如何找到某个大整数的一个非1、非自身的因子?

算法1:试除法

从 \(2\) 到 \(\sqrt{n}\) 枚举,判断是否为 \(n\) 的因子。

时间复杂度 \(O(\sqrt{n})\)

算法2:随机数法

从 \(2\) 到 \(n-1\) 枚举,判断是否为 \(n\) 的因子。

这个算法看上去像是来搞笑的,简直和猴子排序不谋而合,然而它正是Pollard-Rho算法的基础。

最坏情况下的期望时间复杂度 \(O(n)\)

算法3:2的优化

从判断是否为 \(n\) 的因子改成判断是否与 \(n\) 不互素,之后取 \(\gcd\) 即可。

最坏情况为:

\[n=p^2\quad p\in prime
\]

此时期望时间复杂度 \(O(\sqrt{n}\log n)\) (\(\log\) 是 \(\gcd\) 带来的)

为了更好得介绍下面的内容,先引入一堆——

生日悖论(其实不是悖论)

这只是有悖直觉而已 OvO

一个房间里有23个人,则他们中有两人生日相同的概率超过一半(不考虑闰年)。

证明从略。

生日悖论启示我们,如果我们不断在某个范围内生成随机整数很快便会生成到重复的数,期望大约在根号级别

对于一个 \([1,N]\) 内整数的随机生成器,生成序列中第一个重复数字的位置的期望为

\[\sqrt{\dfrac{\pi N}{2}}
\]

但这件事意义并没有那么大。正如虽然生日悖论是正确的,但你不一定能在班上遇到和自己生日相同的人,因为这个高概率是在两两比较下才成立的。对这些数两两进行验证,复杂度立刻退化,并没有什么进步。所以我们需要一些技巧。

伪随机数序列

设 \(f(x)=x^2+c\)(可能受曼德勃罗集的启发吧)

则构造序列

\[P(i)=\begin{cases} 0 & i=0 \\ f(P(i-1)) & i>0 \end{cases}
\]

\[P(i)_n=P(i)\pmod{x}
\]

由于 \(P(i)_n\) 的取值只由上一个决定(马尔可夫链)(\(n,c\) 看作常数)且值域有限,则此序列一定会形成

举个例子:

取 \(n=1001=7\times11\times13,c=2\) 时,序列 \(P(i)_n\) 的走向为:

生成的序列常常形成这样的 \(\rho\) 形,这也是为什么 Pollard 把这个算法命名为 \(\rho\) (rho) 算法。

算法4:Pollard-Rho

转换一下原问题至:不断求出 \(n\) 的一个非 \(1\) 因数,直到此因数不为 \(n\) 即可。

接下来考虑如何求出 \(n\) 的一个非 \(1\) 因数

其实就是找 \(P\) 序列中两数 \(x,y\)(不一定相邻),使得 \(\gcd(|x-y|,n)>1\)

我们称整个为 \(\rho\),环(此图中的 \(445\to830\to214\to753\to445\))为 \(o\),\(o\) 的环长为 \(len(o)\)

这伪随机数序列有什么好处呢?其实,这个伪随机数生成器生成的数具有一个性质:

若 \(\rho\) 上有两个数 \(i,j\) 位置相差 \(d\quad(len(o) \nmid d)\) (\(e.g.\) 图中 \(38\) 与 \(214\) 相差 \(3\);\(445\) 与 \(753\) 相差 \(1\) 或 \(3\) 均可),且

\[\gcd(|i-j|,n)>1
\]

则在 \(o\) 上 \(\forall x,y\) 位置相差 \(d\) ,有

\[\gcd(|x-y|,n)>1
\]

Prove_start

\(len(o) \nmid d \implies \rho\) 上位置相差 \(d\) 的数不可能相同

\[\gcd(|i-j|,n)>1
\]
\[\implies \gcd(|i-j|\times|i+j|,n)>1
\]
\[\implies \gcd(|i-j|\times|i+j|,n)>1
\]
\[\implies \gcd(|i^2-j^2|,n)>1
\]
\[\implies \gcd(|f(i)-f(j)|,n)>1
\]
\[\implies \dots
\]

(递推)

\[\implies \gcd(|x-y|,n)>1
\]

Prove_end

换言之,任意选取 \(o\) 上距离为 \(i\quad(0<i<len(o))\) 的两点 \(x_i,y_i\),判断 \(\gcd(|x_i-y_i|,n)\) 是否为 \(n\) 的非 \(1\) 因数。

这些二元组基本上(因为距离为 \(len(o)\) d 倍数的没算,由于这是概率算法,这些可忽略)代表了 \(\rho\) 上的所有二元组。

所以我们在一个 \(o\) 上,对于每种距离 \(i\),任意找一组 \(x_i,y_i\) 判断是否有非 \(1\) 因子即可。

若没找到,则 \(f(x)\) 中 \(c\) 换一个随机值构造 \(\rho\) 重复上述步骤即可。

那怎么快速枚举环上每种距离的两点呢?——

Floyd判环算法(龟兔赛跑算法)

形象理解一下,就是把 \(\rho\) 看作飞行棋棋盘,有两只小灰鸡从 \(0\) 开始,慢的(称为 \(turtle\))每次走一格,快的(称为 \(rabbit\))每次走两格

即初始

\[turtle=rabbit=0
\]

每次

\[turtle:=f(turtle),rabbit:=f(f(rabbit))
\]

且判断 \(\gcd(|rabbit-turtle|,n)\)

由于 \(rabbit\) 与 \(turtle\) 之间的距离先逐渐增大,之后在环上相遇,所以两者之间的距离几乎可以取到所有可能的值。

期望复杂度 \(O(n^{\frac{1}{4}}\log n)\)

  1. inline ll f(ll x,ll c,ll n){
  2. return (/*__int128*/(lll)x*x+c)%n;
  3. }
  4. inline ll PR(ll n,ll c){
  5. ll t=f(0,c,n);//turtle
  6. ll r=f(f(0,c,n),c,n);//rabbit
  7. while(t!=r){
  8. ll d=gcd(abs(t-r),n);
  9. if(d>1)
  10. return d;
  11. t=f(t,c,n);
  12. r=f(f(r,c,n),c,n);
  13. }
  14. return n;//没有找到,重新调整参数c
  15. }

据说这个方法分解不了 \(4\),所以最好特判一下。

Prove_start ( of the time complexity )

设 \(d|n\quad(1<d\leqslant\sqrt{n})\)

因为 \(P(i)_n\) 和 \(P(i)_d\) 可近似看为随机序列,根据生日悖论可以推出其出现循环的期望步数分别为

\[\sqrt{\dfrac{\pi n}{2}},\sqrt{\dfrac{\pi d}{2}}
\]

由于 \(n>d\) ,所以有极大的概率当第一次 \(P(rabbit)_d=P(turtle)_d\) 时,\(P(rabbit)_n\ne P(turtle)_n\)(即 \(P_d\) 比 \(P_n\) 更早进入循环)

此时

\[\begin{aligned} |P(rabbit)_n-P(turtle)_n|&=|(k_{rabbit}d+P(rabbit)_d)-(k_{turtle}d+P(turtle)_d)| \\ &=|(k_{rabbit}-k_{turtle})d+(P(rabbit)_d-P(turtle)_d))| \\ &=|(k_{rabbit}-k_{turtle})d|\end{aligned}
\]

为 \(d\) 的倍数,于是求 \(\gcd\) 即可求出 \(d\) 这个因子。

因为 \(P_d\) 的循环期望步数 \(= \sqrt{\dfrac{\pi d}{2}} \approx \sqrt{d}\),而 \(d\leqslant\sqrt{n}\),再乘上 \(\gcd\) 的时间复杂度 \(O(\log n)\),则最后是 \(O(n^{\frac{1}{4}}\log n)\)

Prove_end

优化:倍增距离

这个方法复杂度很低了,但是这个 \(\log\) 还是看得人不爽,我们考虑如何去掉它。

我们想到

\[\gcd(x,n)>1 \implies \gcd(kx,n)>1 \quad (k\in \mathbb{N^+})
\]

所以我们可以减少求公因数的次数,即先把一些待选数乘起来,再统一与 \(n\) 求公因数。

我们可以每隔 \(1,2,4,8,16,\dots\) 个数(依次增加)求一次公因数,这样只需要求期望 \(\log(n^{\frac{1}{4}})\) 次公因数。

具体做法改为(伪代码):

  1. \(turtle:=rabbit:=k:=0\)

  2. \(mul:=1\)

  3. \(\operatorname{For}(i:1\to 2^k) rabbit:=f(rabbit),mul:=mul
    \times |rabbit-turtle|\)

  4. \(\operatorname{check\_gcd}(mul,n)\)

  5. \(turtle:=rabbit\)

  6. \(k:=k+1\)

  7. \(\operatorname{goto}(step \ 2)\)

即 \(turtle\) 开启了瞬移到 \(rabbit\) 身边的功能,冷却时间倍增。

总期望时间复杂度为 \(O(n^{\frac{1}{4}}+\log(n^{\frac{1}{4}})\log(n))\approx O(n^{\frac{1}{4}})\)

优化:固定步数

倍增距离在常数上有个缺点,就是到后面间隔很大,可能已达成目标却迟迟无法退出。

所以我们也可以龟兔赛跑算法(不带瞬移)每隔固定步数 \(C\approx \log n\) (取 \(128\) 较优)就求一次公因数。

注意:这里的固定步数不是指固定 \(turtle,rabbit\) 之间的距离,而是与Floyd判环算法/龟兔赛跑算法相同,只不过将相邻的 \(\gcd\) 询问堆在一起处理。

总期望时间复杂度为 \(O(n^{\frac{1}{4}}+\dfrac{n^{\frac{1}{4}}\log n}{C})\approx O(n^{\frac{1}{4}})\)

网上很多模板会把这两种方法结合,即倍增取距离,但又规定一个上限。本人本地测试了一下,似乎跟固定步数的时间差别不大,但 Luogu 上好像只有结合的方法能过,固定步数TLE调不出来 qwq

  1. inline ll gcd(ll x,ll y){//定义 gcd(0,x)=x
  2. if(x<y) swap(x,y);
  3. if(y==0) return x;
  4. return gcd(y,x%y);
  5. }
  6. inline ll f(ll x,ll c,ll n){
  7. return ((lll)x*x+c)%n;
  8. }
  9. inline ll PR(ll n,ll c){
  10. ll t;//turtle
  11. ll r=0;//rabbit
  12. ll val;//累乘
  13. ll d;//因数
  14. for(int len=1;;len<<=1){//len:这一阶段的长度 (倍增)
  15. t=r;
  16. val=1;
  17. For(cnt,1,len){//rabbit跑
  18. r=f(r,c,n);
  19. val=(lll)val*abs(r-t)%n;
  20. if(cnt%127==0){
  21. d=gcd(val,n);
  22. if(d>1)
  23. return d;
  24. }
  25. }
  26. d=gcd(val,n);
  27. if(d>1)
  28. return d;
  29. }
  30. }

求最大因数( Luogu P4718 )

既然可以求一个因数,自然就可以求最大因数,这需要一个递归即可。

  1. ll ans;
  2. void work(ll n){//求n的最大素因数->ans
  3. if(n<=ans || n<2) return ;
  4. if(MR(n)){//特判素数
  5. ckmx(ans,n);
  6. return ;
  7. }
  8. ll d=n;
  9. uid(R,1,n-1);
  10. while(d==n) d=PR(n,Rand(R));//找到一个因子(不一定素)
  11. while(n%d==0) n/=d;
  12. work(n);
  13. work(d);
  14. }

完整呆码

  1. //luogu.com.cn/problem/P4718
  2. #include<bits/stdc++.h>
  3. using namespace std;
  4. #define ll long long
  5. #define lll __int128
  6. #define br putchar('\n')
  7. #define For(i,j,k) for(register int i=j;i<=k;i++)
  8. #define uid(i,j,k) uniform_int_distribution<ll> i(j,k)
  9. #define Rand(s) s(rand_num)
  10. unsigned seed=chrono::system_clock::now().time_since_epoch().count();//种子 值为从1970/1/1 8:00到现在的秒数乘上10^9
  11. mt19937 rand_num(seed);//大随机数
  12. inline ll read(){//快读
  13. ll s=0,w=1;char ch=getchar();
  14. while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
  15. while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
  16. return s*w;
  17. }
  18. inline void write(ll x){//快写number
  19. if(x<0)putchar('-'),x=-x;
  20. if(x>9)write(x/10);
  21. putchar(x%10+'0');
  22. }
  23. template<class T> inline void ckmx(T &a,T b){ if(a<b)a=b; }//check max
  24. //------------------------------------------------------------------------------
  25. inline ll pw(ll a,ll b,ll c){
  26. if(b==0) return 1;
  27. ll r=pw(a,b>>1,c);
  28. r=(lll)r*r%c;
  29. if(b&1) r=(lll)r*a%c;
  30. return r;
  31. }
  32. inline ll gcd(ll x,ll y){//定义 gcd(0,x)=x
  33. if(x<y) swap(x,y);
  34. if(y==0) return x;
  35. return gcd(y,x%y);
  36. }
  37. inline bool mr(ll n,ll c){//用c来筛n
  38. ll k=n-1,cnt=0;
  39. while(!(k&1)){
  40. k>>=1;
  41. cnt++;
  42. }
  43. ll x=pw(c,k,n),y=x;
  44. if(x==1) return true;
  45. while(cnt--){
  46. y=pw(x,2,n);
  47. if(y==1 && x!=n-1 && x!=1) return false;
  48. x=y;
  49. if(x==1) return true;
  50. }
  51. return false;
  52. }
  53. vector<ll> pr={2,3,5,7,13331,998244353}; //素数选得好,AC不能少
  54. inline bool MR(ll x){
  55. if(x<2) return false;
  56. for(ll i:pr) if(x==i) return true;
  57. for(ll i:pr) if(!mr(x,i)) return false;
  58. return true;
  59. }
  60. ll ans;
  61. inline ll f(ll x,ll c,ll n){
  62. return ((lll)x*x+c)%n;
  63. }
  64. inline ll PR(ll n,ll c){
  65. ll t;//turtle
  66. ll r=0;//rabbit
  67. ll val;//累乘
  68. ll d;//因数
  69. for(int len=1;;len<<=1){//len:这一阶段的长度 (倍增)
  70. t=r;
  71. val=1;
  72. For(cnt,1,len){//rabbit跑
  73. r=f(r,c,n);
  74. val=(lll)val*abs(r-t)%n;
  75. if(cnt%127==0){
  76. d=gcd(val,n);
  77. if(d>1)
  78. return d;
  79. }
  80. }
  81. d=gcd(val,n);
  82. if(d>1)
  83. return d;
  84. }
  85. }
  86. void work(ll n){//求n的最大素因数->ans
  87. if(n<=ans || n<2) return ;
  88. if(MR(n)){//特判素数
  89. ckmx(ans,n);
  90. return ;
  91. }
  92. ll d=n;
  93. uid(R,1,n-1);
  94. while(d==n) d=PR(n,Rand(R));//找到一个因子(不一定素)
  95. while(n%d==0) n/=d;
  96. work(n);
  97. work(d);
  98. }
  99. signed main(){
  100. int T=read();
  101. while(T--){
  102. ll n=read();
  103. ans=0;
  104. work(n);
  105. if(ans==n) puts("Prime");
  106. else write(ans),br;
  107. }
  108. return 0;
  109. }

Miller-Rabin and Pollard-Rho的更多相关文章

  1. POJ2429 - GCD & LCM Inverse(Miller–Rabin+Pollard's rho)

    题目大意 给定两个数a,b的GCD和LCM,要求你求出a+b最小的a,b 题解 GCD(a,b)=G GCD(a/G,b/G)=1 LCM(a/G,b/G)=a/G*b/G=a*b/G^2=L/G 这 ...

  2. POJ1811- Prime Test(Miller–Rabin+Pollard's rho)

    题目大意 给你一个非常大的整数,判断它是不是素数,如果不是则输出它的最小的因子 题解 看了一整天<初等数论及其应用>相关部分,终于把Miller–Rabin和Pollard's rho这两 ...

  3. Pollard rho算法+Miller Rabin算法 BZOJ 3668 Rabin-Miller算法

    BZOJ 3667: Rabin-Miller算法 Time Limit: 60 Sec  Memory Limit: 512 MBSubmit: 1044  Solved: 322[Submit][ ...

  4. Miller Rabin素数检测与Pollard Rho算法

    一些前置知识可以看一下我的联赛前数学知识 如何判断一个数是否为质数 方法一:试除法 扫描\(2\sim \sqrt{n}\)之间的所有整数,依次检查它们能否整除\(n\),若都不能整除,则\(n\)是 ...

  5. HDU 3864 D_num Miller Rabin 质数推断+Pollard Rho大整数分解

    链接:http://acm.hdu.edu.cn/showproblem.php? pid=3864 题意:给出一个数N(1<=N<10^18).假设N仅仅有四个约数.就输出除1外的三个约 ...

  6. poj 1811 Pallor Rho +Miller Rabin

    /* 题目:给出一个数 如果是prime 输出prime 否则输出他的最小质因子 Miller Rabin +Poller Rho 大素数判定+大数找质因子 后面这个算法嘛 基于Birthday Pa ...

  7. POJ1811_Prime Test【Miller Rabin素数测试】【Pollar Rho整数分解】

    Prime Test Time Limit: 6000MS Memory Limit: 65536K Total Submissions: 29193 Accepted: 7392 Case Time ...

  8. POJ2429_GCD &amp; LCM Inverse【Miller Rabin素数測试】【Pollar Rho整数分解】

    GCD & LCM Inverse Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 9756Accepted: 1819 ...

  9. POJ1811_Prime Test【Miller Rabin素数測试】【Pollar Rho整数分解】

    Prime Test Time Limit: 6000MS Memory Limit: 65536K Total Submissions: 29193 Accepted: 7392 Case Time ...

  10. HDU1164_Eddy&#39;s research I【Miller Rabin素数测试】【Pollar Rho整数分解】

    Eddy's research I Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...

随机推荐

  1. 工作效率:通过pycharm的模板代码减少重复工作

    摘要 在常见的业务开发场景下,经常要开发大量重复的代码,这里代码耗时但又必要,就像我们写分析报告一样,每次都要为固定的格式耗费精力.我们可以更加日常开发经验总结出一些常用的模板代码来帮助我们实现一秒五 ...

  2. 小程序跨页面传递data数据的三种方法

    Q:小程序怎么把页面data里的数据传到另外的页面? 或者小程序怎么吧表单里的数据传到另外的页面?A:1.可以使用url传递数据. 例如在A页面中传递数据,需要注意的是,wx.switchTab中的u ...

  3. 解锁 VS Code 更多可能性,轻松入门 WebView

    作者:HelloGitHub-小夏 说起 VS Code 大家普遍印象应该都差不多是这样:不就是个编辑器嘛,最主要的还是 coding 的快感咯. 里面很多功能都应该是围绕如何提高 coding 效率 ...

  4. Spring笔记(2)

    一.AOP简介 1.概念: 面向切面编程(Aspect-Oriented Programming),可以说是OOP(Object-Oriented Programing,面向对象编程)的补充和完善. ...

  5. vue-cli坑比系列

    Error loading saved preferences: ~/.vuerc may be corrupted or have syntax errors. Please fix/delete ...

  6. 命令行解析函数:getopt_long、getopt

    一.前言 在学习一些项目代码时,尤其涉及到命令行传参的代码,经常遇到getopt相关的函数,对这一类函数可以说是既陌生又熟悉.陌生是因为不知道它是干啥的,熟悉呢,是因为经常遇到.于是乎在追踪了多天ip ...

  7. openswan协商流程之(六):main_inI3_outR3()

    主模式第六包:main_inI3_outR3 1. 序言 main_inI3_outR3()函数是ISAKMP协商过程中第六包的核心处理函数的入口,第五六包主要用来验证对方的身份信息,同时此报文也是加 ...

  8. shell 脚本 根据PID过滤查看进程所有信息

    #!/bin/bash read -p "输入要查询的PID: " P #筛选第二列等于输入的PID号 n=`ps aux | awk '$2~/^'$P'$/ {print $1 ...

  9. linux 下的shutdown指令

    命令简介: 该命令可以安全关闭或者重新启动系统.你没有看错,shutdown命令不仅可以关闭系统.也可以重启Linux系统. 命令语法: /sbin/shutdown [-t sec] [-arkhn ...

  10. Docker安装GitLab与Runner(网关),常规设置,自动化用到k8s+token

    [转]图文详解k8s自动化持续集成之GitLab CI/CD Windows里面使用Debian命令行工具完成 和Docker网络相关的命令 查看某一个容器的网络 docker inspect 容器I ...