如何对两个 4 位数字进行乘法,将它们视为 C++ 中的多项式
How to do multiplication for two 4-bit numbers treating them as polynomials in C++
我正在使用C++模拟迷你AES加密/解密算法。
为此,我需要乘以two 4-bit numbers
,同时将它们视为多项式。
它经历了一些阶段,将它们转换为多项式,将两个多项式相乘,然后在需要时使用预定义的不可约多项式进行多项式缩减以降低功率,最后将它们转换回 4 位格式。
例如,乘以1011 ⊗ 0111
类似于x3+x+1 ⊗ x2+x+1
答案是,如果x5+x4+1
的幂为5
,那么您需要通过除以预定义的多项式x4+x+1
来减少它。答案将是x2
0100
.
提前非常感谢!
例如,你可以这样做
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 缓存或您的平台拥有的任何最有效的内存(。
您只需计算一次答案即可初始化数组。即使计算函数缓慢且效率低下,也不会成为问题。
相关文章:
- c++模板来表示多项式
- 使用链表数据结构打印多项式
- 需要帮助重载多项式类运算符C++
- 如何修复此教科书程序以在C++中添加多项式?
- 如何对两个 4 位数字进行乘法,将它们视为 C++ 中的多项式
- 实现伪多项式DP子集和
- 递归程序获得勒让德多项式
- 在 NTL 中构造多项式的标准方法是什么?
- 最小二乘多项式拟合仅适用于偶数个坐标
- 多项式系数代码始终提供相同的答案
- 进入第二个多项式后如何修复分割错误?
- 用霍纳方法进行多项式求值的C++ constexpr
- 卡拉苏巴 - 多项式乘以 CUDA
- 使用链表添加多项式?援助
- 用Isringstream C 提取多项式的系数
- 用于多项式乘法的卡拉苏巴算法
- C :多项式矩阵的输出
- 多项式链接列表中的过载 运算符
- NTRUEncrypt:使用开源标准算法中的描述无法正确找到两个多项式的GCD,无法定义是否存在多边形的逆
- 二阶多项式计算器的输出不一致