New Work-flow of Circuit Bootstrapping

参考文献:

  1. [CGGI17] Chillotti I, Gama N, Georgieva M, et al. Faster packed homomorphic operations and efficient circuit bootstrapping for TFHE. ASIACRYPT 2017 (1): 377-408.
  2. [CDKS21] Chen H, Dai W, Kim M, et al. Efficient homomorphic conversion between (ring) LWE ciphertexts. ACNS 2021 (1): 460-479.
  3. [KLD+23] Kim A, Lee Y, Deryabin M, et al. LFHE: Fully homomorphic encryption with bootstrapping key size less than a megabyte[J]. Cryptology ePrint Archive, 2023.
  4. [DKMS24] De Micheli G, Kim D, Micciancio D, et al. Faster amortized FHEW bootstrapping using ring automorphisms. Public Key Cryptography 2024 (4): 322-353.
  5. [WWL+24] Wang R, Wen Y, Li Z, et al. Circuit Bootstrapping: Faster and Smaller. EUROCRYPT 2024 (2): 342-372.
  6. Leveled mode of TFHE
  7. Conversion Between ®LWE
  8. 加权自动机:在 Semirings 上建模

文章目录

  • LHE Mode
    • Original TFHE
    • Novel Work Flow
  • Automorphism-Based PBS
    • Using Sparse Isomorphism
    • MV-PBS
  • Analysis & Parameters

LHE Mode

TFHE 除了有 FHE mode,还有 [CGGI17] 提出的 LHE mode:

  • 前者每个 Gate 都需要自举,利用 LinPoly + PBS 实现布尔运算;
  • 后者仅在噪声过大或者类型不符时才自举,利用 det-WFA + CMux-based OBDD + BRS 实现布尔运算。由于 RLWE 和 RGSW 外积的噪声增长不对称性,只要 RGSW 加密消息的范数很小(比如:布尔值、单项式),那么 LHE 的容许 CMux 深度就会很大。

自动机的运算:

在这里插入图片描述

决策树的运算:

在这里插入图片描述

比特序列表示的运算:

在这里插入图片描述

但是,它们都是用 CMux Gate 搭建的,控制位是 RGSW 密文(布尔值/单项式的 Powers-of-Base),数据位是 RLWE/LWE 密文(系数编码)。如果想要把数据位提升到控制位,就需要 LWE-to-RGSW 的密文转换,也就是 “电路自举”。

Original TFHE

[CGGI17] 的电路自举的工作流如下:

在这里插入图片描述

他们使用三组参数:

  • ( q ‾ , n ‾ ) (\underline{q}, \underline{n}) (q,n) 是 Level 0 的 LWE 参数集,存储数据,具有最高的噪声。模数和维度都尽可能小,使得自举更高效。
  • ( q , N ) (q,N) (q,N) 是 Level 1 的 RGSW 参数集,存储控制位。模数和维度的规模,决定了外积的效率和深度。
  • ( Q ‾ , N ‾ ) (\overline{Q}, \overline{N}) (Q,N) 是 Level 2 的 RLWE 参数集,用于 PBS 自举,具有最小的噪声。选取足够大的模数,获得所需的深度。

