Advertisement
saleks28

bva6

Aug 29th, 2020
323
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.14 KB | None | 0 0
  1. from datetime import datetime
  2.  
  3. CONST_MENU = "Введите номер команды\n" \
  4.     "1 - m-арный алгоритм\n" \
  5.     "2 - Бинарный алгоритм\n" \
  6.     "3 - Встроенные функции Sage\n" \
  7.     "4 - Выход\n"
  8.  
  9. def pre_calculations(m, P):
  10.     P_arr = []
  11.     P_arr.append(0 * P)
  12.     P_arr.append(P)
  13.     for i in range(2, 2 ** m):
  14.         P_arr.append(i * P)
  15.     return P_arr
  16.  
  17. def slice_to_bits(number, bits):
  18.     bitstring = "{0:b}".format(number)
  19.     res = []
  20.     while len(bitstring) % bits != 0:
  21.         bitstring = '0' + bitstring
  22.     i = 0
  23.     while i < len(bitstring):
  24.         j = i + bits
  25.         part = bitstring[i:j]
  26.         res.append(int(part, 2))
  27.         i = j
  28.     return res
  29.  
  30.  
  31. def m_alg(k, m, P, E, P_arr):
  32.     Q_inf = E(0, 1, 0)
  33.     fi_arr = slice_to_bits(k, m)
  34.     for fi in fi_arr:
  35.         Q_inf = 2 ** m * Q_inf
  36.         if fi != 0:
  37.             Q_inf = Q_inf + P_arr[fi]
  38.     return Q_inf
  39.  
  40.  
  41. def bin_alg(P, k, E):
  42.     t = int(ceil(log(k, 2)))
  43.     Q_inf = E(0, 1, 0)
  44.     binary_form_k = bin(k)[2::]
  45.     for i in range(0, t):
  46.         Q_inf = 2 * Q_inf
  47.         if binary_form_k[i] == '1':
  48.             Q_inf = Q_inf + P
  49.     return Q_inf
  50.  
  51.  
  52. def show_sage_results(P, E, k):
  53.     print("Sage: ")
  54.     start_time = datetime.now()
  55.     print("Умножение числа на точку: {} за время {}" . format(E(k* P), datetime.now() - start_time))
  56.  
  57.  
  58. def main():
  59.     # Константы
  60.     p = 115792089237316193816632940749697632394964361042935191217416087735021737577431
  61.     A = 39911043712488959346023488649471543779004688285304668897256090422321915164205
  62.     B = 26607362474992639564015659099647695852669792190203112598170726948214610109470
  63.     xG = 1
  64.     yG = 11226734598496010064741041559038474696573800958032815190522914592034679115175
  65.     E = EllipticCurve(GF(p), [A, B])
  66.     G = E(xG, yG)
  67.     k = 222200022200022220002220002222
  68.  
  69.     # m задается произвольно
  70.     m = 4
  71.  
  72.     while 1:
  73.         user_choice = input(CONST_MENU)
  74.         if not user_choice.isdigit():
  75.             continue
  76.         user_choice = int(user_choice)
  77.         if user_choice == 1:
  78.             all_time = None
  79.             start_time = datetime.now()
  80.             P_arr = pre_calculations(m, G)
  81.             all_time = datetime_now() - start_time
  82.             print("Время пред. расчетов: {}" . format(all_time))
  83.             start_time = datetime.now()
  84.             res = m_alg(k, m, G, E, P_arr)
  85.             end_time = datetime.now() - start_time
  86.             print("m-арный алгоритм: {} за время {}" . format(res, end_time ))
  87.             print("Общее время работы: {}" . format(all_time + end_time))
  88.         elif user_choice == 2:
  89.             start_time = datetime.now()
  90.             res = bin_alg(G, k, E)
  91.             print("Своя реализация умножения точки на число: {} за время {}" . format(res, datetime.now() - start_time))
  92.         elif user_choice == 3:
  93.             show_sage_results(G, E, k)
  94.         elif user_choice == 4:
  95.             return
  96.     pass
  97.  
  98. main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement