-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathBài 35 Miller-Rabin copy.py
54 lines (54 loc) · 1.72 KB
/
Bài 35 Miller-Rabin copy.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
import random
def power(a, k, n):
b = 1
# Cập nhật x nếu nó lớn hơn p
a = a % n
while(k > 0):
# Nếu y là số lẻ, nhân x với kết quả
if(k & 1):
b = (b * a) % n
# y là số chẵn
k = k >> 1 # y = y/2
a = (a * a) % n
return b
def millerTest(r, n):
# Chon một số a ngẫu nhiên từ [2..n-2]
# Các trường hợp đảm bảo n > 4
a = 2 + random.randint(1, n - 4)
# Thực hiện vòng lặp tính a^r % n
y = power(a, r, n)
if(y == 1 or y == n-1):
return True
# Tiếp tục bình phương x trong kho một trong các trường hợp sau không xảy ra:
# 1. r không chạm tới n - 1
# 2. y ^ 2 % n không bằng 1
# 3. y ^ 2 % n không bằng n - 1
while(r != n - 1):
y = (y * y) % n
r *= 2
if(y == 1):
return False
if(y == n - 1):
return True
return False
# Trả về False nếu n là composite và trả về true nếu n là số nguyên
# k là một tham số đầu vào quyết định mức độ chính xác, k càng cao nghĩa là độ chính xác càng cao
def isPrime(n, k):
if(n <= 1 or n == 4):
return False
if(n <= 3):
return True
# Tìm giá trị của r sao cho n = 2^s * r + 1 với r >= 1
r = n - 1
while(r % 2 == 0):
r //= 2
for i in range(k):
if(millerTest(r, n) == False):
return False
return True
k = 4
n = int(input("Nhập số nguyên tố n: "))
if(isPrime(n, k) == True):
print("Số {} là số nguyên tố ".format(n))
else:
print("Số %d không là số nguyên tố" % n)