BFV同态加密方案初步学习

news2024/11/19 5:46:00

BFV是把Bra12的LWE版本推到了RLWE版本,Bra12也可以叫做BFV。

经典的RLWE的公钥加密算法回顾

对比以前的Regev的LWE公钥加密方案,其实几乎只是把明文空间换了,也就是在最大比特编码的时候把2换成t,即, Δ = ⌊ q / t ⌋ \Delta = \lfloor q/t \rfloor Δ=q/t。同时这里的 q q q是没有限制的,也就是可以使用2的幂次来简化运算。
在这里插入图片描述

这里可以这样看 s = ( 1 , s ) \mathbf s = (1,\mathbf s) s=(1,s), c t = ( c 0 , c 1 ) \mathbf {ct}=(\mathbf c_0,\mathbf c_1) ct=(c0,c1)
对于正确性验证
c 0 + c 1 ⋅ s = p 0 ⋅ u + e 1 + Δ ⋅ m + p 1 ⋅ u + e 2 = − a ⋅ s ⋅ u + e ⋅ u + e 1 + Δ ⋅ m + a ⋅ s ⋅ u + e 2 ⋅ s = Δ ⋅ m + e ⋅ u + e 1 + e 2 ⋅ s ( m o d    q ) \begin{aligned}\mathbf c_0+\mathbf c_1 \cdot \mathbf s &= \mathbf p_0 \cdot \mathbf u +\mathbf e_1 + \Delta \cdot \mathbf m + \mathbf p_1 \cdot \mathbf u +\mathbf e_2 \\ &= -\mathbf a \cdot \mathbf s \cdot \mathbf u + \mathbf e \cdot \mathbf u +\mathbf e_1 + \Delta \cdot \mathbf m + \mathbf a \cdot \mathbf s \cdot \mathbf u + \mathbf e_2 \cdot \mathbf s \\ &= \Delta \cdot \mathbf m +\mathbf e \cdot \mathbf u +\mathbf e_1 + \mathbf e_2 \cdot \mathbf s (\mod q) \end{aligned} c0+c1s=p0u+e1+Δm+p1u+e2=asu+eu+e1+Δm+asu+e2s=Δm+eu+e1+e2s(modq)
可以看到这里的噪声似乎与 u \mathbf u u s \mathbf s s有关,如果将这两个取的小一点,能够一定程度上减低噪声。
另外,将噪声用 v = e ⋅ u + e 1 + e 2 ⋅ s \mathbf v = \mathbf e \cdot \mathbf u +\mathbf e_1 + \mathbf e_2 \cdot \mathbf s v=eu+e1+e2s表示,能够得到 [ c 0 + c 1 ⋅ s ] q = Δ ⋅ m + v [\mathbf c_0+\mathbf c_1 \cdot \mathbf s ]_q =\Delta \cdot \mathbf m + \mathbf v [c0+c1s]q=Δm+v,与此同时若取样的 χ ≤ B \chi \le B χB的话,我们将得到噪声的界限,即 v ≤ 2 ⋅ B 2 ⋅ δ R + B \mathbf v \le 2\cdot B^2 \cdot \delta_R+B v2B2δR+B,其中 δ R \delta_R δR表示扩张因子
δ R = max ⁡ { ∥ a ⋅ b ∥ ∥ a ∥ ⋅ ∥ b ∥ : a , b ∈ R } \delta_{R}=\max \left\{\frac{\|a \cdot b\|}{\|a\| \cdot\|b\|}: a, b \in R\right\} δR=max{abab:a,bR},其中的 ∣ ∣ a ∣ ∣ = m a x i ∣ a i ∣ ||a||=max_i|a_i| a=maxiai为无穷范数。

同态方案

方案是基于前面的LPR.ES方案的,作为优化,该方案增加了一个重线性化,将 u \mathbf u u s \mathbf s s的取值范围变为 R 2 \mathbb R_2 R2,即它们的范数为1,其他基本一致
借用BV11里面的思想,将解密过程看作一个解密函数,即得到,
[ c t ( x ) ] q = [ c 0 + c 1 ⋅ x ] q [\mathbf {ct}(\mathbf x)]_q=[\mathbf c_0+\mathbf c_1 \cdot \mathbf x ]_q [ct(x)]q=[c0+c1x]q
代入密钥就能得到明文
[ c t ( s ) ] q = Δ ⋅ m + v [\mathbf {ct}(\mathbf s)]_q= \Delta \cdot \mathbf m + \mathbf v [ct(s)]q=Δm+v