电路自举包含两个步骤:令 v = ( v 0 , v 1 , ⋯ , v l − 1 ) v=(v_0,v_1,\cdots,v_{l-1}) v=(v0,v1,,vl1) 是 RGSW 使用的 Gadget Vector,令 s k ‾ , s k , s k ‾ \underline{sk},sk,\overline{sk} sk,sk,sk 分别是三层的私钥。

  1. Functional Bootstrapping Step

    • 输入单个 Level-0 LWE 密文 L W E s k ‾ ( m ) LWE_{\underline{sk}}(m) LWEsk(m),使用 l l l 次 PBS 计算出 L W E s k ‾ ( m v i ) LWE_{\overline{sk}}(mv_i) LWEsk(mvi)
    • 这里可以使用 [CLOT21] 的 PBSmanyLUT 加速。
  2. Ciphertext Conversion Step

    • RGSW 密文的第一部分:使用 LWE-to-RLWE PubKS 过程,把 ( b , a ) = L W E s k ‾ ( m v i ) (b,a)=LWE_{\overline{sk}}(mv_i) (b,a)=LWEsk(mvi) 切换到 R L W E s k ( m v i ) RLWE_{sk}(mv_i) RLWEsk(mvi)

      使用的 KSK 是 R L W E s k ′ ( s k j ‾ ) RLWE'_{sk}(\overline{sk_j}) RLWEsk(skj),计算过程是
      ( b , 0 ) + ∑ j a j ⊙ R L W E s k ′ ( s k j ‾ ) (b,0) + \sum_j a_j \odot RLWE'_{sk}(\overline{sk_j}) (b,0)+jajRLWEsk(skj)

    • RGSW 密文的第二部分:使用 LWE-to-RLWE PriKS 过程,把 ( b , a ) = L W E s k ‾ ( m v i ) (b,a) = LWE_{\overline{sk}}(mv_i) (b,a)=LWEsk(mvi) 切换到 R L W E s k ( s k ⋅ m v i ) RLWE_{sk}(sk \cdot mv_i) RLWEsk(skmvi)

      使用的 KSK 是 R L W E s k ′ ( s k ⋅ s k j ‾ ) RLWE'_{sk}(sk \cdot \overline{sk_j}) RLWEsk(skskj) 以及 R L W E s k ′ ( s k ) RLWE'_{sk}(sk) RLWEsk(sk),计算过程是
      b ⊙ R L W E s k ′ ( s k ) + ∑ j a j ⊙ R L W E s k ′ ( s k ⋅ s k j ‾ ) b \odot RLWE'_{sk}(sk) + \sum_j a_j \odot RLWE'_{sk}(sk \cdot \overline{sk_j}) bRLWEsk(sk)+jajRLWEsk(skskj)

    • 最后把 R L W E s k ( m v i ) RLWE_{sk}(mv_i) RLWEsk(mvi) R L W E s k ( s k ⋅ m v i ) RLWE_{sk}(sk \cdot mv_i) RLWEsk(skmvi) 组装成 R G S W s k ( m ) RGSW_{sk}(m) RGSWsk(m) 密文即可。上述的 PubKS 和 PriKS 也可以采用 pre-computed variant,提高效率、降低噪声,代价是更大的 KSK 规模。

对于计算开销:使用 MV-PBS 之后,实际上 Ciphertext Conversion Step 占据了大部分。对于存储开销:也是 Ciphertext Conversion Step 中的 KSK 占据了大部分。

疑问:为何不使用 [CDKS21] 的基于自同构的 LWE-to-RLWE 呢?

  • [CGGI17] 的 PubKS 或 PriKS,需要 N ‾ \overline{N} N 次和标量 a j ∈ Z Q ‾ a_j \in \mathbb Z_{\overline Q} ajZQ(系数表示下分解和数乘)的外积运算,每次都需要 2 l N 2lN 2lN 次模乘,共计 2 l N ‾ N 2l\overline NN 2lNN
  • 基于自同构的 LWE-to-RLWE,需要 N ‾ / N ⋅ log ⁡ n \overline{N}/N \cdot\log n N/Nlogn 次和多项式 a ∈ R Q ‾ , n a \in R_{\overline Q,n} aRQ,n(系数表示下分解,再转化为 NTT 表示)的外积运算(长度 N ‾ \overline{N} N 的内积表示为 N ‾ / N \overline{N}/N N/N 个长度 N N N 的卷积),每次都需要 2 ( l + 1 ) N log ⁡ N + 2 l N 2(l+1)N\log N + 2lN 2(l+1)NlogN+2lN 次模乘,共计 2 ( l + 1 ) N ‾ log ⁡ 2 N + 2 l N ‾ log ⁡ N 2(l+1)\overline{N}\log^2 N + 2l\overline{N}\log N 2(l+1)Nlog2N+2lNlogN
  • 假如 N = 1024 N = 1024 N=1024,那么 log ⁡ 2 N = 100 ≪ N \log^2 N = 100 \ll N log2N=100N,效率提升应当十分显著,密钥规模也小得多,噪声方差会偏大 N ‾ log ⁡ N \overline{N}\log N NlogN 因子。

