当前位置: 首页 > news >正文

上海专业做网站的怎么做网站卖产品

上海专业做网站的,怎么做网站卖产品,wordbook wordpress,软件开发五个阶段写在前面: 在上一篇中展示了如何使用 BFV 方案执行一个非常简单的计算。该计算在 plain_modulus 参数下进行,并且仅使用了 BFV 明文多项式中的一个系数。这种方法有两个显著的问题: 实际应用通常使用整数或实数运算,而不是模运算…

写在前面:

        在上一篇中展示了如何使用 BFV 方案执行一个非常简单的计算。该计算在 plain_modulus 参数下进行,并且仅使用了 BFV 明文多项式中的一个系数。这种方法有两个显著的问题:

  1. 实际应用通常使用整数或实数运算,而不是模运算;
  2. 仅使用了明文多项式的一个系数。这实际上是非常浪费的,因为明文多项式很大,而且无论如何都会被整体加密。

        如果直接增加 plain_modulus 参数,直到没有溢出发生,就能让计算表现得像整数运算。但是问题在于增加 plain_modulus 会增加噪声预算的消耗,并且还会减少初始噪声预算。接下来介绍其他将数据布局到明文元素(编码)的方法,这些方法可以允许更多的计算而不会发生数据类型溢出,并且可以充分利用整个明文多项式。

一、批处理介绍

[BatchEncoder] (适用于 BFV 或 BGV 方案)

        令 N 表示 poly_modulus_degree,T 表示 plain_modulus。批处理允许将 BFV 明文多项式视为 \left [ 2,\frac{N}{2} \right ] 矩阵,每个元素是模 T 的整数。在矩阵视图中,加密操作对加密矩阵进行逐元素操作,使用户能够在完全可向量化的计算中获得数个数量级的速度提升。
        因此,除了最简单的计算,批处理应是与 BFV 一起使用的首选方法,并且如果使用得当,其实现将比不使用批处理的任何实现都要出色。
        此外,批处理对于 BGV 方案的工作方式与此示例中的 BFV 方案类似。例如,只需将`scheme_type::bfv` 更改为 `scheme_type::bgv`  即可使此示例适用于 BGV 方案。

1.1 参数设置

EncryptionParameters parms(scheme_type::bfv);
size_t poly_modulus_degree = 8192;
parms.set_poly_modulus_degree(poly_modulus_degree);
parms.set_coeff_modulus(CoeffModulus::BFVDefault(poly_modulus_degree));

        要启用批处理,我们需要将 plain_modulus 设置为一个与 2*poly_modulus_degree 同余于 1 的素数。这个需要特别注意,因为这与普通的Encode不同,并且设置不正确的话 BatchEncoder会校验,设置为满足  T= 2*N*k+1\left ( k=1,2,\cdots \right ) 的素数即可。
        同时,Microsoft SEAL 提供了一个辅助方法来找到这样的素数。在这个示例中,我们创建了一个支持批处理的 20 位素数。

parms.set_plain_modulus(PlainModulus::Batching(poly_modulus_degree, 20));

        然后就可以用参数创建环境,并且可以通过查看 SEALContext 创建的加密参数限定符来验证批处理是否确实启用了。

SEALContext context(parms);
print_parameters(context);
auto qualifiers = context.first_context_data()->qualifiers();
cout << "批处理已启用:" << boolalpha << qualifiers.using_batching << endl;

        这里输出为:

1.2 创建其他实例

        这里与上篇相同,创建加解密需要的实例:

KeyGenerator keygen(context);
SecretKey secret_key = keygen.secret_key();
PublicKey public_key;
keygen.create_public_key(public_key);
RelinKeys relin_keys;
keygen.create_relin_keys(relin_keys);
Encryptor encryptor(context, public_key);
Evaluator evaluator(context);
Decryptor decryptor(context, secret_key);

        但是注意,编码器与之前不同,批处理通过 BatchEncoder 类的实例进行。:

BatchEncoder batch_encoder(context);

二、批处理运算

        这里需要格外注意槽的概念,批处理 `槽` 的总数等于 poly_modulus_degree,N,这些槽被组织成 \left [ 2,\frac{N}{2} \right ] 矩阵,可以对其进行加密和计算。每个槽包含一个模 plain_modulus 的整数。
        
这里每一个明文或者密文块,可以用的槽数量就是 N,但是内部不是一整个连续存储。逻辑上可以认为是两行的一个矩阵,但是物理上其实是类似于单链表的一种存储形式。
        这里可以查看可用的槽数量,当然为了清晰一行有多少个,可以定义一个 row_size:

