summaryrefslogtreecommitdiff
path: root/lab13/lab13.py
blob: 993ad810d476f508d33d0456610b7919105d3d8d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
def poly_print(f):
    n, f_c = f
    n = len(f_c) - 1
    poly_str = ""
    for i in range(len(f_c)):
        cur_cf = f_c[i]
        if not cur_cf:
            continue
        if cur_cf > 0:
            sign = "+"
        else:
            cur_cf = -cur_cf
            sign = "-"
        poly_str += f"{sign} {cur_cf}x^{n - i} "
    poly_str = poly_str[:len(poly_str) - 4]
    if poly_str[0] == "+":
        poly_str = poly_str[2:]
    return poly_str


def poly_reduction(f):
    n, f_c = f
    i = 0
    while i < len(f_c) and f_c[i] == 0:
        n -= 1
        i += 1
    return n, f_c[i:]


def inverse(n, field):
    x = 0
    for _ in range(field):
        if (n * x) % field != 1:
            x += 1
        else:
            break
    return x


def pdf(f, g, field):
    m, f_c = f
    n, g_c = g
    f_c.reverse()
    g_c.reverse()

    q_c = [0] * (m + 1)
    r_c = f_c

    for k in range(m - n, -1, -1):
        q_c[k] = (f_c[n + k] * inverse(g_c[n], field)) % field
        for j in range(n + k - 1, k - 1, -1):
            r_c[j] = (r_c[j] - q_c[k] * g_c[j - k]) % field

    q_c.reverse()
    r_c.reverse()

    return (m, q_c), (n, r_c)


if __name__ == "__main__":
    print("Введите коэффициенты первого многочлена:")
    cf = list(map(int, input().split()))
    f = poly_reduction((len(cf) - 1, cf))

    print("Введите коэффициенты второго многочлена:")
    cf = list(map(int, input().split()))
    g = poly_reduction((len(cf) - 1, cf))

    f_size = int(input("Введите размерность поля: "))

    q, r = pdf(f, g, f_size)

    print("Результат деления:", poly_print(q))
    if r is not None:
        print("Остаток от деления:", poly_print(r))
    else:
        print("Остатка нет")