c - El Gamal 指数查找算法
问题描述
我试图找到一个数字 Z 的指数,其模 X 将给出 Y。这是我的代码:
int main()
{
int a = 607;
int gen = 28;
long long b = 28;
int c = 597;
int i = 1;
while (i < 10000000000)
{
b = b * gen;
if ((b % a) == c)
{
printf("%ld\n", b);
return i;
}
i++;
}
return 0;
}
此代码实现了计算指数的 El Gamal 算法。该程序应该返回 153,但相反,它会继续并迭代直到结束。任何人都可以为我解释一下吗?
解决方案
不幸的是,您的描述和您的代码没有共同的变量名称。你犯了一个小错误和一个大错误:你没有采取中间结果模型 a。这是我的代码,做了一些修改:
int main(int argc, char** argv) {
int a = 607;
int gen = 28;
int b = 1;
int c = 597;
int i = 1;
while (i < a)
{
b = (b * gen) % a;
// invariant: b == (gen**i) % a
if (b == c)
{
printf("%d\n", i);
return i;
}
i++;
}
}
做算术时需要更加小心;对于新程序员来说,它非常脆弱。溢出潜伏在每个角落,对于浮动类型,underflow 也是捕食者。永远不要相信 a+b、ab、a/b 或 a*b 总能产生数学认为它应该产生的结果。
推荐阅读
- javascript - 实例化 ES6 类
- reactjs - Reactjs - 我如何从一个组件(输入框)获取输入并在其他组件中使用它
- android - 在 Android 应用程序中显示文本文档时出现问题
- javascript - JavaScript 我必须单击两次才能选择元素
- python - Python - 在两个数据框熊猫中搜索两个条件
- kotlin - @Controller 的元注释在 Micronaut 中不起作用
- python - 在Django rest框架中删除对象后不显示成功消息
- ethereum - 使用导入的 OpenZeppelin 文件在 Etherscan 上验证和发布合约
- xamarin.forms - Serilog xamarin配置json反序列化-仅获取消息模板的一部分
- javascript - 验证仅适用于第一行,不适用于其他行!我觉得这是因为返回真/假,但我需要在我的验证