neongm

zhegalkin source code

Jan 12th, 2021
640
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. from random import randint
  2.  
  3. DEBUG = False
  4.  
  5. def to_sbin(n, target_length = 0):
  6.     b = str(bin(n)).replace("0b", '')
  7.     if len(b) < target_length: b = "0"*(target_length-len(b)) + b
  8.     return b
  9.  
  10. def sbin_to_element(n):
  11.     if "1" not in n: return "1"
  12.     return "".join(["x{}".format(i+1) for i in range(len(n)) if n[i] == "1"])
  13.  
  14. def pascal_triangle_iteration(arr):                                # actual zhegalkin functions:
  15.     return [arr[i]^arr[i+1] for i in range(len(arr)-1)]
  16.  
  17. def pascal_triangle(arr):
  18.     global DEBUG
  19.     res = [arr[0]]
  20.     if DEBUG: print("\nтреугольник паскаля:\n", arr, sep="")
  21.     for i in range(len(arr)-1):
  22.         arr = pascal_triangle_iteration(arr)
  23.         if DEBUG: print(arr)
  24.         res.append(arr[0])
  25.     if DEBUG: print("g:",res)
  26.     return res
  27.  
  28. def worker(arr, base):
  29.     global DEBUG
  30.     p_arr = pascal_triangle(arr)
  31.     if DEBUG:
  32.         print("\nтаблица слагаемых:")
  33.         print("g\tслагаемое")
  34.         for i in range(len(p_arr)):
  35.             if p_arr[i]==1: print("{}\t{}\t".format(p_arr[i], sbin_to_element(to_sbin(i, base))), sep='')
  36.             else: print("{}\t{}\t".format(p_arr[i], sbin_to_element(to_sbin(i, base))))
  37.     return " (+) ".join([sbin_to_element(to_sbin(i, base)) for i in range(len(p_arr)) if p_arr[i] == 1])
  38.                                                                      # end of the actual code
  39.  
  40. def input_test(inp):
  41.     for i in inp:
  42.         if i not in ["0", "1"]:
  43.             print("введено значение, не равное 0 или 1\n")
  44.             return False
  45.     for i in range(2, 100):
  46.         if len(inp)==2**i: return True
  47.     print("длинна последовательности должна быть 2^n\n")
  48.     return False
  49.  
  50. def get_inputs_amount(inp):
  51.     for i in range(1, 100):
  52.         if len(inp)==2**i: return i
  53.     else: return False
  54.  
  55. def main():
  56.     global DEBUG
  57.     while True:
  58.         temp_input = input("введите значения таблицы или команду\n>").lower()
  59.         if temp_input in ["выход", "выйти", "exit", "quit", "закрыть"]: break
  60.  
  61.         elif temp_input in ["debug", "подробно", "расписать", "дебаг"]:
  62.             DEBUG = False if DEBUG==True else True
  63.             if DEBUG==True: print("промежуточный вывод включен\n")
  64.             else: print("промежуточный вывод выключен\n")
  65.  
  66.         elif len(temp_input)!=0 and input_test(temp_input):
  67.             truth_table = [int(i) for i in temp_input]
  68.             res = worker(truth_table, get_inputs_amount(truth_table))
  69.             print("\nполученный полином:", res,'\n')
  70.  
  71.         else:
  72.             print("ошибка ввода\nвозможные команды:\n   - ввод таблицы - последовательность из 0 и 1, пример: 11101100\n   - выход, exit (и т.п.) - для выхода из программы\n   - подробно, debug - включает вывод промежуточных данный и действий программы,\n     повторное введение отключает данную опцию\n", sep="")
  73.  
  74. if __name__ == "__main__": main()
RAW Paste Data