-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path_math.py
85 lines (73 loc) · 1.9 KB
/
_math.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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
import random
# hàm kiếm tra số nguyên tố Miller-Rabin primality test.
# def type
def modPrimePow(a=int, b=int, p=int):
ret = 1
a %= p
b %= p - 1
while b > 0:
if b % 2 > 0:
ret = (ret * a) % p
a = (a * a) % p
b //= 2
return ret
def is_prime(n, k=10):
if n <= 1 or n == 4:
return False
if n <= 3:
return True
# tìm d và s thỏa d * 2^s = n - 1
s = 0
d = n - 1
while d % 2 == 0:
d //= 2
s += 1
for _ in range(k):
t = random.randint(2, n - 2)
x = pow(t, d, n)
if x == 1 or x == n - 1:
continue
for r in range(s - 1):
x = pow(x, 2, n)
if x == n - 1:
break
else:
return False
return True
# class type
# class math():
# def __init__(self) -> None:
# pass
# def modPrimePow(self, a=int, b=int, p=int):
# ret = 1
# a %= p
# b %= p - 1
# while b > 0:
# if b % 2 > 0:
# ret = (ret * a) % p
# a = (a * a) % p
# b //= 2
# return ret
# def is_prime(self, n, k=10):
# if n <= 1 or n == 4:
# return False
# if n <= 3:
# return True
# # tìm d và s thỏa d * 2^s = n - 1
# s = 0
# d = n - 1
# while d % 2 == 0:
# d //= 2
# s += 1
# for _ in range(k):
# t = random.randint(2, n - 2)
# x = pow(t, d, n)
# if x == 1 or x == n - 1:
# continue
# for r in range(s - 1):
# x = pow(x, 2, n)
# if x == n - 1:
# break
# else:
# return False
# return True