使用 FHEW-like 自举 BV-like

参考文献:

  1. [CDKS21] Chen H, Dai W, Kim M, et al. Efficient homomorphic conversion between (ring) LWE ciphertexts[C]//International Conference on Applied Cryptography and Network Security. Cham: Springer International Publishing, 2021: 460-479.
  2. [KDE+23] Kim A, Deryabin M, Eom J, et al. General bootstrapping approach for RLWE-based homomorphic encryption[J]. IEEE Transactions on Computers, 2023.

文章目录

  • Scaled Modulus Raising
  • Bootstrapping for CKKS
    • Multiprecision CKKS
    • RNS-CKKS
  • Bootstrapping for BGV
    • Multiprecision BGV
    • RNS-BGV
  • Bootstrapping for BFV
    • Multiprecision BFV
    • RNS-BFV
  • Compact Representation of Blind Rotation Keys
    • Reconstruction
    • On the Fly

[KDE+23] 提出可以使用 FHEW-like 实现 BV-like 的通用自举程序。文章说给出了 C++ 实现,不过没有给代码链接;文章中说性能依旧需要继续改进,没有给出具体的数据。

首先,我们定义一些密文类型:

  • L W E q , s ( m ) = ( a , m + e − ⟨ a , s ⟩ ) ∈ Z q n + 1 LWE_{q,s}(m) = (a,m+e-\langle a,s\rangle) \in \mathbb Z_q^{n+1} LWEq,s(m)=(a,m+ea,s⟩)Zqn+1
  • R L W E Q , s ( m ) = ( a , m + e − a ⋅ s ) ∈ R Q 2 RLWE_{Q,s}(m)=(a,m+e-a\cdot s) \in R_Q^2 RLWEQ,s(m)=(a,m+eas)RQ2
  • R L W E Q , s ′ ( m ) = ( R L W E Q , s ( g 0 ⋅ m ) , ⋯ , R L W E Q , s ( g d − 1 ⋅ m ) ) ∈ R Q 2 d RLWE'_{Q,s}(m) = (RLWE_{Q,s}(g_0\cdot m),\cdots,RLWE_{Q,s}(g_{d-1}\cdot m)) \in R_Q^{2d} RLWEQ,s(m)=(RLWEQ,s(g0m),,RLWEQ,s(gd1m))RQ2d
  • R G S W Q , s ( m ) = ( R L W E Q , s ′ ( s ⋅ m ) , R L W E Q , s ′ ( m ) ) RGSW_{Q,s}(m)=(RLWE'_{Q,s}(s\cdot m),RLWE'_{Q,s}(m)) RGSWQ,s(m)=(RLWEQ,s(sm),RLWEQ,s(m))

简记无噪声的密文为 R L W E 0 ( u ) RLWE^0(u) RLWE0(u),这里 u u u 是其(无编码的)相位。

Scaled Modulus Raising

[KDE+23] 首先介绍了一个核心算法,它用于将较小密文模数 q q q 下的消息,提升到更大的密文模数 Q Q Q。这需要消除模 Q Q Q 下出现的 q q q-overflower,因此明显需要自举程序。

我们设置 q = 2 N q=2N q=2N,给定相位是 ∥ u ∥ ∞ ≤ c < N / 2 \|u\|_\infty \le c<N/2 uc<N/2 的密文,记为 R L W E 2 N , s 0 ( u ) RLWE_{2N,s}^0(u) RLWE2N,s0(u)

  1. Extraction:采取 FHEW 的系数提取过程,获得 L W E 2 N , s ( u i ) , i ∈ [ N ] LWE_{2N,s}(u_i), i\in[N] LWE2N,s(ui),i[N]
  2. Blind Rotation:使用 FHEW/TFHE 盲旋转过程,初始设置 ACC 加密 f = − ∑ j = − c c Δ j ⋅ X j f=-\sum_{j=-c}^c \Delta j\cdot X^j f=j=ccΔjXj,最终获得 R L W E Q , s ( f ⋅ X u i ) , i ∈ [ N ] RLWE_{Q,s}(f\cdot X^{u_i}), i\in[N] RLWEQ,s(fXui),i[N],相位的常数项是 Δ u i \Delta u_i Δui,并且 X 2 c + 1 , ⋯ , X N − 2 c − 2 X^{2c+1},\cdots,X^{N-2c-2} X2c+1,,XN2c2 的系数都是零,将它简记为 u ( i ) ∈ R Q u^{(i)} \in R_Q u(i)RQ
  3. Repacking:将这 N N N 个密文组合成单个密文 R L W E Q , s ( Δ u ) RLWE_{Q,s}(\Delta u) RLWEQ,s(Δu)

