III. Các công thức và hàm Toán học quan trọng trong Tin học (tiếp)
4. Dãy số Harmonic (Harmonic Series)
4.1. Định nghĩa
Dãy số Harmonic là dãy số có thể nhiều bạn đã khá quen thuộc. Trong Toán học, đây là một dãy tổng vô hạn các số phân biệt:
Tổng của dãy số này có cận trên là với là hằng số Euler. Điều này đôi khi rất hữu dụng trong việc tính toán độ phức tạp thuật toán, ví dụ như trong giải thuật sàng lọc số nguyên tố Eratosthene. Đó là lí do giải thuật này có độ phức tạp là trên thực tế còn nhanh hơn rất rất nhiều.
4.2. Bổ đề Harmonic
Phát biểu: Xét dãy số: . Bổ đề Harmonic nói rằng:
- Dãy số trên là một dãy không tăng và có tối đa giá trị phân biệt.
- Dãy số trên có tổng tiến tới .
Chứng minh:
- Đối với ý đầu tiên của bổ đề, ta có: Giả sử . Xét đoạn giá trị từ 1 tới có tối đa giá trị khác nhau của trong đoạn này (vì có giá trị khác nhau). Phần còn lại gồm các giá trị lớn hơn thì và là một số nguyên dương, vì vậy có tối đa giá trị khác nhau của trong đoạn này. Vậy số lượng giá trị khác nhau nhiều nhất của dãy số là .
- Đối với ý thứ hai, ta chứng minh đơn giản vì dãy số Harmonic có tổng tiến tới nên dãy số ban đầu sẽ có tổng xấp xỉ bằng .
Bổ đề Harmonic chỉ được sử dụng trong một số bài toán rất đặc biệt, chẳng hạn như tính tổng các ước nguyên dương của mọi số từ tới . Nhìn chung, các định lý, bổ đề trong Tin học sẽ ít khi gặp trong bài thi, chỉ trong một vài bài toán rất cụ thể thì mới phải dùng đến chúng mà thôi.
5. Tìm biểu diễn thập phân của một số hữu tỉ
Chúng ta đều biết rằng, một số hữu tỉ là số có thể biểu diễn được dưới dạng phân số với và là các số nguyên với . Khi biểu diễn số hữu tỉ dưới hệ cơ số ta có hai dạng là số thập phân hữu hạn và số thập phân vô hạn tuần hoàn. Dưới đây ta có hai tính chất quan trọng của số hữu tỉ:
- Một phân số tối giản với mẫu dương và mẫu không có ước nguyên tố nào ngoài và thì viết được dưới dạng số thập phân hữu hạn. Ví dụ như có mẫu nên . Một số thập phân hữu hạn cũng có thể coi là một số thập phân vô hạn tuần hoàn với chu kỳ là .
- Một phân số tối giản với mẫu dương và mẫu có ít nhất một ước nguyên tố ngoài và thì viết được dưới dạng số thập phân vô hạn tuần hoàn.
Bài toán đặt ra ở đây là làm sao tìm được chu kỳ của số thập phân vô hạn tuần hoàn khi biết dạng phân số của nó là , nếu như ta coi số thập phân hữu hạn cũng là số thập phân vô hạn tuần hoàn với chu kỳ là . Dưới đây mình sẽ giới thiệu một phương pháp của trung học cơ sở:
- Bước : Đặt phép chia ghi nhận thương nguyên ở lần chia đầu tiên. Thương này là phần nguyên của số thập phân. Kế đến tiếp tục đặt phép chia với số dư của phép chia đàu tiên, lưu các thương và số dư ở mỗi lần chia tiếp theo vào hai mảng phân biệt.
- Bước : Lặp lại liên tục quá trình chia cho giống như phép chia số thập phân: Lấy số dư nhân thêm rồi chia cho tiếp tục lưu thương và số dư của phép chia mới và lại lặp lại quá trình,…
- Bước : Lặp lại bước cho tới khi thấy số dư bị lặp lại. Gọi vị trí xuất hiện đầu tiên của số dư này trên dãy số dư là thì chu kỳ của số thập phân sẽ bắt đầu từ vị trí trên dãy thương cho tới hết dãy thương. Còn các chữ số nằm trước vị trí trên dãy thương sẽ là các chữ số thập phân tự do.
Ví dụ: Giả sử phân số là . Đầu tiên thực hiện phép chia có dư, thu được phần nguyên là số dư là . Gọi thương và số dư của các phép chia tiếp theo lần lượt là và quy trình để tìm ra biểu diễn thập phân của nó là:
- Lần chia thứ nhất: .
- Lần chia thứ hai: .
- Lần chia thứ ba: .
- Lần chia thứ tư: .
- Lần chia thứ năm: .
- Lần chia thứ sáu: .
- Lần chia thứ bảy: .
- Lần chia thứ tám: (số dư bị lặp lại ở vị trí không lưu thương này mà tính luôn chu kỳ). Số thập phân lúc này sẽ là: .
Cài đặt:
void decimal_presentation(int a, int b)
{
cout << a / b << '.'; // Đưa ra phần nguyên trước.
int pos = 0;
mark[a % b] = pos++; // Mảng mark lưu vị trí xuất hiện của các số dư.
a %= b; // Đặt a = a % b để tiếp tục phép chia.
int loop_start = 0;
vector < int > quotient; // Vector lưu các thương.
while (true) // Tiếp tục quá trình chia để tìm các số sau dấu chấm.
{
a *= 10;
long long r = a % b;
quotient.push_back(a / b);
if (mark[r]) // Số dư bị lặp lại.
{
loop_start = mark[r]; // Vị trí bắt đầu chu kỳ.
break;
}
else // Nếu chưa lặp lại thì tiếp tục chia và lưu số dư.
{
mark[r] = pos++;
a = r;
}
}
// In ra biểu diễn thập phân của số hữu tỉ a/b.
for (int i = 0; i < loop_start; ++i)
cout << quotient[i];
cout << '(';
for (int i = loop_start; i < quotient.size(); ++i)
cout << quotient[i];
cout << ')';
}
6. Vài đẳng thức đáng lưu ý
Qua quá trình nghiên cứu và đúc kết từ các kỳ thi HSG Tin học các cấp và kinh nghiệm cá nhân, mình nhận thấy các dãy số với công thức có sẵn thường được áp dụng rất nhiều trong các bài toán về chủ đề Số học trong Tin học. Tất nhiên, không ai cho các bạn một dãy số rồi bắt tìm công thức của nó cả, nhưng những dãy số sẽ được lồng ghép vào các bài toán lớn để gây khó khăn cho người giải ở những bước tìm kết quả cuối cùng. Vì vậy, mình đã tổng hợp những dãy số rất hữu ích có thể sử dụng trong lập trình thi đấu, hy vọng nó đủ dùng. Các dãy số chủ yếu sẽ có được công thức từ việc chứng minh quy nạp hoặc biến đổi theo phương pháp của THCS, bạn đọc cố gắng đọc kĩ để hiểu được thì sẽ nhớ rất lâu!
5.1.
Chứng minh: Sử dụng quy nạp toán học:
- Với ta thấy đẳng thức đúng.
- Giả sử đẳng thức đúng với tức là
- Chứng minh đẳng thức đúng với : . (Do giả thiết quy nạp). . . . (điều phải chứng minh).
Vậy đẳng thức đúng với mọi .
5.2.
Chứng minh:
- Với ta có đẳng thức đúng.
- Giả sử đẳng thức đúng với tức là .
- Chứng minh đẳng thức đúng với : . . . Giờ ta cần chứng minh: . Thật vậy, ta có: đẳng thức đúng.
Vậy đẳng thức (1) đúng với đồng nghĩa với việc đẳng thức ban đầu đúng với .
5.3.
Chứng minh:
- Với ta có đẳng thức đúng.
- Giả sử đẳng thức đúng với tức là .
- Chứng minh đẳng thức đúng với : . Thật vậy, ta có: (Do giả thiết quy nạp). . .
Vậy ta có điều phải chứng minh, đẳng thức đúng với .
5.4.
Chứng minh:
- Với ta có đẳng thức đúng.
- Giả sử đẳng thức đúng với tức là .
- Chứng minh đẳng thức đúng với : . Thật vậy, ta có: . (Do giả thiết quy nạp).
Vậy ta có điều phải chứng minh, đẳng thức đúng với .
IV. Bất đẳng thức
Các bất đẳng thức được ứng dụng nhiều nhất trong Toán học cũng như Tin học ở mức độ thi HSG sẽ là bất đẳng thức AM - GM và bất đẳng thức Bunyakovsky. Trong các bài toán số học, hai bất đẳng thức này sẽ có tác dụng rất lớn trong việc đặt cận cho bài toán, từ đó dễ dàng thực hiện các công việc liên quan tới đếm số lượng. Quá trình chứng minh của các bất đẳng thức này là thành quả toán học lâu dài và cũng không cần thiết cho bạn đọc nên mình xin phép không trình bày ở đây.
1. Bất đẳng thức AM - GM
Các bạn thường được biết đến bất đẳng thức này trong chương trình Toán trung học là bất đẳng thức Cauchy. Nhưng thực ra nó chỉ được chứng minh bởi Cauchy mà thôi, còn tên quốc tế của nó phải là Bất đẳng thức AM - GM, hay Bất đẳng thức trung bình cộng - trung bình nhân. Bất đẳng thức này được phát biểu như sau: "Trung bình cộng của số luôn luôn lớn hơn hoặc bằng trung bình nhân của chúng. Dấu bằng xảy ra khi và chỉ khi cả số đó bằng nhau":
Bất đẳng thức này cũng hoàn toàn đúng trong trường hợp hai giá trị trung bình có hệ số: Với số và các hệ số nếu đặt thì:
2. Bất đẳng thức Bunyakovsky
Là dạng cơ bản của bất đẳng thức Cauchy - Schwarz, một bất đẳng thức được áp dụng trong nhiều lĩnh vực của Toán học. Dưới đây là dạng tổng quát của bất đẳng thức Bunyakovsky cho hai bộ số và :
V. Lời kết
Như vậy, chúng ta đã cùng nhau tìm hiểu những công thức, định lý rất thú vị và hữu ích trong Toán học có thể ứng dụng trong Tin học. Tuy nhiên, đó không phải là tất cả. Toán học là một chủ đề cực kỳ rộng lớn và chắc chắn không thể tóm gọn trong vài trang giấy. Vì vậy, trên đây chỉ là một phần rất nhỏ những thứ có thể giúp ích cho các bạn học sinh trong quá trình rèn luyện Thuật toán mà thôi.
Những bài tập của công thức Toán học rất phong phú, phần nhiều sẽ xuất phát từ những công thức rất đơn giản, chỉ cần biến đổi một chút là thu được kết quả. Vì vậy, trước khi suy nghĩ đến những công thức quá phức tạp, bạn đọc hãy tìm cách tạo ra công thức Toán học thông qua những biến đổi thông thường như giải phương trình, chuyển vế đổi dấu hay nhân phá ngoặc,...rất có thể sẽ giúp các bạn tìm ra đáp án bài toán nhanh chóng.
Cuối cùng, hãy chịu khó rèn luyện thật nhiều các bài toán số học để tăng cường khả năng tư duy và mở rộng tầm hiểu biết của bản thân về các công thức toán học. Nơi luyện tập phù hợp nhất chính là thông qua các kỳ thi trên trang web codeforces.com.
VI. Tài liệu tham khảo
- https://codeforces.com/blog/entry/55912
- https://toanhoc247.com/ly-thuyet-va-bai-tap-ve-phuong-phap-quy-nap-toan-hoc-a10798.html
- https://codeforces.com/blog/entry/51272
- https://vnoi.info/wiki/translate/he/Number-Theory-4.md
- https://www.geeksforgeeks.org/eulers-totient-function/
- https://www.geeksforgeeks.org/legendres-formula-highest-power-of-prime-number-that-divides-n/
- https://www.geeksforgeeks.org/largest-power-k-n-factorial-k-may-not-prime/
- https://vi.wikipedia.org/wiki/Bất_đẳng_thức_Cauchy–Schwarz