Novel Work Flow

[WWL+24] 提出了新的工作流,移除了 ACC to LWE 步骤,直接把 ACC 重构为 RGSW(实际上就是把 Extract 和基于自同构的 LWE-to-RLWE 合并了),从而消除了开销最大的 PubKS 和 PriKS 过程。

在这里插入图片描述

仅使用 Level 0 和 Level 2 两组参数集,新的电路自举流程是:

  1. PBS Without Sample Extraction

    • 输入单个 Level-0 LWE 密文 L W E s k ‾ ( m ) LWE_{\underline{sk}}(m) LWEsk(m),使用 l l l 次 PBS 计算出
      R L W E s k ‾ ( N ‾ − 1 m v i + ∑ k = 1 N ‾ − 1 y k X k ) RLWE_{\overline{sk}}(\overline{N}^{-1}mv_i+\sum_{k=1}^{\overline{N}-1}y_k X^k) RLWEsk(N1mvi+k=1N1ykXk)
      预期的明文在常数项(缩放 N ‾ − 1 \overline{N}^{-1} N1 抵消后续自同构的影响),其余的系数是冗余的。

    • 这里使用了 [WWL+24] 优化的 Automorphism-Based MV-PBS 算法。

  2. Ciphertext Conversion

  • RGSW 密文的第一部分:使用 [CDKS21] 提出的 Trace 稀疏分解算法(分圆塔),使用 Galois自同构 τ 2 k + 1 , k = log ⁡ N ‾ , ⋯ , 2 , 1 \tau_{2^k+1}, k=\log \overline{N},\cdots,2,1 τ2k+1,k=logN,,2,1 对应的 KSK,计算出 ( b , a ) = R L W E s k ‾ ( m v i ) (b,a) = RLWE_{\overline{sk}}(mv_i) (b,a)=RLWEsk(mvi)

  • RGSW 密文的第二部分:使用 [DKMS24] 提出的 RLWE’-to-RGSW 技术, 给定 S S K = R L W E s k ‾ ′ ( s k ‾ 2 ) SSK = RLWE'_{\overline{sk}}(\overline{sk}^2) SSK=RLWEsk(sk2),计算
    ( 0 , b ) + a ⊙ R L W E s k ‾ ′ ( s k ‾ 2 ) = R L W E s k ‾ ( s k ‾ ⋅ m v i + s k ‾ ⋅ e ) (0,b) + a \odot RLWE'_{\overline{sk}}(\overline{sk}^2) = RLWE_{\overline{sk}}(\overline{sk} \cdot mv_i + \overline{sk} \cdot e) (0,b)+aRLWEsk(sk2)=RLWEsk(skmvi+ske)
    其中 e ∈ R Q ‾ , N ‾ e \in R_{\overline{Q},\overline{N}} eRQ,N R L W E s k ‾ ( m v i ) RLWE_{\overline{sk}}(mv_i) RLWEsk(mvi) 的噪声。

  • 最后把 R L W E s k ‾ ( m v i ) RLWE_{\overline{sk}}(mv_i) RLWEsk(mvi) R L W E s k ‾ ( s k ‾ ⋅ m v i ) RLWE_{\overline{sk}}(\overline{sk} \cdot mv_i) RLWEsk(skmvi) 组装成 R G S W s k ‾ ( m ) RGSW_{\overline{sk}}(m) RGSWsk(m) 密文即可。

Ciphertext Conversion 的算法是:

在这里插入图片描述

总体的复杂度是:

在这里插入图片描述

