这是一些面试问题中提出的问题。
给定三个多项式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
可能是什么方法? 我们可以在比特级做点什么吗?
答案 0 :(得分:12)
<强>动机强>
这里的二进制系数意味着系数在字段Z_2中是模2,或者只是取值0和1并且像位一样操作。这并不意味着系数是基数为2的任意整数。它们是二进制(仅取两个值),而不是简单地用二进制数字系统表示。
牢记这一点,这个问题很容易回答,是的,XOR和(左)移位的按位运算就足够了。虽然不需要回答这个问题,但这个问题是由加密技术推动的。它演示了散列中常用的一些按位运算与一些加密方案和抽象代数之间的联系,因此可以在密码分析中利用有限域上多项式的结果。将产品模数为另一个多项式是为了防止结果的程度超过一定限度。机器寄存器上的操作自然会这样做溢出。
<强>加成强>
首先让我们谈谈补充。由于系数是模2,因此x + x = 2x = 0x = 0
添加2 mod 2 = 0
。因此,只要有两个相同的术语,它们就会取消,而当只有一个术语时,它会持续存在。这与XOR
的行为相同。例如,添加(x^4 + x^2 + 1) + (x^3 + x^2):
(1x^4+0x^3+1x^2+0x^1+1x^0)+(0x^4+1x^3+1x^2+0x^1+0x^0) = (1x^4+1x^3+0x^2+0x^1+1x^0)
或者,仅使用紧凑系数表示法,
10101 XOR 01100 = 11001
<强>乘法强>
乘以x
会将每个项的幂增加一。在紧凑符号中,这相当于左按位移位。
(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
因此,要乘以多项式f(x) * g(x)
,我们可以将f(x)
分别乘以g(x)
的每个项,每个项等同于一个班次,然后加上,该加法等效于XOR。让我们乘以(x^4 + x^2 + 1) * (x^3 + x^2)
(x^4 + x^2 + 1) * (x^3 + x^2) = (x^4 + x^2 + 1)*x^3 + (x^4 + x^2 + 1) *x^2
(10101 << 3) XOR (10101 << 2) = 10101000 XOR 01010100 = 11111100
所以答案是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)]
现在,如果n
的学位x^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
通常,n = degree(h)
时[x ^ n mod h(x)] = [h(x)-x ^ n]。在紧凑的形式中,这相当于关闭n
位,这可以通过将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 mod(x ^ 5 + x)] = x ^ 2,或00000100,或紧凑形式 (00100010&lt;&lt; 1)XOR(00100000 <&lt; 1)= 00000100
但是,更有效率,只需转移上一个答案,我们将对x^7
进行处理:
[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
结束语
我们可以要求Wolfram Alpha通过长期划分为我们验证此结果。给出的余数为x^4 - x
,当系数为2时,相当于x^4 + x
。
可以组合逐项乘法和模数步骤,例如,乘以x
并对产品进行模数化,以获得更有效的算法,如果产品的度数至少为h(x)
,则该算法将是一个移位和异或。然后重复结果,乘以x
并对产品进行模数计算,并将乘法的答案记录为x^2
。等等......
答案 1 :(得分:0)
这是一个知识问题。基本上,除非你要么像高斯一样聪明,要么你已经知道同余数学,也称为&#34;模拟算术&#34;,你就搞砸了。你可能想要阅读的一本书来了解这些东西是&#34;数论与数字导论&#34;艾伦比。
最终关键的知识是一致性可以通过几种方法计算,其中最好的方法是&#34; square和multiply&#34;方法很古老。基本上,无论何时你有二进制1,你都是正方形和多数,但是当你有一个0时,你就是正方形。完整的算法和解释在p。艾伦比的79。
另一种方法是使用中国剩余的东西,这可能是提问者的目标。
你在哪里申请?国家安全局?洛斯阿拉莫斯?这是一个非常棘手的问题。
很棒,因为成为唯一真正回答这个问题的人而受到了抨击。这里要明确一点:正如我上面所说,毫无疑问,面试官期待利用平方和乘法算法。在RSA /加密算法内部使用平方和乘法来进行快速模运算。见第225用于描述此算法和RSA应用程序:Implementation of Multinomial Standard Product for RSA State。面试官可能在RSA上工作,这就是他知道这种方法的原因。
答案 2 :(得分:0)
你基本上做的是二元操作。 您可以查看CPU如何实现此类操作。
http://en.wikipedia.org/wiki/Multiplication_algorithm http://en.wikipedia.org/wiki/Modulo_operation
答案 3 :(得分:0)
这看起来像一个简单的多项式乘法和长除法问题。只需将多项式相乘,然后除以它们。对于两个嵌套for循环,乘法非常简单,对于长除法,请参见: