【密码学】全同态加密基于多项式环计算的图解

全同态加密方案提供了一种惊人的能力 —— 能够在不知道数据具体内容的情况下对数据进行计算。这使得你可以在保持潜在敏感源数据私密的同时,得出问题的答案。

  

这篇文章的整体结构包括多项式环相关的数学介绍,基于多项式环的加密和解密是如何工作的,同态加法和乘法如何实现的。

原文来源:https://humanata.com/blog/illustrated_primer/#homomorphic-operations,现在已经无法访问。

前言        

        这些全同态加密方案【BFV、BGV、CKKS】都是基于一个称为Ring learning with errors(RLWE)的困难计算问题。

        本质上,这些方案中的数据在加密时(密文)和未加密时(明文)都用多项式表示。如: 4x^2 + 2x + 1

        与我们常学的多项式有一些不同,首先系数都是整数,余数是相对于某个整数 t 的余数(对 t 取模)。假设 t=24 ,那么一个24小时的时钟,21加6小时得到3小时。所有多项式的系数都是这样处理的。

        另外,我们可以将数字的取值范围设为-11到12,以便方便地对数字求反。请注意,这只是一个方便因素—— −1 的余数和23的余数(除以24)没有区别。

        第二个,也是比较棘手的,这些多项式的不同之处是使用余数的想法不仅适用于多项式的系数,也适用于多项式本身。

        我们定义了一个特殊的多项式,称为多项式模,并且只考虑多项式被该多项式模除后的余数。在BFV方案中,这个多项式模的具体形式是 x^d+1 ,其中 d=2^n 。对于一些 ,为了说明问题,我们取 n =4 ,因此多项式为 x^d+1

        因为我们考虑的是关于 x^d+1 的余项,所以我们只需要考虑幂次为 x^0x^{15}的多项式。任何较大的幂都会被多项式模除掉。这也可以通过考虑x^{16} \equiv -1\ (mod\ x^{16}+1)来理解,这意味着x^{16}可以用 −1 代替,以将 x 的较大幂次减少到0到15的范围内。

        我们考虑的所有多项式都是这种形式: 

        其中16个系数 a_i 可以从0到 t−1 。可以用一个由系数组成的环面来说明这一点,如下所示:

        在这个图中,每个环,代表多项式中出现的 的一个幂的24个系数的可能值。绿色的点表示系数0的位置。这为我们提供了一种很好的方式来可视化多项式,这将有助于我们在下面考虑加密和解密步骤的工作原理。

        BFV加密方案涉及大量的多项式乘法运算。当我们将x的两个幂相乘时,例如 2x^{14}x^4 ,我们将它们的指数相加——得到2x^{18} 。有人可能会假设,要找到关于多项式模的多项式余数,可能只需要将指数从 0 旋转到 x^{16},得到 2x^2 ,就像上面所示的整数系数一样。这就是多项式模为 x^d 时的情况。然而,我们的多项式模是 x^d+1 。如上所述,额外的 +1 因子引入了符号变化,这有助于进一步打乱乘法的结果。

        如上所述,将2x^{14} 乘以x^4x^d+1 ,取这一项(由上图的红点表示),围绕环向前旋转4次,通过0点调整系数的值,得到 22x^{2} (或 -2x^{2},如果考虑数值从-12到11而不是0到23)。

首先,2x^{14} 乘以x^4,根据幂运算法则,指数相加,得到 2x^{18}

在模 x^{16}+1 的情况下, x^{18}可写成 x^{16}\cdot x^{2}。又因为 x^d+1 ,所以x^{16}x^d+1 为 -1。

那么x^{18}=x^{16}\cdot x^{2}x^d+1 就变为-1\cdot x^{2}=-x^{2}。而前面的系数2乘以-1得到-2。

如果我们考虑数字从0到23,那么-2等价于22(在模24的情况下),所以结果是22x^{2}。如果我们考虑数字从 -12 到 11,那么结果是-2x^{2}

        这种形式的多项式具有非常丰富的结构和许多优良的性质。它们是分圆多项式的子集。严格来说,将它们中的一个用作多项式模并不是必需的,但这样做可以提供许多便利和加速。

