You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET SEAL BFV方案SquareInplace运算Plaintext取值异常问题咨询

问题根因分析

1. Plaintext输出差异的原因

  • Plaintext.ToString()方法默认将存储的数值以十六进制格式输出:16的十六进制表示为10,256的十六进制表示为100,完全匹配你观察到的输出结果
  • pt[0]返回的是存储值的原始十进制整数值,这个才是运算的真实结果

2. 运算结果不符合预期的核心错误

你在CreateCiphertextFromInt方法中构造Plaintext的方式存在错误:

  • new Plaintext(value.ToString())这个构造函数的入参字符串,会被SEAL解析为十六进制数值,而非十进制整数:
    当你输入十进制10时,传的字符串是"10",被解析为十六进制的0x10即十进制的16,16平方后得到256,完全匹配你得到的pt[0] = 256的结果
修复方案

1. 正确构造Plaintext

不要将整数转字符串传入Plaintext构造函数,改用以下两种方式之一:

  • 直接用数值构造(适合单整数场景):
var plaintext = new Plaintext(value); // 直接传ulong类型的数值,无需转字符串
  • 用IntegerEncoder/BatchEncoder做正式编码(适合多整数、批量运算场景):
// 初始化Encoder
var encoder = new IntegerEncoder(context);
// 编码整数
var plaintext = encoder.Encode(value);
// 解码结果
int result = encoder.DecodeInt32(pt);

2. 正确读取运算结果

  • 如果你是单系数存储整数,直接读取pt[0]即可得到正确的十进制结果,不要使用Plaintext.ToString()的输出作为运算结果
  • 如果使用了Encoder编码,调用对应Encoder的Decode方法得到结果
参数配置说明

你当前的BFV参数配置没有问题:

  • PolyModulusDegree 8192搭配BFVDefault的218位CoeffModulus符合SEAL的推荐配置
  • PlainModulus 4173162863是符合要求的素数,单值运算的数值上限只要不超过PlainModulus就不会出现模溢出问题

内容的提问来源于stack exchange,提问作者Tad McClellan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 07:06:03