由于 c < N / 2 c<N/2 c<N/2,我们选取大于 2 c 2c 2c 的最小二的幂次 n = n c n=n_c n=nc,那么就可以将 N N N 个 RLWE 密文分为若干组 { R L W E ( u i + n k } k ∈ [ N / n ] , i ∈ [ n ] \{RLWE(u^{i+nk}\}_{k\in[N/n]}, i\in[n] {RLWE(ui+nk}k[N/n],i[n],我们计算:
∑ k = 0 N / n − 1 R L W E ( u ( i + n k ) ) ⋅ X n k = R L W E ( u ( i , n ) : = ∑ k = 0 N / n − 1 u ( i + n k ) X n k ) \sum_{k=0}^{N/n-1} RLWE(u^{(i+nk)}) \cdot X^{nk} = RLWE\left(u^{(i,n)}:=\sum_{k=0}^{N/n-1} u^{(i+nk)} X^{nk}\right) k=0N/n1RLWE(u(i+nk))Xnk=RLWE u(i,n):=k=0N/n1u(i+nk)Xnk
因为间隔 n > 2 c n>2c n>2c 足够大,因此获得的相位 u ( i , n ) u^{(i,n)} u(i,n) 的位置 n k , k ∈ [ N / n ] nk,k\in[N/n] nk,k[N/n] 恰好就是 Δ u i + n k \Delta u_{i+nk} Δui+nk 本身。

接着利用 [CDKS21] 的打包技术,自同构 τ 1 + 2 N / n \tau_{1+2N/n} τ1+2N/n 应用到 u ( i , n ) u^{(i,n)} u(i,n),它保持位置 X n k X^{nk} Xnk 的系数,翻转位置 X n k + n / 2 X^{nk+n/2} Xnk+n/2 的系数符号;剩余位置的系数被打乱或者变号(我们不关心)。因此,对于 i ∈ [ n / 2 ] i\in[n/2] i[n/2],计算
R L W E ( 2 ⋅ u ( i , n / 2 ) ) = ( R L W E ( u ( i , n ) ) + X n / 2 ⋅ R L W E ( u ( i + n / 2 , n ) ) ) + τ 1 + 2 N / n ( R L W E ( u ( i , n ) ) − X n / 2 ⋅ R L W E ( u ( i + n / 2 , n ) ) ) \begin{aligned} RLWE(2\cdot u^{(i,n/2)}) &= \left(RLWE(u^{(i,n)})+X^{n/2}\cdot RLWE(u^{(i+n/2,n)})\right)\\ &+ \tau_{1+2N/n}\left(RLWE(u^{(i,n)})-X^{n/2}\cdot RLWE(u^{(i+n/2,n)})\right) \end{aligned} RLWE(2u(i,n/2))=(RLWE(u(i,n))+Xn/2RLWE(u(i+n/2,n)))+τ1+2N/n(RLWE(u(i,n))Xn/2RLWE(u(i+n/2,n)))
这就将 N / n N/n N/n 个密文合并为了 N / 2 n N/2n N/2n 个密文。迭代执行对数次,可以最终合并出单个密文 R L W E ( n ⋅ Δ u ) RLWE(n \cdot \Delta u) RLWE(nΔu)。为了移除额外的因子 n n n

  1. 假如 Q Q Q n n n 互素,那么在 f f f 中使用 [ n − 1 ] Q ⋅ Δ [n^{-1}]_Q \cdot \Delta [n1]QΔ 代替原本的 Δ \Delta Δ 即可
  2. 假如 Q Q Q 是二的幂次( n n n 也是),那么使用 Q n Qn Qn 代替原本的 Q Q Q,最后缩放 n n n 同时在消息和模数上消除它

打包算法:

在这里插入图片描述

Bootstrapping for CKKS

Multiprecision CKKS

使用的密文模数 q q q 是二的幂次,相位形如
c t ( s ) = m + e + q v ∈ R ct(s) = m+e+qv \in R ct(s)=m+e+qvR
q ′ = q / 2 N q'=q/2N q=q/2N,计算 c t ′ = c t ( m o d q ′ ) ct'=ct \pmod{q'} ct=ct(modq),那么
c t ′ ( s ) = m + e + q ′ u ∈ R ct'(s) = m+e+q'u \in R ct(s)=m+e+quR
我们可计算
c t p r e p = ( a − [ a ] q ′ q ′ , b − [ b ] q ′ q ′ ) ∈ R 2 N 2 ct_{prep} = \left( \frac{a-[a]_{q'}}{q'}, \frac{b-[b]_{q'}}{q'} \right) \in R_{2N}^2 ctprep=(qa[a]q,qb[b]q)R2N2
易知 c t p r e p ( s ) = ( q v − q ′ u ) / q ′ = − u + 2 N v ct_{prep}(s)=(qv-q'u)/q'=-u+2Nv ctprep(s)=(qvqu)/q=u+2Nv,从而它是 R L W E 2 N , s 0 ( − u ) RLWE_{2N,s}^0(-u) RLWE2N,s0(u)

现在,利用 Scaled Modulus 过程,可以获得 c t s m = R L W E Q , s ( − q ′ u ) ct_{sm}=RLWE_{Q,s}(-q'u) ctsm=RLWEQ,s(qu)

继续计算 c t b o o t = c t s m + c t ′ ( m o d Q ) ct_{boot} = ct_{sm}+ct' \pmod Q ctboot=ctsm+ct(modQ),它满足
c t b o o t ( s ) = − q ′ u + e s m + m + e + q ′ u = m + ( e + e s m ) ct_{boot}(s) = -q'u+e_{sm} + m+e+q'u = m+(e+e_{sm}) ctboot(s)=qu+esm+m+e+qu=m+(e+esm)
自举算法为:

在这里插入图片描述

对于稀疏打包的密文(这里指相位落在子环内),假设 c t ( s ) = m ( Y ) + q ⋅ v ( X ) ct(s)=m(Y)+q\cdot v(X) ct(s)=m(Y)+qv(X),其中 Y = X N / n Y=X^{N/n} Y=XN/n 是子环的本原单位根。

利用自同构 X → X − X n + 1 + X 2 n + 1 − ⋯ − X N − n + 1 X\to X-X^{n+1}+X^{2n+1}-\cdots-X^{N-n+1} XXXn+1+X2n+1XNn+1 的性质,它将 ( N / n ) ∣ k (N/n) \mid k (N/n)k 的那些项 X k X^k Xk 的系数翻倍 N / n N/n N/n 因子,其余的项的系数都被消除。因此,我们可以使用同态自同构的加和,将 Y Y Y 子环以外的系数全都消除,获得 c t ′ ( s ) = m ( Y ) + q ⋅ v ′ ( Y ) ct'(s)=m(Y)+q\cdot v'(Y) ct(s)=m(Y)+qv(Y)

现在,我们只需对这些稀疏的系数执行 Scaled Modulus 过程即可。

在这里插入图片描述

RNS-CKKS

使用的密文模数 q q q 是素数的乘积,相位形如
c t ( s ) = m + e + q v ∈ R ct(s) = m+e+qv \in R ct(s)=m+e+qvR
首先计算 c t ′ = 2 N ⋅ c t ( m o d q ) ct'=2N\cdot ct \pmod q ct=2Nct(modq)
c t ′ ( s ) = 2 N ⋅ ( m + e ) + q u ∈ R ct'(s) = 2N\cdot(m+e) + qu \in R ct(s)=2N(m+e)+quR
然后计算
c t p r e p = ( 2 N a − [ 2 N a ] q ′ q ′ , 2 N b − [ 2 N b ] q ′ q ′ ) ∈ R 2 N 2 ct_{prep} = \left( \frac{2Na-[2Na]_{q'}}{q'}, \frac{2Nb-[2Nb]_{q'}}{q'} \right) \in R_{2N}^2 ctprep=(q2Na[2Na]q,q2Nb[2Nb]q)R2N2
它的相位是 − u ( m o d 2 N ) -u \pmod{2N} u(mod2N),利用 Scaled Modulus 过程获得 c t s m = R L W E Q p , s ( − q u ) ct_{sm}=RLWE_{Qp,s}(-qu) ctsm=RLWEQp,s(qu),其中的 p p p 是 auxiliary prime 用于控制噪声

计算 c t ′ ′ = c t s m + c t ′ ( m o d Q p ) ct''=ct_{sm}+ct' \pmod{Qp} ct′′=ctsm+ct(modQp),满足
c t ′ ′ ( s ) = − q u + e s m + 2 N ⋅ ( m + e ) + q u = 2 N m + ( 2 N e + e s m ) ct''(s) = -qu+e_{sm} + 2N\cdot(m+e)+qu = 2Nm + (2Ne+e_{sm}) ct′′(s)=qu+esm+2N(m+e)+qu=2Nm+(2Ne+esm)
最后将它乘以 p / 2 N p/2N p/2N 接着缩放 p p p 因子,获得
c t b o o t ( s ) = m + ( e + e s m / 2 N + e r s ) ( m o d Q ) ct_{boot}(s) = m + (e+e_{sm}/2N + e_{rs}) \pmod Q ctboot(s)=m+(e+esm/2N+ers)(modQ)
完整的自举程序为

在这里插入图片描述

Bootstrapping for BGV

Multiprecision BGV

模数是二的幂次。与 CKKS 的自举步骤基本一样,

在这里插入图片描述

RNS-BGV

模数是素数乘积。与 CKKS 的自举步骤基本一样,

在这里插入图片描述

Bootstrapping for BFV

Multiprecision BFV

BFV 的自举略有不同,它并不是消除 overflow 去提升模数,而是需要降低噪声。

模数 Q Q Q 是二的幂次,密文相位是
c t ( s ) = e + Q t m ∈ R Q ct(s) = e+\frac{Q}{t}m \in R_Q ct(s)=e+tQmRQ
首先计算 c t ′ = t ⋅ c t ( m o d Q ) ct'=t \cdot ct \pmod Q ct=tct(modQ)
c t ′ ( s ) = t e + Q v ∈ R ct'(s) = te + Qv \in R ct(s)=te+QvR
Q ′ = Q / 2 N Q'=Q/2N Q=Q/2N,接着计算 c t ′ ′ = c t ′ ( m o d Q ′ ) ct''=ct' \pmod{Q'} ct′′=ct(modQ)
c t ′ ′ ( s ) = t e + Q ′ u ∈ R ct''(s) = te + Q'u \in R ct′′(s)=te+QuR
于是可以计算
c t p r e p = c t ′ − c t ′ ′ Q ′ ∈ R 2 N 2 ct_{prep} = \frac{ct'-ct''}{Q'} \in R_{2N}^2 ctprep=Qctct′′R2N2
它的相位是 − u + 2 N v -u+2Nv u+2Nv,利用 Scaled Modulus 过程获得 c t s m = R L W E Q t , s ( Q ′ u ) ct_{sm}=RLWE_{Qt,s}(Q'u) ctsm=RLWEQt,s(Qu)

然后计算 c t ′ ′ ′ = c t s m + t ⋅ c t − c t ′ ′ ( m o d Q t ) ct'''=ct_{sm}+t \cdot ct-ct'' \pmod{Qt} ct′′′=ctsm+tctct′′(modQt)
c t ′ ′ ′ ( s ) = ( Q ′ u + e s m ) + ( t e + Q m ) − ( t e + Q ′ u ) = Q m + e s m ct'''(s) = (Q'u+e_{sm}) + (te+Qm) - (te+Q'u) = Qm+e_{sm} ct′′′(s)=(Qu+esm)+(te+Qm)(te+Qu)=Qm+esm
最后缩放 t t t 因子,获得 c t b o o t = R L W E Q , s ( m ) ct_{boot}=RLWE_{Q,s}(m) ctboot=RLWEQ,s(m)

完整的自举算法为:

在这里插入图片描述

RNS-BFV

模数是素数乘积。就是上述自举算法的变体,

在这里插入图片描述

Compact Representation of Blind Rotation Keys

[KDE+23] 还给出了压缩 BK 的方法。

采取三元秘密,原本的 BK 形如: R G S W s ( s i + ) RGSW_s(s_i^+) RGSWs(si+) 以及 R G S W s ( s i − ) RGSW_s(s_i^-) RGSWs(si),其中的 s i + = [ s i = 1 ] s_i^+=[s_i=1] si+=[si=1] s i − = [ s i = − 1 ] s_i^-=[s_i=-1] si=[si=1] 作为 CMux 控制位。

Reconstruction

为了减少通信开销,[KDE+23] 仅生成 R L W E s ′ ( s ± ) RLWE_s'(s^\pm) RLWEs(s±) R L W E s ′ ( s 2 ) RLWE_s'(s^2) RLWEs(s2) 两个密文,其中
s ± ( X ) = ∑ i = 0 N − 1 s i ± X i s^{\pm}(X) = \sum_{i=0}^{N-1} s_i^\pm X^i s±(X)=i=0N1si±Xi
利用自同构的保持/翻转各个位置系数的符号的特点,我们可以根据 R L W E s ′ ( s ± ) RLWE_s'(s^\pm) RLWEs(s±) 恢复出全部的 R L W E s ′ ( s i ± ) RLWE_s'(s_i^\pm) RLWEs(si±)。算法为:

在这里插入图片描述

消除因子 N N N 是容易的。接着,利用计算出的各个分量 R L W E s ( g j s i ± ) = ( a i j , b i j ) RLWE_s(g_js_i^\pm)=(a_{ij},b_{ij}) RLWEs(gjsi±)=(aij,bij),可以计算出:
R L W E s ( a i j ⋅ s 2 + b i j ⋅ s ) = R L W E s ( g j s i ± ⋅ s ) RLWE_s(a_{ij} \cdot s^2 + b_{ij} \cdot s) = RLWE_s(g_js_i^\pm\cdot s) RLWEs(aijs2+bijs)=RLWEs(gjsi±s)
它们组成了 R L W E s ′ ( s i ± s ) RLWE_s'(s_i^\pm s) RLWEs(si±s),于是我们就得到了
R G S W s ( s i ± ) = ( R L W E s ′ ( s i ± ) , R L W E s ′ ( s i ± s ) ) RGSW_s(s_i^\pm) = (RLWE_s'(s_i^\pm), RLWE_s'(s_i^\pm s)) RGSWs(si±)=(RLWEs(si±),RLWEs(si±s))

On the Fly

为了减少内存开销,[KDE+23] 还提出了动态重构 BK 的方法,用完就立即丢弃。

这儿也是利用了自同构,消除常数项以外的其他系数。我们首先乘以 X − i X^{-i} Xi,从而提取任意位置的 s i ± s_i^\pm si± 的密文。算法为:

在这里插入图片描述

[KDE+23] 提出了一种新的盲旋转过程,它不需要重构出 R L W E s ′ ( s i ± ⋅ s ) RLWE_s'(s_i^\pm \cdot s) RLWEs(si±s),而是直接根据 R L W E s ′ ( s i ± ) RLWE_s'(s_i^\pm) RLWEs(si±) R L W E s ′ ( s 2 ) RLWE_s'(s^2) RLWEs(s2) 来计算:给定 A C C = R L W E s ( f ) = ( a , b ) ACC=RLWE_s(f)=(a,b) ACC=RLWEs(f)=(a,b),给定密文 L W E s ( u ) = ( α , β ) LWE_s(u)=(\alpha,\beta) LWEs(u)=(α,β),先计算
a ⋅ R L W E s ′ ( X α i s i ) = R L W E s ′ ( a ⋅ X α i s i ) = ( a ′ , b ′ ) a\cdot RLWE_s'(X^{\alpha_is_i}) = RLWE_s'(a\cdot X^{\alpha_is_i}) = (a',b') aRLWEs(Xαisi)=RLWEs(aXαisi)=(a,b)
然后计算
a ′ ⋅ R L W E s ′ ( s 2 ) + ( b ′ , 0 ) = R L W E s ( a ′ s 2 + b ′ s ) = R L W E s ( a s ⋅ X α i s i ) a' \cdot RLWE_s'(s^2) + (b',0) = RLWE_s(a's^2+b's) = RLWE_s(as \cdot X^{\alpha_is_i}) aRLWEs(s2)+(b,0)=RLWEs(as2+bs)=RLWEs(asXαisi)
最后计算出
R L W E s ( a s ⋅ X α i s i ) + R L W E s ( b ⋅ X α i s i ) = R L W E s ( f ⋅ X α i s i ) RLWE_s(as \cdot X^{\alpha_is_i}) + RLWE_s(b \cdot X^{\alpha_is_i}) = RLWE_s(f \cdot X^{\alpha_is_i}) RLWEs(asXαisi)+RLWEs(bXαisi)=RLWEs(fXαisi)
对于每个 i i i 都这么计算,最终可以获得 R L W E s ( f ⋅ X u ) RLWE_s(f \cdot X^u) RLWEs(fXu)

在这里插入图片描述

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

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

相关文章

Linux——磁盘和文件系统(一)

Linux——磁盘和文件系统 磁盘机械式磁盘固态硬盘 机械式磁盘结构磁盘&#xff0c;磁道&#xff0c;扇区柱面 文件系统的初始化划卷&#xff08;划盘&#xff09; 挂载C盘放了什么东西Boot Block&#xff08;启动模块&#xff09; 0号组放了什么东西Super Block&#xff08;超级…

Python爬取猫眼电影专业评分数据中的应用案例

在数据分析和可视化展示中&#xff0c;获取准确的电影专业评分数据至关重要。猫眼电影作为中国领先的电影信息与票务平台&#xff0c;其专业评分对于电影行业和影迷的数据来说具有重要意义。通过Python爬虫技术&#xff0c;我们可以实现从猫眼电影网站上自动获取这些数据目标。…

shell脚本基础之循环语句

目录 一、循环语句的概念 二、for循环语句 1、列表循环 2、列表for循环案例大全 案例一 案例二 案例三 案例四 案例五 案例六 案例七 案例八 3、不带列表循环 4、类似C语言风格的for循环 5、for循环总结 三、while循环语句 1、while循环语句格式 2、while死循…

GMS测试BTSfail-CVE-2022-20451

描述&#xff1a; 项目需要过GMS兼容性测试&#xff0c;BTS这块我们环境没有&#xff0c;送检之后出现了一个BTS的Alert&#xff0c;这个是必须要解决的。下面的warning可以不考虑。 这个是patch问题&#xff0c;根据代理提供的pdf文件找到一个id:为A-235098883的补丁&#xf…

利用ChatGPT实现副业赚钱的10个方法

现今ChatGPT的热潮越来越高&#xff0c;很多程序员也把目光转向了如何靠ChatGPT赚钱&#xff0c;而那些掌握先机的程序员已经通过这一副业赚到了人生中的第一桶金。 如果你也对ChatGPT感兴趣&#xff0c;但还没有找到程序员靠ChatGPT实现营收&#xff0c;增加副业收入的方法&a…

web渗透测试-Server2225-(环境+解析)

1、访问目标IP,打开第1题,根据页面提示,将获取的flag提交。提交格式:flag{xxx}(提交花括号里面的字段) 给出了如上代码,很明显,flag在flag.php文件内。 REQUEST方法既可以接受GET方法,也可以接受POST方法,方便起见,我们选择GET方法。 eval函数 eval() 函数把字符串…

电商平台低价乱价?电商平台API接口接入,实时获取商品价格

​和传统线下渠道对比线上电商运营手段多样和方便&#xff0c;电商会经常采用价格策略以吸引消费者&#xff0c;这种灵活而频繁的价格变动对供货商的渠道管理提出了前所未有的挑战&#xff0c;实时监测电商的价格变动对于品牌商和电商平台是非常重要的环节。而促销活动设计和日…

当包容结构体遇见灵活的内存管理

&#x1f308;个人主页&#xff1a;小田爱学编程 &#x1f525; 系列专栏&#xff1a;c语言从基础到进阶 &#x1f3c6;&#x1f3c6;关注博主&#xff0c;随时获取更多关于c语言的优质内容&#xff01;&#x1f3c6;&#x1f3c6; &#x1f600;欢迎来到小田代码世界~ &#x…

Python算法题集_和为K的子数组

本文为Python算法题集之一的代码示例 题目560&#xff1a;和为K的子数组 说明&#xff1a;给你一个整数数组 nums 和一个整数 k &#xff0c;请你统计并返回 该数组中和为 k 的子数组的个数 。 子数组是数组中元素的连续非空序列。 示例 1&#xff1a; 输入&#xff1a;nu…

JavaScript DOM属性和方法之event事件对象

event对象代表事件的状态&#xff0c;比如事件在其中发生的元素&#xff0c;键盘按键的状态、鼠标的位置、鼠标按钮的状态&#xff0c;事件通常与函数结合使用&#xff0c;函数不会在事件发生前被执行&#xff0c;只有当事件被触发的时候才会执行函数。 一、句柄事件 HTML5的…

【代码能力提升 | 代码阅读学习】分析 VoxelNet 的 主干

文章目录 前言代码分析VoxelNet model2.数据处理2.1单个样本处理2.2处理成batch 最后&#xff0c;附上我一步步调试代码&#xff0c;到3D-conv 前言 代码来自&#xff1a;https://github.com/skyhehe123/VoxelNet-pytorch 其中 测试数据来自&#xff1a;https://github.com/ga…

春节寄快递贵?想要便宜寄快递?那是你没找到寄快递便宜的渠道!

春节将至&#xff0c;公司会发放一大批的年货礼品给员工们&#xff0c;来聊表这一年来的勤恳工作的心意。但是想要拿走这么多的年货&#xff0c;可不是一件容易的事情啊&#xff0c;这时候我们可以通过邮寄的方式把东西邮寄走&#xff0c;是不是省了很多事呢&#xff0c;不仅回…

如何过有「松弛感」的生活?

最近网上有一个词很流行&#xff0c;叫做「松弛感」。最早的出处似乎是这么一条微博&#xff1a;博主见到一家人出门旅游&#xff0c;行李全部被退回&#xff0c;空手抵达目的地&#xff0c;竟然没人紧张和生气&#xff0c;而是重新安排好行李后继续开心聊天&#xff0c;全程非…

Redis -- 前置知识

目录 简要 分布式系统 负载均衡 引入缓存 数据库分表 微服务 小结 简要 redis是存储数据在内存中, 定义变量就是在内存中, 但是redis是在分布式系统中, 才能真正发挥威力, 如果只是单机程序, 那么直接通过变量来存储数据的方式将是最优的选择. …

Unity 解释器模式(实例详解)

文章目录 示例1&#xff1a;基础解释器结构示例2&#xff1a;小于表达式&#xff08;LessThanExpression&#xff09;示例3&#xff1a;逻辑或表达式&#xff08;OrExpression&#xff09;示例4&#xff1a;逻辑非表达式&#xff08;NotExpression&#xff09;示例5&#xff1a…

DeepLearningSystem:开启深度学习之旅的全方位指南,一款深度学习系统性开源课程项目!

在当今这个数据驱动的时代&#xff0c;深度学习技术 已经成为了科技领域的一个重要分支。 对于有志于掌握这一技术的专业人士和学生来说&#xff0c;有一个项目值得特别关注——由chenzomi12开发的“深度学习系统”课程。 Star&#xff1a;6.2k GitHub&#xff1a;https://gi…

美睫师睫毛嫁接零基础学习,日式美睫与开花嫁接实战教学

一、教程描述 大家都说女人的钱好挣&#xff0c;这是因为每个女人在每年&#xff0c;都要花很多钱来打扮自己。本套教程是关于日式美睫和开花嫁接的&#xff0c;从零基础学习到店铺经营都有涉及&#xff0c;就做美睫和睫毛嫁接这两项业务&#xff0c;月收入万元以上应该问题不…

系统引导程序 Boot Loader——学习笔记

基于嵌入式Linux 的完整系统软件由三个部分组成&#xff1a;系统引导程序、Linux 操作系统内核和文件系统。 系统引导程序 Boot Loader 是系统加电后运行的第一段软件代码&#xff0c;它的作用是加载操作系统或者其他程序到内存中&#xff0c;并将控制权交给它们。 Boot Load…

JMeter性能测试实战

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

C语言——O / 动态内存管理

一、为什么要有动态内存分配 我们已经掌握的内存开辟⽅式有&#xff1a; int val 20;//在栈空间上开辟四个字节 char arr[10] {0};//在栈空间上开辟10个字节的连续空间 但是上述的开辟空间的⽅式有两个特点&#xff1a; • 空间开辟⼤⼩是固定的。 • 数组在申明的时候&am…