Algorithm 两个多项式相乘

Algorithm 两个多项式相乘,algorithm,Algorithm,这是一些面试问题中提出的问题 给定三个多项式f(x),g(x),h(x),其中系数是二元的。给出[f(x)*g(x)]mod h(x)[二进制系数中的所有运算] 多项式以这种格式给出……x3+x+1表示为“1011”。编写一个程序char*multmod(char*f,char*g,char*h),它将输出多项式…(f*g)mod h 可能的方法是什么? 我们能在比特级别做点什么吗?这是一个知识问题。基本上,除非你像高斯一样聪明,或者你已经知道同余数学,也称为“模算术”,否则你就完蛋了。你可能想

这是一些面试问题中提出的问题

给定三个多项式f(x),g(x),h(x),其中系数是二元的。给出[f(x)*g(x)]mod h(x)[二进制系数中的所有运算]

多项式以这种格式给出……x3+x+1表示为“1011”。编写一个程序char*multmod(char*f,char*g,char*h),它将输出多项式…(f*g)mod h

可能的方法是什么?
我们能在比特级别做点什么吗?

这是一个知识问题。基本上,除非你像高斯一样聪明,或者你已经知道同余数学,也称为“模算术”,否则你就完蛋了。你可能想读一本书来了解这方面的知识,这本书是Allenby的《数论与计算导论》

归根结底,关键知识是同余可以用几种方法计算,其中最好的是“平方乘”方法,这是一种非常古老的方法。基本上,当你有一个二进制1时,你既可以是平方的也可以是倍数的,但是当你有一个0时,你只需要平方。完整的算法和解释见第页。艾伦比79号

另一种方法是使用中国剩余语,这可能是提问者的目的

你在哪里申请?国家安全局?洛斯阿拉莫斯?这是一个相当棘手的问题



太好了,我被否决了,因为我是唯一一个真正回答这个问题的人。这里需要澄清的是:毫无疑问,正如我上面所说的,面试官期望利用平方和乘法算法。RSA/密码算法内部使用平方和乘法来执行快速模运算。见第页。225有关此算法和RSA应用程序的说明:。采访者可能在RSA上工作过,这就是他知道该方法的原因。

你实际上在做的是二进制操作。 您可以查看CPU如何实现这些操作


http://en.wikipedia.org/wiki/Modulo_operation这看起来像一个简单的多项式乘法和长除法问题。把多项式相乘,然后再除以。乘法非常简单,有两个嵌套的for循环,有关长除法,请参见:


动力

二进制系数在这里意味着系数是模2,在Z_2中,或者只是取值0和1,并像位一样操作。这并不意味着系数是以基数2表示的任意整数。它们是二进制的(正好有两个值),而不是简单地用二进制数字系统来表示

牢记这一点,这个问题很容易回答,是的,异或和(左)移位的按位操作就足够了。虽然不需要回答这个问题,但这个问题是由密码学引起的。它展示了散列中常用的一些位运算与一些加密方案和抽象代数之间的联系,因此有限域上多项式的结果可以用于密码分析。将乘积模化为另一个多项式是为了防止结果的阶数增长超过某个极限。机器寄存器上的操作自然会发生溢出

添加

首先让我们谈谈加法。由于系数是模2,因此将
x+x=2x=0x=0
相加,因为
2模2=0
。所以,只要有两个相同的术语,它们就会取消,只有一个术语,它就会持续。这与异或的行为相同。例如,添加
(x^4+x^2+1)+(x^3+x^2):

或者,使用仅压缩系数表示法

10101 XOR 01100 = 11001
乘法

乘以
x
将每个项的幂增加1。在紧凑表示法中,这相当于左位移位

(1x^4+0x^3+1x^2+0x^1+1x^0) * x = (1x^5+0x^4+1x^3+0x^2+1x^1+0x^0)
10101 << 1 = 101010
因此,答案是
x^7+x^6+x^5+x^4+x^3+x^2

模约化

模约化
h(x)
也相当容易。它当然不需要您记住如何进行长除法。像乘法一样,我们会逐项进行。让我们继续同一个例子,取模
h(x)=x^5+x

(x^7 + ... + x^2) mod (x^5+x) = [x^7 mod (x^5+x)] + ... + [x^2 mod (x^5+x)]
现在,如果
x^n
的度
n
小于
h(x)
,这里是5,那么没有什么可以做的,因为
h(x)
不会除以
x^n

[x^2 mod (x^5+x)] = x^2 or 00000100
[x^3 mod (x^5+x)] = x^3 or 00001000
[x^4 mod (x^5+x)] = x^4 or 00010000
当度数相等时,我们可以说,
h(x)
除以
x^n
一次,我们已经被
h(x)
的剩余项超出。我们做得太多而不是太少几乎无关紧要,自
-1 mod 2=1
以来的登录余数也不重要。这里,

x^5 = (x^5 + x) – x, so
[x^5 mod (x^5+x)] = x, or 00000010
通常,[x^n mod h(x)]=[h(x)-x^n]当
n=度(h)
时。在紧凑形式中,这相当于关闭
n
th位,这可以通过将
h(x)
的表示与
x^n
的表示异或来实现:

00100010 XOR 00100000 = 00000010.
x^n
的度数大于
h(x)
时,我们可以将
h(x)
乘以
x^k
以使度数匹配,并按照前一种情况进行操作

x^6=(x^5+x)*x–(x)*x=-x^2,所以 [x^6模(x^5+x)]=x^2,或00000100,或紧凑形式
(00100010注意:以下引导性问题是针对原始海报的。你能添加两个多项式吗?二元多项式上的此操作与正则多项式上的操作有何不同?你能将任意多项式乘以
x^17
?你知道如何进行多项式长除法吗?是的,XOR的二进制操作d移位应该可以做到这一点。有些人缺少的是系数是二进制的,也就是说在Z_2中。这意味着
(x^3+x^2+1)+(x^2)=(x^3+2x^2+1)=(x^3+1)
1101 XOR 0100=1001
!在我的时代,这将是一个高中水平的问题。如果你知道如何除法,这个问题很容易回答
x^5 = (x^5 + x) – x, so
[x^5 mod (x^5+x)] = x, or 00000010
00100010 XOR 00100000 = 00000010.
[x^7 mod (x^5+x)] = x^3, or 00001000
x^2 + x^3 + x^4 + x + x^2 + x^3 = x^4 + 2x^3 + 2x^2 + x = x^4 + x, or
00000100 XOR 00001000 XOR 00010000 XOR 00000010 XOR 00000100 XOR 00001000 = 00010010