疑问:文章说由于 step 2 无法切换维度,因此就把 RGSW 留在 Level 2 参数集。但是,这会导数 LHE 的计算开销较大(自举噪声和密钥切换噪声都累积在 KaTeX parse error: Got function '\overline' with no arguments as subscript at position 11: \mathbb Z_\̲o̲v̲e̲r̲l̲i̲n̲e̲{Q} 的低位,没必要保留)。可以依然使用中等规模的参数 ( q , N ) (q,N) (q,N),可修改为:

  1. 使用 Ring-Swich 技术,额外要求 s k ‾ ∈ R N ≤ R N ‾ \overline{sk} \in R_{N} \le R_{\overline{N}} skRNRN,首先把 ACC 模切换到安全的模数 q q q,然后直接提取出维度 N N N 子环(含有所需的常数项),这几乎是免费的
  2. 现在 ACC 是参数 ( q , N ) (q,N) (q,N) 下的 RLWE 密文,执行 Trace 消除冗余系数,然后做成 RGSW 密文,执行 LHE 运算
  3. 这样做,step 1 完全不变(稀疏私钥的安全性),step 2 速度更快、存储更小

如果不想要稀疏私钥,也可以这么做:依旧提取出维度 N ‾ \overline{N} N 的 LWE 密文,然后分成 N ‾ / N \overline{N}/N N/N 个区间(内积 = 卷积),使用 [CDKS21] 的基于自同构的 LWE-to-RLWE 算法,仅需 N ‾ / N \overline{N}/N N/N 次调用,效率损失也很小。

Automorphism-Based PBS

[WWL+24] 使用了两种 PBS Without Sample Extraction 算法,其一是 CMux-based Blind Rotation,其二是 Automorphism-Based Blind Rotation。

[WWL+24] 对前者的 Level 0 使用二元秘密( ∥ s ∥ 2 2 = n ‾ / 2 \|s\|_2^2 = \underline{n}/2 s22=n/2),对后者的 Level 0 使用 σ = 3.2 \sigma=3.2 σ=3.2 的高斯秘密( ∥ s ∥ 2 2 = n ‾ σ 2 \|s\|_2^2 = \underline{n}\sigma^2 s22=nσ2)。为了降低模切换噪声(大约是 σ m s 2 = ( ∥ s ∥ 2 2 + 1 ) / 12 \sigma_{ms}^2 = (\|s\|_2^2+1)/12 σms2=(s22+1)/12),[WWL+24] 两者的 Level 2 都使用二元秘密。

Using Sparse Isomorphism

[LMK+23] 的基于自同构的自举,关键是使用了同构 Z 2 N ∗ ≅ Z N / 2 × Z 2 \mathbb Z_{2N}^* \cong \mathbb Z_{N/2} \times \mathbb Z_2 Z2NZN/2×Z2,生成元是 { g , − 1 } \{g,-1\} {g,1}。要求系数形如 2 k + 1 ∈ Z 2 N 2k+1 \in \mathbb Z_{2N} 2k+1Z2N,从而可以表示为 ± g j \pm g^{j} ±gj 形式,只需要准备 2 2 2 个 KSK,使用 Galois 自同构计算指数上的数乘 X a i ⋅ s i = τ ± g j ( X s i ) X^{a_i \cdot s_i} = \tau_{\pm g^j}(X^{s_i}) Xaisi=τ±gj(Xsi)

为了进一步提高自举效率(和 a i a_i ai 不同取值的数量有关),[WWL+24] 使用了更加稀疏的系数,形如 k ⋅ 2 ν + 1 ∈ Z 2 N k \cdot 2^\nu +1 \in \mathbb Z_{2N} k2ν+1Z2N,只要 N ≥ 8 N \ge 8 N8 并且 ν ≥ 2 \nu \ge 2 ν2,则它们构成了某个元素 g ∈ Z 2 N g \in \mathbb Z_{2N} gZ2N 生成的乘法循环群,只需要准备 1 1 1 个 KSK 即可。易知 o r d ( 5 m o d 2 N ) = N / 2 ord(5 \bmod 2N)=N/2 ord(5mod2N)=N/2,因此可以选取 g = 5 2 ν − 2 g=5^{2^{\nu-2}} g=52ν2

