Skip to content

Commit cce45da

Browse files
committed
Complete basic math algo
1 parent 6394703 commit cce45da

File tree

8 files changed

+502
-3
lines changed

8 files changed

+502
-3
lines changed

src/algorithms/math/euclidean-algorithm/README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
# Thuật toán Euclidean
1+
# Thuật toán Euclid
22

3-
Trong toán học, thuật toán Euclidean hay Euclid's, là một phương pháp hiệu quả để tính ước chung lớn nhất (GCD) của hai số, GCD của hai số là số lớn nhất mà cả hai cùng chia hết hay chia không có phần dư.
3+
Trong toán học, thuật toán Euclid hay Euclid's, là một phương pháp hiệu quả để tính ước chung lớn nhất (GCD) của hai số, GCD của hai số là số lớn nhất mà cả hai cùng chia hết hay chia không có phần dư.
44

5-
Thuật toán Euclidean được xây dựng dựa trên nguyên tắc ước chung lớn nhất của hai số không thay đổi, nếu số lớn hơn được thay thế bởi hiệu số của nó với số nhỏ hơn. Ví dụ, `21` là GCD của `252``147` (vì `252 = 21 × 12``147 = 21 × 7`) đồng thời `21` cũng là GCD của `147``105 = 252 − 147`.
5+
Thuật toán Euclid được xây dựng dựa trên nguyên tắc ước chung lớn nhất của hai số không thay đổi, nếu số lớn hơn được thay thế bởi hiệu số của nó với số nhỏ hơn. Ví dụ, `21` là GCD của `252``147` (vì `252 = 21 × 12``147 = 21 × 7`) đồng thời `21` cũng là GCD của `147``105 = 252 − 147`.
66
Vì sự thay đổi này sẽ làm cho số lớn hơn thành số nhỏ hơn, nên quá trình này sẽ lặp lại cho đến khi nào hai số bằng nhau. Khi đó, chúng sẽ là GCD của hai số ban đầu.
77

