BFV/BGV全同态加密方案浅析
本文主要为翻译内容,原文地址:Introduction to the BFV encryption scheme、https://www.inferati.com/blog/fhe-schemes-bgv
之前的一篇博客我们翻译了CKKS全同态加密方案的内容,但该篇上下文中有一些知识要点,作者在BFV/BGV中已经做了讲解,所以做了省略;为了补齐这部分知识,我们今天将这两篇的内容结合到一篇进行更全面的阐述。
BGV和BFV是“算术FHE”系列中的两种方案。自2011年/2012年首次发表以来的十年里,BGV和BFV已经进行了调整和重新分析,并被确定为基本上是等效的,其在实现、效率和噪声传播方面存在细微差异,因不同参数选择而异。并且方案的许多高级技巧也被用于CKKS。
1、介绍
Fan-Vercauteren(FV)方案[Bra12, FV12](也称为 Brakerski-Fan-Vercauteren(BFV)方案)被认为是第二代全同态加密(FHE)方案之一,它是基于带错误学习环(RLWE)问题构建的[LPR13]。BrakerskiGentry-Vaikuntanathan (BGV) [BGV14] 方案是另一种基于错误环学习的密码系统,可提供对加密数据的计算。BGV 和 BFV 提供相同的功能,即对整型消息进行精确计算,但是它们的构造存在一些差异。
BFV 在两个环上实例化:明文环,包括未加密或可理解消息的编码;密文环,包括加密消息。与任何其他全同态加密方案类似,BFV 允许不可信方在无法访问解密密钥的情况下对加密数据进行有意义的计算。这是由于同态属性使得在明文和密文空间之间存在一个映射(或函数),该映射保留了这两个空间中的运算。
BGV 与 BFV 方案类似,也定义了明文环和密文环。加密过程将明文环中的输入明文元素映射到密文环中的密文元素。广义地讲,加密是通过使用几乎随机的掩码隐藏明文消息来实现的,该掩码是使用公钥(或对称密钥操作模式下的私钥)计算得出的。加密的输出通常是密文空间的两个元素;第一个元素包含被掩码的明文数据,而第二个元素包含可在解密过程中使用的辅助信息。解密使用私钥和密文中的辅助信息来移除掩码并恢复明文消息。对于熟悉 ElGamal 加密(将单个明文元素映射到成对密文元素)的读者来说,这可能听起来很熟悉。
在基于环上带误差学习的全同态加密方案中,一个关键概念是误差,也称为噪声,它在加密过程中被添加到明文消息中。该误差对于满足RLWE困难性假设至关重要,否则RLWE将变成一个可以由商用计算机解决的简单计算问题,其结果是,基于此类简单问题构建的全同态方案将容易被攻破。同时当我们执行同态计算(主要是同态加法和同态乘法)时,误差幅度会增大。且同态乘法产生的误差增长速度比同态加法产生的误差增长速度比快。
到目前为止,我们讨论了BFV和BGV之间的相似之处。在接下来的段落中,我们将描述这两种方案的不同之处。首先,BFV方案通常是尺度不变(或尺度无关)的,也就是说,在同态计算过程中密文模数不会改变。另一方面,BGV是一种尺度相关的方案,它定义了多个密文模数,每个层级有一个模数。正如我们在图1中看到的,BGV定义了一系列“小”模数链。每个层级
相关联的,是一个密文大模数
。请注意,小模数
的选择以及大模数
的集合不是任意的,其背后的原理将在本文后面阐述。在执行同态计算时,密文不断从一个层级移动到另一个层级。密文的典型流程如下:一个新加密的密文从层级
开始,我们将其称为用于演示的加密层级。当我们对密文进行计算时,它从较高层级
移动到较低层级
。最终,在解密之前,密文处于层级1。应该指出的是,上述向下受限的流程是BGV分层版本中的典型流程。在可自举的 BGV 中,密文可以根据需要在两个方向(向上或向下)移动。

