在GF2中查找python中的逆多项式

时间:2017-04-04 12:26:28

标签: python numpy scipy polynomials inverse

我对Python很新,我有一个与多项式有关的问题。 让我们在GF(2)中有一个高次多项式,例如: x^n + x^m + ... + 1,其中nm最多可达10000。 我需要找到反多项式到这个。在Python中最快的方法是什么(可能使用numpy)?

由于

3 个答案:

答案 0 :(得分:1)

您基本上有两个选项:

  • 使用 sympy.polys.galoistools ,Sympy是用于符号数学的出色python库。但是,至少根据我的经验,如果多项式具有很高的阶数(这在纠错编码理论中很常见),则sympy会非常慢。

    from sympy.polys.galoistools import gf_gcdex, gf_strip
    
    def gf_inv(a, irr_poly):  # irriducible polynomial 
    
        return gf_gcdex(gf_strip(a), irr_poly, 2 , ZZ)[0]
    

此解决方案对于所有GF(2 ^ p)字段都是通用的,例如GF(2)/(x ^ p + 1)。

  • 如果您的多项式具有非常高的sympy速度,那就太慢了,您必须开发自己的扩展Euclidean Algorithm例程以及执行此算法所需的所有其他函数。

自从我个人以来,我不得不对非常高阶的GF(2)的多项式(一万个!)进行求逆,所以我也使用numpy开发了自己的EEA,但仅针对GF2 [x]多项式:

def gf2_xgcd(b, a):
"""Perform Extended Euclidean Algorithm over GF2

Given polynomials ``b`` and ``a`` in ``GF(p)[x]``, computes polynomials
``s``, ``t`` and ``h``, such that ``h = gcd(f, g)`` and ``s*b + t*a = h``.
The typical application of EEA is solving polynomial diophantine equations and findining multiplicative inverse.


Parameters
----------
b : ndarray (uint8 or bool) or list
    b polynomial's coefficients.
a : ndarray (uint8 or bool) or list
    a polynomial's coefficients.
Returns
-------
y2 : ndarray of uint8
     s polynomial's coefficients.
x2 : ndarray of uint8
     t polynomial's coefficients.
b : ndarray of uint8
    h polynomial's coefficients.

Notes
-----
Rightmost element in the arrays is the leading coefficient of the polynomial.
In other words, the ordering for the coefficients of the polynomials is like the one used in MATLAB while
in Sympy, for example, the leftmost element is the leading coefficient.

Examples
========

>>> x = np.array([1, 1, 1, 1, 1, 0, 1, 0, 1], dtype="uint8")
>>> y = np.array([1, 0, 1], dtype="uint8")
>>> gf2_xgcd(x,y)
(array([0, 1, 1, 1], dtype=uint8),
 array([1, 1], dtype=uint8),
 array([1], dtype=uint8))

"""

x1 = np.array([1], dtype="uint8")
y0 = np.array([1], dtype="uint8")

x0 = np.array([], dtype="uint8")
y1 = np.array([], dtype="uint8")

while True:

    q, r = gf2_div(b, a)

    b = a

    if not r.any():
        break

    a = r

    if not (q.any() and x1.any()):  # if q is zero or x1 is zero
        x2 = x0
    elif not x0.any():  # if x0 is zero
        x2 = mul(x1, q)
    else:
        mulres = mul(x1, q)

        x2 = gf2_add(x0, mulres)

    if not (q.any() and y1.any()):
        y2 = y0
    elif not y0.any():
        y2 = mul(y1, q)
    else:
        mulres = mul(y1, q)

        y2 = gf2_add(y0, mulres)

    # update
    y0 = y1
    x0 = x1
    y1 = y2
    x1 = x2

return y2, x2, b

当然要执行EEA,首先需要定义允许在GF2 [x]上执行乘法的功能。 ]字段。

事实上,我已经开发了一个 python模块,该模块可在 GitHub 中使用:pyGF2,它可以在GF2 [x]上高效地计算多项式算法,包括多项式求逆比Sympy快几个数量级。 这里的EEA代码直接从该存储库中获取。

答案 1 :(得分:0)

尝试使用numpy.polyval()。

它评估特定值的多项式。

In [1]: p = np.poly1d([1, 1, -10])  # Use a poly1d to represent the polynomial.

In [2]: y = 100

In [3]: (p - y).roots
Out[4]: array([-11.,  10.])

Numpy是您正在搜索的图书馆

答案 2 :(得分:-1)

尝试使用数学包圣人