summaryrefslogtreecommitdiff
path: root/lab4
diff options
context:
space:
mode:
Diffstat (limited to 'lab4')
-rw-r--r--lab4/lab4.py52
-rw-r--r--lab4/requirements.txt2
2 files changed, 54 insertions, 0 deletions
diff --git a/lab4/lab4.py b/lab4/lab4.py
new file mode 100644
index 0000000..3f2ffa4
--- /dev/null
+++ b/lab4/lab4.py
@@ -0,0 +1,52 @@
+from sympy.polys.galoistools import gf_from_int_poly, gf_berlekamp
+from sympy.polys.domains import ZZ
+
+
+def poly_string(polynom):
+ tmp = []
+ for power, coeff in enumerate(polynom):
+ if coeff == 0:
+ continue
+ s = str(coeff) if coeff != 1 and power > 0 or power == 0 else ""
+ if power >= 1:
+ s += "x"
+ if power >= 2:
+ s += f"^{power}"
+ tmp.append(s)
+ return "(" + " + ".join(tmp) + ")"
+
+
+def is_prime(x):
+ for i in range(2, int(x ** 0.5) + 1):
+ if x % i == 0:
+ return False
+ return True
+
+
+def main():
+ p = input("Порядок p поля Z_p: ")
+ try:
+ p = int(p)
+ except ValueError:
+ print("Не удалось считать число")
+ return
+
+ if not is_prime(p):
+ print("Число p должно быть простым")
+ return
+
+ print("Введите коэффициенты многочлена [c_0 + c_1 * x + c_2 * x^2 + ...]:")
+ try:
+ c = map(int, input().split())
+ except ValueError:
+ print("Коэффициенты должны состоять только из цифр")
+ return
+
+ f = gf_from_int_poly(c, p)
+ print(f"Введённый многочлен над полем Z_{p}[x]: {poly_string(f)}")
+ factors = gf_berlekamp(f, p, ZZ)
+ print(" * ".join(map(poly_string, factors)))
+
+
+if __name__ == "__main__":
+ main()
diff --git a/lab4/requirements.txt b/lab4/requirements.txt
new file mode 100644
index 0000000..c8a04f6
--- /dev/null
+++ b/lab4/requirements.txt
@@ -0,0 +1,2 @@
+mpmath==1.2.1
+sympy==1.11.1