给自己定的小目标一个月至少写两篇博客
霍纳法则(Horner Rule)博客上之前有介绍原理,点击此处,本篇会给出更为详细讲解以及实现过程,并给出python代码复现
1霍纳法则介绍
对于多项式:
计算计算开销为:平方(乘法计算)1+2+3+........+n需要次。加法: n次。
提取公因数x得:
点击此处乘法和加法开销都为n次
2多维向量打包解包
3有限域上的多项式乘法
在一些密码学算法中,如椭圆曲线密码学中,需要在有限域上进行多项式的乘法运算。假设我们有两个多项式:
𝑃(𝑥)=3𝑥2+2𝑥+5 𝑄(𝑥)=4𝑥+1
我们要计算它们的乘积 在有限域上的结果。(这里的有限域你可以简单理解成0到6,任何数模7只会得到这些数)
使用霍纳法则进行多项式乘法:
- 将 (P(x)) 重写为霍纳形式:
- 将 (Q(x)) 重写为霍纳形式:
- 将霍纳形式的 (P(x)) 和 (Q(x)) 相乘,并在有限域 (GF(7)) 上进行运算。
计算结果:
- 计算 的常数项:
- 计算 的一次项系数:
- 计算 的二次项系数:
因此, 在有限域 (GF(7)) 上的结果为 。
4多维聚合计算,节约存储
当需要计算一段数据:和的内积可以利用霍纳函数打包之后计算,同时计算之后可以以霍纳形式存储
5python演示代码
以x=5举例:
#霍纳法则打包
def vector_pack(vectors):
# 获取向量的维度
n = len(vectors)
# 初始化结果变量
result = 0
# 遍历所有向量
num = 0
for i in range(n):
num += vectors[i] * (5 ** (n - i - 1))
# 使用霍尔法则实现打包操作
packed_vector = (result + num)
# result = (result + num) % (2 ** n)
return packed_vector
def decrypt_pack(decrypted_vector):
dec_num = decrypted_vector[0]
binary_list = []
while dec_num > 0:
binary_list.append(str(dec_num % 5))
dec_num //= 5
bin_str = ''.join(binary_list[::-1])
binary_list = [int(bit) for bit in bin_str]
print(binary_list)
return binary_list
大家可以动手写写
创作不易请给博主点点赞吧
6.5分享
有人问我多维聚合打包具体在哪块实现,这边再说一下
4大整数加密算法打包
比较好的例子是paillier同态算法,(具体算法可以参考我上一篇博客)算法加密出来的数是大整数,但开销较大。如果要加密向量的每一位,例如(1.1.20)每一位都要加密开销太大了,可以先用霍纳打包完之后,再加密进行同态计算,最后解密解码。具体流程如下
-
霍纳规则打包:首先,我们需要将多维向量通过霍纳规则转换为一个整数。例如,对于向量 [1, 1, 20][1,1,20],在假设每一位都在0到99的范围内,我们可以将其转换为整数 21102110。
-
加密打包后的整数:使用Paillier加密算法对打包后的整数进行加密。
-
同态计算:在加密状态下进行计算,例如将加密的向量与一个标量相乘。
-
解密和解码:最后,解密计算结果并使用霍纳规则将其转换回原始的向量格式。
除霍纳外还有如超递增序列等方法优化多维向量的同态算法的实现,感兴趣可以下去了解下这方面知识