我们注意到,前面关于加密和解密具有固定层级的描述是相当简化的,因为在的任何层级进行加密或解密都是可能的。还应当指出的是,BFV方案也可以实例化为尺度相关的方案,这使得这两种方案之间的这种差异存在争议。
BFV和BGV之间另一个争议较小的区别在于密文结构以及明文消息的加密方式。图2展示了BFV和BGV的密文结构。在BFV中,明文消息被放置在密文系数的最高有效位(MSB)一侧。这是通过在加密过程中用相当大的值 对消息进行缩放来实现的。另一方面,BGV将消息放置在密文系数的最低有效位(LSB)一侧。重要的是,在同态计算过程中,明文和噪声永远不会重叠,以便解密能够恢复预期的计算结果。

MSB 代表最高有效位,q 是密文模数,t 是明文模数。摘自 [CKKS17]
2、明文空间和密文空间
BFV中的明文和密文空间是在两个不同的多项式环上定义的,分别记为和
,其中
,
是环的维度,
以及
分别是明文和密文的系数模数。记号
可以看作是整数系数模
和
的多项式集合,即系数在
中且次数小于 n。出于效率考虑,n通常设置为2的幂次方整数。注意,在实际应用中, q通常远大于t,因此, C的基数远大于P的基数,这也意味着P中的一个明文消息M可以映射到C中的多个有效密文。
和
中的阶(或不同元素的数量)分别为
和
。
表1展示了参数n = 4和t = 5时的有效明文消息示例。
BGV的明文和密文空间与BFV中的类似。明文多项式环定义为,即次数小于n且系数在
中的多项式集合,其中明文模数t和环维度n均为整数。密文多项式环定义为
,其中
,
是 l 层的密文模数。出于效率考虑,n通常像我们在BFV讨论中那样被设置为2的幂整数。此外, q通常远大于t,这会影响加密后的消息扩展率。
BFV的明文空间为,密文格式为
;BGV的明文空间为
,密文格式为
。
3、参数
我们在此描述BFV中使用的主要参数。除了在第3节中介绍的明文和密文空间参数之外,BFV还使用了一些随机分布:
、
、
【随机分布可参考《CKKS全同态加密方案浅析》关于参数的介绍】。
我们注意到参数的选择是特定于应用场景的,并且也由所需的安全级别驱动。对于一组当前被接受的参数,我们建议读者参考同态加密标准
中的表1和表2。
: https://homomorphicencryption.org/wp-content/uploads/2018/11/HomomorphicEncryptionStandardv1.1.pdf
4、编码和解码
BFV和BGV在编码上类似,回想一下,明文空间是多项式环。这意味着消息需要被转换为
中的多项式。这种转换被称为编码。文献中包含了许多为全同态加密提出的编码方案。我们在这里回顾两种针对整数数据类型的简单方案。
设 m 表示我们想要在全同态加密中加密的一个整数消息。第一种编码方案(我们称之为朴素编码方案)将明文元素构造为:。也就是说,我们将 M 设置为一个常数多项式,其中 m 为常数项。虽然这种编码方案原则上很简单,但特别是对于大消息 m 来说效率极低。原因是在对密文执行同态运算时,明文系数的大小会增大。为了确保同态求值的结果与感兴趣计算的预期结果相匹配,我们需要确保明文系数不会超出
的范围。因此,我们需要确保t比要在全同态中实现的计算的输入、任何中间结果和输出都足够大。朴素编码方案呈现出系数快速增长的情况。我们注意到这种编码方案存在一个更严重的局限性,即浪费了明文多项式中的
个系数。这种方案的解码通过简单读取解密后得到的明文多项式的常数项来实现。其他更高效的编码方案会利用一个子集甚至所有系数,称为打包或批量编码方案。
我们要介绍的另一种编码方案,称为整数编码方案,其工作方式如下:
1. 用二进制表示m,即;
2. 构造。由于在实际中n太大,未使用的位被设置为0。
由于明文系数的量级较小,在同态求值过程中系数的增长通常较慢。请注意,使用这种编码进行同态求值可能会导致明文多项式的次数增加。为了确保同态求值的结果与感兴趣的计算的预期结果相匹配,我们需要确保明文系数的次数不会超出 的范围,并且系数不会超出
的范围。
注意,对于整数编码方案,可以选择除2以外的任何整数分解基数,例如三进制、四进制或k进制基数分解。整数编码方案的解码通过在处计算明文多项式来实现,即计算
。
5、密钥生成
私钥SK是从中生成的一个随机三元多项式,它是一个次数为 n 且系数在 {-1、0、+1}中的多项式。
BFV
的公钥 PK 是一对多项式,计算如下:
,
,其中 a 是
中的随机多项式,
是从
中随机抽样的误差多项式。
符号意味着多项式算术应该在模 q 下进行。请注意,由于
在
中,多项式算术也应该在环多项式模
下进行。
BGV
的公钥PK也是一对多项式,计算如下:
,
,其中
是
中的随机多项式,
是从
中采样的随机误差多项式。
符号 表示多项式模
下进行计算。请注意,与BFV中的密钥生成不同,这里的误差是由
缩放的。
6、加密和解密
首先我们来介绍下BFV的加解密过程:
在 P 中加密明文消息 M,首先生成三个小的随机多项式,从 生成
,从
生成
和
,然后返回密文
如下:
(1)
参数被定义为 q 除以 t 的商,即
。它用于缩放消息。
解密是通过在密钥上对密文进行评估来执行的,如下所示,并反转加密中应用的缩放因子:
(2)
为了检查解密为何起作用以及在哪些条件下起作用,让我们将等式(2)展开如下:
(3)
需要注意的是, 的无穷范数(即多项式
中最大的绝对系数,用
表示)非常小,因为
和
都是小多项式。更具体地说,鉴于这些小多项式都受参数
的限制,可以很容易地证明
。
为了继续进行证明,我们需要展开模 下的等式
(3)
并完成对解密函数的求值。可以如下进行:
(4)
其中 是某个多项式。将等式
(4)
乘以 得到
。解密中的取整函数去除
,最后的模
运算去除
并恢复
。简而言之,为了使解密正确地恢复
,我们需要确保
,否则噪声将会溢出并破坏消息。
接下来我们介绍BGV的加解密过程,整体类似,会一些小差异:
加密算法将明文消息M和公钥PK作为输入,并输出密文 ,从而对输入消息进行加密。加密过程如下:我们生成三个小的随机多项式,从
生成
,从
生成
和
,并计算:
(5)
注意 中的误差多项式是如何被明文模数
缩放的。这与我们之前在图2中展示的情况一致,即消息位于密文系数的低位,而噪声可以在高位增长。
解密过程通过将密文和私钥 作为输入来逆转加密过程。如果在计算过程中噪声没有增长到无法控制的程度,它将输出明文消息
。解密过程如下:
(6)
为了检查解密为何起作用以及在哪些条件下起作用,让我们将等式(5) 展开如下:
(7)
通过将上述结果对 取模,我们去除了噪声向量
并恢复出没有噪声的
。但这里有一个与v的范数相关的注意事项。只要
,解密就有效,其中
定义为v中最大的绝对系数。设置这个边界是为了使噪声的幅度不会增长过多而破坏消息。
7、同态计算
在本节中,我们将解释BFV和BGV在同态计算求值过程中是如何工作的。在这里,我们研究两个主要的同态操作:加法和乘法。
BFV的同态加法
让我们以同态加法为参考来理解同态加法是如何工作的。这个过程非常简单,我们只需将每个密文中相应的多项式相加,如等式(8)所示:
(8)
为了理解为什么这样可行,让我们将等式(8)进行如下拆解:假设 和
分别是对
和
的新的加密结果。从代数角度来看,它们可以如下表示,参见等式
(1)
:
(9)
通过将方程(8)
中的 和
进行代入,我们得到以下结果:
(10)
很容易注意到,等式(10)
具有对 进行加密的有效密文形式。请注意,在最坏情况分析下,
中的误差项大约是输入密文中噪声项的总和,即噪声是累加增长的。可以遵循上述用于推导 Eval
AddPlain
表达式的过程。明文消息可以通过加密转换为密文形式,且没有误差项,即 。
BFV的同态乘法
同态乘法比同态加法更复杂。我们在此介绍基本过程,并请读者参考外部资源以获取更多详细信息。
将密文写成在私钥SK 处的求值形式是有用的,参考公式(4)
,就像我们在推导解密过程中所做的那样:
,
(11)
将密文相乘会得到:
(12)
密文看起来接近我们想要的加密形式 。我们注意到,用
进行缩放会准确地得到我们在第一项中想要的东西,再加上一些噪声。然而,由于
不能整除
,所以最后一项
会产生很大的噪声。相反,我们将使用因子
进行缩放。现在,我们可以写成
。我们也可以写成
。用
进行缩放并将这些表达式代入等式
(12)
,我们得到以下结果:
(13)
推导过程的最后一步是将等式(13)
模 化简,这会得到:
(14)
其中 是由等式
(13)
中的最后两项产生的舍入误差。
乘法运算中的噪声增长具有近似为 的线性因子,即
,其中
是乘积密文中的噪声,
是输入密文中的噪声。
简而言之,为了评估同态乘法,我们计算输入密文的张量积并按 进行缩放,如下所示:
(15)
可以注意到,EvalMult 将结果密文中的项数从 2 个环元素增加到了 3 个。此外,为了解密得到的密文,必须使用稍微不同的解密过程。幸运的是,这些复杂情况可以通过重线性化来解决,这将在后续部分进行描述。
BGV的同态加法
如公式(16)
所示,同态加法以两个相对于相同模数 定义的密文
和
作为输入,并返回一个密文
,该密文包含对输入中加密的两个明文消息之和的加密,即
。只要被加数密文中的误差不是太大,这就适用。为了理解这一点,让我们分析同态加法过程。公式
(5)
相当简单,我们只需将每个密文中的相应多项式相加。
(16)
为了理解这为何可行,让我们对公式(16)
进行如下拆解:假设 和
分别是对
和
的新的加密结果果。从代数角度来看,它们可以如下表示(参见公式
(5)
)。
(17)
将 和
代入公式
(16)
,我们得到以下结果:
(18)
很容易看出公式(18)
具有对 进行加密的有效密文的形式。请注意,在
中的误差项,在最坏情况分析下,大约是输入密文中噪声项的总和,即噪声是累加增长的。
BGV的同态乘法
同态乘法以两个相对于相同模数 定义的密文
和
作为输入,并返回一个密文$
,该密文包含对输入密文中加密的两个明文消息之积的加密,即
。
在接下来的分析中,我们将解密公式解释为在私钥SK处的密文评估:
(19)
将密文相乘会得到:
(20)
密文乘积的解密公式具有对 进行加密的有效密文结构,其噪声项为
。注意噪声项是如何随着输入密文中噪声的乘积而呈乘法增长的
。这意味着随着我们在计算中进行得更深入,噪声呈指数增长。为了解决这个问题,BGV使用模数切换(ModSwitch)来降低乘法噪声的增长速度。模数切换将在本文后面进行描述。
根据上述讨论,我们可以推断出\(EvalMult\)可以通过输入密文的多项式乘法进行计算,如下面的公式所示:
(21)
EvalMult 将结果密文中的环元素数量从 2 增加到了 3。此外,乘积密文是相对于 而不是原始的私钥
定义的,也就是说,它可以使用
进行解密。为了将元素数量恢复到 2 并使密文可以使用
进行解密,可以使用接下来描述的重线性化过程。
8、重线性化
BFV的重线性化过程的主要目的是将由 EvalMult 产生的乘积密文(product ciphertexts)的大小减少回两个环元素。
这个问题可以具体表述如下:令 。我们的目标是找到
,使得:
(22)
通过评估密钥 提供对
的访问。请注意,这是
的掩码版本,因为
。现在我们可以计算
如下:
(23)
如果我们写出方程(23)的解密公式,我们得到:
(24)
需要注意的是,由于 在
中有系数,所以项
可能会很大。不过,有一种使用基分解的技术可以减少这个误差。更多细节,我们请读者参考[FV12]。
BGV由于与密文模数相关的一些小变化,我们在这里简要重申,相同的问题和相同的目标,使得:
(25)
通过评估密钥 计算
如下:
(26)
通过解密公式(24),我们就会得到我们想要的内容。
9、模数切换
如前所述,模数切换(MODSWITCH)用于控制乘法噪声。这个概念最初在[BGV14]中被引入,它利用了这样一个事实:给定一个相对于模数q和私钥SK定义的密文C,它可以被转换为一个相对于另一个模数 和相同私钥SK定义的等价密文
,使得:
(27)
这种转换是通过将C的系数乘以 的量并进行适当的舍入来完成的。为了降低噪声幅度,我们选择一个比
小得多的
,这使我们能够降低乘法噪声。
请注意,在BGV的情境中,q可以是任何层级 的
;而在此情境中q'简单地就是
。此外,密文模数
的选择使得它们对
取模是等价的。这导致在不影响加密的明文消息的情况下降低了噪声。从明文的角度看,就好像我们是按1进行缩放。
模数切换(MODSWITCH)可以按照公式(28)
进行计算,其中[·]是一个合适的舍入函数。转换后的密文C'是根据新的模数q'定义的。
(28)
10、安全性
BFV/BGV 方案安全性源于 RLWE 问题的难度。我们注意到,选择最佳的参数以最大化性能并同时满足安全性和功能性约束是一项相当复杂的任务,最好咨询专业密码学家来进行选择。对于 BFV/BGV 的简要安全分析和一组推荐参数,我们建议读者参考同态加密标准。
11、总结
BFV和BGV同态加密方案的发展路径和关键里程碑:
11.1.
BFV发展路径
BFV方案(Brakerski/Fan-Vercauteren)最初是由Zvika Brakerski提出的,并由Fan和Vercauteren进一步改进。其发展历程可以分为以下几个阶段:
-
2011年Brakerski提出基于学习有噪声问题(LWE)和理想格的同态加密基础模型。这一模型首次展示了如何利用噪声增长的管理,实现多次加密操作。
-
2012年Brakerski和Vercauteren改进了初始方案,引入了特殊模数来控制噪声增长(即现在称为BFV的方案)。此时,他们提出了新的编码方式,允许整数加法和乘法运算,特别适合用于需要高精度计算的场景。
-
2014年Fan和Vercauteren提出了一个改进版本,通过调整参数和编码策略来进一步优化BFV的噪声管理,使得BFV方案在整数加密中更为高效稳定,这一版本正式确立了BFV的模型。
BFV:更适合低深度、精确计算,不需要模数转换。
11.2.
BGV发展路径
BGV方案(Brakerski-Gentry-Vaikuntanathan)则是在BFV方案基础上,进一步通过模数转换技术改善了噪声控制和运算效率,特别适合高深度、多乘法操作的同态加密场景。BGV的发展路径主要包括以下阶段:
-
2011年Brakerski和Vaikuntanathan提出一个非耦合模数的噪声控制技术,为后续的BGV方案打下基础。这项技术允许在不同模数下控制噪声增长,使同态乘法不至于导致噪声增长过快。
-
2012年Brakerski、Gentry和Vaikuntanathan联合提出了BGV方案,首次引入模数转换(modulus switching)技术。该技术通过每次乘法操作后逐步减小模数来管理噪声,使得BGV方案能够支持更高深度的乘法操作。这一创新为高深度同态加密计算带来了显著的效率提升。
-
2013年BGV方案得到进一步的优化,引入了批处理(batching)和密文旋转(ciphertext rotation)技术,允许在密文中进行向量操作,提升了批处理密文的计算效率。
BGV:在重线性化的基础上支持模数转换,适合高深度和批处理计算,噪声控制更好,密文大小管理更高效。
因此,选择使用BFV还是BGV,取决于具体应用需求,比如精度需求和计算深度。如果需要更高的运算深度和效率,BGV会是更合适的选择,而对于低深度、精确度要求高的场景,BFV则更适用。
在《Revisiting Homomorphic Encryption Schemes for Finite Fields》这篇文章里,作者在PALISADE中做了BGV和BFV的实现:
BGV在大明文模数下噪声增长比较小,他们的结果是优化后的BFV和BGV在大明文模数下表现近似,稍好于BGV。
BFV的效率在小明文模数下较好,BGV的效率在适中或者较大的模数情况下表现较好。
PALISADE中的BFV实现比之前最好的实现在深层(乘法)电路的评估上快了4倍。
相关文章:
BFV/BGV全同态加密方案浅析
本文主要为翻译内容,原文地址:Introduction to the BFV encryption scheme、https://www.inferati.com/blog/fhe-schemes-bgv 之前的一篇博客我们翻译了CKKS全同态加密方案的内容,但该篇上下文中有一些知识要点,作者在BFV/BGV中已…...