基于多项式环的加解密

        我们已经介绍了用于BFV方案的多项式环的一些性质,现在我们可以讨论其加密和解密的工作原理。首先,我们需要讨论如何生成私钥和公钥,然后讨论如何使用它们进行加密和解密。

公钥和私钥

        加密接收明文,并使用由私钥派生的公钥将其转换为密文,这种从明文到密文的转换只有当你知道私钥的情况下才容易逆转,即从密文还原回明文。

        更具体地说,明文是环上的多项式,其具有多项式模 x^d+1,其中d = 2^n,以及系数模 t。明文加密后为密文,其是由两个环上的、具有相同多项式模的多项式构成的,但系数模为 q,通常 q 远大于 t

        例如,多项式模为 x^{4096} + 1,这意味着明文和密文中的多项式都有 d = 4096 个系数。明文多项式的系数需要模 t = 290764801,密文多项式的系数需要模 q = 9214347247561474048 或更大。

        出于演示目的,我们将使用小得多的数字,但希望这些数字能更好地说明方案的各个步骤中发生了什么。在第一部分中,为了使事情更加直观,我们将使用 d=16, t=7, q=874。注意,这些参数是不安全的!

  • 对于私钥或密钥,我们用 s 表示,它是我们随机生成的一个系数为-1、0或1的多项式。例如:

  • 对于公钥的 pk_1 部分,我们用 a 表示,它是我们从密文空间中随机生成一个多项式,其系数模为q。例如:

  • 误差多项式(噪音),我们用 e 表示,系数很小,来自离散高斯分布。这个多项式在这里使用一次,然后丢弃。例如:

        然后,公钥被定义为一对多项式pk = (pk_0, \ pk_1) = ([-as+e]_q,\ a),其中,多项式运算是求多项式模和系数模 q 的运算。

对于上面给出的示例,公钥的第一个多项式被构造为:

        其中第一个乘法取多项式 a,它的系数来自于对 q 取模的整个范围,然后乘以系数为-1、0或1的 s。由于模上多项式模的多项式的乘法具有“旋转和反射”性质,有效地混合和打乱了 a 的所有系数,并进一步增加了小的噪音。多项式 a 有效地掩盖了公钥中的私钥。

        从公钥破解加密方案基本上需要从 ([-as+e]_q, \ a) 对中计算出 s。唯一的因素是该方案中包含了噪音——如果 e 为零,则很容易从公钥中计算出  s。当 e 足够大,但又不太大时,这是一个难题。

        本文的示例中,私钥可以通过暴力攻击恢复——−尝试每个可能的  s (只有3 ^ 16 = 43046721组合)然后计算 as + e 来寻找出一个接近公钥的第一项的答案。对于真正的参数,这种暴力攻击的方法是完全不可行的。3 ^ 4096 是一个很大的数字,但有更聪明的方法,然后定义给定的一组参数的安全性。

加密

        加密过程看起来有点像公钥生成过程。加密需要一个明文,它是一个系数为模 t 的多项式 ,并将其转换为一对系数为模 q 的多项式。为了说明这一点,我们将加密一个只有两个非零系数的非常简单的多项式消息: m=3+4x^8\equiv 3-3x^8

        加密还需要三个小的多项式。两个误差多项式来自于与公钥误差多项式相同的离散高斯分布,分别为 e_1, e_2,另一个多项式我们称之为 u,它的系数为-1、0或1,就像私钥一样。

        这些多项式只在加密过程中使用,然后丢弃。

        密文由两个多项式表示,计算为: ct=([pk_0u+e_1+qm/t]_q,[pk_1u+e_2]_q)

        请注意消息中的值是在mod t的范围内,而在我们的示例中,它们被缩放为q/t (即128),使它们覆盖mod q的范围。这是消息被插入到密文时的唯一更改。这些值通过添加到第一项来掩盖,第一项的值是在mod q的范围内,与随机的噪音没有区别。u的随机性改变了每次加密中使用的掩码,从而确保相同的明文在每次加密时产生不同的密文。

