Skip to content

Commit 8aba30e

Browse files
authored
refactor(library/math): documents alternative terms for "greatest common divisor" (#575)
- captures the aliases and abbreviations mentioned in [this article for this operator](https://en.wikipedia.org/wiki/Greatest_common_divisor) - see [commits](https://github.com/nod-ai/shark-ui/pull/575/commits) for refactor operations
1 parent 0546d54 commit 8aba30e

File tree

2 files changed

+43
-20
lines changed

2 files changed

+43
-20
lines changed

src/library/math/operator/constructive/greatestCommonDivisor.test.ts

Lines changed: 22 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,7 @@ import {
1414
squared,
1515
} from '../hyper';
1616

17-
import {
18-
greatestCommonDivisor,
19-
} from './greatestCommonDivisor';
17+
import * as GCDAlias from './greatestCommonDivisor';
2018

2119
const pairCombos = <
2220
LeftElement extends number,
@@ -48,7 +46,11 @@ const symmetricPairCombos = <
4846
filler: given.filler,
4947
});
5048

51-
describe(greatestCommonDivisor, () => {
49+
const aliasKeys = Object.keys(GCDAlias) as (keyof typeof GCDAlias)[];
50+
51+
describe.each(aliasKeys)(`${GCDAlias.default.name} alias: "%s"`, (eachAliasKey) => {
52+
const eachAliasedGCD = GCDAlias[eachAliasKey]; // eslint-disable-line import/namespace
53+
5254
const singleDigitPrimes = [2, 3, 5, 7] as const;
5355

5456
const [
@@ -67,7 +69,7 @@ describe(greatestCommonDivisor, () => {
6769
it.each(combosOfInoperableNumbers)('should reject inoperable operands', (...$0) => {
6870
expect.assertions(1);
6971

70-
expect(() => greatestCommonDivisor(...$0)).toThrow(Error);
72+
expect(() => eachAliasedGCD(...$0)).toThrow(Error);
7173
});
7274

7375
const combosOfInfiniteNumbers = symmetricPairCombos({
@@ -78,7 +80,7 @@ describe(greatestCommonDivisor, () => {
7880
it.each(combosOfInfiniteNumbers)('should reject infinite operands', (...$0) => {
7981
expect.assertions(1);
8082

81-
expect(() => greatestCommonDivisor(...$0)).toThrow(Error);
83+
expect(() => eachAliasedGCD(...$0)).toThrow(Error);
8284
});
8385
});
8486

@@ -94,13 +96,13 @@ describe(greatestCommonDivisor, () => {
9496
it.each(combosOfFractionalNumbers)('should reject them', (...$0) => {
9597
expect.assertions(1);
9698

97-
expect(() => greatestCommonDivisor(...$0)).toThrow(Error);
99+
expect(() => eachAliasedGCD(...$0)).toThrow(Error);
98100
});
99101

100102
it.each(combosOfFractionalNumbers)('should safely propagate the error', (...$0) => {
101103
expect.assertions(1);
102104

103-
expect(() => greatestCommonDivisor(...$0)).toThrow(Attempt.NonActionableError);
105+
expect(() => eachAliasedGCD(...$0)).toThrow(Attempt.NonActionableError);
104106
});
105107

106108
const fractionalCombosWithMessage = [
@@ -121,7 +123,7 @@ describe(greatestCommonDivisor, () => {
121123
it.each(fractionalCombosWithMessage)('should communicate clearly with developers', ($0) => {
122124
expect.assertions(1);
123125

124-
expect(() => greatestCommonDivisor(...$0.numbers)).toThrow($0.message);
126+
expect(() => eachAliasedGCD(...$0.numbers)).toThrow($0.message);
125127
});
126128
});
127129
});
@@ -131,7 +133,7 @@ describe(greatestCommonDivisor, () => {
131133
it('should accept valid operands', () => {
132134
expect.assertions(1);
133135

134-
expect(() => greatestCommonDivisor(primeA, primeB)).not.toThrow();
136+
expect(() => eachAliasedGCD(primeA, primeB)).not.toThrow();
135137
});
136138

137139
const combosOfSignedIdentityFactors = symmetricPairCombos({
@@ -145,22 +147,22 @@ describe(greatestCommonDivisor, () => {
145147
const signedA = eachComboOfSignedIdentityFactors[0] * primeA;
146148
const signedB = eachComboOfSignedIdentityFactors[1] * primeB;
147149

148-
expect(/* */greatestCommonDivisor(/**/signedA, /**/signedB))
149-
.toBe(/**/greatestCommonDivisor(/* */primeA, /* */primeB));
150+
expect(/* */eachAliasedGCD(/**/signedA, /**/signedB))
151+
.toBe(/**/eachAliasedGCD(/* */primeA, /* */primeB));
150152
});
151153

152154
it('should be commutative', () => {
153155
expect.assertions(1);
154156

155-
expect(/* */greatestCommonDivisor(primeA, primeB))
156-
.toBe(/**/greatestCommonDivisor(primeB, primeA));
157+
expect(/* */eachAliasedGCD(primeA, primeB))
158+
.toBe(/**/eachAliasedGCD(primeB, primeA));
157159
});
158160

159161
it('should be associative', () => {
160162
expect.assertions(1);
161163

162-
expect(/* */greatestCommonDivisor(greatestCommonDivisor(primeA, primeB), primeC))
163-
.toBe(/**/greatestCommonDivisor(greatestCommonDivisor(primeB, primeC), primeA));
164+
expect(/* */eachAliasedGCD(eachAliasedGCD(primeA, primeB), primeC))
165+
.toBe(/**/eachAliasedGCD(eachAliasedGCD(primeB, primeC), primeA));
164166
});
165167

166168
const combosOfTogglingFactors = [
@@ -173,7 +175,7 @@ describe(greatestCommonDivisor, () => {
173175
expect.assertions(1);
174176

175177
expect(
176-
greatestCommonDivisor(
178+
eachAliasedGCD(
177179
primeA * eachComboOfTogglingFactors[0],
178180
primeA * eachComboOfTogglingFactors[1],
179181
),
@@ -185,7 +187,7 @@ describe(greatestCommonDivisor, () => {
185187
it('should preserve the identity of matching operands', () => {
186188
expect.assertions(1);
187189

188-
expect(greatestCommonDivisor(primeA, primeA)).toBe(primeA);
190+
expect(eachAliasedGCD(primeA, primeA)).toBe(primeA);
189191
});
190192

191193
const identityFactor = 1;
@@ -204,7 +206,7 @@ describe(greatestCommonDivisor, () => {
204206
expect.assertions(1);
205207

206208
expect(
207-
greatestCommonDivisor(
209+
eachAliasedGCD(
208210
identityFactor * eachCoPrimePair[0],
209211
identityFactor * eachCoPrimePair[1],
210212
),
@@ -232,7 +234,7 @@ describe(greatestCommonDivisor, () => {
232234
expect.assertions(1);
233235

234236
expect(
235-
greatestCommonDivisor(
237+
eachAliasedGCD(
236238
eachCommonFactor * eachComboOfNonComposites[0],
237239
eachCommonFactor * eachComboOfNonComposites[1],
238240
),

src/library/math/operator/constructive/greatestCommonDivisor.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,27 @@ const greatestCommonDivisor = (
3333
return leftHandMagnitude;
3434
};
3535

36+
/** Alias for {@link greatestCommonDivisor} */
37+
const greatestCommonFactor = greatestCommonDivisor;
38+
39+
/** Alias for {@link greatestCommonDivisor} */
40+
const highestCommonDivisor = greatestCommonDivisor;
41+
42+
/** Alias for {@link greatestCommonDivisor} */
43+
const highestCommonFactor = greatestCommonDivisor;
44+
45+
/** Abbreviation for {@link greatestCommonDivisor} */
46+
const gcd = greatestCommonDivisor;
47+
48+
/** Abbreviation for {@link greatestCommonFactor} */
49+
const gcf = greatestCommonFactor;
50+
3651
export {
52+
greatestCommonDivisor as default,
3753
greatestCommonDivisor,
54+
greatestCommonFactor,
55+
highestCommonDivisor,
56+
highestCommonFactor,
57+
gcd,
58+
gcf,
3859
};

0 commit comments

Comments
 (0)