Elasticsearch 实战应用详解!
Elasticsearch 实战应用详解 一、概述 Elasticsearch 是一个高度可扩展的开源全文搜索引擎,它能够处理大量数据并提供实时搜索和分析能力。基于 Lucene 构建,Elasticsearch 通过简单的 RESTful API 接口隐藏了 Lucene 的复杂性,使全文搜索变…...

最新最全面的JAVA面试题免费下载
面对求职市场的激烈竞争,掌握全面且深入的Java知识已成为每一位Java开发者必不可少的技能。《2023最新版Java面试八股文》是一份精心整理的面试准备资料,旨在帮助广大开发者系统复习,从容应对Java及相关技术栈的面试挑战。这份文档不仅汇聚了…...

修改sql server 数据库的排序规则
文章目录 引言I 解决方案案例II 知识扩展排序规则SQL SERVER支持的所有排序规则引言 新增sql server 数据库实例的默认排序规则不支持中文存储,导致乱码 解决方案: 修改排序规则为Chinese_PRC_CI_AS 或者 Chinese_PRC_Stroke_CI_AS_WS或者Chinese_PRC_CI_AI_KS_WS 仅对新增…...

Node学习记录-until实用工具
来源:Nodejs 第十八章(util) util 是Node.js内部提供的很多实用或者工具类型的API util.promisify 用于将遵循Node回调风格(即最后一个参数为回调函数)的函数转换成返回Promise的函数,这样可以使得异步代…...

