Teammasik

lr2_cryptography

May 8th, 2024
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.34 KB | None | 0 0
  1. from tkinter import *
  2. from tkinter import filedialog
  3.  
  4.  
  5. def gcd(a, b):
  6.     while b != 0:
  7.         a, b = b, a % b
  8.     return a
  9.  
  10.  
  11. def calculate_gcd():
  12.     a = int(entry_a.get())
  13.     b = int(entry_b.get())
  14.     result = gcd(a, b)
  15.     result_label.config(text="GCD: " + str(result))
  16.  
  17.  
  18. # алгоритм вычисляет НОД для b и остатка от деления a на b, а также коэффициенты x и y для этого шага рекурсивно
  19. # После рекурсивного вызова алгоритма он получает НОД и коэффициенты
  20. # Затем алгоритм вычисляет коэффициенты x и y для исходных чисел a и b, используя следующие формулы
  21. def extended_gcd(a, b):
  22.     if a == 0:
  23.         return b, 0, 1
  24.     else:
  25.         g, x, y = extended_gcd(b % a, a)
  26.         return g, y - (b // a) * x, x
  27.  
  28.  
  29. def calculate_extended_gcd():
  30.     a = int(entry_a.get())
  31.     b = int(entry_b.get())
  32.     g, x, y = extended_gcd(a, b)
  33.     result_label.config(text="GCD: " + str(g) + "\nx: " + str(x) + "\ny: " + str(y))
  34.  
  35.  
  36. def solve_comparison_equation():
  37.     a = int(entry_a.get())
  38.     b = int(entry_b.get())
  39.     n = int(entry_n.get())
  40.     g, x0, _ = extended_gcd(a, n)
  41.  
  42.     # Проверяем, имеет ли право часть b сравнения быть разделена на НОД g без остатка
  43.     if b % g != 0:
  44.         result_label.config(text="No solutions")
  45.     else:
  46.         x0 = (x0 * (b // g)) % n
  47.         solutions = [(x0 + k * (n // g)) % n for k in range(g)]
  48.         result_label.config(text="Solutions:\n" + "\n".join(map(str, solutions)))
  49.  
  50.  
  51. def read_from_file():
  52.     file_path = filedialog.askopenfilename()
  53.     if file_path:
  54.         try:
  55.             with open(file_path, 'r') as file:
  56.                 a, b, n = map(int, file.readline().split())
  57.                 entry_a.delete(0, END)
  58.                 entry_a.insert(0, str(a))
  59.                 entry_b.delete(0, END)
  60.                 entry_b.insert(0, str(b))
  61.                 entry_n.delete(0, END)
  62.                 entry_n.insert(0, str(n))
  63.         except ValueError:
  64.             result_label.config(text="Invalid file!")
  65.  
  66.  
  67. def validate_input(new_value):
  68.     return new_value.isdigit() or new_value == ""
  69.  
  70.  
  71. root = Tk()
  72.  
  73. vcmd = (root.register(validate_input), '%P')
  74.  
  75. Label(root, text="Number A:").grid(row=0, column=0)
  76. entry_a = Entry(root, validate="key", validatecommand=vcmd)
  77. entry_a.grid(row=0, column=1)
  78.  
  79. Label(root, text="Number B:").grid(row=1, column=0)
  80. entry_b = Entry(root, validate="key", validatecommand=vcmd)
  81. entry_b.grid(row=1, column=1)
  82.  
  83. Label(root, text="Number N:").grid(row=3, column=0)
  84. entry_n = Entry(root, validate="key", validatecommand=vcmd)
  85. entry_n.grid(row=3, column=1)
  86.  
  87. Button(root, text="Calculate GCD", command=calculate_gcd).grid(row=7, column=0, columnspan=2)
  88. Button(root, text="Calculate GCD X and Y", command=calculate_extended_gcd).grid(row=9, column=0, columnspan=2)
  89. Button(root, text="Calculate GCD Diophantine", command=solve_comparison_equation).grid(row=11, column=0, columnspan=2)
  90.  
  91. result_label = Label(root, text="")
  92. result_label.grid(row=15, column=0, columnspan=2)
  93.  
  94. Button(root, text="Read from File", command=read_from_file).grid(row=13, column=0, columnspan=2)
  95.  
  96. root.mainloop()
  97.  
Add Comment
Please, Sign In to add comment