Đại số tuyến tính là một trong những nền tảng quan trọng của trí tuệ nhân tạo và rất nhiều ứng dụng công nghệ khác. Bài viết này được dịch từ trang BetterExplained nhằm giải thích bản chất của đại số tuyến tính một cách trực quan và dễ hiểu cho những người mới bắt đầu. Bài viết có một vài chỉnh sửa từ Math2IT để ngôn ngữ gần gũi hơn với người Việt, nhưng không thay đổi nội dung bài.
Mặc dù đã học qua hai lớp đại số tuyến tính, kiến thức của tôi vẫn chỉ dừng lại ở: “Ma trận, định thức, cái gì đó riêng (eigen).”
Sao lại tới nông nỗi này nhỉ? Ờ thì, cứ thử nhìn mấy thể loại lớp học sau:
- Đặt tên lớp là Đại số tuyến tính nhưng lại tập trung dạy những thứ gọi là ma trận và vector.
- Dạy các khái niệm như thứ tự Hàng/Cột bằng thủ thuật mnemonics (một phương pháp giúp ghi nhớ bằng cách gắn dữ liệu cần nhớ với một thông tin quen thuộc hơn) thay vì giải thích những suy luận đằng sau khái niệm.
- Ưu tiên dạy những thứ trừu tượng (Vector 2D! Vector 3D!) và né tránh các chủ đề thực tế cho tới tuần cuối cùng của kỳ học.
Những kẻ sống sót trong lớp là những người có chuyên môn vật lý, lập trình viên đồ họa, hoặc mấy đứa ưa bị hành hạ. Chúng ta đã bỏ lỡ một điều then chốt là:
Đại số tuyến tính cho phép chúng ta đưa các bảng tính mini (mini-spreadsheets) vào trong các phương trình toán học.
Chúng ta có thể thay đổi dữ liệu từ một bảng dữ liệu gốc (một ma trận) và từ đó tạo ra những bảng mới với dữ liệu đã cập nhật. Đấy chính là quyền năng của một bảng tính được viết dưới dạng một phương trình.
Bài viết này là lời giới thiệu về đại số tuyến tính mà tôi ước mình đã được dạy, kèm một ví dụ thực tế về thị trường chứng khoán.
Đại khái thì “đại số” có nghĩa là “những mối quan hệ [giữa các số]”. Ở cấp tiểu học, đại số khám phá mối quan hệ giữa những số chưa biết. Kể cả khi không biết giá trị của x và y, chúng ta vẫn có thể khẳng định là: .
Đại khái thì “đại số tuyến tính” có nghĩa là “các mối quan hệ dưới dạng đường thẳng”. Để tôi giải thích rõ hơn.
Các đường thẳng thì dễ dự đoán. Hãy tưởng tượng một cái mái nhà: di chuyển về phía trước 3 mét theo chiều ngang (so với mặt đất) thì độ cao sẽ tăng 1 mét (Hệ số góc! Thay đổi dọc (rise) trên thay đổi ngang (run = 1/3). Di chuyển về phía trước 6 mét thì chúng ta dễ dàng đoán được độ cao tăng lên 2 mét. Điều này khác với việc leo lên một cái mái vòm: với mỗi một mét ngang về phía trước thì sự thay đổi theo chiều dọc sẽ khác nhau.
Các đường thẳng thì ngoan ngoãn và dễ đoán:
- Nếu di chuyển về phía trước 3 mét làm độ cao tăng 1 mét, thì di chuyển xa gấp 10 lần sẽ tăng độ cao gấp 10 lần (ví dụ: đi 30 mét về phía trước thì độ cao tăng 10 mét).
- Nếu di chuyển về phía trước 3 mét làm độ cao tăng 1 mét, và 6 mét làm độ cao tăng 2 mét, thì (3 + 6) mét sẽ tăng (1 + 2) mét độ cao.
Trong ngôn ngữ toán học, một phép toán F được coi là tuyến tính nếu như đầu vào được nhân vào bao nhiêu thì đầu ra cũng được nhân lên bấy nhiêu, và đầu vào được thêm vào bao nhiêu thì đầu ra cũng sẽ được thêm vào bấy nhiêu:
Trong ví dụ của chúng ta, hàm F(x) cho biết thay đổi về chiều dọc khi chúng ta di chuyển về phía trước x mét, thể hiện các thuộc tính nêu trên:
Một phép toán là một tính toán dựa trên các đầu vào. Phép toán nào là tuyến tính và có thể dự đoán kết quả được? Có vẻ là phép nhân.
Phép tính luỹ thừa () không dễ dự đoán: 10² là 100, nhưng 20² lại là 400. Chúng ta nhân đôi đầu vào nhưng kết quả lại ra gấp bốn lần.
Ngạc nhiên là, phép cộng thông thường cũng không phải là tuyến tính. Hãy xem xét hàm "cộng ba" :
Chúng ta nhân đôi đầu vào nhưng đầu ra lại không nhân đôi. (Ừ, đúng là phương trình cho một đường thẳng đã bị dịch chuyển, nhưng nó không phải là "tuyến tính" vì . Ngộ ha.)
Thế vậy thì hàm số nào thực sự là tuyến tính? Đơn giản là những hàm nhân với một hằng số, những hàm có dạng như: . Trong ví dụ về mái nhà của chúng ta thì là hàm .
Nhưng cuộc đời không đến nỗi quá nhạt nhẽo. Chúng ta vẫn có thể kết hợp nhiều hàm số tuyến tính () thành một hàm lớn hơn, ví dụ như hàm G dưới đây:
Hàm G vẫn được coi là tuyến tính, vì nhân đôi đầu vào thì kết quả ra cũng nhân đôi:
Vậy là chúng ta có công cụ "phép tính mini" (mini arithmetic): nhân các đầu vào với một hằng số, và cộng các kết quả lại với nhau. Phép tính này thực sự rất hữu ích vì chúng ta có thể chia nhỏ các đầu vào, phân tích từng phần riêng biệt và kết hợp các kết quả lại với nhau:
Nếu chúng ta dùng các phép toán không tuyến tính (như ) thì chúng ta không thể chia nhỏ ra để trị và sau đó kết hợp các kết quả lại, vì Đây chính là cái lợi của việc dùng các phép toán tuyến tính.
Hầu hết các lớp học đại số tuyến tính sẽ đập vào mặt bạn với những kiến thức của ma trận. "Ok các cháu, cùng học nói nào. Chọn một chủ ngữ, động từ và tân ngữ. Tiếp theo, biến đổi động từ. Sau đó, thêm các giới từ..."
Không! Đây không phải là lớp học về ngữ pháp. Tôi muốn biết ý tưởng chính ở đây là gì?
- Chúng ta có một đống đầu vào cần theo dõi
- Chúng ta cần thực hiện các phép toán có tính chất tuyến tính, có thể dự đoán được (cái gọi là "phép toán mini" ý)
- Chúng ta đưa ra một kết quả, và sau đó có thể tiếp tục biến đổi kết quả đó
Ok. Vấn đề đầu tiên là, làm thế nào để theo dõi cùng lúc nhiều đầu vào? Dùng một danh sách kiểu này được không:
1x
2y
3z
Không tệ. Chúng ta có thể viết thành (x, y, z) cũng được - tạm thời cứ để nó như thế đã.
Tiếp theo, làm thế nào để có thể theo dõi các phép toán? Hãy nhớ rằng trong tay chúng ta chỉ có công cụ "phép toán mini”: nhân đầu vào với một hằng số, và cuối cùng thì thực hiện phép cộng. Nếu phép toán F của chúng ta được viết theo kiểu
Chúng ta có thể viết tắt toàn bộ hàm số thành (3, 4, 5). Chúng ta biết rằng cần nhân đầu vào đầu tiên với giá trị đầu tiên, đầu vào thứ hai với giá trị thứ hai, và đầu vào thứ ba với giá trị thứ ba, sau đó cộng các kết quả lại.
Thế nếu bạn chỉ có mỗi một đầu vào ở vị trí đầu tiên?
Để cho thêm phần kịch tính: làm thế nào để xử lý nhiều bộ đầu vào cùng lúc? Giả sử chúng ta muốn thực hiện phép toán F trên cả (a, b, c) và (x, y, z). Chúng ta có thể thử viết:
Nhưng cách đó không được: F chỉ nhận 3 đầu vào, không phải 6. Chúng ta nên tách các đầu vào thành từng nhóm riêng biệt:
1Đầu vào 1 Đầu vào 2
2---------------------
3a x
4b y
5c z
Ổn hơn nhiều rồi đấy.
Thế làm thế nào để chúng ta chạy cùng một đầu vào qua nhiều phép toán khác nhau? Chúng ta có thể viết mỗi phép toán thành một hàng:
1F: 3 4 5
2G: 3 0 0
Tuyệt! Mọi thứ đang đâu vào đấy: đầu vào thì được sắp xếp theo cột dọc, các phép toán thì được sắp xếp theo hàng ngang.
Chỉ dùng từ ngữ thì không đủ để diễn tả. Tôi sẽ minh hoạ đầu vào (input), phép tính (operation), và đầu ra (đầu ra) như thế này:
Tưởng tượng các đầu vào được “đổ” vào từng phép tính:
Khi một đầu vào đi qua một phép toán, nó tạo ra một thành phần đầu ra. Trong ví dụ của chúng ta, đầu vào đi qua phép toán F và cho ra . Nó đi qua phép toán G và cho ra .
Đã tới phần khó nhằn là ma trận rồi đây. Ma trận chính là một cách viết tắt cho các sơ đồ của chúng ta:
Ma trận là một biến đơn lẻ đại diện cho một bảng tính chứa các đầu vào hoặc một bảng tính chứa các phép toán.
Thay vì trình tự đi theo đầu vào => ma trận => đầu ra, chúng ta sử dụng ký hiệu hàm, như hoặc . Chúng ta thường ký hiệu ma trận bằng chữ cái viết hoa (F), và mỗi cột đầu vào đơn lẻ bằng chữ viết thường (x). Vì chúng ta có một vài đầu vào (A) và một vài đầu ra (B), nên chúng cũng được coi là ma trận:
Kích thước ma trận được đo bằng HxC: số lượng Hàng nhân số lượng Cột, và được viết tắt là "m x n" (tui biết bạn đang nghĩ gì, đúng là "h x c" sẽ dễ nhớ hơn). Các thành phần trong ma trận được tham chiếu theo cách tương tự: là hàng thứ i và cột thứ j (tui biết bạn đang nghĩ gì, "i" và "j" rất dễ bị nhầm lẫn khi đứng cạnh nhau khi viết trên bảng). Sử dụng phương pháp mnemonics khá hiệu quả nếu có ngữ cảnh, và đây là cách tôi dùng:
- HC, giống như Hàng Chuối hoặc Heo Con
- Sử dụng hình chữ "L". Đếm xuống theo hình L, sau đó ngang qua
Tại sao thứ tự HC lại hợp lý? Ma trận phép tính của chúng ta là 2×3 và ma trận đầu vào của chúng ta là 3×2. Viết chúng lại với nhau:
1[Ma trận phép tính] [Ma trận đầu vào]
2[Số lượng phép tính x Kích thước phép tính] [Số lượng đầu vào x Kích thước đầu vào]
3[m x n] [p x q] = [m x q]
4[2 x 3] [3 x 2] = [2 x 2]
Lưu ý rằng các ma trận khớp nhau ở chỗ “kích thước của phép tính (ký hiệu n)” và “kích thước của đầu vào (ký hiệu p)” (n = p). Chúng nhất định phải khớp nhau! Nếu đầu vào của chúng ta có 3 thành phần thì phép tính của chúng ta cũng cần 3 thành phần. Thực tế thì chúng ta chỉ có thể nhân các ma trận khi n = p.
Ma trận đầu ra có m hàng phép toán cho mỗi đầu vào, và có q đầu vào, tạo thành một ma trận “m x q”.
Cùng tìm hiểu thêm các phép toán [tuyến tính]. Giả sử có 3 đầu vào, chúng ta có thể tạo ra một vài ma trận, mỗi ma trận là một phép toán đơn giản:
- Phép tính cộng: [1 1 1]
- Phép tính trung bình: [1/3 1/3 1/3]
"Phép cộng" chỉ đơn giản là a + b + c. "Phép tính trung bình" cũng tương tự: (a + b + c)/3 = a/3 + b/3 + c/3
Thử các dòng phép toán đơn giản này:
- Chỉ có một đầu vào ở vị trí thứ nhất: [1 0 0]
- Chỉ có một đầu vào ở vị trí thứ hai: [0 1 0]
- Chỉ có một đầu vào ở vị trí thứ ba: [0 0 1]
Và nếu chúng ta kết hợp chúng thành một ma trận duy nhất:
1[100]
2[010]
3[001]
Wow — đó chính là “ma trận đơn vị (ký hiệu là )”. Ma trận này sao chép 3 đầu vào thành 3 đầu ra, không thay đổi. Thế còn cái này thì sao?
1[1 0 0]
2[0 0 1]
3[0 1 0]
Nó thay đổi thứ tự đầu vào: (x, y, z) trở thành (x, z, y).
Còn cái này thì sao?
1[2 0 0]
2[0 2 0]
3[0 0 2]
Nó nhân đôi các đầu vào lên. Chúng ta có thể viết lại nó thành ( là ma trận đơn vị) nếu chúng ta muốn.
Và vâng, khi chúng ta quyết định xem xét các đầu vào như là tọa độ vector, ma trận phép tính sẽ biến đổi các vector của chúng ta. Đây là một vài ví dụ:
- Biến đổi theo tỉ lệ (scale): làm cho tất cả các đầu vào trở nên lớn hơn/ nhỏ hơn
- Biến đổi xiên (skew): làm cho một vài đầu cụ thể trở nên lớn hơn/ nhỏ hơn
- Biến đổi lật (flip): làm cho các đầu vào trở thành âm tính
- Biến đổi xoay (rotate): tạo ra các tọa độ mới dựa trên các tọa độ cũ (biến Đông trở thành Bắc, Bắc trở thành Tây, v.v.)
Đây chính là diễn giải hình học dành cho phép nhân, và cách làm biến đổi không gian vector. Bạn chỉ cần nhớ rằng các vector về cơ bản là dữ liệu để thay đổi.
Cùng thực hành đại số tuyến tính trong thế giới thực:
- Dữ liệu đầu vào: danh mục cổ phiếu bao gồm cổ phiếu của Apple, Google và Microsoft
- Các phép toán: là những thay đổi về giá trị công ty sau khi một tin tức được tung ra
- Đầu ra: danh mục đầu tư đã được cập nhật
Và một đầu ra phụ: một danh mục mới liệt kê lợi nhuận và lỗ ròng sau khi tin tức được tung ra.
Thường thì chúng ta sẽ theo dõi các giá trị này trong một bảng tính. Nhưng hãy thử áp dụng cách suy nghĩ của đại số tuyến tính:
- Vector đầu vào là ($Apple, $Google, $Microsoft), nó cho biết số tiền đầu tư vào từng cổ phiếu. (À nhân tiện thì các giá trị này có thể là kết quả của một ma trận khác, trong ma trận đó số lượng cổ phiếu được nhân với giá của chúng. Không nói thì ai mà biết chứ!)
- 4 phép toán đầu ra sẽ là: giá trị cập nhật của Apple, giá trị cập nhật của Google, giá trị cập nhật của Microsoft, và lợi nhuận.
Trực quan hoá vấn đề. Tưởng tượng từng phép toán được chạy như sau:
Điều then chốt là hiểu tại sao chúng ta cần thiết lập ma trận như thế này chứ không phải cứ đâm đầu vào việc tính toán số liệu.
Hiểu rồi chứ? Giờ để tôi đưa ra đề bài.
Giả sử một sản phẩm iDevice bí mật được ra mắt: Giá cổ phiếu Apple tăng 20%, Google giảm 5%, và Microsoft giữ nguyên. Chúng ta sẽ điều chỉnh giá trị của từng cổ phiếu bằng cách sử dụng một thứ tương tự như ma trận đơn vị:
1Giá trị mới của Apple [1.2 0 0]
2Giá trị mới của Google [0 0.95 0]
3Giá trị mới của Microsoft [0 0 1]
Giá trị mới của Apple bằng giá trị ban đầu tăng thêm 20% (Google = giảm 5%, Microsoft = không thay đổi).
Gượm đã! Chúng ta cũng cần tính tổng lợi nhuận nữa:
Tổng thay đổi = (0.20 * Apple) + (-0.05 * Google) + (0 * Microsoft)
Ma trận tính toán cuối cùng của chúng ta là:
1Giá trị mới của Apple [1.2 0 0]
2Giá trị mới của Google [0 0.95 0]
3Giá trị mới của Microsoft [0 0 1]
4Tổng lợi nhuận [.20 -.05 0]
Tới đây bạn vẫn hiểu chứ? Ta tính được bốn đầu ra từ ba đầu vào. Ba phép toán đầu tiên cho ra một 'bản sao dữ liệu nhưng đã được thay đổi' và phép toán cuối cùng kết hợp các thay đổi lại với nhau.
Bây giờ hãy nhập vào danh mục đầu tư của Alice giá trị ($1000, $1000, $1000) và Bob ($500, $2000, $500). Chúng ta có thể tính toán số liệu bằng tay, hoặc sử dụng Wolfram Alpha (link tính toán ở đây):
(Chú ý: Các đầu vào nên được nhập theo cột, nhưng viết theo hàng dễ hơn. Phép chuyển vị, được chỉ định bằng ký hiệu t (tau), chuyển đổi từ hàng sang cột.)
Kết quả là: Alice có $1200 đầu tư vào AAPL, $950 vào GOOG, $1000 vào MSFT, với lợi nhuận ròng là $150. Bob có $600 vào AAPL, $1900 vào GOOG và $500 vào MSFT, với lợi nhuận ròng là $0.
Điều gì đang diễn ra nhỉ? Chúng ta đang tính toán bằng chính bảng tính của chúng ta. Đại số tuyến tính đã xuất hiện từ thế kỷ 19 nhưng bảng tính mới chỉ được được phát minh vào những năm 1980. Tôi nghĩ việc giáo dục đại số tuyến tính còn yếu kém chính là lý do tạo ra khoảng cách này.
Một trong những ứng dụng từ sớm của bảng chứa số (chưa phải là 'ma trận') là để ghi chép cho các hệ thống tuyến tính:
có thể viết là:
Để khỏi phải đau tay, chúng ta có thể tính toán thêm/bớt các hàng trong ma trận và tìm ra kết quả thay vì viết lại toàn bộ các phương trình. Khi ma trận được biến đổi thành ma trận đơn vị, các giá trị của x, y và z được hiển thị bên phía kết quả.
Quá trình này, gọi là Phép khử Gauss-Jordan, giúp chúng ta tiết kiệm thời gian. Tuy nhiên, đại số tuyến tính chủ yếu được dùng cho phép biến đổi ma trận, chứ không hẳn là để giải quyết các bộ phương trình lớn (nó tương tự như việc bạn sử dụng Excel để tạo một danh sách mua sắm thôi).
Từ ngữ có thể được phân loại dựa trên cách sử dụng của chúng (ví dụ như danh từ, động từ, tính từ). Tương tự, ma trận cũng có thể được chia thành các loại khác nhau.
Các mô tả như "upper-triangular" (tam giác trên), "symmetric" (đối xứng), "diagonal" (đường chéo) nói tới hình dạng của ma trận và có ảnh hưởng đến quá trình biến đổi của chúng.
Định thức là "kích thước" của đầu ra sau khi biến đổi. Nếu đầu vào là một vector đơn vị (đại diện cho diện tích hoặc thể tích bằng 1), định thức là kích thước của diện tích hoặc thể tích sau khi được biến đổi. Định thức bằng 0 thì ma trận có tính "phá hủy" và không thể đảo ngược (cũng giống như việc nhân với số 0 vậy: khi nhân với 0 thì không còn gì).
“Vector đặc trưng (hoặc vector riêng)” (eigenvector) và “giá trị riêng” (eigenvalue) đại diện cho "trục" của phép biến đổi.
Thử tưởng tượng bạn đang quay một quả địa cầu: khi quay thì mỗi vị trí sẽ đối mặt với một hướng mới, ngoại trừ các cực.
Một "vector đặc trưng" là một vector (đầu vào) không thay đổi hướng khi đi qua ma trận (nó sẽ luôn “chạy theo đường trục"). Mặc dù hướng của nó không thay đổi nhưng kích thước thì có thể thay đổi. “Giá trị riêng” là số lần một vector đặc trưng được co dãn hoặc thu nhỏ khi đi qua ma trận.
(Trực giác của tôi trong vấn đề này khá yếu, tôi sẽ tìm hiểu thêm. Bạn có thể tìm hiểu thêm qua video và biểu đồ hữu ích này).
Một điều thú vị: chúng ta có thể xem ma trận phép tính như là các đầu vào!
Giả sử chúng ta có một công thức bao gồm nhiều lệnh (Thêm 2 chén đường, 3 chén bột...).
Nếu chúng ta muốn dùng công thức này nhưng theo hệ mét thay vì chén thì sao? Hãy coi các câu hướng dẫn như một văn bản cần dịch từ ngôn ngữ này qua ngôn ngữ khác (từ ngôn ngữ “chén” qua “mét”). Vậy thì cái công thức này cũng giống như "đầu vào" để chúng ta biến đổi mà thôi. Khi đã biến đổi xong, chúng ta có thể thực hiện lệnh theo các hướng dẫn mới.
Một ma trận phép tính cũng có tính chất tương tự: nó cũng chỉ là tập hợp các lệnh mà chúng ta có thể biến đổi. Áp dụng một ma trận phép tính này vào một ma trận phép tính khác cho ra một ma trận phép tính mới; và ma trận mới này áp dụng cả hai biến đổi theo thứ tự.
Nếu N là "điều chỉnh danh mục cho tin tức" và T là "điều chỉnh danh mục cho thuế" thì khi áp dụng cả hai ta có:
Biểu thức trên có nghĩa là "Tạo ra ma trận X bằng cách: đầu tiên, điều chỉnh tin tức, sau đó điều chỉnh thuế". Wow! Chúng ta không cần đầu vào, chúng ta có thể trực tiếp áp dụng luôn một ma trận vào một ma trận khác.
Vẻ đẹp của đại số tuyến tính là việc tính toán của cả một bảng tính được biểu diễn chỉ bằng một chữ cái duy nhất. Nếu bạn muốn áp dụng biến đổi đó một vài lần nữa thì sao? Hãy sử dụng hoặc .
Được chứ, vì bạn đã hỏi một cách rất tử tế. Có vẻ như là “phép toán mini” của chúng ta khá hạn chế: nó chỉ dùng để nhân chứ không dùng để cộng được? Đã tới lúc mở rộng tư duy của chúng ta.
Hãy thử cho thêm một giá trị giả là 1 vào tập hợp đầu vào: (x, y, z) sẽ trở thành (x, y, z, 1).
Bây giờ chúng ta có thể thao túng cái giá trị đã biết và vừa mới được thêm vào trong ma trận phép tính này! Nếu chúng ta muốn , chúng ta có thể viết:
1[1 0 0 1]
Và sẽ là:
1[1 1 0 -3]
Hurray!
Bạn muốn một giải thích khoa học hơn? Chúng ta có thể giả định đầu vào của chúng ta tồn tại trong một chiều không gian với kích thước lớn hơn kích thước hiện tại 1 bậc. Sau đó ta cho vào trong chiều không gian đó. Chúng ta biến đổi xiên (skew) chiều không gian mới, cho ra hiệu ứng giống như một biến đổi trượt (slide) trên chiều không gian hiện tại. Ví dụ: lấy đầu vào và chạy qua:
1[1 0 0 1]
2[0 1 0 1]
3[0 0 1 1]
4[0 0 0 1]
Kết quả là . Bỏ qua chiều thứ 4, mỗi đầu vào đều được cộng thêm +1. Chúng ta giữ cái giá trị giả (ở đây là 1) và có thể làm thêm các biến đổi trượt sau đó.
Rốt cục thì “phép tính mini” không hề bị hạn chế!
Tôi đã bỏ qua một số chi tiết “nhỏ nhưng có võ” của đại số tuyến tính, nhưng việc đó không quá quan trọng. Tại sao?
Các phép ẩn dụ này đang giúp tôi suy nghĩ theo cách của ma trận, nhiều hơn khi so với các lớp học mà tôi đã “đạt điểm cao”. Cuối cùng thì tôi có thể trả lời cho câu hỏi "Tại sao đại số tuyến tính hữu ích?" bằng cách trả lời cho câu hỏi "Tại sao bảng tính lại hữu ích?".
Chúng không hữu ích lắm, trừ khi bạn cần một công cụ để giải quyết gần như mọi vấn đề thực tế. Thử hỏi một doanh nhân xem họ thà hiến tặng thận hay bị cấm sử dụng Excel mãi mãi. Đó chính là tác động của đại số tuyến tính mà chúng ta đã không nhìn ra: chúng là những ký hiệu tiện dụng để đưa bảng tính vào các phương trình toán học.
Làm toán vui vẻ nhé.