【Mac】安装 VMware Fusion Pro
VMware Fusion Pro 软件已经正式免费提供给个人用户使用! 1、下载 【官网】 下拉找到 VMware Fusion Pro Download 登陆账号 如果没有账号,点击右上角 LOGIN ,选择 REGISTER 注册信息除了邮箱外可随意填写 登陆时,Username为…...

解决go run main.go executable file not found in %PATH%
项目场景: 命令行执行go run 都会报 executable file not found in %PATH% 问题描述 最近我发现,我通过命令行,无论是跑什么go文件,都会出现这个错误。但是我通过我的IDE就能跑,于是我也没有管它。 但是最近&#x…...

C++ 手写常见的任务定时器
序言 最近在编写 C 的服务器代码时,我遇到了一个需求,服务器很可能会遇到那些长期不活跃的连接,这些连接占用了一定的资源但是并没有进行有效的通信。为了优化资源使用,我决定实现一个定时器,以便定期检查连接的活跃状…...

【VS+QT】联合开发踩坑记录
最新更新日期:2024/11/05 0. 写在前面 因为目前在做自动化产线集成软件开发相关的工作,需要用到QT,所以选择了VS联合开发,方便调试。学习QT的过程中也踩了很多坑,在此记录一下,提供给各位参考。 1. 环境配…...