Note:同态加法和乘法之所以可行,是因为消息仅以缩放的形式存在于密文中。其他项的作用是隐藏消息,并且在只有知道秘密密钥才能移除这些项的情况下,它们在隐藏消息方面被证明是有效的。

        使用上面给出的多项式显式计算密文的第一个元素:

        在密文的第一项中展开公钥,我们看到: ct_0=[e_1+e \cdot u - a\cdot u\cdot s+q \cdot m/t]_q。在这个表达式中,前两项是“小”的,与误差项成比例,后两项是“大”的。第一个大项有效地隐藏了第二个项,也就是明文多项式消息。

        密文的第二个元素是这样计算的:

        在密文的第二个元素中展开公钥,我们可以看到 ct_1=[a \cdot u+e_2]_q 。这展示了解密是如何工作的—如果我们知道 s,我们可以计算 ct_1 \cdot s=[a \cdot u \cdot s+e_2 \cdot s]_q,这可以用来删除密文第一个元素中的非消息大项。

        综上所述,密文可以用公钥、私钥、掩码、噪声和消息表示为:

解密

        如上所述,解密相对简单。首先,我们计算 [ct_0+ct_1 \cdot s]_q ,这将完全从消息中删除掩码。这给了我们一个扩展为 [q\cdot m/t+e_1+e\cdot u+e_2\cdot s]_q 的多项式,即缩放后的信息加上一些噪声项。因此,只要噪声项不是太大,我们就可以恢复消息。

        从图中可以看出,除了两个非零系数( x^8x^0 )外,明文的所有系数都小于q/t=128 。如果我们将这个多项式缩放回对 t 取模的范围,那么我们有:

        四舍五入这些系数恢复我们的消息 m=3-3x^8

        我们通过将近似系数四舍五入后缩放到最接近的整数对应值来获得我们的消息:

绿色-噪音、粉色-近似解

        把这些放在一起,我们通过计算来解密密文:{m}'=[ \left \lfloor q[ct_0+ct_1 \cdot s]_q \right \rceil]_t\left \lfloor \right \rceil 表示舍入到最接近的整数。

        如果系数中噪声太大,那么它们最终会更接近一个与正确整数不同的整数,然后解密将(悄无声息地)失败并产生错误的结果。在上面的例子中,最大的误差是 23/128 ,所以仍然有一些空间允许产生更多的噪音,并且能够正确的解密。可以通过使 q/t比值变大或变小来调整噪声空间净含量。

同态操作

        人们对这类密码体制如此感兴趣的一个主要原因是,它们允许同态加法和乘法(来自希腊语 homo - same,表示"相同" 和 morphe - shape,表示"形态")。这意味着您可以在数字仍然加密的情况下进行加法和乘法运算,而不必先解密。这是一个令人惊叹的功能,有望在数据保护和安全方面构建一个新的黄金标准。

同态加法

        最简单的情况是两个加密数字的相加。假设我们已经用相同的公钥加密了两个多项式 m_1m_2 :

a=([pk_0u_1+e_1+qm_1/t]_q,[pk_1u_1+e_2]_q), \\ b=([pk_0u_2+e_3+qm_2/t]_q,[pk_1u_2+e_4]_q)

        注意,我们需要使用两个不同的小多项式 u_1 和 u_2 ,以及4个小噪声多项式 e_1, e_2, e_3, e_4 来做到这一点。如果我们只是添加相应的密文元素,我们得到一个新的密文:

a+b= \\ ([pk_0(u_1+u_2)+(e_1+e_3)+q(m_1+m_2)/t]_q, [pk_1(u_1+u_2)+(e_2+e_4)]_q)

        由于消息仅存在于具有缩放的密文中,因此加法的结果与加密 m_1+m_2 的形式相同,只是增加了新的噪音:

c=([pk_0(u_3)+(e_5)+q(m_1+m_2)/t]_q,[pk_1(u_3)+(e_6)]_q)

        大致的解密(舍入之前)将为: [q(m_1+m_2)/t+e_5+eu_3+e_6s]_q。这意味着只要新的噪声项不太大,消息 m_1+m_2 就能正确解密。其中噪声有三种类型:

