Metadata-Version: 2.4
Name: pchjlib
Version: 0.1.4.1
Summary: Thư viện pchjlib là một bộ công cụ đa năng…
Home-page: https://github.com/Joesifer/pchjlib
Author: Joesifer
License: MIT
Keywords: pchjlib
Classifier: Development Status :: 5 - Production/Stable
Classifier: Intended Audience :: Developers
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3 :: Only
Classifier: Programming Language :: Python :: Implementation :: CPython
Classifier: Programming Language :: Python :: Implementation :: PyPy
Classifier: Natural Language :: Vietnamese
Classifier: Operating System :: OS Independent
Requires-Python: >=3.7
Description-Content-Type: text/markdown
License-File: LICENSE.txt
Provides-Extra: numpy
Requires-Dist: numpy; extra == "numpy"
Provides-Extra: roman
Requires-Dist: roman; extra == "roman"
Provides-Extra: full
Requires-Dist: numpy; extra == "full"
Requires-Dist: roman; extra == "full"
Dynamic: author
Dynamic: classifier
Dynamic: description
Dynamic: description-content-type
Dynamic: home-page
Dynamic: keywords
Dynamic: license
Dynamic: license-file
Dynamic: provides-extra
Dynamic: requires-python
Dynamic: summary

<h1 align="center">
<img src="https://i.imgur.com/AUXxUzd.png" width="500" alt="PCHJLIB - Joesifer">
</h1><br>


