如何对两个 4 位数字进行乘法,将它们视为 C++ 中的多项式

How to do multiplication for two 4-bit numbers treating them as polynomials in C++

本文关键字:多项式 C++ 两个 数字      更新时间:2023-10-16

我正在使用C++模拟迷你AES加密/解密算法。

为此,我需要乘以two 4-bit numbers,同时将它们视为多项式。

它经历了一些阶段,将它们转换为多项式,将两个多项式相乘,然后在需要时使用预定义的不可约多项式进行多项式缩减以降低功率,最后将它们转换回 4 位格式。

例如,乘以1011 ⊗ 0111类似于x3+x+1 ⊗ x2+x+1答案是,如果x5+x4+1的幂为5,那么您需要通过除以预定义的多项式x4+x+1来减少它。答案将是x20100.

提前非常感谢!

例如,你可以这样做

unsigned int multiply_poly(unsigned int a, unsigned int b)
{
unsigned int ret = 0;
while(a)
{
if(a & 1)
{
ret ^= b;
}
a >>= 1;
b <<= 1;
}
return ret;
}

解释:你基本上是写乘法。您将a向右移动,并始终查看最后一点。如果它是0的,如果它1你与b的xor,则不添加任何内容。由于异或不完全是整数的加法,这不仅仅是a*b。你可以考虑为什么两个多项式的相加可以通过异或来完成。由于我们向左移动b,因此它总是与当前单声道相乘a.

两个 4 位数字?通常,位操作函数(例如,第一位,最后一位,位计数(缓慢且效率低下,除非CPU具有实现它们的特殊功能(例如,SSE4具有位计数例程(。常见的有效解决方案是创建一个帮助程序数组来解决字节问题(256 个长数组,每个字节都有解决方案(。

在您的情况下,我会将两个 4 位多项式存储在单个unsigned char中,并将std::array<unsigned char,256>与预先计算的答案一起使用。因此,整个计算被替换为单个加载操作(希望来自 L3 缓存或您的平台拥有的任何最有效的内存(。

您只需计算一次答案即可初始化数组。即使计算函数缓慢且效率低下,也不会成为问题。