e_5 = e_1 + e_3 \\ eu_3 = e(u_1+u_2) \\ e_6s = (e_2+e_4)s

        我们担心的是,当这些项变得足够大,以至于噪音多项式中的一个系数大于 q/(2t) 时,解密就会失败,因为解密过程结束时的四舍五入操作会四舍五入到错误的数字。

        如果我们只考虑第一项,那么我们就把来自离散高斯分布的多项式中的系数相加。这意味着在某些情况下,我们会把一个负系数加到一个正系数上,结果会更接近于零。在其他情况下,系数会有相同的符号,所以结果会更大。我们可以做很多的同态加法,看看噪音是如何随着加法的数量增加而增加的,这是很有指导意义的。系数的分布如下图所示,其中我们添加了1、5和30个噪音多项式(随机地进行了数百次试验)。

        当我们添加了30个噪音多项式时,某些系数有可能会大于64,即超过了q/t的一半,所以解密不会产生正确的结果。

        另外两项表示不同的情况 —— 第二项是一个噪音多项式乘以一些“小的多项式”(系数为-1、0或1)的总和。这种乘法会产生更大的噪音。一个噪音多项式和一个小的多项式的乘积的系数大约将是随机正负号的噪音多项式系数的2/3rds的总和。这意味着这个噪音与多项式的最高次的平方根 \sqrt n 一致。

        对这一项绘制与上面相同的分布可以看出,它比第一项大得多,而且即使对于我们示例中的参数,也存在错误解密的危险,即使只是添加了几个参数。

        第三项是类似的 —— 一组噪音多项式之和,乘以一个“小的多项式”。它的噪音分布是这样的: 

        结合起来,我们可以画出这三项的最大系数的增长,作为已经发生的加法数量的函数。这是一个须状图,给出了这些最大值的可变性。(注意噪音的均值接近于零,这是最大系数的幅值分布) 

        这表明,对于我们所选择的参数,由两个以上加法产生的密文,解码错误的概率很高,而且两次加法失败的概率也很高。这是因为有时最大错误大于64,当q/t = 128时,会导致不正确的解密,就像这里一样。为了给这样的操作提供更多的空间,我们需要使用更大的q/t比值,这可以应对通常由所执行的操作数量引入的噪音量。

        不幸的是,由密文的同态乘法引入的噪音量又要大得多。

同态乘法

        我们首先回顾下公钥和密文形式:pk = (pk_0,\ pk_1) =([-as+e]_q,\ a)ct=([pk_0u+e_1+qm/t]_q,[pk_1u+e_2]_q)。以及解密初级形态为 [ct_0+ct_1 \cdot s]_q

        同态乘法在程序上很简单,但是比加法复杂得多。如上所述,消息以 qm_1/t 的比例出现在密文的第一个元素中。因此,将两个密文的第一个元素相乘,再乘以t/q,就会得到一个带有 qm_1m_2/t 的项——如果我们仍然能够除去掩码项,这个项就可以恢复。

        因此,要理解同态乘法的机制,关键在于了解如何从密文的乘积中去掉掩码项。要做到这一点,我们的想法是把密文看作是私钥 s 的幂次方的一个简单多项式。这是这篇文章中使用多项式的第三种不同的方法,虽然它有点令人困惑,但是它是理解同态乘法如何工作的关键。

        我们可以写出解密过程的第一部分,使密文的每个元素都是 s 的多项式的系数:[ct_0 + ct_1s^1]_q

        请记住, ct和 s 本身就是多项式,所以这个方程是一个多项式乘以一个多项式 (s^0)加上一个多项式乘以另一个多项式(s^1),然后所有这些都取多项式模 x^d+1和系数模 q

        现在,我们在上面看到解密产生了一个与掩码项 au无关的量:[ct_0 + ct_1s^1]_q \rightarrow \frac{q}{t}m + noise

        好了,现在考虑两个密文 a 和 b,它们被定义为两个消息 m_1 和 m_2 的加密,它们可以被解密:

[a_0 + a_1s^1]_q \rightarrow \frac{q}{t}m_1 + n_1 \\\ [b_0 + b_1s^1]_q \rightarrow \frac{q}{t}m_2 + n_2

        其中 n_1 和 n_2 表示密文中的噪声。

        如果我们取它们的乘积,我们有: [a_0 + a_1s^1]_q[b_0 + b_1s^1]_q \rightarrow (\frac{q}{t}m_1 + n_1)( \frac{q}{t}m_2 + n_2)