PH热榜 | 2024-11-05
DevNow 是一个精简的开源技术博客项目模版,支持 Vercel 一键部署,支持评论、搜索等功能,欢迎大家体验。 Github:https://github.com/LaughingZhu/DevNow 1. FullContext 标语:用自然语言,让你的市场推广流…...

模拟机器人逐字回答,类似于实时回话
代码如下 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> </head><…...

Java学习路线:JUL日志系统(一)日志框架介绍
目录 打印日志 日志的级别 打印文件 日志过滤器 日志输出流程 首先,为什么要使用日志系统? 如果单纯地用System.out.println打印信息,如果项目比较大,存在大量的信息就会显得非常凌乱。 而且,当我们希望在debug的…...

[渲染层网络层错误] net::ERR_CONTENT_LENGTH_MISMATCH 问题解决
问题描述 问题背景 微信小程序访问后端img资源的时候,偶尔出现这个感叹号,图片加载不出来,但是对应的url贴出来在浏览器中访问,或者重新加载是可以访问的。 错误描述 经查询前端报错 [渲染层网络层错误] net::ERR_CONTENT_LE…...

C 语言编程中的常见错误及解决方案
在 C 语言开发中,编译和链接错误是常见的问题,尤其是在处理多个源文件时。本文将总结一些常见的错误,并提供相应的解决方案,以帮助开发者更高效地排查和修复这些问题。 1. 结构体作用域问题 问题描述 在函数参数列表中定义结构体…...