88
Bằng cách đảo ngược các bước, GCD có thể được biểu thị dưới dạng tổng của hai số ban đầu, mỗi số nhân với một số nguyên dương hoặc âm, ví dụ: `21 = 7 × 147 + (−4) × 252`. GCD thể hiện theo cách này được gọi là bổ đề Bézout.
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
# Khoảng cách Euclid
2+
3+
Trong toán học, **khoảng cách Euclid** giữa hai điểm trong không gian Euclid là độ dài của đoạn thẳng nói hai điểm đó. Có thể được tính từ toạ độ Descartes của hai điểm bằng cách sử dụng định lý Pythagoras nên nó còn được gọi là khoảng cách Pythagoras.
4+
5+
![Euclidean distance between two points](https://upload.wikimedia.org/wikipedia/commons/5/55/Euclidean_distance_2d.svg)
6+
7+
## Công thức khoảng cách
8+
9+
### Một chiều
10+
11+
Khoảng cách giữa hai điểm bất kỳ trên trục số là giá trị tuyệt đối của hiệu tọa độ của chúng
12+
13+
![One dimension formula](https://wikimedia.org/api/rest_v1/media/math/render/svg/7d75418dbec9482dbcb70f9063ad66e9cf7b5db9)
14+
15+
### Hai chiều
16+
17+
Trong mặt phẳng Euclid, cho điểm `p` có toạ độ Descartes là (p1, p2) và điểm `q` có toạ độ (q1, q2). Khi đó khoảng cách giữa chúng được tính:
18+
19+
![Two dimensions formula](https://wikimedia.org/api/rest_v1/media/math/render/svg/9c0157084fd89f5f3d462efeedc47d3d7aa0b773)
20+
21+
### Nhiều chiều
22+
23+
Trong không gian ba chiều, với hai điểm bất kỳ có tọa độ Descartes cho trước, khoảng cách giữa chúng là:
24+
25+
![Three dimensions formula](https://wikimedia.org/api/rest_v1/media/math/render/svg/d1d13a40a7b203b455ae6d4be8b3cce898bda625)
26+
27+
Ví dụ : khoảng cách giữa hai điểm `(8,2,6)``(3,5,7)`:
28+
29+
![3-dimension example](https://www.mathsisfun.com/algebra/images/dist-2-points-3d.svg)
30+
31+
Tổng quát, đối với các điểm được cho bởi tọa độ Descartes trong không gian Euclid `n` chiều, khoảng cách là:
32+
33+
![n-dimensional formula](https://wikimedia.org/api/rest_v1/media/math/render/svg/a0ef4fe055b2a51b4cca43a05e5d1cd93f758dcc)
34+
35+
## Liên kết
36+
37+
- [Euclidean Distance on MathIsFun](https://www.mathsisfun.com/algebra/distance-2-points.html)
38+
- [Euclidean Distance on Wikipedia](https://en.wikipedia.org/wiki/Euclidean_distance)
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
/**
2+
* @typedef {import('../matrix/Matrix.js').Matrix} Matrix
3+
*/
4+
5+
import * as mtrx from '../matrix/Matrix';
6+
7+
/**
8+
* Tính toán khoảng cách euclid giữa hai ma trận.
9+
*
10+
* @param {Matrix} a
11+
* @param {Matrix} b
12+
* @returns {number}
13+
* @trows {Error}
14+
*/
15+
const euclideanDistance = (a, b) => {
16+
mtrx.validateSameShape(a, b);
17+
18+
let squaresTotal = 0;
19+
20+
mtrx.walk(a, (indices, aCellValue) => {
21+
const bCellValue = mtrx.getCellAtIndex(b, indices);
22+
squaresTotal += (aCellValue - bCellValue) ** 2;
23+
});
24+
25+
return Number(Math.sqrt(squaresTotal).toFixed(2));
26+
};
27+
28+
export default euclideanDistance;
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
# Phương pháp Horner
2+
3+
Trong toán học, phương pháp Horner (hoặc lược đồ Horner) là một giải thuật biến đổi đa thức. Với phương pháp này, ta có thể biến đổi đa thức chỉ với `n` phép cộng và `n` phép nhân. Do đó, yêu cầu lưu trữ của nó gấp 'n' lần số bit của 'x'.
4+
5+
Phương pháp Horner được xây dựng trên hằng đẳng thức sau :
6+
7+
![Horner's rule](https://wikimedia.org/api/rest_v1/media/math/render/svg/2a576e42d875496f8b0f0dda5ebff7c2415532e4)
8+
9+
Hằng đẳng thức trên còn gọi là _auy tắc Horner_
10+
11+
Để giải hằng đẳng thức bên giải, đới với một `x` cho trước, ta bắt đầu bằng cách lặp lại đa thức từ trong ra ngoài, tích luỹ kết quả rồi lặp lại. Sau lần lặp thứ `n`, với `n` là bậc của đa thức, từ kết quả tích luỹ có được ta có thể biến đổi đa thức.
12+
13+
**Sử dụng đa thức**
14+
15+
Giả sử ta có đa thức `P(x)`:
16+
`4 * x^4 + 2 * x^3 + 3 * x^2 + x^1 + 3`, hãy phân tích đa thức tại `Q(x=2)`.
17+
18+
Ta có thể biểu diễn đa thức bằng mảng `[3, 1, 3, 2, 4]` và lặp lại nó qua từng giá trị để lưu vào một biến tích luỹ như `acc += pow(x=2, index) * array[index]`. Về bản hất mỗi luỹ thừa của phép toán (`pow`) là `n-1` phép nhân. Thế nên, ta có tổng cộng `14` phép toán được thực hiện bao gồm `4` phép cộng, `5` phép nhân và `5` phép luỹ thừa(giả định mỗi luỹ thừa được tính bằng cách lặp lại phép nhân).
19+
20+
**Sửu dụng quy tắc Horner**
21+
22+
Với cùng đa thức trên ta sử dụng quy tắc Horner như sau : viết lại đa thức thành `x * (x * (x * (4 * x + 2) + 3) + 1) + 3`, biểu diễn mảng `[4, 2, 3, 1, 3]` để có thể lưu lại vòng lặp đầu tiên dưới dạng `acc = arr[0] * (x=2) + arr[1]`, và kết thúc vòng lặp `acc *= (x=2) + arr[index]`. Cùng một bài toán nhưng với quy tắc Horner ta chỉ cần `10` phép tính bao gồm `4` phép cộng và `4` phép nhân.
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
/**
2+
*
3+
* Trả về biểu diễn của đa thức tại giá trị cụ thể.
4+
* Sử dụng cách tiếp cận đơn giản với luỹ thừa.
5+
*
6+
* @param {number[]} coefficients - i.e. [4, 3, 2] for (4 * x^2 + 3 * x + 2)
7+
* @param {number} xVal
8+
* @return {number}
9+
*/
10+
export default function classicPolynome(coefficients, xVal) {
11+
return coefficients.reverse().reduce(
12+
(accumulator, currentCoefficient, index) => {
13+
return accumulator + currentCoefficient * (xVal ** index);
14+
},
15+
0,
16+
);
17+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
/**
2+
* Trả về biểu diễn của đa thức tại giá trị cụ thể.
3+
* Sử dụng quy tắc Horner.
4+
*
5+
* @param {number[]} coefficients - i.e. [4, 3, 2] for (4 * x^2 + 3 * x + 2)
6+
* @param {number} xVal
7+
* @return {number}
8+
*/
9+
export default function hornerMethod(coefficients, xVal) {
10+
return coefficients.reduce(
11+
(accumulator, currentCoefficient) => {
12+
return accumulator * xVal + currentCoefficient;
13+
},
14+
0,
15+
);
16+
}

0 commit comments

Comments
 (0)