我对Python很新,我有一个与多项式有关的问题。
让我们在GF(2)
中有一个高次多项式,例如:
x^n + x^m + ... + 1
,其中n
,m
最多可达10000。
我需要找到反多项式到这个。在Python中最快的方法是什么(可能使用numpy
)?
由于
答案 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)。
自从我个人以来,我不得不对非常高阶的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)
尝试使用数学包圣人