bench_discrete_log.py 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. import sys
  2. from time import time
  3. from sympy.ntheory.residue_ntheory import (discrete_log,
  4. _discrete_log_trial_mul, _discrete_log_shanks_steps,
  5. _discrete_log_pollard_rho, _discrete_log_pohlig_hellman)
  6. # Cyclic group (Z/pZ)* with p prime, order p - 1 and generator g
  7. data_set_1 = [
  8. # p, p - 1, g
  9. [191, 190, 19],
  10. [46639, 46638, 6],
  11. [14789363, 14789362, 2],
  12. [4254225211, 4254225210, 2],
  13. [432751500361, 432751500360, 7],
  14. [158505390797053, 158505390797052, 2],
  15. [6575202655312007, 6575202655312006, 5],
  16. [8430573471995353769, 8430573471995353768, 3],
  17. [3938471339744997827267, 3938471339744997827266, 2],
  18. [875260951364705563393093, 875260951364705563393092, 5],
  19. ]
  20. # Cyclic sub-groups of (Z/nZ)* with prime order p and generator g
  21. # (n, p are primes and n = 2 * p + 1)
  22. data_set_2 = [
  23. # n, p, g
  24. [227, 113, 3],
  25. [2447, 1223, 2],
  26. [24527, 12263, 2],
  27. [245639, 122819, 2],
  28. [2456747, 1228373, 3],
  29. [24567899, 12283949, 3],
  30. [245679023, 122839511, 2],
  31. [2456791307, 1228395653, 3],
  32. [24567913439, 12283956719, 2],
  33. [245679135407, 122839567703, 2],
  34. [2456791354763, 1228395677381, 3],
  35. [24567913550903, 12283956775451, 2],
  36. [245679135509519, 122839567754759, 2],
  37. ]
  38. # Cyclic sub-groups of (Z/nZ)* with smooth order o and generator g
  39. data_set_3 = [
  40. # n, o, g
  41. [2**118, 2**116, 3],
  42. ]
  43. def bench_discrete_log(data_set, algo=None):
  44. if algo is None:
  45. f = discrete_log
  46. elif algo == 'trial':
  47. f = _discrete_log_trial_mul
  48. elif algo == 'shanks':
  49. f = _discrete_log_shanks_steps
  50. elif algo == 'rho':
  51. f = _discrete_log_pollard_rho
  52. elif algo == 'ph':
  53. f = _discrete_log_pohlig_hellman
  54. else:
  55. raise ValueError("Argument 'algo' should be one"
  56. " of ('trial', 'shanks', 'rho' or 'ph')")
  57. for i, data in enumerate(data_set):
  58. for j, (n, p, g) in enumerate(data):
  59. t = time()
  60. l = f(n, pow(g, p - 1, n), g, p)
  61. t = time() - t
  62. print('[%02d-%03d] %15.10f' % (i, j, t))
  63. assert l == p - 1
  64. if __name__ == '__main__':
  65. algo = sys.argv[1] \
  66. if len(sys.argv) > 1 else None
  67. data_set = [
  68. data_set_1,
  69. data_set_2,
  70. data_set_3,
  71. ]
  72. bench_discrete_log(data_set, algo)