右边的表达式与计算 a 和 b 所用的掩码无关,所以左边也必须与它们无关。如果我们把左边展开成 s 的形式(为了方便起见,再乘以 t/q )就得到了: mult(a,b)= c_0 + c_1s + c_2s^2,其中 c_0 = [\frac{t}{q}a_0b_0 ]_qc_1 = [\frac{t}{q}(a_1b_0+a_0b_1) ]_qc_2 = [\frac{t}{q}a_1b_1]_q

        这样做意味着我们可以计算出一个新的密文的组成部分,它比原来的密文多一个元素,并且可以正确地使用密钥 s 的幂次方进行解密。

        解密的形式展开如下: [ \left \lfloor t/q[ct_0s^0+ct_1s^1+ct_2s^2]_q\right \rceil]_t

        这只是增加了一个项,该项是一个多项式乘以另一个多项式的平方。这里需要处理大量的细节追踪工作,但这只是学校水平的代数运算(当然,不包括模数部分!)。这是一种解密步骤的推广,它允许我们解密同态乘法的结果。

        要了解这一切是如何显式地工作的,请考虑 a 和 b 在加密过程中的展开式:

a=([pk_0u_1+e_{11}+qm_1/t]_q,[pk_1u_1+e_{12}]_q), \\ b=([pk_0u_2+e_{21}+qm_2/t]_q,[pk_1u_2+e_{22}]_q)

        如果我们展开乘法的定义,同时对结果进行部分解密(即解密到除以 q/t 和整数之前),那么得到的表达式就很复杂。但是,由于每个密文的组件都是在解密过程中被构造成能够删除掩码项( au_i )的,所以这个展开的结果完全不依赖于来自公钥的掩码项!!!

得到的表达式如下:

ct_0s^0+ct_1s^1+ct_2s^2 \\ = \frac{q}{t}m_1m_2 + e_{22}m_1s+e_{12}m_2s+em_2u_1+em_1u_2+e_{21}m_1+e_{11}m_2 \\ + \frac{t}{q}e^2u_1u_2 + \frac{t}{q}e_{12}e_{22}s^2 + \frac{t}{q}e_{22}esu_1 + \frac{t}{q}e_{12}esu_2 \\ \frac{t}{q}e_{12}e_{21}s + \frac{t}{q}e_{11}e_{22}s + \frac{t}{q}e_{21}eu_1 + \frac{t}{q}e_{11}eu_2 + \frac{t}{q}e_{11}e_{21}

        这里有很多项,但是现在我们已经去掉了掩码,问题是,噪音(除了第一个)与 q/(2t) 的“噪音预算”相比有多大?

        为了感受这一点,我们模拟了大量加密的随机信息的乘法, d = 16, t = 7, q = 7168 = 1024 \times t。各类型噪音的系数大小分布如下图所示。请注意,总的噪音需要大于 q/(2t) = 512 才能导致解密错误。在这些项中,涉及噪音多项式的项、消息和私钥, e_{22}m_1s + e_{12}m_2s 是最大的贡献者。

        上图显示,对于这些参数,最大的贡献来自于包含噪音多项式乘以消息多项式和私钥的项。这种噪音的最大系数约为300。这里有两项,其他的项更小。把所有的噪音合并成一个,就得到了乘法结果的总噪音。这些系数的分布如下图所示: 

重线性化

        上面概述的乘法策略允许我们进行多次乘法,但代价是每次乘法都将密文的大小增加一个多项式。密文在大小上增长可能是一个问题。事实证明,有一些方法可以将密文的大小还原为两个多项式,但代价是增加噪声。这就是所谓的 Relinearisation(重线性化),因为你要去掉 s 多项式中的二次项和更高的项。

        另一项使这种加密方案切实可行的重要技术是将多个消息打包到一个明文中(单指令多数据(SIMD)),通过并行化提高吞吐量。