同态乘法

来看看核心的乘法运算
在这里插入图片描述

该定理表明,乘法时,噪声不是呈平方增长,而是大致上乘以了一个系数 2 ⋅ t ⋅ δ R 2 ⋅ ∣ ∣ s ∣ ∣ 2\cdot t\cdot \delta_R^2\cdot||\mathbf s|| 2tδR2s,也就是线性增长,从表达式里能看到,对噪声有显著影响的是 t t t s \mathbf s s的范数。(具体引理证明感兴趣可以去原文看看😇)

重线性化

然后用BV11中的函数思想,两个函数相乘得到的将是三项,成为二次函数,需要执行重线性化让它还原为两项也就是一次式。
假设一个二阶的密文为 [ c 0 , c 1 , c 2 ] [\mathbf c_0,\mathbf c_1,\mathbf c_2] [c0,c1,c2],线性化的目的是将它变成一阶的 [ c 0 ′ , c 1 ′ ] [\mathbf c'_0,\mathbf c'_1] [c0,c1] [ c 0 + c 1 ⋅ s + c 2 ⋅ s 2 ] q = [ c 0 ′ + c 1 ′ ⋅ s + r ] q \left[\mathbf{c}_{0}+\mathbf{c}_{1} \cdot \mathbf{s}+\mathbf{c}_{2} \cdot \mathbf{s}^{2}\right]_{q}=\left[\mathbf{c}_{0}^{\prime}+\mathbf{c}_{1}^{\prime} \cdot \mathbf{s}+\mathbf{r}\right]_{q} [c0+c1s+c2s2]q=[c0+c1s+r]q,其中 r \mathbf r r很小。
由于 s 2 \mathbf s^2 s2是不可知的,所以这里选用的方式是加密一手。
为此,这里引入了一个重线性化密钥 r l k = ( [ − ( a 0 ⋅ s + e 0 ) + s 2 ] q , a 0 ) rlk=([-(\mathbf a_0 \cdot \mathbf s +\mathbf e_0)+\mathbf s^2]_q,\mathbf a_0) rlk=([(a0s+e0)+s2]q,a0),满足 r l k [ 0 ] + r l k [ 1 ] ⋅ s = s 2 + e 0 rlk[0]+rlk[1]\cdot \mathbf s =\mathbf s^2 +\mathbf e_0 rlk[0]+rlk[1]s=s2+e0

方案一(T进制分解)

