msts 1.0.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,40 @@
1
+ # Lịch sử phiên bản
2
+
3
+ ## 1.0.0 — 2026-11-12
4
+
5
+ Bản phát hành đầu tiên.
6
+
7
+ ### Tính toán chính xác
8
+
9
+ - Số học bằng **phân số** chính xác tuyệt đối: `0.1 + 0.2` → `3/10` (không bao giờ có sai số số thực)
10
+ - **Căn thức** giữ dạng chính xác và tự rút gọn: `√8` → `2√2`, `//2 * //8` → `4`
11
+ - Tự **phân tích trong căn / lũy thừa phân số**: `8^(2/3)` → `4`, `2^0.5` → `√2`
12
+ - **π** (công thức Machin) và **e** (chuỗi hội tụ) tính bằng số nguyên lớn với độ chính xác tuỳ ý
13
+ - **Phân số thập phân** nhận diện số tuần hoàn: `1/3` → `0.(3)`, kiểu SGK: `0,(3)`
14
+ - Làm tròn nửa xa 0, làm tròn số thập phân lớn (`round(2.675, 2)` = `67/25`)
15
+
16
+ ### Trình bày từng bước giải
17
+
18
+ - `steps()` xuất từng bước biến đổi như bài làm SGK, chọn mức `chi_tiet="short"` / `"full"`
19
+ - Song ngữ Việt / Anh: `ngon_ngu="vi"` / `"en"`
20
+ - Giải **phương trình bậc 1, bậc 2** (trình bày Δ, nghiệm kép, vô nghiệm, vô số nghiệm)
21
+ - Giải **bất phương trình** bậc 1, bậc 2 (tập nghiệm theo dấu Δ)
22
+ - So sánh hai vế (Đúng / Sai) và rút gọn biểu thức chứa ẩn
23
+
24
+ ### Kí hiệu SGK
25
+
26
+ - `pretty()` / `xem_truc_tuyen()`: `2^10 + 8//3 + pi/2 <= 5` → `2¹⁰ + ∛8 + π/2 ≤ 5`
27
+ - Đọc được kí hiệu **Unicode khi nhập**: `√`, `∛`, `∜`, `π`, `≤`, `≥`, `×`, `÷`, `²`, `³`, `½`, `−`...
28
+ - `chuan_hoa()` xuất lại biểu thức ở dạng ASCII tường minh: `√16 + π` → `can(16, 2) + pi`
29
+
30
+ ### Hàm bổ trợ
31
+
32
+ - Lượng giác `sin`, `cos`, `tan`, `cot`, `asin`, `acos`, `atan` — bảng giá trị chính xác, theo độ hoặc radian
33
+ - `ln`, `log`, `log2`, `log10`, `exp`, `sqrt`, `can(a[,b])`, `abs`, `floor`, `ceil`, `round`, `gcd`, `lcm`, `min`, `max`, `mod`, giai thừa `n!`, phần trăm `n%`
34
+
35
+ ### GUI (tuỳ chọn — `pip install msts[gui]`)
36
+
37
+ - `msts.MathLabel` — nhãn hiển thị toán học, tự chọn font đẹp nhất trên máy
38
+ - `msts.StepsBox` — khung hiển thị các bước giải
39
+ - `msts.chon_font_toan`, `msts.gan_xem_truc_tiep` — tiện ích font và xem trước trực tiếp
40
+ - App demo máy tính hoàn chỉnh trong `examples/demo_may_tinh.py`
@@ -0,0 +1,90 @@
1
+ # Hướng dẫn phát hành (upload) msts lên PyPI
2
+
3
+ Sau khi làm theo các bước dưới đây, người dùng chỉ cần:
4
+
5
+ ```bash
6
+ pip install msts
7
+ python -c "import msts; print(msts.solve('x^2 - 5x + 6 = 0'))"
8
+ ```
9
+
10
+ > Tên `msts` trên PyPI **còn trống** lúc kiểm tra ngày 2026-11-12.
11
+ > PyPI cấp tên theo thứ tự ai đăng trước thì được — nên hoàn thiện và đăng sớm.
12
+
13
+ ## 0. Chuẩn bị (chỉ làm một lần)
14
+
15
+ 1. Đăng kí tài khoản tại <https://pypi.org/account/register/> và bật xác thực 2 bước.
16
+ 2. Tạo API token tại <https://pypi.org/manage/account/token/> (scope: *Entire account*),
17
+ sao chép chuỗi token (dạng `pypi-...`).
18
+ 3. **Sửa thông tin tác giả** trong `pyproject.toml` cho đúng bạn (bắt buộc trước khi đăng):
19
+
20
+ ```toml
21
+ authors = [
22
+ { name = "Tên của bạn", email = "ban@email.com" },
23
+ ]
24
+ ```
25
+
26
+ (Có thể thêm mục `[project.urls]` với `Homepage` / `Repository` trỏ về repo GitHub/GitLab của bạn.)
27
+
28
+ ## 1. Build gói
29
+
30
+ ```bash
31
+ cd msts # thư mục chứa pyproject.toml
32
+ python -m pip install --upgrade build
33
+ python -m build
34
+ ```
35
+
36
+ Kết quả: `dist/msts-1.0.0.tar.gz` (sdist) và `dist/msts-1.0.0-py3-none-any.whl` (wheel).
37
+
38
+ ## 2. Kiểm tra gói trước khi đăng
39
+
40
+ ```bash
41
+ python -m pip install --upgrade twine
42
+ twine check dist/*
43
+ ```
44
+
45
+ Phải nhận được `PASSED` cho cả hai file. Nên tự thử nghiệm thêm:
46
+
47
+ ```bash
48
+ python -m venv /tmp/thu_nghiem
49
+ /tmp/thu_nghiem/bin/pip install dist/msts-1.0.0-py3-none-any.whl
50
+ /tmp/thu_nghiem/bin/python -m msts # demo console
51
+ /tmp/thu_nghiem/bin/python tests/test_msts.py # bộ test logic
52
+ ```
53
+
54
+ ## 3. Tập dượt trên TestPyPI (khuyến nghị lần đầu)
55
+
56
+ ```bash
57
+ twine upload --repository testpypi dist/*
58
+ ```
59
+
60
+ (Tài khoản TestPyPI riêng tại <https://test.pypi.org/>; nếu dùng token thì tạo token trên TestPyPI.)
61
+
62
+ Kiểm tra trang dự án tại `https://test.pypi.org/project/msts/` rồi thử cài:
63
+
64
+ ```bash
65
+ pip install --index-url https://test.pypi.org/simple/ msts
66
+ ```
67
+
68
+ ## 4. Đăng lên PyPI chính thức
69
+
70
+ ```bash
71
+ twine upload dist/*
72
+ ```
73
+
74
+ - Twine sẽ hỏi username: nhập `__token__`, password: dán chuỗi token `pypi-...`
75
+ (hoặc lưu sẵn trong file `~/.pypirc` để không phải gõ lại mỗi lần).
76
+
77
+ Sau khi đăng thành công, trang dự án nằm tại: `https://pypi.org/project/msts/`
78
+
79
+ ## 5. Phát hành bản mới sau này
80
+
81
+ 1. Tăng `version` trong `pyproject.toml` (ví dụ `1.0.1`, `1.1.0`...) — PyPI **không cho phép đè** lên version đã đăng.
82
+ 2. Ghi bổ sung vào `CHANGELOG.md`.
83
+ 3. Xoá thư mục `dist/` cũ, chạy lại `python -m build`, rồi `twine upload dist/*`.
84
+
85
+ ## Ghi chú thêm
86
+
87
+ - **Phần lõi không có bất kì dependency nào** — chỉ cần Python chuẩn; người dùng cài
88
+ `pip install msts[gui]` nếu muốn dùng widget customtkinter.
89
+ - File `dist/` và `*.egg-info/` đã có trong `.gitignore` — đừng commit lên git.
90
+ - Nếu twine báo lỗi `File already exists` nghĩa là version đó đã đăng rồi — tăng version rồi build lại.
msts-1.0.0/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 msts contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
msts-1.0.0/MANIFEST.in ADDED
@@ -0,0 +1,6 @@
1
+ include LICENSE
2
+ include README.md
3
+ include CHANGELOG.md
4
+ include HUONG_DAN_PYPI.md
5
+ recursive-include tests *.py
6
+ recursive-include examples *.py
msts-1.0.0/PKG-INFO ADDED
@@ -0,0 +1,171 @@
1
+ Metadata-Version: 2.4
2
+ Name: msts
3
+ Version: 1.0.0
4
+ Summary: Máy Tính Toán Học Thông Minh — tính chính xác bằng phân số, trình bày từng bước giải, kí hiệu SGK (√, ∛, π, ≤), giải phương trình / bất đẳng thức, widget customtkinter
5
+ Author: VVT
6
+ License-Expression: MIT
7
+ Keywords: math,calculator,exact-arithmetic,fraction,sqrt,radical,step-by-step,equation,inequality,quadratic,sgk,vietnam,education,textbook
8
+ Classifier: Development Status :: 5 - Production/Stable
9
+ Classifier: Intended Audience :: Education
10
+ Classifier: Intended Audience :: Science/Research
11
+ Classifier: Operating System :: OS Independent
12
+ Classifier: Programming Language :: Python :: 3
13
+ Classifier: Programming Language :: Python :: 3.9
14
+ Classifier: Programming Language :: Python :: 3.10
15
+ Classifier: Programming Language :: Python :: 3.11
16
+ Classifier: Programming Language :: Python :: 3.12
17
+ Classifier: Programming Language :: Python :: 3.13
18
+ Classifier: Topic :: Education
19
+ Classifier: Topic :: Scientific/Engineering :: Mathematics
20
+ Requires-Python: >=3.9
21
+ Description-Content-Type: text/markdown
22
+ License-File: LICENSE
23
+ Provides-Extra: gui
24
+ Requires-Dist: customtkinter>=5.2; extra == "gui"
25
+ Dynamic: license-file
26
+
27
+ # msts — Máy Tính Toán Học Thông Minh
28
+
29
+ Thư viện Python **thuần chuẩn** (không cần cài thêm bất kì thư viện nào) dành cho bài tập toán kiểu sách giáo khoa Việt Nam:
30
+
31
+ - **Tính chính xác tuyệt đối** bằng phân số — không bao giờ gặp `0.1 + 0.2 = 0.30000000000000004`
32
+ - **Trình bày từng bước giải** như bài làm trên bảng, song ngữ Việt / Anh
33
+ - **Biến kí hiệu nhập sang dạng SGK**: `2^10` → `2¹⁰`, `8//3` → `∛8`, `pi/2` → `π/2`, `<=` → `≤`
34
+ - **Giải phương trình / bất phương trình** bậc 1, bậc 2 (có trình bày Δ, tập nghiệm...)
35
+ - Căn thức, π, e giữ **dạng chính xác** và tự rút gọn: `√8` → `2√2`, `1/(√2+1)` → `√2 − 1`
36
+ - Số thập phân vô tỉ tuần hoàn nhận diện được: `1/3` → `0.(3)` (kiểu SGK: `0,(3)`)
37
+ - Widget **customtkinter** để làm app máy tính thông minh (tuỳ chọn)
38
+
39
+ ## Cài đặt
40
+
41
+ ```bash
42
+ pip install msts # phần lõi — chỉ cần Python chuẩn
43
+ pip install "msts[gui]" # kèm widget customtkinter cho phần GUI
44
+ ```
45
+
46
+ Yêu cầu Python 3.9 trở lên. Chạy thử nhanh sau khi cài: gõ lệnh `msts` (demo console).
47
+
48
+ ## Bắt đầu nhanh
49
+
50
+ ```python
51
+ >>> import msts
52
+
53
+ >>> msts.solve("0.1 + 0.2").text # chính xác tuyệt đối, không sai số
54
+ '3/10'
55
+ >>> msts.solve("(1/2 + 1/3) : (1/6)").text
56
+ '5'
57
+ >>> msts.solve("//2 * //8").text # √2 · √8 = √16
58
+ '4'
59
+ >>> msts.solve("2pi + pi").text # π giữ dạng kí hiệu
60
+ '3π'
61
+ >>> msts.solve("1/3").thap_phan() # dạng thập phân (12 chữ số mặc định)
62
+ '0.333333333333…'
63
+ >>> msts.solve("2x + 3 = 7").text # phương trình bậc 1
64
+ 'x = 2'
65
+ >>> msts.solve("x^2 - 5x + 6 = 0").text # phương trình bậc 2
66
+ 'x = 2 hoặc x = 3'
67
+ >>> msts.solve("2x - 1 >= 3").text # bất phương trình
68
+ 'x ≥ 2'
69
+ ```
70
+
71
+ Trình bày từng bước giải:
72
+
73
+ ```python
74
+ >>> print(msts.steps("2 + 3*(4-1)").text)
75
+ 2 + 3·(4 − 1)
76
+ Bước 1: Tính hiệu: 4 − 1 = 3
77
+ = 2 + 3·3
78
+ Bước 2: Tính tích: 3 · 3 = 9
79
+ = 2 + 9
80
+ Bước 3: Tính tổng: 2 + 9 = 11
81
+ = 11
82
+ Vậy 2 + 3·(4 − 1) = 11
83
+ ```
84
+
85
+ Biến kí hiệu nhập sang dạng SGK:
86
+
87
+ ```python
88
+ >>> msts.pretty("2^10 + 8//3 + pi/2 <= 5")
89
+ '2¹⁰ + ∛8 + π/2 ≤ 5'
90
+ ```
91
+
92
+ Xem thêm file `examples/vi_du_su_dung.py` trong kho mã nguồn để có ví dụ cho toàn bộ API.
93
+
94
+ ## Bảng kí hiệu khi nhập
95
+
96
+ | Khi nhập | Nghĩa | Ví dụ |
97
+ | --- | --- | --- |
98
+ | `a//b` | căn bậc b của a | `8//3` = ∛8 = 2 |
99
+ | `//a` | căn bậc hai | `//16` = 4 |
100
+ | `a^b`, `a^b^c` | lũy thừa (kết hợp phải) | `2^3^2` = 512 |
101
+ | `pi`, `e` | số π, số e | `2pi + pi` = 3π |
102
+ | `(a/b)` | phân số | `(1/2) + (1/3)` = 5/6 |
103
+ | `/` hoặc `:` | chia | `5 : 2` = 5/2 |
104
+ | `<` `<=` `>` `>=` `!=` | so sánh | `2^3 >= 7` → Đúng |
105
+ | `=` | lập phương trình / BPT | `2x + 3 = 7` |
106
+ | `5!` | giai thừa | `5!` = 120 |
107
+ | `50%` | phần trăm | `50%` = 1/2 |
108
+ | `sin(30)`... | lượng giác (mặc định theo độ) | `sin(30)` = 1/2 |
109
+ | `ln`, `log`, `log2`, `log10`, `exp`, `sqrt`, `can(a[,b])`, `abs`, `floor`, `ceil`, `round`, `gcd`, `lcm`, `min`, `max`, `mod` | hàm bổ trợ | `log2(8)` = 3 |
110
+
111
+ Module cũng **đọc được** kí hiệu Unicode khi nhập: `√16`, `∛8`, `π`, `≤`, `×`, `÷`, `²`, `½`, `−5`...
112
+
113
+ ## Cấu hình
114
+
115
+ ```python
116
+ msts.cau_hinh(kieu_sgk=True) # xuất số kiểu SGK: 0,5 và 0,(3)
117
+ msts.cau_hinh(so_chu_so=15) # số chữ số thập phân (mặc định 12)
118
+ msts.cau_hinh(don_vi="rad") # lượng giác theo radian
119
+ msts.cau_hinh(ngon_ngu="en") # chú thích bước giải tiếng Anh
120
+ msts.cau_hinh(chi_tiet="short") # rút gọn lời giải
121
+ ```
122
+
123
+ ## Làm app máy tính với customtkinter
124
+
125
+ ```python
126
+ import msts
127
+ import customtkinter as ctk
128
+
129
+ app = ctk.CTk()
130
+
131
+ nhan = msts.MathLabel(app, co_chu=26)
132
+ nhan.pack()
133
+ nhan.dat_toan("2^10 + 8//3") # hiển thị '2¹⁰ + ∛8'
134
+
135
+ khung = msts.StepsBox(app, co_chu=17)
136
+ khung.pack()
137
+ khung.hien(msts.steps("x^2 - 5x + 6 = 0")) # hiển thị từng bước giải
138
+
139
+ app.mainloop()
140
+ ```
141
+
142
+ Các widget có sẵn: `MathLabel`, `StepsBox`, `chon_font_toan`, `gan_xem_truc_tiep` (đổi kí hiệu sang dạng SGK ngay khi gõ). Xem app hoàn chỉnh trong `examples/demo_may_tinh.py`.
143
+
144
+ ## English summary
145
+
146
+ `msts` (Máy Tính Toán Học Thông Minh — Smart Math Calculator) is a pure-standard-library Python package for school-style mathematics:
147
+
148
+ - **Exact arithmetic** with fractions — radicals, π and e stay exact (`0.1 + 0.2` → `3/10`, `√8` → `2√2`, `1/(√2+1)` → `√2 − 1`)
149
+ - **Step-by-step solutions** (bilingual Vietnamese / English) for expressions, linear and quadratic equations, and inequalities
150
+ - **Pretty-printing** input into textbook notation: `2^10 + 8//3 + pi/2 <= 5` → `2¹⁰ + ∛8 + π/2 ≤ 5`
151
+ - Extra math functions: trigonometry (degrees/radians), `ln`/`log`/`log2`/`log10`, `exp`, `sqrt`, `gcd`, `lcm`, factorial, percent...
152
+ - Optional **customtkinter** widgets (`MathLabel`, `StepsBox`) for building calculator apps
153
+
154
+ ```python
155
+ >>> import msts
156
+ >>> msts.solve("x^2 - 5x + 6 = 0").text
157
+ 'x = 2 hoặc x = 3'
158
+ >>> msts.steps("2 + 3*(4-1)", ngon_ngu="en").danh_sach[0]
159
+ 'Bước 1: Tính hiệu: 4 − 1 = 3'
160
+ ```
161
+
162
+ ## Chạy test
163
+
164
+ ```bash
165
+ python tests/test_msts.py # 191 test logic (không cần GUI)
166
+ xvfb-run -a python tests/test_gui.py # 17 smoke test GUI (cần customtkinter + Xvfb trên Linux)
167
+ ```
168
+
169
+ ## Giấy phép
170
+
171
+ MIT — xem file [LICENSE](LICENSE).
msts-1.0.0/README.md ADDED
@@ -0,0 +1,145 @@
1
+ # msts — Máy Tính Toán Học Thông Minh
2
+
3
+ Thư viện Python **thuần chuẩn** (không cần cài thêm bất kì thư viện nào) dành cho bài tập toán kiểu sách giáo khoa Việt Nam:
4
+
5
+ - **Tính chính xác tuyệt đối** bằng phân số — không bao giờ gặp `0.1 + 0.2 = 0.30000000000000004`
6
+ - **Trình bày từng bước giải** như bài làm trên bảng, song ngữ Việt / Anh
7
+ - **Biến kí hiệu nhập sang dạng SGK**: `2^10` → `2¹⁰`, `8//3` → `∛8`, `pi/2` → `π/2`, `<=` → `≤`
8
+ - **Giải phương trình / bất phương trình** bậc 1, bậc 2 (có trình bày Δ, tập nghiệm...)
9
+ - Căn thức, π, e giữ **dạng chính xác** và tự rút gọn: `√8` → `2√2`, `1/(√2+1)` → `√2 − 1`
10
+ - Số thập phân vô tỉ tuần hoàn nhận diện được: `1/3` → `0.(3)` (kiểu SGK: `0,(3)`)
11
+ - Widget **customtkinter** để làm app máy tính thông minh (tuỳ chọn)
12
+
13
+ ## Cài đặt
14
+
15
+ ```bash
16
+ pip install msts # phần lõi — chỉ cần Python chuẩn
17
+ pip install "msts[gui]" # kèm widget customtkinter cho phần GUI
18
+ ```
19
+
20
+ Yêu cầu Python 3.9 trở lên. Chạy thử nhanh sau khi cài: gõ lệnh `msts` (demo console).
21
+
22
+ ## Bắt đầu nhanh
23
+
24
+ ```python
25
+ >>> import msts
26
+
27
+ >>> msts.solve("0.1 + 0.2").text # chính xác tuyệt đối, không sai số
28
+ '3/10'
29
+ >>> msts.solve("(1/2 + 1/3) : (1/6)").text
30
+ '5'
31
+ >>> msts.solve("//2 * //8").text # √2 · √8 = √16
32
+ '4'
33
+ >>> msts.solve("2pi + pi").text # π giữ dạng kí hiệu
34
+ '3π'
35
+ >>> msts.solve("1/3").thap_phan() # dạng thập phân (12 chữ số mặc định)
36
+ '0.333333333333…'
37
+ >>> msts.solve("2x + 3 = 7").text # phương trình bậc 1
38
+ 'x = 2'
39
+ >>> msts.solve("x^2 - 5x + 6 = 0").text # phương trình bậc 2
40
+ 'x = 2 hoặc x = 3'
41
+ >>> msts.solve("2x - 1 >= 3").text # bất phương trình
42
+ 'x ≥ 2'
43
+ ```
44
+
45
+ Trình bày từng bước giải:
46
+
47
+ ```python
48
+ >>> print(msts.steps("2 + 3*(4-1)").text)
49
+ 2 + 3·(4 − 1)
50
+ Bước 1: Tính hiệu: 4 − 1 = 3
51
+ = 2 + 3·3
52
+ Bước 2: Tính tích: 3 · 3 = 9
53
+ = 2 + 9
54
+ Bước 3: Tính tổng: 2 + 9 = 11
55
+ = 11
56
+ Vậy 2 + 3·(4 − 1) = 11
57
+ ```
58
+
59
+ Biến kí hiệu nhập sang dạng SGK:
60
+
61
+ ```python
62
+ >>> msts.pretty("2^10 + 8//3 + pi/2 <= 5")
63
+ '2¹⁰ + ∛8 + π/2 ≤ 5'
64
+ ```
65
+
66
+ Xem thêm file `examples/vi_du_su_dung.py` trong kho mã nguồn để có ví dụ cho toàn bộ API.
67
+
68
+ ## Bảng kí hiệu khi nhập
69
+
70
+ | Khi nhập | Nghĩa | Ví dụ |
71
+ | --- | --- | --- |
72
+ | `a//b` | căn bậc b của a | `8//3` = ∛8 = 2 |
73
+ | `//a` | căn bậc hai | `//16` = 4 |
74
+ | `a^b`, `a^b^c` | lũy thừa (kết hợp phải) | `2^3^2` = 512 |
75
+ | `pi`, `e` | số π, số e | `2pi + pi` = 3π |
76
+ | `(a/b)` | phân số | `(1/2) + (1/3)` = 5/6 |
77
+ | `/` hoặc `:` | chia | `5 : 2` = 5/2 |
78
+ | `<` `<=` `>` `>=` `!=` | so sánh | `2^3 >= 7` → Đúng |
79
+ | `=` | lập phương trình / BPT | `2x + 3 = 7` |
80
+ | `5!` | giai thừa | `5!` = 120 |
81
+ | `50%` | phần trăm | `50%` = 1/2 |
82
+ | `sin(30)`... | lượng giác (mặc định theo độ) | `sin(30)` = 1/2 |
83
+ | `ln`, `log`, `log2`, `log10`, `exp`, `sqrt`, `can(a[,b])`, `abs`, `floor`, `ceil`, `round`, `gcd`, `lcm`, `min`, `max`, `mod` | hàm bổ trợ | `log2(8)` = 3 |
84
+
85
+ Module cũng **đọc được** kí hiệu Unicode khi nhập: `√16`, `∛8`, `π`, `≤`, `×`, `÷`, `²`, `½`, `−5`...
86
+
87
+ ## Cấu hình
88
+
89
+ ```python
90
+ msts.cau_hinh(kieu_sgk=True) # xuất số kiểu SGK: 0,5 và 0,(3)
91
+ msts.cau_hinh(so_chu_so=15) # số chữ số thập phân (mặc định 12)
92
+ msts.cau_hinh(don_vi="rad") # lượng giác theo radian
93
+ msts.cau_hinh(ngon_ngu="en") # chú thích bước giải tiếng Anh
94
+ msts.cau_hinh(chi_tiet="short") # rút gọn lời giải
95
+ ```
96
+
97
+ ## Làm app máy tính với customtkinter
98
+
99
+ ```python
100
+ import msts
101
+ import customtkinter as ctk
102
+
103
+ app = ctk.CTk()
104
+
105
+ nhan = msts.MathLabel(app, co_chu=26)
106
+ nhan.pack()
107
+ nhan.dat_toan("2^10 + 8//3") # hiển thị '2¹⁰ + ∛8'
108
+
109
+ khung = msts.StepsBox(app, co_chu=17)
110
+ khung.pack()
111
+ khung.hien(msts.steps("x^2 - 5x + 6 = 0")) # hiển thị từng bước giải
112
+
113
+ app.mainloop()
114
+ ```
115
+
116
+ Các widget có sẵn: `MathLabel`, `StepsBox`, `chon_font_toan`, `gan_xem_truc_tiep` (đổi kí hiệu sang dạng SGK ngay khi gõ). Xem app hoàn chỉnh trong `examples/demo_may_tinh.py`.
117
+
118
+ ## English summary
119
+
120
+ `msts` (Máy Tính Toán Học Thông Minh — Smart Math Calculator) is a pure-standard-library Python package for school-style mathematics:
121
+
122
+ - **Exact arithmetic** with fractions — radicals, π and e stay exact (`0.1 + 0.2` → `3/10`, `√8` → `2√2`, `1/(√2+1)` → `√2 − 1`)
123
+ - **Step-by-step solutions** (bilingual Vietnamese / English) for expressions, linear and quadratic equations, and inequalities
124
+ - **Pretty-printing** input into textbook notation: `2^10 + 8//3 + pi/2 <= 5` → `2¹⁰ + ∛8 + π/2 ≤ 5`
125
+ - Extra math functions: trigonometry (degrees/radians), `ln`/`log`/`log2`/`log10`, `exp`, `sqrt`, `gcd`, `lcm`, factorial, percent...
126
+ - Optional **customtkinter** widgets (`MathLabel`, `StepsBox`) for building calculator apps
127
+
128
+ ```python
129
+ >>> import msts
130
+ >>> msts.solve("x^2 - 5x + 6 = 0").text
131
+ 'x = 2 hoặc x = 3'
132
+ >>> msts.steps("2 + 3*(4-1)", ngon_ngu="en").danh_sach[0]
133
+ 'Bước 1: Tính hiệu: 4 − 1 = 3'
134
+ ```
135
+
136
+ ## Chạy test
137
+
138
+ ```bash
139
+ python tests/test_msts.py # 191 test logic (không cần GUI)
140
+ xvfb-run -a python tests/test_gui.py # 17 smoke test GUI (cần customtkinter + Xvfb trên Linux)
141
+ ```
142
+
143
+ ## Giấy phép
144
+
145
+ MIT — xem file [LICENSE](LICENSE).