Модуль gf(Galua field)
В файле gf.py реализована алгебрна полей Галуа
exp_ - список значений экспоненты от элементов поля. exp_[x]= e :sup:x
log_ - список значений логарифма от элементов поля. log_[x] = log(x)
add(x,y) - функция сложения элементов поля Галуа. Побитовый xor.
def add(x,y):
return x^y
sub(x,y) - функция вычитания элементов поля Галуа.
def sub(x,y):
return x^y
mult(x,y) - функция умножения элементов поля Галуа.
def mult(x, y):
if x == 0 or y == 0:
return 0
return exp_[(log_[x] + log_[y]) % 255]
div(x,y) - функция деления элементов поля Галуа.
def div(x, y):
if y == 0:
raise ValueError("y must not be zero")
if x == 0:
return 0
return exp_[(log_[x] - log_[y]) % 255]
pow(x,y) - функция возведение в степень элементов поля Галуа.
def pow(x, power):
i = log_[x]
i *= power
i %= 255
return exp_[i]
inverse(x,y) - функция инвресии элементов поля Галуа.
def inverse(x):
return exp_[255 - log_[x]]
poly_scale(p,x) - умножение вектора на константу
def poly_scale(p, x):
res = [mult(coeff, x) for coeff in p]
return res
poly_add(p,q) - сложение полиномов.
poly_mult(p,q) - умножение полиномов.
poly_div(dividend, divisor) - деление полиномов. quotient - целая часть, remainder - остаток
def poly_div(dividend, divisor):
remainder = dividend.copy()
for i in range(len(dividend) - (len(divisor) - 1)):
coef = remainder[i]
if coef != 0:
for j in range(1, len(divisor)):
if divisor[j] != 0:
remainder[i + j] = sub(remainder[i + j], mult(divisor[j], coef))
quotient = remainder[:len(dividend) - (len(divisor) - 1)]
remainder = remainder[len(dividend) - (len(divisor) - 1):]
return quotient, remainder
Пример входных данных
dividend = [1, 0, 1, 1, 0, 0, 0, 0] # пример полинома-делимого divisor = [1, 1, 1] # пример полинома-делителя
#. Вызов функции quotient, remainder = gf.poly_div(dividend, divisor)
#. Вывод результатов print(«Частное:», quotient) print(«Остаток:», remainder)“““
poly_eval(poly,x)-