Các số liệu và dữ liệu trong các bảng biểu được sử dụng để phục vụ cho việc phântích, nhận xét và đánh giá đã được tôi thu thập từ các nguồn đáng tin cậy, và tất cả cácnguồn này được ghi
YÊU CẦU
Regulations
You should solve and submit this report to your elearning account within 14 days, from the beginning of May 21st, 2024, to the end of Jun 3rd, 2024 Late submission is not accepted.
This is a group final report Number of students in a group can’t be more than 3.
In the test, there are questions that need to be customized according to a student
ID Only the smallest student ID in your group will be used for this purpose For example, in group of 3 students, said 52200123, 52200136 and 52201001, then only
Students need to submit a compressed file named with your Student IDs, eg. 52200123_52200136_52201001.zip/rar, including this structure:
The document file is in Word format (.doc/docx), named by your Student IDs, eg. 52200123_52200136_52201001.docx, using our faculty’s format, from 25 to 35 pages The tasks of each member and self-evaluation of your group should be declared at the end of this report.
English is required for high-quality classes Format violations will cost from 10% to 50% of your total scores
Any case of plagiarism will get 0.
The Python source code files are named by your Student ID and Task Number, eg.52200123_52200136_52201001_8.py and 52200123_52200136_52201001_9.py.
Questions
1.2.1 Question 1: Euclid’s algorithm and Bezout’s identity
1.2.8 Question 8: Finding an Inverse Modulo n
THỰC HIỆN
Question 1: Euclid’s algorithm and Bezout’s identity
2.1.1 Requirements a Using Euclid’s algorithm to calculate gcd(2024, 1000 + m) and lcm(2024, 1000 + m), where m is the last 3 digits of your student ID For example, if your student ID is
52200123 then you need to calculate gcd(2024, 1123) and lcm(2024, 1123). b Apply above result(s) in to find 5 integer solution pairs (x,y) of this equation:
For example, if your student ID is 52000123 then your equation is:
2024x + 1123y = gcd(2024, 1123) 2.1.2 Present: a Mã số sinh viên của tôi là: 52000846
Theo giải thuật Euclid, ước chung lớn nhất của hai số nguyên sẽ không thay đổi khi thay đổi số lớn hơn bằng hiệu của nó với số nhỏ hơn: gcd(a, b) = gcd(a - b, b) (a,b Z, a > b)∈
Theo giải thuật Euclid, ta có: gcd(2024, 1846) = gcd(2024 - 1846, 1846) = gcd(178, 1846) = gcd(1846, 178)
Tương tự gán a = 1846, b = 178, ta có: gcd(1846, 178) = gcd(1846- 178, 178) = gcd(1668, 178)
Tương tự gán a = 1668, b = 178, ta có: gcd(1668, 178) = gcd(1668- 178, 178) = gcd(1490, 178)
Tương tự gán a = 1490, b = 178, ta có: gcd(1490, 178) = gcd(1490- 178, 178) = gcd(1312, 178)
Tương tự gán a = 1312, b = 178, ta có: gcd(1312, 178) = gcd(1312- 178, 178) = gcd(1134, 178)
Tương tự gán a = 1134, b = 178, ta có: gcd(1134, 178) = gcd(1134- 178, 178) = gcd(956, 178)
Tương tự gán a = 956, b = 178, ta có gcd(956, 178) = gcd(956- 178, 178) = gcd(778, 178)
Tương tự gán a = 778, b = 178, ta có: gcd(778, 178) = gcd(778- 178, 178) = gcd(600, 178)
Tương tự gán a = 600, b = 178, ta có: gcd(600, 178) = gcd(600- 178, 178) = gcd(422, 178)
Tương tự gán a = 422, b = 178, ta có: gcd(422, 178) = gcd(422- 178, 178) = gcd(244, 178)
Tương tự gán a = 244, b = 178, ta có: gcd(244, 178) = gcd(244- 178, 178) = gcd(66, 178) = gcd(178,66)
Tương tự gán a = 178, b = 66, ta có: gcd(178, 66) = gcd(178 - 66, 66) = gcd(112, 66)
Tương tự gán a = 112, b = 66, ta có: gcd(112, 66) = gcd(112 - 66, 66) = gcd(46, 66) = gcd(66,46)
Tương tự gán a = 66, b = 46, ta có: gcd(66, 46) = gcd(66 - 46, 46) = gcd(20, 46) = gcd(46,20)
Tương tự gán a = 46, b = 20, ta có: gcd(46, 20) = gcd(46 - 20, 20) = gcd(26, 20)
Tương tự gán a = 26, b = 20, ta có: gcd(26, 20) = gcd(26 - 20, 20) = gcd(6, 20) = gcd(20,6)
Tương tự gán a = 20, b = 6, ta có: gcd(20, 6) = gcd(20-6, 6) = gcd(14, 6)
Tương tự gán a = 14, b = 6, ta có: gcd(14, 6) = gcd(14-6, 6) = gcd(8, 6)
Tương tự gán a = 8, b = 6, ta có: gcd(8, 6) = gcd(8-6, 6) = gcd(2, 6) = gcd(6,2)
Tương tự gán a = 6, b = 2, ta có: gcd(6, 2) = gcd(6-2, 2) = gcd(4, 2)
Tương tự gán a = 4, b = 2, ta có: gcd(4, 2) = gcd(4-2, 2) = gcd(2, 2)
Tương tự gán a = 2, b = 2, ta có: gcd(2, 2) = gcd(2-2, 2) = gcd(0, 2)
Ta lại có: a x b = gcd(a,b) x lcm(a,b)
Từ đáp án của câu ta có:a
Từ đáp án của câu , ta có:a gcd(2024,1846) = gcd(1846,178) 2024 = 1 x 1846 + 178⇒
= gcd(2,0) 6 = 3 x 2 + 0⇒ Hay ta có thể viết thành:
⇒ Phương trình (*) có 1 cặp nghiệm là (x1, y1) = (-280, 307)
- Theo bổ đề Bezout, với phương trình ax + by = d, các cặp nghiệm (x, y) có thể được tìm thấy theo dạng tổng quát (x + k.b/d, y – k.a/d) với k là các số nguyên. Theo phương trình (*), với a = 2024, b = 1846, d = 2, chọn k = 1, ta có 1 cặp nghiệm mới là:
Chọn k = -1, ta có cặp nghiệm mới:
Chọn k = 2, ta có cặp nghiệm mới:
Chọn k = -2, ta có cặp nghiệm mới:
⇒ 5 cặp nghiệm có thể tìm thấy của phương trình đã cho là:
Question 2: Recurrence relation
Solve this recurrence relation an = 8.a – 15.an−1 n−2 with a = 5 and a = m, 0 1 where m is the last 2 digits of your student ID For example, if your student
Mã số sinh viên của tôi là: 52000846 a = m = 46⇒ 1
Ta thấy hệ thức: an = 8.a – 15.an−1 n−2 là hệ thức truy hồi tuyến tính thuần nhất bậc 2 với hệ số hằng.
⇒ Hệ thức trên sẽ thỏa mãn bởi chuỗi 1, t, t , t , , t 2 3 n với (t R, t ≠ 0) nếu và chỉ nếu t thỏa mãn phương trình:∈ t 2 - 8t + 15 = 0 (**) Δ = b – 4ac = (-8) – 4 x 1 x 15 = 4 2 2
Do Δ > 0 Phương trình có 2 nghiệm riêng biệt:⇒ x1 = − b + Δ
Vì phương trình (**) có 2 nghiệm phân biệt nên các nghiệm t của phương trình này sẽ thỏa mãn nghiệm tổng quát: an = C × x 1 n +D × x 2 n =C ×5 n +D ×3 n
Với a = 5, a = 46, ta có hệ phương trình:0 1 a0 = 5 = C.5 + D.3 = C + D 0 0 a1 = 46 = C.5 + D.3 = 5C + 3D 1 1
⇒ Nghiệm của C, D của hệ trên là: C = 15.5, D= -10.5
⇒ Dạng tổng quát của các số hạng thuộc hệ thức truy hồi trên là: a = 15.5 - 10.5n n n
Question 3: Set
2.3.1 Requirements a Create a set Γ of characters from your case-insensitive non-diacritical full name. For example, the set corresponding with “Tôn Đức Thắng” is Δ = {A, C, D, G, H, N, O,
T, U}. b Find the union, intersect, non-symmetric difference, and symmetric difference of Γ and Δ, where Γ and Δ are from question 3a.
Tên đầy đủ của tôi là: “Nguyễn Cao Lâm”
Question 4: Relations
Let be a binary relation defined on 2 integers as follow:ℜ
∀a,b∈N (aRb↔m|(a.b)) where is the last 2 digits of your student ID
For example, if your student ID is 52200123 then the valid binary relation is
Is R reflexive, symetric, anti-symetric, transitive? Prove your answer
Mã số sinh viên của tôi là: 52000846 a1 = m = 46.⇒
R không có tính phản xạ: Để chứng tỏ R có tính phản xạ, cần phải chứng minh rằng:
Theo định nghĩa của R, điều này có nghĩa là:
Với mọi a N, 46|(a.a)∈ Điều này sai vì với trường hợp a = 5, a.a = 5 x 5 = 25 và 25 không chia hết cho 46
⇒ Vì thế R không có tính phản xạ.
R có tính đối xứng: Để chứng tỏ R có tính đối xứng, cần phải chứng minh rằng:
Với mọi a, b N, nếu aRb thì bRa∈
Theo định nghĩa của R, điều này có nghĩa là:
Với mọi a, b N, nếu 46|(a.b) thì 46|(b.a)∈ Điều đó đúng vì a.b = b.a theo luật giao hoán cho phép cộng và phép nhân
⇒ Vì thế R có tính đối xứng.
R không có tính phản đối xứng: Để chứng tỏ R có tính đối xứng, cần phải chứng minh rằng:
Với mọi a, b N, nếu aRb và bRa thì a = b∈
Theo định nghĩa của R, điều này có nghĩa là:
Với mọi a, b N, nếu 46|(a.b) và 46|(b.a) thì a = b∈ Điều đó không đúng với trường hợp a = 1, b = 23, khi đó 46|(1 x 23) và 46|(23 x 1) nhưng 1 ≠ 23.
⇒ Vì thế R không có tính phản đối xứng.
R có tính bắc cầu: Để chứng tỏ R có tính bắc cầu, cần phải chứng minh rằng: Với mọi a, b, c N, nếu aRb ∈ và bRc thì aRc
Theo định nghĩa của R, điều này có nghĩa là:
Với mọi a, b, c N, nếu 46|(a.b) và 46|(b.c) thì 46|(a.c)∈ Điều đó đúng với mọi trường hợp
⇒ Vì thế R có tính bắc cầu.
Question 5: Kruskal’s algorithm
Propose a solution for circuit-checking in Kruskal's algorithm Give an example.
Giới Thiệu Về Thuật Toán Kruskal
Thuật toán Kruskal là một thuật toán cổ điển được sử dụng để tìm Cây Khung Nhỏ Nhất (Minimum Spanning Tree - MST) của một đồ thị vô hướng, có trọng số MST là một tập hợp con của các cạnh kết nối tất cả các đỉnh trong đồ thị mà không tạo ra bất kỳ chu trình nào và có tổng trọng số nhỏ nhất.
Các Bước Của Thuật Toán Kruskal:
1 Sắp xếp tất cả các cạnh của đồ thị theo thứ tự không giảm của trọng số.
2 Khởi tạo một rừng trong đó mỗi đỉnh là một cây riêng biệt.
3 Lặp qua các cạnh đã sắp xếp và thêm cạnh vào MST nếu nó không tạo ra chu trình với các cạnh đã có trong MST.
4 Sử dụng cấu trúc dữ liệu Union-Find để kiểm tra chu trình và hợp nhất các cây một cách hiệu quả.
Cấu Trúc Dữ Liệu Union-Find
Cấu trúc dữ liệu Union-Find (còn được gọi là Disjoint Set Union - DSU) được sử dụng để quản lý và hợp nhất các tập hợp các phần tử và kiểm tra xem hai phần tử có cùng tập hợp hay không.
- Find: Xác định tập hợp mà một phần tử cụ thể thuộc về.
- Union: Hợp nhất hai tập hợp thành một.
Giải Pháp Kiểm Tra Chu Trình Để kiểm tra chu trình trong thuật toán Kruskal, chúng ta sử dụng cấu trúc dữ liệu Union-Find Khi xem xét việc thêm một cạnh (u, v), chúng ta kiểm tra xem u và v có cùng tập hợp hay không bằng cách sử dụng hoạt động `Find`:
- Nếu `Find(u)` bằng `Find(v)`, thêm cạnh này sẽ tạo ra chu trình, do đó chúng ta bỏ qua cạnh này.
- Nếu `Find(u)` không bằng `Find(v)`, chúng ta thêm cạnh vào MST và thực hiện
`Union(u, v)` để hợp nhất các tập hợp.
Ví dụ minh họa: Đồ thị với 6 đỉnh và 9 cạnh
Giả sử chúng ta có một đồ thị với 6 đỉnh và 9 cạnh như sau:
Bước 1: Sắp Xếp Các Cạnh Theo Trọng Số
Chúng ta sắp xếp các cạnh theo thứ tự không giảm của trọng số:
Bước 2: Khởi Tạo Cấu Trúc Union-Find
Chúng ta khởi tạo cấu trúc Union-Find cho 6 đỉnh (0 đến 5), mỗi đỉnh là một tập hợp riêng biệt.
Find(u) Find(v) Hành động Kết quả Parent Kết quả Rank
(1, 2) 2 1 2 Thêm [0, 1, 1, 3, 4, 5] [0, 1, 0, 0, 0, 0](0, 1) 4 0 1 Thêm [1, 1, 1, 3, 4, 5] [0, 1, 0, 0, 0, 0](0, 2) 4 1 1 Bỏ qua [1, 1, 1, 3, 4, 5] [0, 1, 0, 0, 0, 0](3, 5) 5 3 5 Thêm [1, 1, 1, 3, 4, 3] [0, 1, 0, 1, 0, 0](1, 3) 6 1 3 Thêm [1, 1, 1, 1, 4, 3] [0, 2, 0, 1, 0, 0](4, 5) 7 4 3 Bỏ qua [1, 1, 1, 1, 1, 3] [0, 2, 0, 1, 0, 0](2, 3) 8 1 1 Bỏ qua [1, 1, 1, 1, 1, 3] [0, 2, 0, 1, 0, 0]
Các cạnh trong cây khung nhỏ nhất (MST):
Question 6: Eulerian circuit
2.6.1 Requirements a Does the following graph have an Eulerian circuit or Eulerian path? Why? b Study and present your knowledge about Hierholzer’s algorithm to find an Eulerian circuit. c If the graph has an Eulerian circuit, use Hierholzer's algorithm to find an Eulerian circuit of that graph when the initial circuit R1 is: i If abcd % 4 = 0 then R1 is EINME ii If abcd % 4 = 1 then R1 is abhga iii If abcd % 4 = 2 then R1 is UVbaU iv If abcd % 4 = 3 then R1 is XCdX
Where abcd is the 4-digit number combined by the last 4 digits in your StudentID.
For example, Student ID 52201234 has abcd = 1234.
2.6.2 Present: a Đồ thị trên có chu trình Euler vì mọi đỉnh và cạnh đều được kết nối với nhau và mọi đỉnh trong đồ thị đều có bậc chẵn (số cạnh kề đều là số chẵn: 4, 6). b Thuật toán Hierholzer là thuật toán từng bước tạo lập chu trình Euler thông qua việc kết nối các đỉnh của đồ thị Bắt đầu mới một đỉnh ngẫu nhiên, đi theo một cạnh bất kì để dẫn đến các đỉnh khác, quá trình này sẽ được lặp lại liên tục cho tới khi ta trở về đỉnh ban đầu và xây dựng được chu trình đầu tiên trong đồ thị Nếu chu trình này đi qua tất cả các đỉnh thì đó là chu trình Euler và thuật toán kết thúc Còn nếu không, ta tiếp tục chọn một đỉnh trong chu trình mà có các cạnh chưa được duyệt để tạo một chu trình mới sao cho các cạnh của chu trình mới tạo ra không trùng lặp với mất kì cạnh nào trong chu trình đầu Từ đó ta có thể biểu diễn hai chu trình trên thành một chu trình mới lớn hơn khi thay chu trình sau vào vị trí đỉnh bắt đầu của nó trong chu trình đầu Tương tự vậy, ta tạo thêm các chu trình mới mà tích hợp chúng vào chu trình trước đó cho đến khi hoàn thành chu trình Euler. c Mã số sinh viên của tôi: 52000846
Chu trình trước Chu trình mới
⇒ Chu trình Euler của đồ thị đã cho là:
Question 7: Map coloring
Given this map: a Modeling this map by a graph. b Color the map (graph) with a minimum number of colors Present your solution step by step.
Let abcd be the 4-digit number combined by the last 4 digits in your StudentID.For example, StudentID 52201234 has abcd = 1234. i If abcd % 4 = 0 then start from Bihar. ii If abcd % 4 = 1 then start from Orissa. iii If abcd % 4 = 2 then start from Rajasthan. iv If abcd % 4 = 3 then start from Meghalaya.
Hình 2.7.1 Đồ thị biểu diễn bản đồ b
Hình 2.7.2 Đồ thị biểu diễn bản đồ sau khi tô màu (1)
Hình 2.7.3 Đồ thị biểu diễn bản đồ sau khi tô màu (2)
Hình 2.7.4 Đồ thị biểu diễn bản đồ sau khi tô màu (3)
Hình 2.7.5 Đồ thị biểu diễn bản đồ sau khi tô màu (4)
Question 8: Finding an Inverse Modulo n
Conduct research on Finding an Inverse Modulo n using the extended Euclidean algorithm Give your own examples.
Implement a Python program to find an Inverse Modulo n using the extended Euclidean algorithm Related libraries are NOT allowed
Test the implemented program using sample data and verify the results Capture your screen results and explain them in your report document.
Thuật toán Euclid mở rộng là một kỹ thuật toán học quan trọng dùng để tìm ước chung lớn nhất (GCD) của hai số nguyên a và b Đồng thời, nó còn tìm ra các hệ số x và y thỏa mãn phương trình: a * x + b * y = d, trong đó d là GCD của a và b Phương trình này được biết đến với tên gọi phương trình nghiệm nguyên bất định, và bổ đề Bézout đảm bảo rằng luôn tồn tại các số nguyên x và y cho phương trình trên.
1 Thuật toán Euclid cơ bản: Để tìm GCD của hai số a và b, ta sử dụng thuật toán Euclid cơ bản, dựa trên việc lặp lại phép chia có dư cho đến khi không còn dư.
2 Mở rộng Euclid: Sau khi tìm được GCD, thuật toán Euclid mở rộng tiếp tục tìm các hệ số x và y bằng cách quay ngược lại từ kết quả cuối cùng của thuật toán Euclid cơ bản.
3 Tổ hợp tuyến tính: Từ các bước trong thuật toán Euclid cơ bản, ta biểu diễn lại GCD dưới dạng tổ hợp tuyến tính của a và b, sau đó tìm ra các hệ số x và y một cách đệ quy.
Giả sử chúng ta cần tìm nghịch đảo của 86 modulo 101.
1 Sử dụng thuật toán Euclid để tìm GCD của 101 và 86:
Từ các bước trên, ta có GCD(101, 86) = 1 Vì GCD bằng 1, tồn tại nghịch đảo của
2 Áp dụng lại để tìm các hệ số:
Chúng ta biểu diễn lại các bước theo dạng tổ hợp tuyến tính:
Như vậy, từ phương trình cuối cùng, ta thấy -27 là nghịch đảo của 86 modulo 101. Tuy nhiên, chúng ta thường biểu diễn nghịch đảo trong dải từ 0 đến n-1 Vì vậy, ta thêm
Do đó, 74 là nghịch đảo của 86 modulo 101.
Ví Dụ Triển Khai Trong Python:
Dưới đây là một triển khai đơn giản của trong Python: CODE def extended_gcd(a, b): if a == 0: return b, 0, 1 gcd, x1, y1 = extended_gcd(b % a, a) x = y1 - (b // a) * x1 y = x1 return gcd, x, y def mod_inverse(a, n): gcd, x, y = extended_gcd(a, n) if gcd != 1: raise ValueError(f"Inverse doesn't exist for {a} and {n}") return x % n
] for a, n in test_cases: try: inverse = mod_inverse(a, n) print(f"The modular inverse of {a} modulo {n} is {inverse}") except ValueError as e: print(e)
Question 9: RSA cryptosystem
Conduct research on RSA cryptosystem Understand the mathematical concepts behind the RSA cryptosystem, including prime number generation, modular arithmetic, extended Euclidean algorithm, prime factorization, etc Give your own examples. Implement a Python program to encrypt and decrypt a message with the RSA cryptosystem Cryptography libraries are allowed.
Test the implemented RSA cryptosystem using sample messages and verify the results Capture your screen results and explain them in your report document.
Analyze the efficiency and security of the implemented RSA cryptosystem.
Discuss the potential security threats and limitations of the RSA cryptosystem. Conclude with recommendations for improving the RSA cryptosystem implementation.
Prime number generation: Các số nguyên tố rất quan trọng trong RSA để tạo ra các khóa Số nguyên tố là các số lớn hơn 1 và chỉ chia hết cho 1 và chính nó.
Modular arithmetic: Đây là hệ thống số học cho các số nguyên, nơi các số quay vòng sau khi đạt đến một giá trị nhất định—đó là modulo.
Extended Euclidean algorithm: Thuật toán này được sử dụng để tìm ước chung lớn nhất (GCD) của hai số và rất hữu ích trong RSA để tính toán nghịch đảo modulo.
Prime factorization: Đây là quá trình phân tích một số hợp thành các thừa số nguyên tố của nó RSA dựa vào độ khó của quá trình này để bảo đảm tính bảo mật.
Các Bước Của Thuật Toán RSA
- Chọn hai số nguyên tố lớn p và q.
- Chọn một số nguyên e sao cho 1 < e < φ(n) và gcd(e, φ(n)) = 1.
- Tính d là nghịch đảo modulo của e modulo φ(n).
- Chuyển thông điệp văn bản thành một số nguyên m.
- Tính toán mã hóa c sử dụng c = m^e mod n.
- Tính toán thông điệp đã giải mã m sử dụng m = c^d mod n.
Ví Dụ Triển Khai Trong Python
Dưới đây là chương trình đơn giản của thuật toán RSA trong Python:
CODE import random from sympy import isprime, mod_inverse def generate_prime_candidate(length):
"Tạo một số nguyên lẻ ngẫu nhiên" p = random.getrandbits(length) p |= (1