示例#1
0
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
示例#2
0
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]
示例#3
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