结论

        粗略地说,加密是将消息隐藏在一个环上的多项式中,并添加一些噪音。每个密文都包含足够的信息,可以在给定私钥的情况下除去自己的掩码。因为密文只涉及到消息的缩放,所以仍然可以对它们执行加法和乘法,并使用一些巧妙的结构来在之后移除掩码。该方案的安全性来自于在不知道私钥的情况下,在噪声存在的情况下很难去除掩码。这个问题的难度具有一些优秀的安全性能,例如没有已知的量子算法来攻击这些系统。

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

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

相关文章

[java][框架]springMVC(1/2)

目标 知道SpringMVC的优点编写SpringMVC入门案例使用PostMan发送请求掌握普通类型参数传递掌握POJO类型参数传递掌握json数据参数传递掌握响应json数据掌握rest风格快速开发 一、SpringMVC简介 1 SpringMVC概述 问题导入 SpringMVC框架有什么优点? 1.1 Spring…

基于STM32健康监控系统/智能手环/老人健康检测系统/心率血氧血压

基于STM32健康监控系统/智能手环/老人健康检测系统/心率血氧血压 持续更新,欢迎关注!!! 基于STM32健康监控系统/智能手环/老人健康检测系统/心率血氧血压 随着人民生活质量的提高和生活节奏的加快,人体健康监测成为全球关注的焦点之一。基于物联网的人体…

百度文心智能体:巧用汉字笔画生成与汉字搜索插件,打造一个学习汉字的教育类智能体

这篇文章,主要介绍如何巧用汉字笔画生成与汉字搜索插件,打造一个学习汉字的教育类智能体。 目录 一、教育类智能体 1.1、智能体演示 1.2、智能体插件 1.3、智能体prompt (1)角色和目标 (2)思考路径 …

质数筛c++

题目描述 输入 nn 个不大于 10^510^5 的正整数。要求全部储存在数组中,去除掉不是质数的数字,依次输出剩余的质数。 输入格式 第一行输入一个正整数 nn,表示整数个数。 第二行输入 nn 个正整数 aiai​,以空格隔开。 输出格式…

Efficient Cascaded Multiscale Adaptive Network for Image Restoration 论文阅读笔记

Efficient Cascaded Multiscale Adaptive Network for Image Restoration 论文阅读笔记 这是新国立和新加坡管理大学发表在ECCV2024上的一篇image restoration的文章,提出了一个新的网络结构ECMA,从实验结果上看在超分,去噪,去模糊…

AI伦理挑战:应对之道

AI伦理挑战:应对之道 人工智能(AI)如同一把双刃剑,它在为生活带来便利的同时,也引发了深刻的伦理挑战。今天,我们将深入探讨AI发展的伦理挑战,以及我们应当如何加以应对。这不仅是技术发展的要…

Python | Leetcode Python题解之第525题连续数组

题目: 题解: class Solution:def findMaxLength(self, nums: List[int]) -> int:# 前缀和字典: key为1的数量和0的数量的差值,value为对应坐标hashmap {0:-1}# 当前1的数量和0的数量的差值counter ans 0for i,num in enumerate(nums):# 每多一个1…

Decision Tree Regressor (决策树) --- 论文实战

一、前言 在《机器学习论文复现实战---linear regression》中通过Pearson 相关性分析,去除了2个高相关性特征 "PN" 和 "AN" ,数据维度变为890*25。(数据集地址) 这里我们不做前期处理,直接就将数据放入 DecisionTreeRegressor 模型中进行训练了。 二…

微服务架构深入理解 | 技术栈

微服务架构深入理解 | 技术栈 服务网关 服务网关是在微服务架构中扮演重要角色的组件,它是系统对外的入口,负责接收和处理客户端的请求,并将请求路由到相应的微服务。服务网关常常与API管理、负载均衡、安全认证、流量控制等功能结合&#xf…

Java日志脱敏——基于logback MessageConverter实现

背景简介 日志脱敏 是常见的安全需求,最近公司也需要将这一块内容进行推进。看了一圈网上的案例,很少有既轻量又好用的轮子可以让我直接使用。我一直是反对过度设计的,而同样我认为轮子就应该是可以让人拿去直接用的。所以我准备分享两篇博客…