开源模型应用落地-glm模型小试-glm-4-9b-chat-批量推理(二)
一、前言 GLM-4是智谱AI团队于2024年1月16日发布的基座大模型,旨在自动理解和规划用户的复杂指令,并能调用网页浏览器。其功能包括数据分析、图表创建、PPT生成等,支持128K的上下文窗口,使其在长文本处理和精度召回方面表现优异&a…...

【C++篇】数据之林:解读二叉搜索树的优雅结构与运算哲学
文章目录 二叉搜索树详解:基础与基本操作前言第一章:二叉搜索树的概念1.1 二叉搜索树的定义1.1.1 为什么使用二叉搜索树? 第二章:二叉搜索树的性能分析2.1 最佳与最差情况2.1.1 最佳情况2.1.2 最差情况 2.2 平衡树的优势 第三章&a…...

C#-类:声明类、声明类对象
一:类的声明 class 类名 {//特征——成员变量//行为——成员方法//保护特征——成员属性//构造函数和析构函数//索引器//运算符重载//静态成员 }类名:帕斯卡 同一个语句块中的不同类 不能重名 二:声明类对象 2.1 类的声明 ≠ 类对象的声…...

【AIGC】ChatGPT提示词Prompt高效编写技巧:逆向拆解OpenAI官方提示词
博客主页: [小ᶻZ࿆] 本文专栏: AIGC | ChatGPT 文章目录 💯前言💯OpenAI官方提示词的介绍OpenAI官方提示词的结构与组成如何通过分析提示词找到其核心组件 💯OpenAI官方提示词分析案例一:制定教学计划案例二&…...

【linux】端口监听和终止进程
端口监听和终止进程 有时候,即使进程看起来已经关闭,它可能仍然占用着端口。你可以使用 netstat -tulpn | grep <端口号> 来查看哪个进程正在使用该端口,然后使用 kill -9 来强制关闭该进程。 [naienotebook-npu-b1bb152e-7655cb9d4…...

【网络安全】|kali中安装nessus
1、使用 df -h 命令查看磁盘使用情况,确保磁盘容量大于40G 简单粗暴办法:重装系统,装系统中注意磁盘空间相关的选项 //磁盘扩容:https://wiki.bafangwy.com/doc/670/ 2、安装 nessus 安装教程 https://blog.csdn.net/Cairo_A/a…...

Docker可视化管理面板DPanel的安装
本文软件由网友 rui 推荐; 什么是 DPanel ? DPanel 是一款 Docker 可视化管理面板,旨在简化 Docker 容器、镜像和文件的管理。它提供了一系列功能,使用户能够更轻松地管理和部署 Docker 环境。 软件特点: 可视化管理&…...

【android12】【AHandler】【3.AHandler原理篇AHandler类方法全解】
AHandler系列 【android12】【AHandler】【1.AHandler异步无回复消息原理篇】-CSDN博客 【android12】【AHandler】【2.AHandler异步回复消息原理篇】-CSDN博客 其他系列 本人系列文章-CSDN博客 1.简介 前面两篇我们主要介绍了有回复和无回复的消息的使用方法和源码解析&a…...

使用Docker Compose构建多容器应用
💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 使用Docker Compose构建多容器应用 引言 Docker Compose 简介 安装 Docker Compose 创建基本配置 运行多容器应用 查看服务状态 …...

面试知识目录
面试知识目录 八股文 java基础 java反射java HashMap面向对象多线程虚拟机内存 SpringMybatisMySQLPostgresqlSQL优化Nosql...

Rust移动开发:Rust在Android端集成使用介绍
Andorid调用Rust 目前Rust在移动端上的应用,一般作为应用sdk的提供,供各端使用,目前飞书底层使用Rust编写通用组件。 该篇适合对Android、Rust了解,想看如何做整合,如果想要工程源码,可以评论或留言有解疑…...

vue3动态监听div高度案例
案例场景 场景描述:现在左边的线条长度需要根据右边盒子的高度进行动态变化 实践代码案例 HTML部分 <div v-for"(device, index) in devices" :key"index"><!-- 动态设置 .left-bar 的高度 --><div class"left-bar"…...

数据转换 | Matlab基于SP符号递归图(Symbolic recurrence plots)一维数据转二维图像方法
目录 基本介绍程序设计参考资料获取方式 基本介绍 Matlab基于SP符号递归图(Symbolic recurrence plots)一维数据转二维图像方法 符号递归图(Symbolic recurrence plots)是一种一维时间序列转图像的技术,可用于平稳和非平稳数据集;对噪声具有…...

分类算法——逻辑回归 详解
逻辑回归(Logistic Regression)是一种广泛使用的分类算法,特别适用于二分类问题。尽管名字中有“回归”二字,逻辑回归实际上是一种分类方法。下面将从底层原理、数学模型、优化方法以及源代码层面详细解析逻辑回归。 1. 基本原理 …...

只允许指定ip远程连接ssh
我们都会使用securtcrt或者xshell等软件进行远程登录,这样虽然会给我们带来很多便捷,但是同样会存在一定的风险。有很多人专门通过重复的扫描试图破解我们的linux服务器,从而获取免费的“肉鸡”。因此我们可以通过设置hosts.allow和hosts.den…...

Rust 力扣 - 2841. 几乎唯一子数组的最大和
文章目录 题目描述题解思路题解代码题目链接 题目描述 题解思路 我们遍历长度为k的窗口,用一个哈希表记录窗口内的所有元素(用来对窗口内元素去重),我们取哈希表中元素数量大于等于m的窗口总和的最大值 题解代码 use std::coll…...