diff options
Diffstat (limited to 'lab13/lab13.py')
| -rw-r--r-- | lab13/lab13.py | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/lab13/lab13.py b/lab13/lab13.py new file mode 100644 index 0000000..993ad81 --- /dev/null +++ b/lab13/lab13.py @@ -0,0 +1,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("Остатка нет")
|