- Notifications
You must be signed in to change notification settings - Fork 46.7k
/
Copy pathleast_common_multiple.py
76 lines (62 loc) · 2.17 KB
/
least_common_multiple.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
importunittest
fromtimeitimporttimeit
frommaths.greatest_common_divisorimportgreatest_common_divisor
defleast_common_multiple_slow(first_num: int, second_num: int) ->int:
"""
Find the least common multiple of two numbers.
Learn more: https://en.wikipedia.org/wiki/Least_common_multiple
>>> least_common_multiple_slow(5, 2)
10
>>> least_common_multiple_slow(12, 76)
228
"""
max_num=first_numiffirst_num>=second_numelsesecond_num
common_mult=max_num
while (common_mult%first_num>0) or (common_mult%second_num>0):
common_mult+=max_num
returncommon_mult
defleast_common_multiple_fast(first_num: int, second_num: int) ->int:
"""
Find the least common multiple of two numbers.
https://en.wikipedia.org/wiki/Least_common_multiple#Using_the_greatest_common_divisor
>>> least_common_multiple_fast(5,2)
10
>>> least_common_multiple_fast(12,76)
228
"""
returnfirst_num//greatest_common_divisor(first_num, second_num) *second_num
defbenchmark():
setup= (
"from __main__ import least_common_multiple_slow, least_common_multiple_fast"
)
print(
"least_common_multiple_slow():",
timeit("least_common_multiple_slow(1000, 999)", setup=setup),
)
print(
"least_common_multiple_fast():",
timeit("least_common_multiple_fast(1000, 999)", setup=setup),
)
classTestLeastCommonMultiple(unittest.TestCase):
test_inputs= (
(10, 20),
(13, 15),
(4, 31),
(10, 42),
(43, 34),
(5, 12),
(12, 25),
(10, 25),
(6, 9),
)
expected_results= (20, 195, 124, 210, 1462, 60, 300, 50, 18)
deftest_lcm_function(self):
fori, (first_num, second_num) inenumerate(self.test_inputs):
slow_result=least_common_multiple_slow(first_num, second_num)
fast_result=least_common_multiple_fast(first_num, second_num)
withself.subTest(i=i):
assertslow_result==self.expected_results[i]
assertfast_result==self.expected_results[i]
if__name__=="__main__":
benchmark()
unittest.main()