【发布时间】:2018-02-10 13:32:36
【问题描述】:
作为大学作业的一部分,我必须在椭圆曲线模 p = 2^255 - 19 上实现 C 标量乘法。由于所有计算都以 p 为模,因此使用原始类型(无符号长)。
但是,如果 a 和 b 是模 p 的两个整数,则存在计算 a*b 溢出的风险。我不知道如何避免这种情况。下面的代码正确吗?
long a = ...;
long b = ...;
long c = (a * b) % p;
或者我应该先投射 a 和 b 吗?
long a = ...;
long b = ...;
long long a1 = (long long) a;
long long b1 = (long long) b;
long c = (long) ((a1 * b1) % p);
我也一直在思考或与long long一起工作。
【问题讨论】:
-
使用这种关系:
(a * b) % m == (a%m * b%m) % m -
实际上并不能保证
long long大于long- 标准只规定了这些类型的最小尺寸 -
p 是 2^255 - 19,所以我认为在乘法之前取模是不够的
-
您的
p有 255 个二进制数字,因此所有本机类型都太窄了。 -
@Raf 基本类型:en.cppreference.com/w/cpp/language/types
long最小为 32 位
标签: c++ c integer-overflow