- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有伽罗华域 GF(2^409)
和不可约多项式f(x) = x^409 + x^15 + x^6 + x + 1
其中系数只能为 1 或 0
如果我有这个字段a(x)
的一些元素,我如何找到反向元素a_1(x)
,这样
a(x) * a_1(x) = 1 (mod f(x))
使用扩展欧克力德算法
我正在使用多项式基础
我知道我可以使用 pow(a(x),2^409 - 2)
找到 a_1(x)
,但我使用Python,电源操作耗时太多
我在定义多项式下的除法运算时遇到了麻烦(没有它我不能使用扩展 Euklid 算法)
最佳答案
表示 GF(2k) 元素的一种常见方法是使用大整数(Python 2 中的long
,int
in Python 3) 并让每一位代表一个系数。要执行多项式除法,您基本上可以按照使用笔和纸执行长除法的步骤进行操作。
让我们举一些更简单的例子。以 GF(27) 为模 x7 + x + 1。让我们尝试求 x6 + x 的倒数3 + x。因此,您必须使用扩展欧几里得算法计算这两个多项式的 GCD。第一步是计算一个的商和余数。即度数大的除以度数小的。
x6 + x3 + x 是 1x6 + 0x5 + 0x4 + 1x3 + 0x2 + 1x1 + 0x0 或 1 0 0 1 0 1 0
简而言之。按照相同的约定,模数为 1 0 0 0 0 0 1 1
。所以你分
1 0 0 0 0 0 1 1 / 1 0 0 1 0 1 0 = 1 0 remainder 1 0 1 1 1
1 0 0 1 0 1 0
1 0 1 1 1
那我在这里做了什么?将 a 除以 b 我在每一个中寻找最高的集合位,即多项式的次数。这些度数之间的差异有点我想在商中设置。在这种情况下,a 的阶数为 7,b 的阶数为 6。差值为 1,因此商必须有项 x1。现在我写下 b 乘以那个项,在这种情况下,它只是 b 的二进制表示向左移动了度数的差异)。然后我从原始 a 中减去该移位值,但我在 𝔽2[x] 中进行减法,所以它实际上是一个 XOR 运算。其结果是一个新数字,我在下一次迭代中将其用作 a 的值。我继续,直到程度的差异变为负数,即我将较小程度的多项式除以较大程度的多项式。然后我就完成了,a 的最后一个值就是我的余数。在上面的划分中,一步完成。
通过执行除法余数的操作,您应该能够弄清楚欧几里德算法。扩展版本需要更多的工作,但请尝试一下。最后,你应该能发现,在上面给出的例子中,倒数是x3 + x + 1(由Sage计算)。为了比较,原始字段 GF(2409) 中 x6 + x3 + x 的倒数将是
"+".join("x^{}".format(i) for i in range(409,-1,-1) if (1 << i) & 71418312917235914488287388787154746126088900129923309868417397199063993100653429184865046255190862140902867842544110449930)
我在 Sage 中计算的这个数字:
x = polygen(ZZ)
m = x^ 409 + x^15 + x^6 + x + 1
F409 = GF(2^409, name="z", modulus=p)
z = F409.gen()
(1/(z^6+z^3+z)).polynomial().change_ring(ZZ)(2)
关于python - 在伽罗华域中生成反向元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41129159/
我是一名优秀的程序员,十分优秀!