Advertisement
Guest User

Untitled

a guest
Feb 26th, 2020
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.91 KB | None | 0 0
  1. import random
  2. import time
  3. from Cryptodome.Util import number
  4.  
  5. start_time = time.time()
  6.  
  7. count_of_iterations = int(input("Введите количество итераций:\n"))
  8.  
  9. prime_numbers = []
  10. q = number.getPrime(16)
  11.  
  12. for _ in range(1):
  13.     while True:
  14.         b = q.bit_length()
  15.         if b == 256:
  16.             prime_numbers.append(q)
  17.             q = number.getPrime(16)
  18.             break
  19.         N = number.getPrime(q.bit_length())
  20.         p = 2 * q * N + 1
  21.         if p.bit_length() == q.bit_length() * 2 and pow(2, 2 * N, p) != 1 and pow(2, 2 * N * q, p) == 1:
  22.             q = p
  23.  
  24. print(prime_numbers)
  25.  
  26.  
  27. def Ferm(n, k):
  28.     if n == 1:
  29.         print("Ни простое, ни составное\n")
  30.         return
  31.  
  32.     for a in range(1, k + 1):
  33.         if a % n != 0:
  34.             mod_a = pow(a, n - 1, n)
  35.             if mod_a != 1:
  36.                 print("Тест Ферма: составное с вероятностью 100.0 %")
  37.                 break
  38.     print("Тест Ферма: простое с вероятностью ", (1 - 2 ** (-k)) * 100, "%")
  39.  
  40.  
  41. def Miller_Rabin(n, k):
  42.     flag = False
  43.  
  44.     if n == 2 or n == 3:
  45.         print("Тест Миллера-Рабина: простое с вероятностью ", (1 - 4 ** (-k)) * 100, "%")
  46.     if n <= 1 or n % 2 == 0:
  47.         print("Тест Миллера-Рабина: составное с вероятностью 100.0 %")
  48.  
  49.     s = 0
  50.     d = n - 1
  51.  
  52.     while d & 1 == 0:
  53.         s += 1
  54.         d //= 2
  55.     for _ in range(k):
  56.         a = random.randrange(2, n)
  57.         x = pow(a, d, n)
  58.         if x != 1 and x != n - 1:
  59.             r = 1
  60.             while r < s and x != n - 1:
  61.                 x = pow(x, 2, n)
  62.                 if x == 1:
  63.                     break
  64.                 r += 1
  65.             if x != n - 1:
  66.                 break
  67.         flag = True
  68.  
  69.     if flag:
  70.         print("Тест Миллера-Рабина: простое с вероятностью ", (1 - 4 ** (-k)) * 100, "%")
  71.     else:
  72.         print("Тест Миллера-Рабина: составное с вероятностью 100.0 %")
  73.  
  74.  
  75. def calculate_Lejandr(base, degree, mod):
  76.     x = 1
  77.     a = base
  78.     p = mod
  79.     while degree > 0:
  80.         if degree % 2 == 1:
  81.             x = (x * a) % p
  82.  
  83.         a = (a * a) % p
  84.         degree = degree // 2
  85.  
  86.     return x % p
  87.  
  88.  
  89. def calculateJacobian(a, n):
  90.     if a == 0:
  91.         return 0
  92.  
  93.     ans = 1
  94.     if a < 0:
  95.  
  96.         a = -a
  97.         if n % 4 == 3:
  98.             ans = -ans
  99.  
  100.     if a == 1:
  101.         return ans
  102.  
  103.     while a:
  104.         if a < 0:
  105.  
  106.             a = -a
  107.             if n % 4 == 3:
  108.                 ans = -ans
  109.  
  110.         while a % 2 == 0:
  111.             a = a // 2
  112.             if n % 8 == 3 or n % 8 == 5:
  113.                 ans = -ans
  114.  
  115.         a, n = n, a
  116.  
  117.         if a % 4 == 3 and n % 4 == 3:
  118.             ans = -ans
  119.         a = a % n
  120.  
  121.         if a > n // 2:
  122.             a = a - n
  123.  
  124.     if n == 1:
  125.         return ans
  126.     return 0
  127.  
  128.  
  129. def Solovay_Strassen(n, k):
  130.     if n < 2 or (n != 2 and n % 2 == 0):
  131.         print("Тест Соловея-Штрассена: составное с вероятностью 100.0 %")
  132.  
  133.     for i in range(k):
  134.         a = random.randrange(n - 1) + 1
  135.         jacobi = (n + calculateJacobian(a, n)) % n
  136.         lejandr = calculate_Lejandr(a, (n - 1) / 2, n)
  137.  
  138.         if jacobi == 0 or lejandr != jacobi:
  139.             print("Тест Соловея-Штрассена: составное с вероятностью 100.0 %")
  140.  
  141.     print("Тест Соловея-Штрассена: простое с вероятностью", (1 - 2 ** (-k)) * 100, "%")
  142.  
  143.  
  144. for x in prime_numbers:
  145.     print("Число ", x, ":")
  146.     Ferm(x, count_of_iterations)
  147.     Solovay_Strassen(x, count_of_iterations)
  148.     Miller_Rabin(x, count_of_iterations)
  149.     print("\n")
  150.  
  151. print("--- %s seconds ---" % (time.time() - start_time))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement