Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 34 additions & 0 deletions Maths/SumOfGeometricProgression.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
/*
Returns the sum of a geometric progression
Article on Geometric Progression: https://en.wikipedia.org/wiki/Geometric_series
Examples:
> sumOfGeometricProgression(2, 0.5, 6)
3.9375
> sumOfGeometricProgression(0.5, 10, 3)
55.5
> sumOfGeometricProgression(0.5, 10, Infinity)
Error: The geometric progression is diverging, and its sum cannot be calculated
*/

/**
*
* @param {Number} firstTerm The first term of the geometric progression
* @param {Number} commonRatio The common ratio of the geometric progression
* @param {Number} numOfTerms The number of terms in the progression
*/
function sumOfGeometricProgression (firstTerm, commonRatio, numOfTerms) {
if (!Number.isFinite(numOfTerms)) {
/*
If the number of Terms is Infinity, the common ratio needs to be less than 1 to be a convergent geometric progression
Article on Convergent Series: https://en.wikipedia.org/wiki/Convergent_series
*/
if (Math.abs(commonRatio) < 1) return firstTerm / (1 - commonRatio)
throw new Error('The geometric progression is diverging, and its sum cannot be calculated')
}

if (commonRatio === 1) return firstTerm * numOfTerms

return (firstTerm * (Math.pow(commonRatio, numOfTerms) - 1)) / (commonRatio - 1)
}

export { sumOfGeometricProgression }
11 changes: 11 additions & 0 deletions Maths/test/SumOfGeometricProgression.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import { sumOfGeometricProgression } from '../SumOfGeometricProgression'

describe('Sum Of Geometric Progression', () => {
it('should return the sum of a finite GP', () => {
expect(sumOfGeometricProgression(100, 1.5, 4)).toBe(812.5)
})

it('should return the sum of an infinite GP', () => {
expect(sumOfGeometricProgression(2, 0.5, Infinity)).toBe(4)
})
})