第一种使用 r l k rlk rlk来转换密文的方法是令 c 0 ′ = c 0 + r l k [ 0 ] ⋅ c 2 \mathbf c'_0 = \mathbf c_0+rlk[0]\cdot\mathbf c_2 c0=c0+rlk[0]c2 c 1 ′ = c 1 + r l k [ 1 ] ⋅ c 2 \mathbf c'_1 = \mathbf c_1+rlk[1]\cdot\mathbf c_2 c1=c1+rlk[1]c2这样得到的噪声 r = e 0 ⋅ c 2 \mathbf r=\mathbf e_0 \cdot \mathbf c_2 r=e0c2(独立于密文的噪声,只是重线性化带来的噪声),但是由于 c 2 ∈ R q \mathbf c_2 \in R_q c2Rq,直接使用的话,会导致噪声被放大很多很多,所以需要进行分解。
那么这里的方法是选择一个基(独立于 t t t),将 c 2 \mathbf c_2 c2切片。即令
c 2 = ∑ i = 0 ℓ T i ⋅ c 2 ( i ) \mathbf c_2 = \sum_{i=0}^{\ell} T^i \cdot \mathbf c_2^{(i)} c2=i=0Tic2(i),其中 ℓ = ⌊ log ⁡ T ( q ) ⌋ \ell=\lfloor\log_T(q) \rfloor =logT(q),且 c 2 ( i ) \mathbf c_2^{(i)} c2(i)系数均在 R T R_T RT中,与此对应的设置重线性化密钥为 r l k = [ ( [ − ( a i ⋅ s + e i ) + T i ⋅ s 2 ] q , a i ) : i ∈ [ 0.. ℓ ] ] rlk=\left[\left(\left[-\left(\mathbf{a}_{i} \cdot \mathbf{s}+\mathbf{e}_{i}\right)+T^{i} \cdot \mathbf{s}^{2}\right]_{q}, \mathbf{a}_{i}\right): i \in[0 . . \ell]\right] rlk=[([(ais+ei)+Tis2]q,ai):i[0..]]
由此得到更新后的密文为
c 0 ′ = [ c 0 + ∑ i = 0 ℓ rlk ⁡ [ i ] [ 0 ] ⋅ c 2 ( i ) ] q  and  c 1 ′ = [ c 1 + ∑ i = 0 ℓ rlk ⁡ [ i ] [ 1 ] ⋅ c 2 ( i ) ] q \mathbf{c}_{0}^{\prime}=\left[\mathbf{c}_{0}+\sum_{i=0}^{\ell} \operatorname{rlk}[i][0] \cdot \mathbf{c}_{2}^{(i)}\right]_{q} \quad \text { and } \quad \mathbf{c}_{1}^{\prime}=\left[\mathbf{c}_{1}+\sum_{i=0}^{\ell} \operatorname{rlk}[i][1] \cdot \mathbf{c}_{2}^{(i)}\right]_{q} c0=[c0+i=0rlk[i][0]c2(i)]q and c1=[c1+i=0rlk[i][1]c2(i)]q
最终得到的噪声将为 r = ∑ i = 0 ℓ c 2 ( i ) ⋅ e i \mathbf r = \sum_{i=0}^\ell \mathbf c_2 ^{(i)}\cdot \mathbf e_i r=i=0c2(i)ei
这样操作的结果是 T T T越大, r l k rlk rlk越小,噪声 r \mathbf r r就越大,但是 T T T越小, r l k rlk rlk就会越大,那么计算速度就会变慢。同时由于重线性化的噪声独立于密文噪声,为了良好的同态,应该让噪声 r \mathbf r r的值在密文噪声的附近。
动态线性化:先选取足够小的 T T T来获取足够小的误差,当几次乘法导致误差变大后,可以选择对 T 2 T^2 T2进行线性化进行加速,也就是计算包含 T 2 T^2 T2 r l k rlk rlk,由此 r l k rlk rlk中应当包含所需的所有信息。(有点懵还,原文是这么写的)

方案二(模切换)

先给出一个能大模数的能够容纳较大误差噪声的加密版本的 s 2 \mathbf s^2 s2,然后再进行缩放来获取所需要的。
更新 r l k = ( − [ ( a ⋅ s + e ) + p ⋅ s 2 ] p ⋅ q , a ) rlk = (-[(\mathbf a \cdot \mathbf s + \mathbf e)+p \cdot \mathbf s^2]_{p \cdot q},\mathbf a) rlk=([(as+e)+ps2]pq,a),其中 a ∈ R p ⋅ q a \in R_{p \cdot q} aRpq e ← χ ′ \mathbf e \leftarrow \chi' eχ(和前面是不一样的分布)。同时密文也要更新为,
c 0 ′ ′ = [ ⌊ c 2 ⋅ r l k [ 0 ] p ⌋ ] q \mathbf c_0'' = \left[\left\lfloor\frac{\mathbf{c}_{2} \cdot \mathbf{r l k}[0]}{p}\right\rfloor\right]_{q} c0=[pc2rlk[0]]q, c 1 ′ ′ = [ ⌊ c 2 ⋅ r l k [ 1 ] p ⌋ ] q \mathbf c_1''=\left[\left\lfloor\frac{\mathbf{c}_{2} \cdot \mathbf{r l k}[1]}{p}\right\rfloor\right]_{q} c1=[pc2rlk[1]]q
简单计算能得到 c 0 ′ ′ + c 1 ′ ′ ⋅ s = c 2 ′ ′ ⋅ s 2 + r \mathbf c_0''+\mathbf c_1'' \cdot s = \mathbf c_2'' \cdot \mathbf s^2 +\mathbf r c0+c1s=c2s2+r
粗略的估算能得到 ∥ r ∥ < q ⋅ B k ⋅ δ R p + ( δ R ⋅ ∥ s ∥ + 1 ) / 2 \|\mathbf{r}\|<\frac{q \cdot B_{k} \cdot \delta_{R}}{p}+\left(\delta_{R} \cdot\|s\|+1\right) / 2 r<pqBkδR+(δRs+1)/2
动态线性化:选择足够大的 p p p来获取足够小的误差,多次乘法噪声增大后就可以通过提取 p ′ / p p'/p p/p,切换模数,来形成有效 r l k rlk rlk进行加速。

同态方案

请添加图片描述