类似于 [LMK+23],只要系数 a i a_i ai 都具有 k ⋅ 2 ν + 1 k \cdot 2^\nu+1 k2ν+1 形式,那么就可以把内积写成关于 g g g 的多项式,再使用 Horner 法则整理为:
∑ i a i s i = P s ( g ) : = ∑ j ∈ I 0 s j + g ( ⋯ + g ( ∑ j ∈ I 2 N / 2 ν − 1 s j ) ) ( m o d 2 N ) \sum_i a_i s_i = P_s(g) := \sum_{j \in I_0} s_j + g\left(\cdots+g\left(\sum_{j \in I_{2N/2^\nu}-1}s_j\right)\right) \pmod{2N} iaisi=Ps(g):=jI0sj+g +g jI2N/2ν1sj (mod2N)
其中 I j = { i : a i = g j } , j = 0 , 1 , ⋯ , 2 N / 2 ν − 1 I_j = \{i: a_i = g^j\}, j=0,1,\cdots,2N/2^\nu-1 Ij={i:ai=gj},j=0,1,,2N/2ν1

由于 o r d ( g ) = 2 N / 2 ν ord(g) = 2N/2^\nu ord(g)=2N/2ν,盲旋转总共执行了 2 N / 2 ν − 1 2N/2^\nu-1 2N/2ν1 次串行的 τ g \tau_g τg 自同构,因此初始 ACC 加密 T V ( X ) TV(X) TV(X),则最终计算出 T V ( X g − 1 ) ⋅ X ∑ i a i s i TV(X^{g^{-1}}) \cdot X^{\sum_i a_i s_i} TV(Xg1)Xiaisi,因此需要预先把 test vector 扭曲 X → X g X \to X^g XXg,保证计算结果的正确性。

在执行盲旋转之前,使用 ⌊ x ⌉ k ⋅ 2 ν + 1 \lfloor x \rceil_{k \cdot 2^\nu+1} xk2ν+1 把 LWE 系数都舍入到合适的形式,这里的舍入噪声会比 [LMK+23] 更大。

在这里插入图片描述

也采用了 [LMK+23] 的窗口技术,进一步降低自同构的数量。

在这里插入图片描述

由于期望值难以计算,为了确定最优的窗口大小,他们使用 Monte Carlo simulation 统计出不同 w w w 对应的自同构数量。对于不同维度 N ′ = 2 N / 2 ν N' = 2N/2^\nu N=2N/2ν,试验出的最佳 w w w 是:

在这里插入图片描述

完整的 PBS 算法是:

在这里插入图片描述

MV-PBS

由于 LWE 密文舍入到的 ( b , a ) (b,a) (b,a) 都是 k ⋅ 2 ν + 1 k \cdot 2^\nu+1 k2ν+1 形式的整数,而非 2 ν 2^\nu 2ν 倍数,因此无法直接成为 Multi-Value PBS。可以采取很简单的技巧:
X b + ∑ i a i s i = X b + ∑ i ( a i + 1 ) s i − ∑ i s i X^{b+\sum_i a_is_i} = X^{b+\sum_i(a_i+1)s_i - \sum_i s_i} Xb+iaisi=Xb+i(ai+1)siisi
其中的 ( b , a ) (b,a) (b,a) 都是 2 ν 2^\nu 2ν 的倍数,从而 b + ∑ i a i s i b+\sum_i a_is_i b+iaisi 也都是 2 ν 2^\nu 2ν 的倍数。这额外需要 A U X = R G S W s k ‾ ( X − ∑ i s k ‾ i ) AUX = RGSW_{\overline{sk}}(X^{- \sum_i \underline{sk}_i}) AUX=RGSWsk(Xiski) 作为辅助信息。

