• 【学习笔记】Half-GCD


    这里是一份快速讲解(即有些东西不严谨)。

    最初看 E l e g i a \sf Elegia Elegia博客,讲得倒是很好,就是留了个疑问未解决——我现在还在评论区里。

    但看了 w h x 1003 \sf whx1003 whx1003博客之后,该疑问就被解开了。因此可以认真讲讲。

    算法动机:作除法时,计算商的复杂度是对的。但是每次的商太短,导致计算余数很慢;如果能够将多次取模统一计算,则可以加速。而且,计算商的时候,一般只会用到次数较高的项。

    算法目标:对 a , b ∈ F [ z ] a,b\in{\Bbb F}[z] a,bF[z],求矩阵 [ x 1 y 1 x 2 y 2 ]

    [x1y1x2y2]" role="presentation" style="position: relative;">[x1y1x2y2]
    [x1x2y1y2] 使得
    deg ⁡ ( x ) , deg ⁡ ( a x 1 + b y 1 ) , deg ⁡ ( a x 2 + b y 2 ) ⩽ k 2 + o ( k ) \deg(x),\deg(ax_1{+}by_1),\deg(ax_2{+}by_2)\leqslant\frac{k}{2}+o(k) deg(x),deg(ax1+by1),deg(ax2+by2)2k+o(k)

    其中 k = max ⁡ { deg ⁡ a ,    deg ⁡ b } k=\max\{\deg a,\;\deg b\} k=max{dega,degb} 。当然 x 2 + y 2 ≠ 0 x^2+y^2\ne 0 x2+y2=0

    不难发现 deg ⁡ gcd ⁡ ( a , b ) > k 2 \deg\gcd(a,b)>\frac{k}{2} deggcd(a,b)>2k 时,该目标无法实现。因此,事实上它的目标是
    deg ⁡ ( a x 1 + b y 1 ) ⩾ k 2 ⩾ deg ⁡ ( a x 2 + b y 2 ) \deg(ax_1{+}by_1)\geqslant\frac{k}{2}\geqslant\deg(ax_2{+}by_2) deg(ax1+by1)2kdeg(ax2+by2)

    然后再做了一次取模。而 a x 2 + b y 2 = 0 ax_2+by_2=0 ax2+by2=0 时,实际上无法进行这次取模。

    算法流程:设 a = a 0 + a 1 z k / 2 ,    b = b 0 + b 1 z k / 2 a=a_0+a_1z^{k/2},\;b=b_0+b_1z^{k/2} a=a0+a1zk/2,b=b0+b1zk/2,先求出 ( a 1 , b 1 ) (a_1,b_1) (a1,b1) Half-GCD \textit{Half-GCD} Half-GCD 结果,则对于每行的 x , y x,y x,y,有 deg ⁡ ( a 1 x + b 1 y ) ⩽ k 4 + o ( k ) \deg(a_1x+b_1y)\leqslant\frac{k}{4}+o(k) deg(a1x+b1y)4k+o(k),且 deg ⁡ ( a 0 x + b 0 y ) ⩽ 3 4 k + o ( k ) \deg(a_0x+b_0y)\leqslant\frac{3}{4}k+o(k) deg(a0x+b0y)43k+o(k),因而 deg ⁡ ( a x + b y ) ⩽ 3 4 k + o ( k ) \deg(ax+by)\leqslant\frac{3}{4}k+o(k) deg(ax+by)43k+o(k)

    特别地,若此时求出的矩阵已经使得 a 1 x 1 + b 1 y 1 = 0 a_1x_1+b_1y_1=0 a1x1+b1y1=0 了,如果 a x 1 + b y 1 = 0 ax_1+by_1=0 ax1+by1=0 就返回该矩阵即可,否则让 ( a x 0 + b y 0 ) (ax_0+by_0) (ax0+by0) ( a x 1 + b y 1 ) (ax_1+by_1) (ax1+by1) 取模即可。

    我们把两行乘出来的两个多项式,移除前 k 4 \frac{k}{4} 4k 项(即除以 z k / 4 z^{k/4} zk/4 再去除负数次项),重新作 Half-GCD \textit{Half-GCD} Half-GCD 。递归返回的多项式的度数是 1 4 k + o ( k ) \frac{1}{4}k+o(k) 41k+o(k) 的,和上一个矩阵一样。通过类似的分析可知,这个矩阵对之前乘出的多项式进行变换后,度数是 1 2 k + o ( k ) {1\over 2}k+o(k) 21k+o(k) 级别的。

    所以两个矩阵相乘就是所需的结果——矩阵内元素的度数恰好是 1 2 k + o ( k ) \frac{1}{2}k+o(k) 21k+o(k) 的。时间复杂度 T ( n ) = 2 T ( n 2 ) + M ( n ) = O ( M ( n ) log ⁡ n ) \mathcal T(n)=2\mathcal T({n\over 2})+\mathcal M(n)=\mathcal O(\mathcal M(n)\log n) T(n)=2T(2n)+M(n)=O(M(n)logn),其中 M ( n ) \mathcal M(n) M(n) deg ⁡ = n \deg=n deg=n 的多项式乘法的复杂度。

    代码实现的技巧:在 Half-GCD \textit{Half-GCD} Half-GCD 时,顺便返回矩阵与列向量的乘积。


    下面是 w h x 1003 \sf whx1003 whx1003 的讲解,我也摘抄一份。

    M G = [ G 1 1 0 ]    ( G ∈ F [ x ] ) \mathbf M_G=

    [G110]" role="presentation" style="position: relative;">[G110]
    \;(G\in\mathbb F[x]) MG=[G110](GF[x]) 是系数属于 F [ x ] \mathbb F[x] F[x] 的矩阵,其中 G ≠ 0 G\ne 0 G=0 G G G 的最高次项系数为正。

    考虑 gcd ⁡ \gcd gcd 的过程,每次求出商 Q ( x ) = A ( x ) ÷ B ( x ) Q(x)=A(x)\div B(x) Q(x)=A(x)÷B(x) 后得到
    [ B ( x ) A ( x )   m o d   B ( x ) ] = [ 0 1 1 − Q ( x ) ] [ A ( x ) B ( x ) ]

    [B(x)A(x)modB(x)]" role="presentation" style="position: relative;">[B(x)A(x)modB(x)]
    =
    [011Q(x)]" role="presentation" style="position: relative;">[011Q(x)]
    [A(x)B(x)]" role="presentation" style="position: relative;">[A(x)B(x)]
    [B(x)A(x)modB(x)]=[011Q(x)][A(x)B(x)]

    注意到该线性变换就是 M Q − 1 \mathbf M_Q^{-1} MQ1 。因此我们只需求出 ∏ M G \prod\mathbf M_G MG,即可直接计算出 gcd ⁡ \gcd gcd 的结果。

    Comment. 事实上对于矩阵 A = [ a b c d ] \mathscr A=

    [abcd]" role="presentation" style="position: relative;">[abcd]
    A=[acbd],若 det ⁡ ( A ) = s \det(\mathscr A)=s det(A)=s
    A − 1 = s − 1 [ d − b − c a ] \mathscr A^{-1}=s^{-1}
    [dbca]" role="presentation" style="position: relative;">[dbca]
    A1=s1[dcba]

    暴力展开不难验证。这可能是二阶矩阵逆元的速算方法吧。

    称矩阵 A \mathscr A A r e g u l a r \rm regular regular 的,当且仅当 A \mathscr A A 是若干 M G \mathbf M_G MG 的乘积。注意 r e g u l a r \rm regular regular 矩阵未必是对称的。

    稍微降低点要求,我们只希望求出 r e g u l a r \rm regular regular 矩阵 A \mathscr A A 使得 [ C ( x ) D ( x ) ] = A − 1 [ A ( x ) B ( x ) ]

    [C(x)D(x)]" role="presentation" style="position: relative;">[C(x)D(x)]
    =\mathscr A^{-1}
    [A(x)B(x)]" role="presentation" style="position: relative;">[A(x)B(x)]
    [C(x)D(x)]=A1[A(x)B(x)] 满足 deg ⁡ D ( x ) ⩽ 1 2 deg ⁡ A ( x ) \deg D(x)\leqslant\frac{1}{2}\deg A(x) degD(x)21degA(x) 。这显然可行,因为最终 D ( x ) = 0 D(x)=0 D(x)=0

    Lemma 1.( ordering property \text{ordering property} ordering property)  r e g u l a r \rm regular regular 矩阵元素的 deg ⁡ \deg deg 在行和列上都单调不增,且其中非零元素的最高次项都为正。

    归纳法不难证明之。事实上 r e g u l a r \rm regular regular 矩阵的 det ⁡ = ± 1 \det=\pm 1 det=±1,因此其 deg ⁡ \deg deg 还有个等式关系。但是没啥用。

    Lemma 2. 设 deg ⁡ A > deg ⁡ B \deg A>\deg B degA>degB,设 m m m 是某常数而 A \mathscr A A r e g u l a r \rm regular regular 矩阵,令
    A ′ = x m A 0 ′ + A 1 ′ B ′ = x m B 0 ′ + B 1 ′ \mathcal A'=x^m\mathcal A'_0+\mathcal A'_1\\ \mathcal B'=x^m\mathcal B'_0+\mathcal B'_1 A=xmA0+A1B=xmB0+B1

    其中
    [ A j ′ B j ′ ] = A − 1 [ A j B j ] for  j = 0 , 1 (1)

    [AjBj]" role="presentation" style="position: relative;">[AjBj]
    = \mathscr A^{-1}
    [AjBj]" role="presentation" style="position: relative;">[AjBj]
    \quad\text{for }j=0,1 \tag{1} [AjBj]=A1[AjBj]for j=0,1(1)

    其中 A = x m A 0 + A 1 A=x^mA_0+A_1 A=xmA0+A1 B = x m B 0 + B 1 B=x^mB_0+B_1 B=xmB0+B1,满足 deg ⁡ A 1 , deg ⁡ B 1 < m \deg A_1,\deg B_1degA1,degB1<m

    Comment. 因为 A ′ A' A 的记法似乎易引起歧义,我试图用 A \mathcal A A 代替,但是二者的区分度又太低。我只好二者同时使用,并且不加 ( x ) (x) (x) 以避免歧义。

    deg ⁡ A 0 ′ > deg ⁡ B 0 ′ \deg\mathcal A'_0>\deg\mathcal B'_0 degA0>degB0 deg ⁡ A 0 ⩽ 2 deg ⁡ A 0 ′ \deg A_0\leqslant 2\deg\mathcal A'_0 degA02degA0,则
    deg ⁡ A ′ = m + deg ⁡ A 0 ′ deg ⁡ B ′ ⩽ m + max ⁡ { deg ⁡ B 0 ′ ,    deg ⁡ ( A 0 ) − deg ⁡ ( A 0 ′ ) − 1 } \deg\mathcal A'=m+\deg\mathcal A_0'\\ \deg\mathcal B'\leqslant m+\max\{\deg\mathcal B_0',\;\deg(A_0){-}\deg(\mathcal A'_0){-}1 \} degA=m+degA0degBm+max{degB0,deg(A0)deg(A0)1}

    Proof. 可能把该引理读懂是最大的挑战

    对那些定义的直观感受:将 A , B A,B A,B 按照 x m x^m xm 分开后,分别进行 A \mathscr A A 变换再合并。

    对限制条件的直观感受:我们要做辗转相除,因此 deg ⁡ A > deg ⁡ B \deg A>\deg B degA>degB 总成立。而 A 0 ′ \mathcal A_0' A0 不是特别短时,余数的次数由高次项决定。

    现在开始证明。设 A = [ P Q R S ] \mathscr A=

    [PQRS]" role="presentation" style="position: relative;">[PQRS]
    A=[PRQS],由 ( 1 ) (1) (1) 式移项知 A 0 = P A 0 ′ + Q B 0 ′ A_0=P\mathcal A_0'+Q\mathcal B_0' A0=PA0+QB0,由 Lemma 1 \text{Lemma 1} Lemma 1 deg ⁡ A 0 ′ > deg ⁡ B 0 ′ \deg\mathcal A'_0>\deg\mathcal B'_0 degA0>degB0
    deg ⁡ A 0 = deg ⁡ A 0 ′ + deg ⁡ P (2) \deg A_0=\deg\mathcal A'_0+\deg P \tag{2} degA0=degA0+degP(2)

    联立 2 deg ⁡ A 0 ′ ⩾ deg ⁡ A 0 2\deg\mathcal A'_0\geqslant\deg A_0 2degA0degA0
    deg ⁡ P ⩽ deg ⁡ A 0 ′ \deg P\leqslant\deg\mathcal A'_0 degPdegA0

    A − 1 = ± [ S − Q − R P ] \mathscr A^{-1}=\pm

    [SQRP]" role="presentation" style="position: relative;">[SQRP]
    A1=±[SRQP],因此 A 1 = ± ( S A 1 − Q B 1 ) \mathcal A_1=\pm(SA_1-QB_1) A1=±(SA1QB1),进而
    deg ⁡ A 1 ′ ⩽ max ⁡ { deg ⁡ A 1 + deg ⁡ S ,    deg ⁡ B 1 + deg ⁡ Q } ⩽ max ⁡ { deg ⁡ A 1 ,    deg ⁡ B 1 } + max ⁡ { deg ⁡ S ,    deg ⁡ Q } ⩽ m − 1 + deg ⁡ P ⩽ m + deg ⁡ A 0 ′
    degA1max{degA1+degS,degB1+degQ}max{degA1,degB1}+max{degS,degQ}m1+degPm+degA0" role="presentation" style="position: relative;">degA1max{degA1+degS,degB1+degQ}max{degA1,degB1}+max{degS,degQ}m1+degPm+degA0
    degA1max{degA1+degS,degB1+degQ}max{degA1,degB1}+max{degS,degQ}m1+degPm+degA0

    所以 deg ⁡ A ′ = m + A 0 ′ \deg\mathcal A'=m+\mathcal A'_0 degA=m+A0

    同理可证 deg ⁡ R = deg ⁡ B 0 − deg ⁡ A 0 ′ ⩽ deg ⁡ A 0 − deg ⁡ A 0 ′ \deg R=\deg B_0-\deg\mathcal A'_0\leqslant\deg A_0-\deg\mathcal A'_0 degR=degB0degA0degA0degA0 以及
    deg ⁡ B 1 ⩽ max ⁡ { deg ⁡ A 1 + deg ⁡ R ,    deg ⁡ B 1 + deg ⁡ P } ⩽ max ⁡ { m − 1 + deg ⁡ A 0 − deg ⁡ A 0 ′ ,    m − 1 + deg ⁡ P } ⩽ m − 1 + deg ⁡ A 0 − deg ⁡ A 0 ′

    degB1max{degA1+degR,degB1+degP}max{m1+degA0degA0,m1+degP}m1+degA0degA0" role="presentation" style="position: relative;">degB1max{degA1+degR,degB1+degP}max{m1+degA0degA0,m1+degP}m1+degA0degA0
    degB1max{degA1+degR,degB1+degP}max{m1+degA0degA0,m1+degP}m1+degA0degA0

    注意前提条件 deg ⁡ A > deg ⁡ B \deg A>\deg B degA>degB 保证了 deg ⁡ A 0 ⩾ deg ⁡ B 0 \deg A_0\geqslant\deg B_0 degA0degB0,以及 ( 2 ) (2) (2) 式在此处的运用。 ■ \blacksquare

    接下来给出 Half-GCD \textit{Half-GCD} Half-GCD 的伪代码实现:
    A l g o r i t h m    hgcd ( A , B ) 1 m ← ⌈ deg ⁡ ( A ) 2 ⌉ 2 i f    deg ⁡ ( B ) < m    t h e n 3 r e t u r n    [ 1 0 0 1 ] 4 H ← h g c d ( A ÷ x m ,    B ÷ x m ) 5 [ C D ] ← H − 1 [ A B ] 6 i f    deg ⁡ ( D ) < m    then 7 r e t u r n    H 8 [ Q R ] ← [ C ÷ D C   m o d   D ] 9 i f    deg ⁡ ( R ) < m    t h e n 10 r e t u r n    H ⋅ M Q 11 k ← 2 m − deg ⁡ ( D ) 12 S ← h g c d ( D ÷ x k ,    R ÷ x k ) 13 r e t u r n    H ⋅ M Q ⋅ S

    Algorithmhgcd(A,B)1mdeg(A)22ifdeg(B)<mthen3return[1001]4Hhgcd(A÷xm,B÷xm)5[CD]H1[AB]6ifdeg(D)<mthen7returnH8[QR][C÷DCmodD]9ifdeg(R)<mthen10returnHMQ11k2mdeg(D)12Shgcd(D÷xk,R÷xk)13returnHMQS" role="presentation" style="position: relative;">Algorithmhgcd(A,B)1mdeg(A)22ifdeg(B)<mthen3return[1001]4Hhgcd(A÷xm,B÷xm)5[CD]H1[AB]6ifdeg(D)<mthen7returnH8[QR][C÷DCmodD]9ifdeg(R)<mthen10returnHMQ11k2mdeg(D)12Shgcd(D÷xk,R÷xk)13returnHMQS
    12345678910111213Algorithmhgcd(A,B)m2deg(A)ifdeg(B)<mthenreturn[1001]Hhgcd(A÷xm,B÷xm)[CD]H1[AB]ifdeg(D)<mthenreturnH[QR][C÷DCmodD]ifdeg(R)<mthenreturnHMQk2mdeg(D)Shgcd(D÷xk,R÷xk)returnHMQS

    特别地,当 A , B A,B A,B 最高次项系数为负时,应将系数取反即乘 − 1 -1 1,反正 − 1 -1 1 u n i t \rm unit unit

    Theorem.  h g c d ( A , B ) \mathrm{hgcd}(A,B) hgcd(A,B) 返回的 r e g u l a r \rm regular regular 矩阵 S \mathscr S S 满足:令 [ A ′ B ′ ] = S − 1 [ A B ]

    [AB]" role="presentation" style="position: relative;">[AB]
    =\mathscr S^{-1}
    [AB]" role="presentation" style="position: relative;">[AB]
    [AB]=S1[AB] deg ⁡ A ′ ⩾ ⌈ deg ⁡ A 2 ⌉ > deg ⁡ B ′ \deg\mathcal A'\geqslant\lceil\frac{\deg A}{2}\rceil>\deg\mathcal B' degA2degA>degB

    Proof. 该限制条件的好处是:上面算法中 H \mathscr H H 作用在 [ A B ]

    [AB]" role="presentation" style="position: relative;">[AB]
    [AB] 上时, Lemma 2 \text{Lemma 2} Lemma 2 的限制条件即成立(其中的 m m m 与算法中的 m m m 相同)。

    考虑每个 r e t u r n \mathbf{return} return 语句的返回值是否满足条件。第 3 3 3 行上的显然合法。第 7 7 7 行上的,由 Lemma 2 \text{Lemma 2} Lemma 2 可知 deg ⁡ C = m + deg ⁡ A 0 ′ ⩾ m \deg C=m+\deg\mathcal A_0'\geqslant m degC=m+degA0m,故合法。第 10 10 10 行上的,由第 6 6 6 行的 i f \mathbf{if} if deg ⁡ D ⩾ m > deg ⁡ R \deg D\geqslant m>\deg R degDm>degR,故合法。

    关键在最后。令 m ′ = deg ⁡ A 0 = deg ⁡ ( A ) − m m'=\deg A_0=\deg(A)-m m=degA0=deg(A)m,对 deg ⁡ A \deg A degA 进行归纳法,由归纳假设知 deg ⁡ B 0 ′ < ⌈ m ′ 2 ⌉ ⩽ deg ⁡ A 0 ′ \deg\mathcal B'_0<\lceil\frac{m'}{2}\rceil\leqslant\deg\mathcal A'_0 degB0<2mdegA0,再由 Lemma 2 \text{Lemma 2} Lemma 2

    deg ⁡ D ⩽ m + max ⁡ { deg ⁡ B 0 ′ ,    deg ⁡ ( A 0 ) − deg ⁡ ( A 0 ′ ) − 1 } ⩽ m + max ⁡ { ⌈ m ′ 2 ⌉ − 1 ,    ⌊ m ′ 2 ⌋ − 1 } = m + ⌈ m ′ 2 ⌉ − 1 < 2 m (3)

    degDm+max{degB0,deg(A0)deg(A0)1}m+max{m21,m21}=m+m21<2m" role="presentation" style="position: relative;">degDm+max{degB0,deg(A0)deg(A0)1}m+max{m21,m21}=m+m21<2m
    \tag{3} degDm+max{degB0,deg(A0)deg(A0)1}m+max{2m1,2m1}=m+2m1<2m(3)

    于是 11 11 11 行的赋值能够使 k > 0 k>0 k>0 。而第 9 9 9 行的 i f \mathbf{if} if 指明 deg ⁡ D > deg ⁡ R ⩾ m \deg D>\deg R\geqslant m degD>degRm,故 deg ⁡ D > 2 m − deg ⁡ D = k \deg D>2m-\deg D=k degD>2mdegD=k,因此第 12 12 12 行的 h g c d \mathrm{hgcd} hgcd 调用至少是合法的。

    现在考虑第二次 h g c d \rm hgcd hgcd,相同记法得到 D 0 , D 0 ′ D_0,\mathcal D'_0 D0,D0 等。此时有
    deg ⁡ D 0 ′ ⩾ ⌈ deg ⁡ D 0 2 ⌉ > deg ⁡ R 0 ′ \deg\mathcal D'_0\geqslant\left\lceil{\deg D_0\over 2}\right\rceil>\deg\mathcal R_0' degD02degD0>degR0

    因为 ( 3 ) (3) (3) 式已经说明 deg ⁡ D ⩽ m + ⌈ deg ⁡ ( A ) − m 2 ⌉ − 1 < deg ⁡ A \deg D\leqslant m+\lceil{\deg(A)-m\over 2}\rceil-1<\deg A degDm+2deg(A)m1<degA,归纳假设仍然成立。

    deg ⁡ D 0 = deg ⁡ ( D ) − k = 2 deg ⁡ ( D ) − 2 m \deg D_0=\deg(D)-k=2\deg(D)-2m degD0=deg(D)k=2deg(D)2m,于是
    deg ⁡ D 0 ′ ⩾ deg ⁡ ( D ) − m > deg ⁡ R 0 ′ \deg\mathcal D'_0\geqslant\deg(D)-m>\deg\mathcal R'_0 degD0deg(D)m>degR0

    再由 Lemma 2 \text{Lemma 2} Lemma 2
    deg ⁡ D ′ = k + deg ⁡ D 0 ′ ⩾ k + deg ⁡ ( D ) − m = m \deg\mathcal D'=k+\deg\mathcal D'_0\geqslant k+\deg(D)-m=m degD=k+degD0k+deg(D)m=m


    deg ⁡ R ′ ⩽ k + max ⁡ { deg ⁡ R 0 ′ ,    deg ⁡ ( D 0 ) − deg ⁡ ( D 0 ′ ) − 1 } ⩽ k + max ⁡ { deg ⁡ ( D ) − m − 1 ,    deg ⁡ ( D ) − m − 1 } = m − 1

    degRk+max{degR0,deg(D0)deg(D0)1}k+max{deg(D)m1,deg(D)m1}=m1" role="presentation" style="position: relative;">degRk+max{degR0,deg(D0)deg(D0)1}k+max{deg(D)m1,deg(D)m1}=m1
    degRk+max{degR0,deg(D0)deg(D0)1}k+max{deg(D)m1,deg(D)m1}=m1

    第二行中同时代入了 { deg ⁡ D 0 = 2 deg ⁡ ( D ) − 2 m deg ⁡ D 0 ′ ⩾ deg ⁡ ( D ) − m

    {degD0=2deg(D)2mdegD0deg(D)m" role="presentation" style="position: relative;">{degD0=2deg(D)2mdegD0deg(D)m
    {degD0=2deg(D)2mdegD0deg(D)m,但这应该不会给读者带来困扰。 ■ \blacksquare

    显然返回的矩阵中多项式的次数是 O ( deg ⁡ A ) \mathcal O(\deg A) O(degA) 的,因为我们实质上在做辗转相除。由 ( 3 ) (3) (3) 式还可知 deg ⁡ D ⩽ m + ⌊ m ′ 2 ⌋ \deg D\leqslant m+\lfloor{m'\over 2}\rfloor degDm+2m,因此 12 12 12 行递归到了度数只有 A A A 的一半的多项式。

    Half-GCD \textit{Half-GCD} Half-GCD 算法的复杂度为 O ( n log ⁡ 2 n ) \mathcal O(n\log^2 n) O(nlog2n),如果我们认为多项式运算的复杂度是 O ( n log ⁡ n ) \mathcal O(n\log n) O(nlogn) 的。

  • 相关阅读:
    JSR303是啥?有啥用处?
    python+nodejs+vue教材征订管理系统
    后知后觉的尴尬
    群狼调研开展连锁酒店神秘顾客调查项目
    golang工程——grpc服务健康检查
    【Golang】网络编程
    TP4333移动电源芯片
    JSON 格式化和校验工具
    spring各版本jar包下载,持续更新中
    Linux Kprobes探索与实践一
  • 原文地址:https://blog.csdn.net/qq_42101694/article/details/126333577