[![PyPI Downloads](https://img.shields.io/badge/pchjlib-PyPI_downloads?style=plastic&logo=pchjlib&label=PyPI%20downloads)](https://pypi.org/project/pchjlib/)
[![GitHub](https://img.shields.io/badge/pchjlib-Joesifer_GitHub?style=plastic&logo=GitHub&label=GitHub)](https://github.com/Joesifer/pchjlib)
[![Python](https://img.shields.io/badge/Version_%3E_3.7-1?style=plastic&label=Python)](https://www.python.org/)
[![Owner](https://img.shields.io/badge/Joesifer-1?style=plastic&label=PCHJLIB&labelColor=%2300fff7&color=%23ffe600)](https://github.com/Joesifer)

# 📚 Yêu cầu

- **Python**: >= 3.7
- **numpy**: Tùy chọn, cho hàm `giai_phuong_trinh` và `tao_danh_sach_so_nguyen_to`. Cài bằng `pip install pchjlib[numpy]` hoặc `pip install numpy`.
- **roman**: Tùy chọn, chỉ cần cho hàm `chuyen_doi_so_la_ma`. Cài bằng `pip install pchjlib[roman]` hoặc `pip install roman`.
- Để cài đặt đầy đủ: `pip install pchjlib[full]`.

# 🛠️ Cài đặt

Bạn có thể cài đặt thư viện cơ bản mà không cần các phụ thuộc tùy chọn:

```bash
pip install pchjlib
```

Nếu bạn cần sử dụng hàm `giai_phuong_trinh` và `tao_danh_sach_so_nguyen_to`, hãy cài đặt với `numpy`:

```bash
pip install pchjlib[numpy]
```

Tương tự, cho hàm `chuyen_doi_so_la_ma`, cài đặt với `roman`:

```bash
pip install pchjlib[roman]
```

Để cài đặt đầy đủ với tất cả các phụ thuộc:

```bash
pip install pchjlib[full]
```

---


# 🌟 Tính năng chính

- 🔍 **Kiểm tra và tạo danh sách các loại số đặc biệt:**  
  Hỗ trợ số nguyên tố, số emirp, số Fibonacci, số hoàn thiện, số tự mãn, số hữu hảo, số chính phương, số mạnh mẽ, số song tố, số phong phú, v.v.

- 🔗 **Xử lý ước số và bội số:**  
  Tạo danh sách ước số, tính ước chung lớn nhất (UCLN), bội chung nhỏ nhất (BCNN), phân tích thừa số nguyên tố.

- 🧮 **Giải phương trình:**  
  Giải các phương trình đa thức từ bậc 1 đến bậc 10.

- 🧹 **Xử lý danh sách và chuỗi:**  
  Loại bỏ phần tử trùng lặp, trích xuất chữ số/số/ký tự từ chuỗi, nén và giải nén chuỗi.

- 🔐 **Mã hóa và giải mã:**  
  Mã hóa Caesar (mã hóa Caesar chỉ mang tính giáo dục, không dùng cho bảo mật thực tế), chuyển đổi chuỗi thành Teen Code Yahoo.

- 🧪 **Mô phỏng:**  
  Mô phỏng quá trình tải xuống, tính toán, loading, và tạo cây thông Giáng sinh, chương trình mảng hai chiều.

- ✨ **Tính toán đặc biệt:**  
  Tính tiền điện, tìm số lớn nhất với tổng chữ số cho trước, tính cạnh tam giác vuông.

- 🔢 **Tạo dãy theo quy luật:**  
  Tạo các dãy số theo các quy luật cụ thể.

- 🔄 **Chuyển đổi và đếm:**  
  Chuyển số thành số La Mã, đếm số cặp nghịch thế trong danh sách.

- 🎮 **Trò chơi:**  
  Chơi kéo búa bao với AI.

# 📚 MỤC LỤC

- 🔢 [Các hàm kiểm tra số nguyên tố và số liên quan](#các-hàm-kiểm-tra-số-nguyên-tố-và-số-liên-quan)  
- 🌀 [Các hàm Fibonacci](#các-hàm-fibonacci)  
- 🧠 [Các hàm tính số hoàn thiện, tự mãn, hữu hảo, hoàn hào, thân thiết](#các-hàm-tính-số-hoàn-thiện-tự-mãn-hữu-hảo-hoàn-hào-thân-thiết)  
- 📐 [Các hàm số chính phương, mạnh mẽ, thân thiết](#các-hàm-số-chính-phương-mạnh-mẽ-thân-thiết)  
- 📊 [Các hàm về ước số và bội số](#các-hàm-về-ước-số-và-bội-số)  
- 👯 [Các hàm số song tố và số phong phú](#các-hàm-số-song-tố-và-số-phong-phú)  
- 🔍 [Các hàm phân tích thừa số nguyên tố](#các-hàm-phân-tích-thừa-số-nguyên-tố)  
- 🧮 [Các hàm giải phương trình](#các-hàm-giải-phương-trình)  
- 🧵 [Các hàm xử lý danh sách và chuỗi](#các-hàm-xử-lý-danh-sách-và-chuỗi)  
- 🏛️ [Mật mã Caesar](#mật-mã-caesar)  
- 👶 [Teen Code Yahoo](#teen-code-yahoo)  
- 🧬 [Các hàm mô phỏng chỉ với string](#các-hàm-mô-phỏng-chỉ-với-string)  
- 💥 [Hàm hỗ trợ tính toán đặc biệt](#hàm-hỗ-trợ-tính-toán-đặc-biệt)  
- 🔁 [Quy luật sinh dãy](#quy-luật-sinh-dãy)  
- 🔄 [Chuyển đổi và đếm](#chuyển-đổi-và-đếm)  
- 🧩 [Khác](#khác)  
- 🛠️ [Những bản cập nhật](#những-bản-cập-nhật)

---

## 🔢 Các hàm kiểm tra số nguyên tố và số liên quan

- **kiem_tra_so_nguyen_to(number)**  
  Kiểm tra xem một số có phải là số nguyên tố hay không. Trả về `True` nếu là số nguyên tố, `False` nếu không.  
  - Tham số: `number` (int) - Số cần kiểm tra.  
  - Ném lỗi: `InvalidInputError` nếu đầu vào không phải số nguyên.

- **tao_danh_sach_so_nguyen_to(limit)**  
  Tạo danh sách các số nguyên tố từ 0 đến `limit`.  
  - Tham số: `limit` (int) - Giới hạn trên của danh sách.  
  - Trả về: Danh sách các số nguyên tố.  
  - Ném lỗi: `InvalidInputError` nếu `limit` không phải số nguyên >= 2.

- **kiem_tra_so_emirp(number)**  
  Kiểm tra xem một số có phải là số emirp (số nguyên tố đảo ngược cũng là nguyên tố) hay không.  
  - Tham số: `number` (int) - Số cần kiểm tra.  
  - Trả về: `True` nếu là số emirp, `False` nếu không.  
  - Ném lỗi: `InvalidInputError` nếu `number` không phải số nguyên dương.

- **tao_danh_sach_so_emirp(limit)**  
  Tạo danh sách các số emirp từ 0 đến `limit`.  
  - Tham số: `limit` (int) - Giới hạn trên của danh sách.  
  - Trả về: Danh sách các số emirp.  
  - Ném lỗi: `InvalidInputError` nếu `limit` không phải số nguyên không âm.

---

## 🌀 Các hàm Fibonacci

- **vi_tri_so_Fibonacci(index)**  
  Tính số Fibonacci thứ `index` bằng phương pháp lặp.  
  - Tham số: `index` (int) - Vị trí của số Fibonacci (bắt đầu từ 0).  
  - Trả về: Số Fibonacci tại vị trí `index`.  
  - Ném lỗi: `InvalidInputError` nếu `index` không phải số nguyên không âm.

- **tao_danh_sach_so_Fibonacci(count)**  
  Tạo danh sách `count` số Fibonacci đầu tiên.  
  - Tham số: `count` (int) - Số lượng phần tử trong danh sách.  
  - Trả về: Danh sách các số Fibonacci.  
  - Ném lỗi: `InvalidInputError` nếu `count` không phải số nguyên không âm.

---

## 🧠 Các hàm tính số hoàn thiện, tự mãn, hữu hảo, hoàn hào, thân thiết

- **tong_uoc_so(number)**  
  Tính tổng các ước số dương của `number` (không tính chính nó).  
  - Tham số: `number` (int) - Số cần tính.  
  - Trả về: Tổng các ước số.  
  - Ném lỗi: `MathError` nếu `number <= 0`, `InvalidInputError` nếu không phải số nguyên.

- **tong_chu_so(number)**  
  Tính tổng các chữ số của `number`.  
  - Tham số: `number` (int) - Số cần tính.  
  - Trả về: Tổng các chữ số.  
  - Ném lỗi: `InvalidInputError` nếu không phải số nguyên.

- **kiem_tra_so_hoan_thien(number)**  
  Kiểm tra xem `number` có phải là số hoàn thiện hay không.  
  - Tham số: `number` (int) - Số cần kiểm tra.  
  - Trả về: `True` nếu là số hoàn thiện, `False` nếu không.  
  - Ném lỗi: `MathError` nếu `number < 1`, `InvalidInputError` nếu không phải số nguyên.

- **tao_danh_sach_so_hoan_thien(limit)**  
  Tạo danh sách các số hoàn thiện từ 1 đến `limit`.  
  - Tham số: `limit` (int) - Giới hạn trên của danh sách.  
  - Trả về: Danh sách các số hoàn thiện.  
  - Ném lỗi: `InvalidInputError` nếu `limit` không phải số nguyên > 0, `InvalidInputError` nếu `limit` không lớn hơn 1.

- **kiem_tra_so_tu_man(number)**  
  Kiểm tra xem `number` có phải là số tự mãn hay không.  
  - Tham số: `number` (int) - Số cần kiểm tra.  
  - Trả về: `True` nếu là số tự mãn, `False` nếu không.  
  - Ném lỗi: `InvalidInputError` nếu `number` không phải số nguyên >= 2.

- **tao_danh_sach_so_tu_man(limit)**  
  Tạo danh sách các số tự mãn từ 2 đến `limit`.  
  - Tham số: `limit` (int) - Giới hạn trên của danh sách.  
  - Trả về: Danh sách các số tự mãn.  
  - Ném lỗi: `InvalidInputError` nếu `limit` không phải số >= 2. `NotIntegerError` nếu `limit` không phải là số nguyên.

- **cap_so_hua_hon(number1, number2)**  
  Kiểm tra xem `number1` và `number2` có phải là cặp số hữu hảo hay không.  
  - Tham số: `number1`, `number2` (int) - Hai số cần kiểm tra.  
  - Trả về: `True` nếu là cặp hữu hảo, `False` nếu không.  
  - Ném lỗi: `MathError` nếu các số âm, `InvalidInputError` nếu không phải số nguyên.

- **kiem_tra_so_hoan_hao(number)**  
  Kiểm tra xem `number` có phải là số hoàn hảo hay không.  
  - Tham số: `number` (int) - Số cần kiểm tra.  
  - Trả về: `True` nếu là số hoàn hảo, `False` nếu không.  
  - Ném lỗi: `MathError` nếu `number < 1`, `InvalidInputError` nếu không phải số nguyên.

- **tao_danh_sach_so_hoan_hao(limit)**  
  Tạo danh sách các số hoàn hảo từ 1 đến `limit`.  
  - Tham số: `limit` (int) - Giới hạn trên của danh sách.  
  - Trả về: Danh sách các số hoàn hảo.  
  - Ném lỗi: `InvalidInputError` nếu `limit` không phải số nguyên > 0.

---

## 📐 Các hàm số chính phương, mạnh mẽ, thân thiết

- **kiem_tra_so_chinh_phuong(number)**  
  Kiểm tra xem `number` có phải là số chính phương hay không.  
  - Tham số: `number` (int) - Số cần kiểm tra.  
  - Trả về: `True` nếu là số chính phương, `False` nếu không.  
  - Ném lỗi: `InvalidInputError` nếu không phải số nguyên.

- **tao_danh_sach_so_chinh_phuong(limit)**  
  Tạo danh sách các số chính phương từ 0 đến `limit`.  
  - Tham số: `limit` (int) - Giới hạn trên của danh sách.  
  - Trả về: Danh sách các số chính phương.  
  - Ném lỗi: `InvalidInputError` nếu `limit` không phải số nguyên không âm.

- **cap_so_than_thiet(number1, number2)**  
  Kiểm tra xem `number1` và `number2` có phải là cặp số thân thiết hay không.  
  - Tham số: `number1`, `number2` (int) - Hai số cần kiểm tra.  
  - Trả về: `True` nếu là cặp thân thiết, `False` nếu không.  
  - Ném lỗi: `MathError` nếu các số không lớn hơn 1, `InvalidInputError` nếu không phải số nguyên.

- **kiem_tra_so_manh_me(number)**  
  Kiểm tra xem `number` có phải là số mạnh mẽ (tổng chữ số là nguyên tố) hay không.  
  - Tham số: `number` (int): Số cần kiểm tra.
             `variant` (int): 1 - Tổng chữ số là nguyên tố; 2 - Có thừa số nguyên tố bình phương.
  - Trả về: `True` nếu là số mạnh mẽ, `False` nếu không.  
  - Ném lỗi: `InvalidInputError` nếu không phải số nguyên.

---

## 📊 Các hàm về ước số và bội số

- **tao_danh_sach_uoc_so(number, positive_only=True)**  
  Tạo danh sách các ước số của `number`.  
  - Tham số: `number` (int) - Số cần tạo danh sách ước số. `positive_only` (bool) - Nếu True, chỉ trả về ước số dương.  
  - Trả về: Danh sách các ước số.  
  - Ném lỗi: `MathError` nếu `number = 0`.

- **tao_danh_sach_boi_so(number)**  
  Tạo danh sách bội số của `number` từ 0 đến 10 lần.  
  - Tham số: `number` (int) - Số cần tạo danh sách bội số.
  - positive_only = True 'hoặc' False. Mặc định là True và các ước sẽ luôn dương, có thể thay đổi thành False và các ước âm sẽ được xuất hiện.
  - Trả về: Danh sách bội số.  
  - Ném lỗi: `MathError` nếu `number = 0`, `NotIntegerError` nếu đầu vào không phải là số nguyên.

- **uoc_chung(numbers)**
  Tạo danh sách các ước chung của một danh sách các số.  
  - Tham số: `numbers` (list) - Danh sách các số.  
  - Trả về: Danh sách các ước chung.  
  - Ném lỗi: `MathError` nếu danh sách không đủ phần tử, `ListError` nếu đầu vào không phải là danh sách hoặc tuple.


- **uoc_chung_lon_nhat(numbers)**  
  Tính ước chung lớn nhất của một danh sách các số.  
  - Tham số: `numbers` (list) - Danh sách các số.  
  - Trả về: Giá trị ước chung lớn nhất.  
  - Ném lỗi: `MathError` nếu danh sách không hợp lệ, `ListError` nếu đầu vào không phải là danh sách hoặc tuple.


- **boi_chung_nho_nhat(numbers)**  
  Tính bội chung nhỏ nhất của một danh sách các số.  
  - Tham số: `numbers` (list) - Danh sách các số.  
  - Trả về: Giá trị bội chung nhỏ nhất.  
  - Ném lỗi: `MathError` nếu danh sách không hợp lệ, `ListError` nếu đầu vào không phải là danh sách hoặc tuple.

---

## 👯 Các hàm số song tố và số phong phú

- **kiem_tra_so_song_to(number)**  
  Kiểm tra xem `number` có phải là số song tố hay không.  
  - Tham số: `number` (int) - Số cần kiểm tra.  
  - Trả về: `True` nếu là số song tố, `False` nếu không.
  - Ném lỗi: `NotIntegerError` nếu đầu vào không phải là số nguyên.

- **tao_danh_sach_so_song_to(limit)**  
  Tạo danh sách các số song tố từ 0 đến `limit`.  
  - Tham số: `limit` (int) - Giới hạn trên của danh sách.  
  - Trả về: Danh sách các số song tố.
  - Ném lỗi: `NotIntegerError` đầu vào phải là số nguyên, `InvalidInputError` giới hạn phải không âm.

- **kiem_tra_so_phong_phu(number)**  
  Kiểm tra xem `number` có phải là số phong phú hay không.  
  - Tham số: `number` (int) - Số cần kiểm tra.  
  - Trả về: `True` nếu là số phong phú, `False` nếu không.
  - Ném lỗi: `NotIntegerError` đầu vào phải là số nguyên.

- **tao_danh_sach_so_phong_phu(limit)**  
  Tạo danh sách các số phong phú từ 0 đến `limit`.  
  - Tham số: `limit` (int) - Giới hạn trên của danh sách.  
  - Trả về: Danh sách các số phong phú.
  - Ném lỗi: `NotIntegerError` đầu vào phải là số nguyên, `InvalidInputError` giới hạn phải không âm.

---

## 🔍 Các hàm phân tích thừa số nguyên tố

- **thua_so_nguyen_to(number)**  
  Phân tích `number` thành danh sách các thừa số nguyên tố.  
  - Tham số: `number` (int) - Số cần phân tích.  
  - Trả về: Danh sách các thừa số nguyên tố.  
  - Ném lỗi: `MathError` nếu `number <= 1`, `NotIntegerError` đầu vào phải là số nguyên.

- **uoc_chung_nguyen_to_hai_so(number1, number2)**  
  Tìm ước chung nguyên tố lớn nhất của hai số.  
  - Tham số: `number1`, `number2` (int) - Hai số cần tính.  
  - Trả về: Giá trị ước chung nguyên tố lớn nhất.  
  - Ném lỗi: `MathError` nếu không có ước chung nguyên tố hoặc số không lớn hơn 1, `NotIntegerError` cả hai số phải là số nguyên.

---

## 🧮 Các hàm giải phương trình

- **giai_phuong_trinh(degree, coefficients)**  
  Giải phương trình từ bậc 1 đến bậc 10 theo hệ số.  
  - Tham số: `degree` (int) - Bậc của phương trình; `coefficients` (list) - Danh sách các hệ số.  
  - Trả về: Chuỗi kết quả nghiệm của phương trình.  
  - Ném lỗi: `InvalidInputError` nếu bậc hoặc hệ số không hợp lệ, `ImportError` nếu numpy không được cài đặt.

---

## 🧵 Các hàm xử lý danh sách và chuỗi

- **danh_sach_khong_trung_lap(items)**  
  Loại bỏ phần tử trùng lặp trong danh sách và sắp xếp giảm dần.  
  - Tham số: `items` (list) - Danh sách cần xử lý.  
  - Trả về: Danh sách không có phần tử trùng lặp.
  - Ném lỗi: `ListError` đầu vào phải là danh sách hoặc tuple.

- **trich_xuat_chu_so_tu_chuoi(text)**  
  Trích xuất các chữ số từ chuỗi. Ví dụ: "abc123" = [1,2,3].  
  - Tham số: `text` (str) - Chuỗi đầu vào.  
  - Trả về: Danh sách các chữ số.  
  - Ném lỗi: `InvalidInputError` nếu chuỗi rỗng.

- **trich_xuat_so_tu_chuoi(text)**  
  Trích xuất các số từ chuỗi. Ví dụ: "abc123" = [123].
  - Tham số: `text` (str) - Chuỗi đầu vào.  
  - Trả về: Danh sách các số.  
  - Ném lỗi: `InvalidInputError` nếu chuỗi rỗng.

- **trich_xuat_ki_tu(text)**  
  Trích xuất các ký tự không phải số từ chuỗi.  
  - Tham số: `text` (str) - Chuỗi đầu vào.  
  - Trả về: Danh sách các ký tự.  
  - Ném lỗi: `TypeErrorCustom` Đầu vào phải là chuỗi, `InvalidInputError` nếu chuỗi rỗng.

- **xau_duoc_nen(text)**
  Xâu được nén thành 2 loại.
  - Tham số: `text` (str) - Chuỗi đầu vào, `type` = 1 hoặc 2. Nếu 1 thì "google" → "google", nếu 2 thì "google" → "google".
  - Trả về: Chuỗi đã nén.
  - Ném lỗi: `InvalidInputError` loại nén chỉ có 1 hoặc 2.

- **xau_duoc_nen_khong_ghi_so(input_text)**  
  Nén chuỗi bỏ số. Ví dụ "hhhoocssssiiinnnhhhhh" → "hocsinh".
  - Tham số: `input_text` (str) - Chuỗi đầu vào.  
  - Trả về: Chuỗi đã nén.  
  - Ném lỗi: `InvalidInputError` nếu chuỗi rỗng.

- **xau_duoc_giai_nen(text)**  
  Giải nén chuỗi. Ví dụ "g2ogle" → "google".
  - Tham số: `text` (str) - Chuỗi đầu vào.  
  - Trả về: Chuỗi đã giải nén.  
  - Ném lỗi: `InvalidInputError` nếu chuỗi rỗng.

- **xau_ki_tu_khong_trung_lap(text)**  
  Tạo chuỗi ký tự không trùng lặp. Ví dụ "google" → gole".
  - Tham số: `text` (str) - Chuỗi đầu vào.  
  - Trả về: Chuỗi không có ký tự trùng lặp.  
  - Ném lỗi: `InvalidInputError` nếu chuỗi rỗng.

---

## 🏛️ Mật mã Caesar

- **chuyen_hoa_caesar(text, shift)**  
  Chuyển chuỗi thành dãy số mật mã Caesar.  
  - Tham số: `text` (str) - Chuỗi đầu vào; `shift` (int) - Số bước dịch chuyển.  
  - Trả về: Dãy số mật mã Caesar.  
  - Ném lỗi: `InvalidInputError` nếu chuỗi rỗng, chuỗi phải chỉ chứa chữ cái, `NotIntegerError` số bước dịch chuyển phải là số nguyên.

- **ma_hoa_caesar(numbers, shift)**  
  Mã hóa dãy số Caesar thành chuỗi.  
  - Tham số: `numbers` (list) - Dãy số đầu vào; `shift` (int) - Số bước dịch chuyển.  
  - Trả về: Chuỗi đã mã hóa.
  - Ném lỗi: `InvalidInputError` nếu chuỗi rỗng, các số phải là số nguyên từ 0 đến 25, `ListError` đầu vào phải là danh sách hoặc tuple, `NotIntegerError` số bước dịch chuyển phải là số nguyên.

---

## 👶 Teen Code Yahoo

- **teen_code_yahoo(input_text)**  
  Chuyển chuỗi thành Teen Code Yahoo.  
  - Tham số: `input_text` (str) - Chuỗi đầu vào.  
  - Trả về: Chuỗi Teen Code Yahoo.

---

## 🧬 Các hàm mô phỏng chỉ với string

- **mp_tai_xuong(steps)**  
  Mô phỏng quá trình tải xuống.  
  - Tham số: `steps` (int) - Số bước tải xuống (2 ≤ steps ≤ 88).  
  - Ném lỗi: `OutOfRangeError` nếu `steps` không nằm trong phạm vi hợp lệ.

- **mp_tinh_toan(steps)**  
  Mô phỏng quá trình tính toán.  
  - Tham số: `steps` (int) - Số bước tính toán (0 ≤ steps < 88).  
  - Ném lỗi: `OutOfRangeError` nếu `steps` không nằm trong phạm vi hợp lệ.

- **mp_loading(count)**  
  Mô phỏng quá trình loading với `count` lần lặp.  
  - Tham số: `count` (int) - Số lần lặp.

- **mp_christmas_tree()**  
  Mô phỏng cây thông giáng sinh.
  - Tham số: type (int) = 1 hoặc 2. Nếu 1 là cây thông cho terminal VSCode, 2 là cho văn bản text.
  - Trả về: Yêu cầu nhập chiều cao cây thông.
- **chuong_trinh_matrix()**:
  - Giới thiệu:
    Chương trình này tạo và thao tác với ma trận ngẫu nhiên dựa trên đầu vào của người dùng.
    Các chức năng bao gồm:
    Tạo ma trận với kích thước và giá trị tối đa do người dùng chỉ định.
    In ma trận.
    Tính toán và hiển thị giá trị lớn nhất, nhỏ nhất, tổng, và trung bình của các phần tử trong ma trận.
    Trích xuất và hiển thị hàng hoặc cột cụ thể.
    Tìm kiếm một số trong ma trận và hiển thị các vị trí của nó.
    Lọc ma trận để chỉ hiển thị các phần tử bằng với số được tìm kiếm.
  - Ví dụ:
  ``` python
      === Chuong trinh Ma tran ===
      - Nhap so hang: 4
      - Nhap so cot: 4
      - Nhap gia tri toi da cho phan tu (mac dinh 100): 50
      - Ma tran goc:

      30  5 -2 12
      25 21 31  2
      14 35 35 38
      43 17 38 27

      >>> Gia tri lon nhat: 43
      >>> Gia tri nho nhat: -2
      >>> Tong cac phan tu: 371
      >>> Trung binh: 23.19

      - Nhap hang can lay (1 den 4): 1
      >>> Hang 1: [30, 5, -2, 12]

      - Nhap cot can lay (1 den 4): 4
      >>> Cot 4: [12, 2, 38, 27]

      - Nhap so can tim: 35
      - So 35 xuat hien 2 lan trong ma tran.
      - Ma tran sau khi loc:

      –– –– –– ––
      –– –– –– ––
      –– 35 35 ––
      –– –– –– ––

      >>> Vi tri cua so:
      [I - 1] Hang: 3, Cot: 2
      [II - 2] Hang: 3, Cot: 3
      === Ket thuc chuong trinh ===
  ```
  - Ném lỗi: `ValueError` nNếu người dùng nhập các giá trị không hợp lệ, chẳng hạn như số hàng hoặc số cột không phải là số nguyên, không dương, lớn hơn 20, hoặc nếu giá trị tối đa lớn hơn 100, `IndexError` nếu người dùng yêu cầu trích xuất hàng hoặc cột không tồn tại trong ma trận.

---

## 💥 Hàm hỗ trợ tính toán đặc biệt

- **tinh_toan_tien_dien(old_reading, new_reading)**  
  Tính toán tiền điện dựa trên chỉ số cũ và mới.  
  - Tham số: `old_reading`, `new_reading` (str) - Chỉ số cũ và mới.  
  - Trả về: Chuỗi kết quả tính toán.  
  - Ném lỗi: `MathError` nếu chỉ số không hợp lệ.

- **tong_chu_so_lon_nhat_bang_n(digit_count, target_sum)**  
  Tìm số lớn nhất có `digit_count` chữ số và tổng các chữ số bằng `target_sum`.  
  - Tham số: `digit_count` (int) - Số chữ số; `target_sum` (int) - Tổng các chữ số.  
  - Trả về: Chuỗi số lớn nhất.  
  - Ném lỗi: `MathError` nếu không thể tạo số thỏa mãn.

- **pythagore(side_a, side_b, side_c)**  
  Tính cạnh còn lại trong tam giác vuông (cạnh cần tìm = `False`).  
  - Tham số: `side_a`, `side_b`, `side_c` (float hoặc bool) - Các cạnh.  
  - Trả về: Chuỗi kết quả tính toán.  
  - Ném lỗi: `MathError` nếu đầu vào không hợp lệ.

---

## 🔁 Quy luật sinh dãy

- **tao_danh_sach_quy_luat_1(total)**  
  Tạo danh sách theo quy luật: 1 số ⋮ 1, 2 số ⋮ 2, … với tổng số lượng `total`.  
  - Tham số: `total` (int) - Tổng số lượng phần tử.  
  - Trả về: Danh sách theo quy luật.

- **tao_danh_sach_quy_luat_2(base, count)**  
  Tạo danh sách các bội của `base` với `count` phần tử.  
  - Tham số: `base` (int) - Số để tạo bội; `count` (int) - Số phần tử.  
  - Trả về: Danh sách các bội.

- **tao_danh_sach_quy_luat_3(count, base)**  
  Tạo danh sách lũy thừa của `base` từ 0 đến `count`.  
  - Tham số: `count` (int) - Số lượng phần tử; `base` (int) - Cơ số.  
  - Trả về: Danh sách lũy thừa.

---

## 🔄 Chuyển đổi và đếm

- **chuyen_doi_so_la_ma(number)**  
  Chuyển đổi `number` thành số La Mã.  
  - Tham số: `number` (int) - Số cần chuyển đổi.  
  - Trả về: Chuỗi số La Mã.  
  - Ném lỗi: `ImportError` nếu roman không được cài đặt, `OutOfRangeError` nếu `number` không từ 1 đến 3999.

- **dem_so_nghich_the(numbers)**  
  Đếm số cặp nghịch thế trong danh sách.  
  - Tham số: `numbers` (list) - Danh sách cần đếm.  
  - Trả về: Số cặp nghịch thế.

---

## 🧩 Khác

- **one_two_three()**  
  Chơi kéo búa bao với AI.  
  - Yêu cầu nhập số trận đấu và lựa chọn (Keo, Bua, Bao).

---

## 🛠️ Những bản cập nhật

> **📅 Ngày cập nhật gần nhất:** 02/08/2025  
> **📦 Tổng số bản phát hành:** 50

---

### 📌 2025
- **0.1.4.1** – *(02/08/2025)*
  ✅ Cập nhật `chuong_trinh_matrix`.


- **0.1.4** – *(02/08/2025)*
  ✅ Cập nhật tính năng lựa chọn bội/ ước âm cho `tao_danh_sach_boi_so` và `tao_danh_sach_uoc_so`.
  🔧 Sửa lỗi `uoc_chung_cua_danh_sach`.
  ❌ Xóa `uoc_chung_lon_nhat`, `trich_xuat_cac_so_tu_so`.
  ✅ Gộp hai hàm xâu được nén thành một.

- **0.1.3.2** – *(01/08/2025)*
  🔧 Sửa lỗi nhỏ.

- **0.1.3.1** – *(01/08/2025)*
  🔧 Sửa lỗi nhỏ.

- **0.1.3** – *(01/08/2025)*  
  ✅ Gộp hai hàm số mạnh mẽ thành một.  
  ⚡ Tối ưu Fibonacci với caching.  
  📚 Thêm type hints và docstring chuẩn NumPy.

- **0.1.2.1** – *(01/08/2025)*  
  🔧 Sửa lỗi nhỏ.

- **0.1.2** – *(01/08/2025)*  
  ✅ Cải thiện tính nhất quán của xác thực đầu vào.  
  ⚡ Tối ưu hóa hiệu suất cho Fibonacci và số nguyên tố.  
  📚 Mở rộng tài liệu với các lỗi dự kiến.

- **0.1.1.3** – *(31/07/2025)*  
  🔧 Sửa README.

- **0.1.1.2** – *(31/07/2025)*  
  🔧 Sửa README.

- **0.1.1.1** – *(31/07/2025)*  
  🔧 Sửa lỗi hiển thị.

- **0.1.1** – *(31/07/2025)*  
  🔧 Sửa lỗi và cập nhật phụ thuộc cho `numpy` và `roman`.

- **0.1.0.7** – *(31/07/2025)*  
  🔧 Sửa lỗi.

- **0.1.0.6** – *(30/07/2025)*  
  🔧 Sửa đổi nhẹ về hỗ trợ phiên bản Python.

- **0.1.0.5** – *(29/07/2025)*  
  🔧 Sửa lỗi.

- **0.1.0.4** – *(28/07/2025)*  
  🔧 Sửa lỗi.

- **0.1.0.3** – *(28/07/2025)*  
  ✏️ Sửa lại README.

- **0.1.0.2** – *(28/07/2025)*  
  ❌ Xóa hàm `thua_so_nguyen_to_day_du`.

- **0.1.0.1** – *(28/07/2025)*  
  🔧 Sửa lỗi nhỏ trong nội dung.

- **0.1.0** – *(28/07/2025)*  
  🧹 Chỉnh sửa toàn bộ.  
  ❌ Xóa hàm `giai_pt_bac_1va2_dang_string`, `tinh_toan_vat_ly_8`.

#### 🔵 0.0.5.x — Tinh chỉnh và cập nhật nhỏ

- **0.0.5.2.1** – *(27/07/2025)*  
  ✏️ Sửa README.

- **0.0.5.2** – *(27/07/2025)*  
  ✏️ Sửa README.

- **0.0.5.1** – *(27/07/2025)*  
  🆕 Cập nhật `teen_code_yahoo`.

- **0.0.5.0** – *(26/07/2025)*  
  ❌ Xóa hàm `an_ky_tu`.

---

### 📌 2024

- **0.0.4.1** – *(17/10/2024)*  
  🆕 Bổ sung hàm `tạo_dãy_chữ`.  
  🔄 Cập nhật `one_two_three`.

- **0.0.4.0** – *(05/05/2024)*  
  ✏️ Sửa README.

- **0.0.3.9** – *(05/05/2024)*  
  ✏️ Sửa README.

- **0.0.3.8** – *(05/05/2024)*  
  🎄 Cập nhật `mp_christmas_tree_cho_VSCode` và `mp_christmas_tree_cho_TEXT`.

- **0.0.3.7** – *(04/05/2024)*  
  🎄 Cập nhật `mp_christmas_tree`.

- **0.0.3.6** – *(03/03/2024)*  
  🧪 Thử nghiệm.

- **0.0.3.5** – *(01/03/2024)*  
  🧪 Thử nghiệm.

- **0.0.3.4** – *(26/02/2024)*  
  ➕ Bổ sung hàm `uoc_chung_cua_danh_sach`.

- **0.0.3.3** – *(21/02/2024)*  
  🔧 Nâng cấp README và metadata thư viện.

- **0.0.3.2** – *(20/02/2024)*  
  ➕ Bổ sung hàm kiểm tra số phong phú.

- **0.0.3.1** – *(20/02/2024)*  
  🔧 Nâng cấp thông tin thư viện.

- **0.0.3** – *(20/02/2024)*  
  ➕ Bổ sung `xau_ki_tu_khong_trung_lap`.  
  ❌ Xóa `ki_tu_trung_lap`.

- **0.0.2.10** – *(19/02/2024)*  
  🔧 Nâng cấp README.

- **0.0.2.9** – *(19/02/2024)*  
  🧪 Thử nghiệm.

- **0.0.2.8** – *(19/02/2024)*  
  🧪 Thử nghiệm.

- **0.0.2.7** – *(18/02/2024)*  
  🔧 Nâng cấp README.

- **0.0.2.6** – *(18/02/2024)*  
  ⚖️ Chuyển sang giấy phép **MIT License**.

- **0.0.2.4** → **0.0.2.5** – *(18/02/2024)*  
  🔧 Nâng cấp README.

- **0.0.2.3** – *(18/02/2024)*  
  🧪 Thử nghiệm.

- **0.0.2.1** → **0.0.2.2** – *(14/02/2024)*  
  🧪 Thử nghiệm.

- **0.0.2** – *(14/02/2024)*  
  🐞 Sửa lỗi thiếu phụ thuộc.

- **0.0.1.1** → **0.0.1.2** – *(14/02/2024)*  
  🧪 Thử nghiệm.

- **0.0.1** – *(14/02/2024)*  
  🎉 Phiên bản đầu tiên!

- **0.0.0.1** – *(14/02/2024)*  
  🧪 Thử nghiệm.
```

---