用于电路自举的 MV-PBS 算法如下:计算符号函数、不做密文提取。

在这里插入图片描述

完整的 PBS 算法是:

在这里插入图片描述

Analysis & Parameters

为了减少 Gadget Vector 的长度,[WWL+24] 对于所有的外积都使用了 [KLD+23] 的 Approximate Gadget Decomposition,选取 B l < q B^l < q Bl<q,那么 v = ( δ , δ B , ⋯ , δ B l − 1 ) v = (\delta,\delta B,\cdots,\delta B^{l-1}) v=(δ,δB,,δBl1),其中 δ = ⌈ q / B l ⌉ \delta = \lceil q/B^l \rceil δ=q/Bl,近似误差 ϵ ≤ δ / 2 \epsilon \le \delta/2 ϵδ/2,环元素和 R L W E ′ ( m ) RLWE'(m) RLWE(m) 的外积噪声是 σ 2 ≤ l N B 2 σ f r e s h 2 / 12 + V a r ( m ) ⋅ ϵ 2 / 3 \sigma^2 \le lNB^2\sigma_{fresh}^2/12 + Var(m)\cdot\epsilon^2/3 σ2lNB2σfresh2/12+Var(m)ϵ2/3(减少了前者,增加了后者,做个平衡),其中 V a r ( m ) ≤ ∥ m ∥ 2 2 Var(m) \le \|m\|_2^2 Var(m)m22。如果是 R L W E RLWE RLWE R G S W RGSW RGSW 的外积,则还有 ∥ m ∥ 2 2 ⋅ σ R L W E 2 \|m\|_2^2 \cdot \sigma_{RLWE}^2 m22σRLWE2 的影响。

有五个不同的 Gadget Vector,它们的 R L W E ′ RLWE' RLWE 的消息格式为

  1. 执行 LHE mode 运算:维度 N ‾ \overline{N} N,模数 Q ‾ \overline{Q} Q,控制位形如 m = b X i , b ∈ { 0 , 1 } m=bX^i, b \in \{0,1\} m=bXi,b{0,1},因此 ∥ m ∥ 2 2 ≤ 1 \|m\|_2^2 \le 1 m221
  2. PBS 中的外积:维度 N ‾ \overline{N} N,模数 Q ‾ \overline{Q} Q,CMux-based 形如 m = s k ‾ i m=\underline{sk}_i m=ski(二元),Auto-based 形如 m = X s k ‾ i m=X^{\underline{sk}_i} m=Xski(高斯),都是 ∥ m ∥ 2 2 ≤ 1 \|m\|_2^2 \le 1 m221
  3. PBS 中的自同构:维度 N ‾ \overline{N} N,模数 Q ‾ \overline{Q} Q,CMux-based 中不存在,Auto-based 形如 m = s k ‾ ( X g j ) m=\overline{sk}(X^{g^j}) m=sk(Xgj),满足 ∥ m ∥ 2 2 ≤ N ‾ / 2 \|m\|_2^2 \le \overline{N}/2 m22N/2
  4. 密文转换中的迹映射:维度 N ‾ \overline{N} N,模数 Q ‾ \overline{Q} Q,形如 m = s k ‾ ( X g u ) m=\overline{sk}(X^{g^u}) m=sk(Xgu),满足 ∥ m ∥ 2 2 ≤ N ‾ / 2 \|m\|_2^2 \le \overline{N}/2 m22N/2
  5. 密文转换中的乘以私钥:维度 N ‾ \overline{N} N,模数 Q ‾ \overline{Q} Q,形如 m = s k ‾ 2 m=\overline{sk}^2 m=sk2(二元),满足 ∥ m ∥ 2 2 ≤ N ‾ 2 / 4 \|m\|_2^2 \le \overline{N}^2/4 m22N2/4

[WWL+24] 首先选取了 Level 0 和 Level 2 的维度和模数,然后固定 ν = 2 \nu=2 ν=2,对应的 PBS 输入密文的最大容许噪声是 σ i n 2 = 2 10 \sigma_{in}^2 = 2^{10} σin2=210,最后选取不同的 Gadget Vector 参数。