这里方案和前面的LPR方案很类似,不同的是, s \mathbf s s u \mathbf u u的取值范围是 R 2 R^2 R2(这是为了减小噪声),多了重线性化密钥(缩减密文规模的)。
密文的形式是 c t = ( c 0 , c 1 ) \mathbf ct=(\mathbf c_0,\mathbf c_1) ct=(c0,c1),乘法其实就是两个密文对应项的乘,然后类似Bra12中的一样乘以一个缩放系数 t / q t/q t/q用于减小噪声
然后是重线性化,和之前描述的一样

请添加图片描述

要实现乘法深度为 L L L的电路,需要满足
4 ⋅ δ R L ⋅ ( δ R + 1.25 ) L + 1 ⋅ t L − 1 < ⌊ q / B ⌋ 4 \cdot \delta_{R}^{L} \cdot\left(\delta_{R}+1.25\right)^{L+1} \cdot t^{L-1}<\lfloor q / B\rfloor 4δRL(δR+1.25)L+1tL1<q/B

全同态方案

(这块儿有点迷糊,没咋看懂,后面有需要再补吧)
采用的是Gentry的Bootstrapping方法,即在噪声达到最大值之前,进行一次同态解密,使得密文具有固定的噪声,且之后仍能进行一次乘法运算。
同态解密的条件是解密电路的深度必须小于同态运算最大深度,由此,需要对上面方案的解密方案进行处理。
这里采用的是不允许解密运算中的噪声 v \mathbf v v增长到界限,而是将它限制在 Δ / μ ( μ > 2 ) \Delta/\mu(\mu>2) Δ/μ(μ>2)内,可以通过将低位全部设置为0来忽略 c t [ 0 ] \mathbf ct[0] ct[0] c t [ 1 ] \mathbf ct[1] ct[1]中的大部分,从而达到优化解密的目的。
设置后,会增加一部分误差,即,把 c t [ 0 ] \mathbf ct[0] ct[0] c t [ 1 ] \mathbf ct[1] ct[1],替换为了 c 0 = c t [ 0 ] + e 0 \mathbf c_0 =\mathbf ct[0]+\mathbf e_0 c0=ct[0]+e0 c 1 = c t [ 1 ] + e 1 \mathbf c_1 =\mathbf ct[1]+\mathbf e_1 c1=ct[1]+e1 ∣ ∣ e i ∣ ∣ < Δ / v ||\mathbf e_i||< \Delta/v ei<Δ/v)。
这样将得到一个增加了新噪声的密文 c 0 + c 1 ⋅ s = Δ ⋅ m + v + e 0 + e 1 ⋅ s + q ⋅ r \mathbf{c}_{0}+\mathbf{c}_{1} \cdot \mathbf{s}=\Delta \cdot \mathbf{m}+\mathbf{v}+\mathbf{e}_{0}+\mathbf{e}_{1} \cdot \mathbf{s}+q \cdot \mathbf{r} c0+c1s=Δm+v+e0+e1s+qr
为了约束新增加的噪声,这里定义了两个函数 abs ⁡ ( a ( x ) ) ∈ Z [ x ] \operatorname{abs}(a(x)) \in Z[x] abs(a(x))Z[x]为将系数绝对值化后的多项式,并定义函数
H ( f ) = max ⁡ { ∥ ∑ i = 0 d − 1 abs ⁡ ( x i + j   m o d   f ( x ) ) ∥ ∣ j = 0 , … , d − 1 } H(f)=\max \left\{\left\|\sum_{i=0}^{d-1} \operatorname{abs}\left(x^{i+j} \bmod f(x)\right)\right\| \mid j=0, \ldots, d-1\right\} H(f)=max{i=0d1abs(xi+jmodf(x))j=0,,d1}
对于分圆多项式如 f = x d + 1 f=x^d +1 f=xd+1,代入上面函数能得到 H ( f ) = 1 H(f)=1 H(f)=1,用 h h h代表 s \mathbf s s的汉明距离(比特中的非0个数),会得到噪声的界限是 Δ / μ + ( H ( f ) ⋅ h + 1 ) ⋅ Δ / ν \Delta / \mu+(H(f) \cdot h+1) \cdot \Delta / \nu Δ/μ+(H(f)h+1)Δ/ν,当满足条件 2 ⋅ μ ⋅ ( H ( f ) ⋅ h + 1 ) < ν ⋅ ( μ − 2 ) 2 \cdot \mu \cdot(H(f) \cdot h+1)<\nu \cdot(\mu-2) 2μ(H(f)h+1)<ν(μ2)时,密文能够正确解密。