size_t slot_count = batch_encoder.slot_count();
size_t row_size = slot_count / 2;

 为了帮助大家理解存储的逻辑形式,这里放几个数字并打印:

vector<uint64_t> pod_matrix(slot_count, 0ULL);
pod_matrix[0] = 0ULL;
pod_matrix[1] = 1ULL;
pod_matrix[2] = 2ULL;
pod_matrix[3] = 3ULL;
pod_matrix[row_size] = 4ULL;
pod_matrix[row_size + 1] = 5ULL;
pod_matrix[row_size + 2] = 6ULL;
pod_matrix[row_size + 3] = 7ULL;

2.1 输入的编码与加密

        使用 BatchEncoder 将矩阵编码成一个明文多项式,并加密:(注意上面是根据 solt_count 创建的输入容器,编码完成后是一个 Plaintext 块,加密完是 Ciphertext 块)

Plaintext plain_matrix;
batch_encoder.encode(pod_matrix, plain_matrix);
Ciphertext encrypted_matrix;
encryptor.encrypt(plain_matrix, encrypted_matrix);
cout <<decryptor.invariant_noise_budget(encrypted_matrix) << " bits";

在示例中这里加密完后立刻解密进行验证,并输出噪声预算:

        对密文的操作会同时在所有 8192 个槽(矩阵元素)上同态执行。为了演示计算,这里编码一个明文矩阵:

vector<uint64_t> pod_matrix2;
for (size_t i = 0; i < slot_count; i++)
{pod_matrix2.push_back((i & size_t(0x1)) + 1);
}
Plaintext plain_matrix2;
batch_encoder.encode(pod_matrix2, plain_matrix2);

2.2 运算

这里展示的运算是:将第二个(明文)矩阵加到加密矩阵上,并对和进行平方

evaluator.add_plain_inplace(encrypted_matrix, plain_matrix2);
evaluator.square_inplace(encrypted_matrix);
evaluator.relinearize_inplace(encrypted_matrix, relin_keys);

输出噪声,并对结果进行解密解码并打印:

cout <<decryptor.invariant_noise_budget(encrypted_matrix) << " bits";
decryptor.decrypt(encrypted_matrix, plain_result);
batch_encoder.decode(plain_result, pod_result);

        从结果可以看出来,两个向量用 Batch Encoder 编码后进行的运算,是对应位置进行的加法和点乘

三、总结

        当所需的加密计算高度并行化时,批处理允许我们高效地使用整个明文多项式。但是,它尚未解决在文件开头提到的另一个问题:每个槽只包含一个模 plain_modulus 的整数,除非plain_modulus 非常大,否则我们可能会很快遇到数据类型溢出并在需要进行整数计算时得到意外的结果。请注意,溢出无法在加密形式中检测到。
        CKKS 方案(及其编码器 CKKSEncoder)解决了数据类型溢出问题,但代价是只能得到近似结果(下篇预告)。

http://www.mmbaike.com/news/31751.html

相关文章:

  • 江阴网站制作直销产业发展论坛
  • 好的做外贸的网站有哪些超级外链吧
  • 个人网站建设免费分析哪些平台可以发布软文
  • 动态网站开发用到的技术网络广告营销有哪些
  • 北京工装装饰公司排行榜绍兴seo排名公司
  • 林州建筑网官网关系网站优化公司
  • 厦门建站比较好的公司我想做个网站怎么做
  • 南宁网站建设哪里有各大免费推广网站
  • 大连金州区房价新乡seo推广
  • 南宁正规的seo费用游戏行业seo整站优化
  • 外贸网站建设推广培训设计网站免费素材
  • 电子商务网站设计与实现论文宁波百度seo点击软件
  • 做租人网站犯法吗第一站长网
  • 用php做美食网站有哪些国外产品推广平台
  • 天津武清做网站河北关键词排名推广
  • 手机版免费申请微网站广州最新疫情情况
  • 免费企业网站cms美国最新新闻头条
  • 一个域名可以做几个网站吗举例网络营销的例子
  • 辽宁建设工程信息网报名步骤惠州网站seo排名优化
  • 网站建设明细报价表百度指数网址是什么
  • 一个网站可以有几个关键词如何引流推广产品
  • 建设人才服务信息网国家网站么软文范例大全500
  • 企业网站托管费用seo权威入门教程
  • 网站公司的好坏百度搜索引擎入口登录
  • 织梦网站后台打不开seo网站优化软件价格
  • 织梦cms起诉前更换了系统优化精灵
  • 网站建设企业 熊账号怎么下载百度
  • dhru商城网站建设国内电商平台有哪些
  • 公司做网站的费用属什么用途中国第三波疫情将在9月份
  • 镇江网站建设策划搜索引擎营销包括