在这里插入图片描述

由于对 step 2 的优化,新电路自举算法的规模和效率都有很大的提升:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/24334.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

dots_image 增强图像中的圆点特征

dots_image 增强图像中的圆点特征 1. dot_image 有什么用途&#xff1f;2. 点状字符的特征增强3. Halcon代码 1. dot_image 有什么用途&#xff1f; Enhance circular dots in an image. 这个算子可以增强图像中的圆点特征&#xff0c;例如下面的例子。 2. 点状字符的特征增强…

忆恒创源国产系列新品 —— PBlaze7 7A40 取得 PCI-SIG 兼容性认证

在此前报道中&#xff0c;我们曾预告了忆恒创源国产系列 PCIe 5.0 SSD 新品 —— PBlaze7 7A40&#xff0c;今天&#xff0c;这款 SSD 已经顺利通过 PCI-SIG 的严格测试并出现在 Integrators List 集成商列表当中&#xff0c;标志着距离 PBlaze7 7A40 的正式发布又近了一步。 正…

记录汇川:红绿灯与HMI-ST

项目要求&#xff1a; 子程序&#xff1a; 子程序&#xff1a; 实际动作如下&#xff1a; 红绿灯与HMI-ST

STM32项目分享:智能门禁锁系统

目录 一、前言 二、项目简介 1.功能详解 2.主要器件 三、原理图设计 四、PCB硬件设计 1.PCB图 2.PCB板及元器件图 五、程序设计 六、实验效果 七、资料内容 项目分享 一、前言 项目成品图片&#xff1a; 哔哩哔哩视频链接&#xff1a; https://www.bilibili.c…

基于某评论的TF-IDF下的LDA主题模型分析

完整代码&#xff1a; import numpy as np import re import pandas as pd import jieba from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.decomposition import LatentDirichletAllocationdf1 pd.read_csv(小红书评论.csv) # 读取同目录下csv文件…

【Vue】组件化开发

文章目录 一、介绍二、根组件 App.vue 一、介绍 组件化&#xff1a;一个页面可以拆分成一个个组件&#xff0c;每个组件有着自己独立的结构、样式、行为。 好处&#xff1a;便于维护&#xff0c;利于复用 → 提升开发效率。 组件分类&#xff1a;普通组件、根组件。 根组件…

MySQL 高级 - 第十一章 | 索引优化与查询优化

目录 第十一章 索引优化与查询优化11.1 数据准备11.2 索引失效案例11.2.1 全值匹配10.2.2 最佳左前缀法则10.2.3 主键插入顺序10.2.4 计算、函数、类型转换&#xff08;自动或手动&#xff09;导致索引失效10.2.5 范围条件右边的列索引失效10.2.6 不等于&#xff08;! 或者 <…

删除目录

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 删除目录可以通过使用os模块提供的rmdir()函数实现。通过rmdir()函数删除目录时&#xff0c;只有当要删除的目录为空时才起作用。rmdir()函数的基本语…

牛客java基础(一)

A 解析 : java源程序只允许一个public类存在 &#xff0c;且与文件名同名 ; D hashCode方法本质就是一个哈希函数&#xff0c;这是Object类的作者说明的。Object类的作者在注释的最后一段的括号中写道&#xff1a;将对象的地址值映射为integer类型的哈希值。但hashCode()并不…

Linux性能优化实战

Linux性能优化实战 33 | 关于 Linux 网络&#xff0c;你必须知道这些&#xff08;上&#xff09;如何提高系统并发&#xff1f;&#xff08;8条&#xff09;如何理解分布式&#xff1f;如何理解云计算&#xff1f;如何理解微服务&#xff1f;TCP/IP 网络栈如何分层&#xff1f;…

前端 JS 经典:打印对象的 bug

1. 问题 相信这个 console 打印语句的 bug&#xff0c;其实小伙伴们是遇到过的&#xff0c;就是你有一个对象&#xff0c;通过 console&#xff0c;打印一次&#xff0c;然后经过一些处理&#xff0c;再通过 console 打印&#xff0c;发现两次打印的结果是一样的&#xff0c;第…

SSM整合总结

一.核心问题 (一)两个容器 web容器 web相关组件&#xff08;controller,springmvc核心组件&#xff09; root容器 业务和持久层相关组件&#xff08;service,aop,tx,dataSource,mybatis,mapper等&#xff09; 父容器&#xff1a;root容器&#xff0c;盛放service、mapper、…

Oracle EBS AP发票验证-计税期间出现意外错误解决方法

系统版本 RDBMS : 12.1.0.2.0 Oracle Applications : 12.2.6 问题症状: **打开发票题头或发票行“税详细信息”**错误提示如下: 由于以下原因而无法针对"税"窗口中所做的修改更新 Oraclee Payables信息: 尚未为税率或帐户来源税率设置可退回税/应纳税额帐户。请…

Java和Web前端哪个有发展前景?

Java和Web前端都是当今技术行业里的热门岗位&#xff0c;岗位招聘需求量大&#xff0c;人才竞争度高&#xff0c;同学们掌握这两个岗位里其中任何一个的相关主流技术&#xff0c;都可以找到一份不错的职位。下面请允许笔者做一个简要的分析阐述&#xff1a; 一、Web前端 Web前…

C语言过度C++语法补充(面向对象之前语法)

目录 1. C相较于C语言新增的语法 0. C 中的输入输出 1. 命名空间 1. 我们如何定义一个命名空间&#xff1f; 2. 如何使用一个命名空间 3. 命名空间中可以定义什么&#xff1f; 4. 在 相同或者不同 的文件中如果出现 同名的命名空间 会如何&#xff1f; 5. 总结~~撒花~~…

网络空间安全数学基础·多项式环与有限域

5.1 多项式环&#xff08;掌握&#xff09; 5.2 多项式剩余类环&#xff08;理解&#xff09; 5.3 有限域&#xff08;熟练&#xff09; 5.1 多项式环 定义&#xff1a;设F是一个域&#xff0c;称是F上的一元多项式&#xff0e; 首项&#xff1a;如果an≠0&#xff0c;则称 a…

CAD二次开发(8)-探索实现不重启CAD进行热部署代码

最近在研究CAD二次开发过程中&#xff0c;调试代码的过程中&#xff0c;需要频繁地重启CAD&#xff0c;非常浪费我们的开发时间&#xff0c;所以我就一直在想&#xff0c;怎么可以实现在不每次重启代码和CAD的情况下&#xff0c;实现代码的热部署效果。 我找到的方式&#xff…

HDFS的块汇报和块放置策略--从一次HDFS写文件故障开始(WIP)

文章目录 前言事故分析&#xff1a;代码解析BlockReport的调度和时机哪些Block会进行FBR或者IBRIBR所选定的BlockFBR所选定的Block 块放置策略详解之在上层寻找机器为文件添加块的基本流程块放置策略&#xff1a;选择机器为每个副本逐个寻找机器在指定范围内随机寻找简单看一下…

本地运行ChatTTS

TTS 是将文字转为语音的模型&#xff0c;最近很火的开源 TTS 项目&#xff0c;本地可以运行&#xff0c;运行环境 M2 Max&#xff0c;差不多每秒钟 4&#xff5e;&#xff5e;5 个字。本文将介绍如何在本地运行 ChatTTS。 下载源码 首先下载源代码 git clone https://github…

一句话说清HDMI ARC eARC功能和区别

HDMI&#xff1a; 高清多媒体接口&#xff0c;主要用于传输高清音视频信号&#xff0c;High Definition Multimedia Interface。 ARC: 音频回传通道&#xff0c;Audio Return Channel eARC: 增强型音频回传通道&#xff0c;第一个E是增强的意思&#xff0c;Enhanced Audio…