参考

Fan, Junfeng and Frederik Vercauteren. “Somewhat Practical Fully Homomorphic Encryption.” IACR Cryptol. ePrint Arch. 2012 (2012): 144.
全同态加密BFV-(section 1-基础知识)
全同态加密BFV-(section 2-SHE)
全同态加密:BFV

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

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

相关文章

web网页设计期末课程大作业——香格里拉旅游网页设计 5页 HTML+CSS+JavaScript

家乡旅游景点网页作业制作 网页代码运用了DIV盒子的使用方法&#xff0c;如盒子的嵌套、浮动、margin、border、background等属性的使用&#xff0c;外部大盒子设定居中&#xff0c;内部左中右布局&#xff0c;下方横向浮动排列&#xff0c;大学学习的前端知识点和布局方式都有…

一起来看看AMD最新显卡驱动22.11.1!

AMD最新推出了显卡驱动22.11.1&#xff0c;可以支持新上线的使命召唤&#xff1a;战区2&#xff0c;并且还修复了一系列的问题&#xff0c;AMD忠实用户们期待了嘛~ 更新内容 支持 使命召唤&#xff1a;战区 2.0 漫威蜘蛛侠&#xff1a;迈尔斯莫拉莱斯™ 固定问题 Radeon™ RX 6…

【mycat】mycat水平分表

mycat完成水平拆分 简介 相对于垂直拆分&#xff0c;水平拆分不是将表做分类&#xff0c;而是按照某个字段的某种规则来分散到多个库之中&#xff0c;每个表中包含一部分数据。简单来说&#xff0c;我们可以将数据的水平切分理解为是按照数据行的切分&#xff0c;就是将表中的…

【Try Hack Me】内网专项---Wreath

THM 学习笔记 【Try Hack Me】内网专项—Wreath &#x1f525;系列专栏&#xff1a;Try Hack Me &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f4c6;首发时间&#xff1a;&#x1f334;2022年11月17日&#x1f334; &#x1f36d;作…

编程基础都要懂的计算机组成

学习目标: 1. 能够说出计算机有那两部分组成 2. 能够说出操作系统的作用 1.1计算机组成 计算机是可以进行数值计算和逻辑运算, 并且具有存储功能的电子机器. 计算机由硬系统件和软件系统组成. 1.1.1 硬件系统 主要分为主机和外设两部分, 是指那些构成计算机系统的物理实体,…

123456

hostname web1 bash 113.219.215.44 ctyun/Ctyun2022 cd /data/html/ tar -cvf /home/ctyun/html_zy.tar ./ mysqldump -uctyun -p --skip-lock-tables -R ultrax>ultrax_zhouyue.sql cd /etc/httpd tar -cvf /home/ctyun/httpd_zhouyue.tar ./ 关机改云主机私有网卡…

APP逆向案例之(一)过 app 更新提示

案例&#xff1a;某APP打开时提示更新 思路&#xff1a;想这是查壳看看有没有加壳&#xff0c;没有就去反编译按照提示搜索下&#xff0c;结果却是没有加壳反编译了下搜索&#xff0c;搜索不到&#xff0c;后来想到是不是网络传过来的&#xff0c;那这样是不是就要先获取本身AP…

Spring(十四)- Spring注解原理解析

文章目录一、Spring注解原理解析1. 使用xml配置扫描组件的原理解析2. 使用配置类扫描组件的原理解析一、Spring注解原理解析 1. 使用xml配置扫描组件的原理解析 使用Component等注解配置完毕后&#xff0c;要配置组件扫描才能使注解生效 ⚫ xml配置组件扫描&#xff1a; <c…

springboot RestTemplate优化 http 池化

http通信之三次握手 为了对每次发送的数据量进行跟踪与协商&#xff0c;确保数据段的发送和接收同步&#xff0c;根据所接收到的数据量而确认数据发送、接收完毕后何时撤消联系&#xff0c;并建立虚连接。 TCP在发送新的数据之前&#xff0c;以特定的顺序将数据包的序号&#…

【LeetCode 力扣】3.无重复字符的最长子串 Java实现 滑动窗口

