mirror of
https://github.com/TheAlgorithms/JavaScript.git
synced 2025-07-04 07:29:47 +08:00

* chore: remove codespell from ci * feat: add codespell workflow * fix: codespell workflow * fix: ignore spellings in directory * chore: fix spellings ./Dynamic-Programming/KadaneAlgo.js:2: contiguos ==> contiguous ./Dynamic-Programming/KadaneAlgo.js:14: posible ==> possible * chore: fix spelling ./Dynamic-Programming/SieveOfEratosthenes.js:4: upto ==> up to * chore: fix spellings ./Dynamic-Programming/MaxNonAdjacentSum.js:22: Exmaple ==> Example * chore: fix spelling ./Project-Euler/test/Problem010.test.js:4: upto ==> up to ./Project-Euler/test/Problem010.test.js:8: upto ==> up to ./Project-Euler/test/Problem010.test.js:12: upto ==> up to * chore: fix spelling ./String/AlphaNumericPalindrome.js:10: recieves ==> receives ./String/AlphaNumericPalindrome.js:10: sting ==> string ./String/AlphaNumericPalindrome.js:46: varaible ==> variable * chore: fix spelling ./String/DiceCoefficient.js:3: stings ==> strings * chore: fix spelling ./String/test/DiceCoefficient.test.js:9: atleast ==> at least * chore: fix spelling ./String/test/MaxWord.test.js:8: ba ==> be * chore: ignore `PermutateString.test.js` * chore: fix spelling ./String/test/CheckVowels.test.js:62: occurances ==> occurrences * chore: ignore `SubsequenceRecursive.js` * chore: fix spelling ./Conversions/TemperatureConversion.js:2: arguement ==> argument * chore: fix spelling ./Conversions/RailwayTimeConversion.js:7: Formate ==> Format ./Conversions/RailwayTimeConversion.js:8: Formate ==> Format * chore: remove Linear Algebra The deleted directory hosted a package which are not accepted by this repository. * Auto-update DIRECTORY.md * chore: fix spelling * chore: fix spellings * merge: Created composite Simpson's integration method. Tests included. (#819) * Created composite Simpson's integration method.Tests included * Minor corrections * Auto-update DIRECTORY.md * Styled with standard.js * chore: remove blank line * chore: remove blank line Co-authored-by: ggkogkou <ggkogkou@ggkogkou.gr> Co-authored-by: github-actions <${GITHUB_ACTOR}@users.noreply.github.com> Co-authored-by: Rak Laptudirm <raklaptudirm@gmail.com> * chore: fix spelling * chore: fix spelling * chore: fix spelling * chore: fix spelling * chore: fix spelling * chore: remove codespell from ci * feat: add codespell workflow * fix: codespell workflow * fix: ignore spellings in directory * chore: fix spellings ./Dynamic-Programming/KadaneAlgo.js:2: contiguos ==> contiguous ./Dynamic-Programming/KadaneAlgo.js:14: posible ==> possible * chore: fix spelling ./Dynamic-Programming/SieveOfEratosthenes.js:4: upto ==> up to * chore: fix spellings ./Dynamic-Programming/MaxNonAdjacentSum.js:22: Exmaple ==> Example * chore: fix spelling ./Project-Euler/test/Problem010.test.js:4: upto ==> up to ./Project-Euler/test/Problem010.test.js:8: upto ==> up to ./Project-Euler/test/Problem010.test.js:12: upto ==> up to * chore: fix spelling ./String/AlphaNumericPalindrome.js:10: recieves ==> receives ./String/AlphaNumericPalindrome.js:10: sting ==> string ./String/AlphaNumericPalindrome.js:46: varaible ==> variable * chore: fix spelling ./String/DiceCoefficient.js:3: stings ==> strings * chore: fix spelling ./String/test/DiceCoefficient.test.js:9: atleast ==> at least * chore: fix spelling ./String/test/MaxWord.test.js:8: ba ==> be * chore: ignore `PermutateString.test.js` * chore: fix spelling ./String/test/CheckVowels.test.js:62: occurances ==> occurrences * chore: ignore `SubsequenceRecursive.js` * chore: fix spelling ./Conversions/TemperatureConversion.js:2: arguement ==> argument * chore: fix spelling ./Conversions/RailwayTimeConversion.js:7: Formate ==> Format ./Conversions/RailwayTimeConversion.js:8: Formate ==> Format * chore: remove Linear Algebra The deleted directory hosted a package which are not accepted by this repository. * Auto-update DIRECTORY.md * chore: fix spelling * chore: fix spellings * chore: fix spelling * chore: fix spelling * chore: fix spelling * chore: fix spelling * chore: fix spelling * chore: fix spelling * chore: fix spelling * chore: fix spelling * chore: fix spelling * chore: fix spelling * chore: fix spelling * chore: fix spelling * chore: fix spelling * chore: no need to check filenames Co-authored-by: github-actions <${GITHUB_ACTOR}@users.noreply.github.com> Co-authored-by: ggkogkou <76820848+ggkogkou@users.noreply.github.com> Co-authored-by: ggkogkou <ggkogkou@ggkogkou.gr>
81 lines
2.1 KiB
JavaScript
81 lines
2.1 KiB
JavaScript
/*
|
|
Source:
|
|
https://en.wikipedia.org/wiki/Exponentiation_by_squaring
|
|
|
|
Complexity:
|
|
O(d^3 log n)
|
|
where: d is the dimension of the square matrix
|
|
n is the power the matrix is raised to
|
|
*/
|
|
|
|
const Identity = (n) => {
|
|
// Input: n: int
|
|
// Output: res: Identity matrix of size n x n
|
|
// Complexity: O(n^2)
|
|
const res = []
|
|
for (let i = 0; i < n; i++) {
|
|
res[i] = []
|
|
for (let j = 0; j < n; j++) {
|
|
res[i][j] = i === j ? 1 : 0
|
|
}
|
|
}
|
|
return res
|
|
}
|
|
|
|
const MatMult = (matrixA, matrixB) => {
|
|
// Input: matrixA: 2D Array of Numbers of size n x n
|
|
// matrixB: 2D Array of Numbers of size n x n
|
|
// Output: matrixA x matrixB: 2D Array of Numbers of size n x n
|
|
// Complexity: O(n^3)
|
|
const n = matrixA.length
|
|
const matrixC = []
|
|
for (let i = 0; i < n; i++) {
|
|
matrixC[i] = []
|
|
for (let j = 0; j < n; j++) {
|
|
matrixC[i][j] = 0
|
|
}
|
|
}
|
|
for (let i = 0; i < n; i++) {
|
|
for (let j = 0; j < n; j++) {
|
|
for (let k = 0; k < n; k++) {
|
|
matrixC[i][j] += matrixA[i][k] * matrixB[k][j]
|
|
}
|
|
}
|
|
}
|
|
return matrixC
|
|
}
|
|
|
|
export const MatrixExponentiationRecursive = (mat, m) => {
|
|
// Input: mat: 2D Array of Numbers of size n x n
|
|
// Output: mat^n: 2D Array of Numbers of size n x n
|
|
// Complexity: O(n^3 log m)
|
|
if (m === 0) {
|
|
// return identity matrix of size n x n
|
|
return Identity(mat.length)
|
|
} else if (m % 2 === 1) {
|
|
// tmp = mat ^ m-1
|
|
const tmp = MatrixExponentiationRecursive(mat, m - 1)
|
|
/// return tmp * mat = (mat ^ m-1) * mat = mat ^ m
|
|
return MatMult(tmp, mat)
|
|
} else {
|
|
// tmp = mat ^ m/2
|
|
const tmp = MatrixExponentiationRecursive(mat, m >> 1)
|
|
// return tmp * tmp = (mat ^ m/2) ^ 2 = mat ^ m
|
|
return MatMult(tmp, tmp)
|
|
}
|
|
}
|
|
|
|
// const mat = [[1, 0, 2], [2, 1, 0], [0, 2, 1]]
|
|
|
|
// // mat ^ 0 = [ [ 1, 0, 0 ], [ 0, 1, 0 ], [ 0, 0, 1 ] ]
|
|
// MatrixExponentiationRecursive(mat, 0)
|
|
|
|
// // mat ^ 1 = [ [ 1, 0, 2 ], [ 2, 1, 0 ], [ 0, 2, 1 ] ]
|
|
// MatrixExponentiationRecursive(mat, 1)
|
|
|
|
// // mat ^ 2 = [ [ 1, 4, 4 ], [ 4, 1, 4 ], [ 4, 4, 1 ] ]
|
|
// MatrixExponentiationRecursive(mat, 2)
|
|
|
|
// // mat ^ 5 = [ [ 1, 4, 4 ], [ 4, 1, 4 ], [ 4, 4, 1 ] ]
|
|
// MatrixExponentiationRecursive(mat, 5)
|