首页 > 解决方案 > 如何对 64 次幂进行模 2 加法

问题描述

我想在 MATLAB 之间p1p2使用 MATLAB 之间对 64 次幂执行加法模 2。p1和都是p2类型uint64。下面的代码正确吗?

c1 = p1 + p2;
if (c1> 2^64)
    c1 = c1 - 2^64;
end

标签: matlabmathmoduloblock-cipher

解决方案


类型变量的最大值uint642^64-1(在 Matlab 中intmax('uint64')),当您执行超过此值(溢出)的加法运算时,结果为2^64-1,因此您的代码将无法工作。

例如:

p1 = uint64(2^64-1) - 5;
p2 = uint64(10);
c1 = p1 + p2;

结果c1是:

>> c1 =

  uint64

   18446744073709551615

这是2^64-1(而不是 2^64-1 + 5

结果c1-p1是:

>> c1-p1

ans =

  uint64

   5

但应该是10

解决方法:

您可以在加法之前检查是否会有溢出,如果有,请计算余数:

intmaxDif = intmax('uint64') - p1;
if(p2  > intmaxDif)
    c1 = p2 - intmaxDif - 1;
else
    c1  = p1 + p2;
end

p1此代码将在和之间执行 64 次幂的模 2p2

感谢Cris Luengo的更正。


推荐阅读