题目链接&#xff1a;3.无重复字符的最长子串 1 原题描述&#xff1a; 2 解题思路 初看此题&#xff0c;其实并不难理解&#xff0c;我们一共有两个指针&#xff0c;一个时我们子串的头 start &#xff0c;一个是我们子串的尾 end。我们的尾 end 依次加一&#xff0c;然后判…

dpdk 多线程 gdb + master

1、 main线程没有调用pthread_join 一、初始化 1、rte_eal_cpu_init()函数中&#xff0c;通过读取/sys/devices/system/cpu/cpuX/下的相关信息&#xff0c;确定当前系统有哪些CPU核&#xff0c;已经每个核属于哪个CPU Socket。 2、eal_parse_args()函数&#xff0c;解析-c参数…

力扣:递增子序列java

力扣&#xff1a;递增子序列java 流程: 设置一个结果集和路径path 本题不设置used而是再当前层设置一个map 递归三部曲&#xff1a; 参数和返回值&#xff1a;参数为输入数组nums&#xff0c;开始下标startindex&#xff0c;返回值为空 对path>1时的path输入结果集//放到这…

OTP语音芯片SOP8的前世今生_如九齐_硕呈_钰绅等以及国产方案KT148A

目录 一、语音芯片的形态简介 语音芯片ic的其中一个品类&#xff0c;就是SOP8封装的OTP语音芯片&#xff0c;非常的经典和常用。源头的供应商基本都是台系的原厂&#xff0c;比如&#xff1a;九齐、硕呈、佑华等等&#xff0c;其中佑华就算是鼻祖了&#xff0c;早期的4位机也是…

JSP脚本

在 JSP 中&#xff0c;可以使用 JSP 脚本写入 Java 代码。 JSP 脚本可以包含任意数量的 Java 语句&#xff0c;变量、方法和表达式。JSP 脚本会把包含的内容插入到 Servlet 的 service() 方法中。 JSP 脚本语法如下&#xff1a; <% Java语句 %> <jsp:scriptlet>J…

【kubernetes篇】使用Harbor仓库管理kubernetes镜像

引言 Docker容器应用的开发和运行离不开可靠的镜像管理&#xff0c;在企业级的Docker Registry管理项目中&#xff0c;一般使用Harbor&#xff0c;它包括权限管理(RBAC)、LDAP、日志审核、管理界面、自我注册、镜像复制和中文支持等功能。 今天就将Harbor仓库的安装和使用做一…

【手把手】教你玩转SpringCloud Alibaba之GateWay

1、什么是GateWay 在微服务架构中&#xff0c;一个系统会被拆分为很多个微服务。那么作为客户端要如何去调用这么多的微服务呢&#xff1f;如果没有网关的存在&#xff0c;只能在客户端记录每个微服务的地址&#xff0c;然后分别去调用。这样的话会产生很多问题: - 客户端多次…

2022年亚太地区大学生数学建模竞赛/2022年亚太杯思路

解题方向&#xff1a; 回复&#xff1a;亚太 2022年第十二届亚太地区大学生数学建模竞赛(以下简称“竞赛”)是北京图象图形学学会主办的亚太地区大学生学科类竞赛&#xff0c;竞赛由亚太地区大学生数学建模竞赛组委会负责组织&#xff0c;欢迎各高等院校按照竞赛章程及有关规定…

【EC200U】何为QuecPython以及QPYcom基础操作

EC200U 何为QuecPython以及QPYcom基础操作QuecPython介绍Quec是啥MicroPythonQuecPython与MicroPython的关系QuecPython技术特性IDE(QPYcom)基础操作创建项目导入脚本方法1方法2运行脚本QuecPython是个啥&#xff0c;QPYcom怎么用? QuecPython介绍 Quec是啥 Quec 取自 Quect…

生产环境日志打印console.log内存溢出解决方法

在开发环境里面&#xff0c;开发者经常喜欢使用 console.log 进行日志打印&#xff0c;很好的提高了开发者的开发效率&#xff0c;但是这样容易产生新的问题&#xff0c;因为console的使用&#xff0c;影响内存的滥用&#xff0c;可能造成内存溢出。 分析内存上述的原因 传递…

*深入学习函数(3)-- 递归篇(图文详解)

目录 一、什么是递归 推荐两个问答社区网站 二、递归的两个必要条件 三、递归练习 1、接收一个整型值&#xff08;无符号&#xff09;&#xff0c;按照顺打印它的每一位。输入&#xff1a;1234&#xff0c;输出&#xff1a;1 2 3 4 2、编写函数不允许创建临时变量&#xff0…