def calc_S(v_vec, alpha_degree, GF_step, degree_of_symbol_x, use_latex): global x v_alpha = Add() v_alpha_mod = Add() for i in range(len(v_vec)): v_alpha += v_vec[i] * x ** (i * alpha_degree) v_alpha_mod += v_vec[i] * x ** ((i * alpha_degree) % (2 ** GF_step - 1)) v_alpha_mod = v_alpha_mod.as_poly(x, domain='GF(2)').args[0] S = sum_alpha(v_alpha_mod, degree_of_symbol_x) if v_alpha == v_alpha_mod: if use_latex: calc = latex(v_alpha) else: calc = v_alpha.__str__() else: if use_latex: calc = latex(v_alpha) + ' = ' + latex(v_alpha_mod) else: calc = v_alpha.__str__() + ' = ' + v_alpha_mod.__str__() if S == 0: return 0, 0, calc k, l = np.where(degree_of_symbol_x[:-1] == '{:>0{GF}b}'.format(S, GF=GF_step)) return a ** (int(k) - 1), int(k), calc
def degree_mod(pol, mod: int): if pol.is_Integer or pol.is_Symbol: return pol if pol.is_Pow: return pol.args[0] ** (int(pol.args[1]) % mod) new_pol = Add() for i in range(len(pol.args)): if pol.args[i].is_Integer or pol.args[i].is_Symbol: new_pol += pol.args[i] else: new_pol += pol.args[i].args[0] ** (int(pol.args[i].args[1]) % mod) if pol.args[-1].is_Integer: return new_pol.as_poly(a, domain='GF(2)').args[0] elif pol.args[-1].is_Symbol: return new_pol.as_poly(pol.args[-1], domain='GF(2)').args[0] else: return new_pol.as_poly(pol.args[-1].args[0], domain='GF(2)').args[0]
def get_lambda_3(S1, S3, S5, degree_of_symbol_x, GF_step): Lambda2_first = Add(S1 ** 2 * S3 + S5) Lambda2_second = Add(S1 ** 3 + S3) Lambda2_second = Lambda2_second.as_poly(a, domain='GF(2)').args[0] Lambda2_second = degree_mod(Lambda2_second, 2 ** GF_step - 1) Lambda2_second = Lambda2_second.as_poly(a, domain='GF(2)').args[0] Lambda2_second = sum_alpha(Lambda2_second, degree_of_symbol_x) if Lambda2_second == 0: return False, 0, 0 Lambda2_second = '{:>0{GF}b}'.format(Lambda2_second, GF=GF_step) k, l = np.where(degree_of_symbol_x[:-1] == Lambda2_second) Lambda2_second = degree_mod(a ** -(int(k) - 1), 2 ** GF_step - 1) Lambda2_mul = Lambda2_first * Lambda2_second if not Lambda2_mul.is_Integer: Lambda2_mul = Lambda2_mul.as_poly().args[0] Lambda2_mod = degree_mod(Lambda2_mul, 2 ** GF_step - 1) Lambda2_mod = Lambda2_mod.as_poly(a, domain='GF(2)').args[0] Lambda2_sum = '{:>0{GF}b}'.format(sum_alpha(Lambda2_mod, degree_of_symbol_x), GF=GF_step) if Lambda2_sum == '0000': Lambda2 = 0 else: k, l = np.where(degree_of_symbol_x[:-1] == Lambda2_sum) Lambda2 = a ** (int(k) - 1) Lambda3_first = Add(S1 ** 3 + S3) Lambda3_second = Add(S1 * Lambda2) if not Lambda3_second.is_Integer: Lambda3_second = Lambda3_second.as_poly().args[0] Lambda3_first = Lambda3_first.as_poly(a, domain='GF(2)').args[0] Lambda3_second = Lambda3_second.as_poly(a, domain='GF(2)').args[0] Lambda3_first = degree_mod(Lambda3_first, 2 ** GF_step - 1) Lambda3_second = degree_mod(Lambda3_second, 2 ** GF_step - 1) Lambda3 = Lambda3_first + Lambda3_second Lambda3 = Lambda3.as_poly(a, domain='GF(2)').args[0] Lambda3 = '{:>0{GF}b}'.format(sum_alpha(Lambda3, degree_of_symbol_x), GF=GF_step) if Lambda3 == '0000': Lambda3 = 0 else: k, l = np.where(degree_of_symbol_x[:-1] == Lambda3) Lambda3 = a ** (int(k) - 1) return True, Lambda2, Lambda3