目标追踪DeepSort

一、卡尔曼滤波 你可以在任何对某个动态系统有 “不确定信息” 的地方使用卡尔曼滤波器,并且可以对系统下一步的行为做出 “有根据的猜测”。即使混乱的现实干扰了你所猜测的干净运动,卡尔曼滤波器通常也能很好地确定实际发生了什么。它还可以利用你可能…

数据结构与算法——Java实现 53.力扣938题——二叉搜索树的范围和

生命的意义 在于活出自我 而不是成为别人眼中的你 —— 24.11.3 938. 二叉搜索树的范围和 给定二叉搜索树的根结点 root,返回值位于范围 [low, high] 之间的所有结点的值的和。 示例 1: 输入:root [10,5,15,3,7,null,18], low 7, high 15 …

微信小程序scroll-view吸顶css样式化表格的表头及iOS上下滑动表头的颜色覆盖、z-index应用及性能分析

微信小程序scroll-view吸顶css样式化表格的表头及iOS上下滑动表头的颜色覆盖、z-index应用及性能分析 目录 微信小程序scroll-view吸顶css样式化表格的表头及iOS上下滑动表头的颜色覆盖、z-index应用及性能分析 1、iOS在scroll-view内部上下滑动吸顶的现象 正常的上下滑动吸顶…

免费好用又好看且多端自动同步第三方终端工具Termius你值得拥有

使用目的: 本地终端功能一样,都是为了登录服务器查看日志等操作。 本地终端 优点:方便简单,无需额外下载安装、免费。 缺点:每次都需要重新登陆输入命令,步骤繁琐无法简化;不能跨端同步。 第…

Unity引擎材质球残留贴图引用的处理

大家好,我是阿赵。   这次来分享一下Unity引擎材质球残留贴图引用的处理 一、 问题 在使用Unity调整美术效果的时候,我们很经常会有这样的操作,比如: 1、 同一个材质球切换不同的Shader、 比如我现在有2个Shader,…

【electron+vue3】使用JustAuth实现第三方登录(前后端完整版)

实现过程 去第三方平台拿到client-id和client-secret,并配置一个能够外网访问回调地址redirect-uri供第三方服务回调搭建后端服务,引入justauth-spring-boot-starter直接在配置文件中定义好第一步的三个参数,并提供获取登录页面的接口和回调…

Jetson OrinNX平台CSI相机导致cpu load average升高问题调试

1. 前言 硬件: Orin NX JP: 5.1.2, R35.4.1 用v4l2-ctl --stream-mmap -d0 命令去获取相机数据时, 用top查看cpu使用情况, CPU占用率很低,但load average在1左右, 无任何程序运行时,load average 为0 用ps -aux 查看当前进程情况,发现有两个系统进程vi-output, …

ComfyUI | FLUX-ControlNet,FLUX-LoRA和FLUX-IPAdapter等工作流【附下载】

本文重点提要 本文将介绍Flux模型及安装指引,文末附所有工作流下载方式ComfyUI FLUX工作流分享:包含FLUX Txt2Img、FLUX Img2Img、FLUX LoRA、FLUX ControlNet、FLUX Inpainting、FLUX NF4和Upscale、FLUX IPAdapter、Flux LoRA训练器、Flux Latent UpscalerFLUX简介 1.1 前…

第六十三周周报 GGNN

文章目录 week63 GGNN摘要Abstract一、文献阅读1. 题目2. abstract3. 网络架构3.1 数据处理部分3.2 门控图神经网络3.3 掩码操作 4. 文献解读4.1 Introduction4.2 创新点4.3 实验过程4.3.1 传感器设置策略4.3.2 数据集4.3.3 实验设置4.3.4 模型参数设置4.3.5 实验结果 5. 结论总…

【Linux】从零开始使用多路转接IO --- poll

碌碌无为,则余生太长; 欲有所为,则人生苦短。 --- 中岛敦 《山月记》--- 从零开始使用多路转接IO 1 前言1 poll接口介绍3 代码编写4 总结 1 前言 上一篇文章我们学习了多路转接中的Select,其操作很简单,但有一些缺…