math-exercises 2.0.7 → 2.0.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/exercises/complex/argumentFromAlgebraicComplex.d.ts +6 -0
- package/lib/exercises/complex/argumentFromAlgebraicComplex.d.ts.map +1 -1
- package/lib/exercises/complex/argumentFromAlgebraicComplex.js +62 -51
- package/lib/exercises/complex/index.d.ts +1 -0
- package/lib/exercises/complex/index.d.ts.map +1 -1
- package/lib/exercises/complex/index.js +1 -0
- package/lib/exercises/functions/exponential/expEquation.d.ts +1 -0
- package/lib/exercises/functions/exponential/expEquation.d.ts.map +1 -1
- package/lib/exercises/functions/logarithm/index.d.ts +1 -0
- package/lib/exercises/functions/logarithm/index.d.ts.map +1 -1
- package/lib/exercises/functions/logarithm/index.js +1 -1
- package/lib/exercises/functions/logarithm/log10PowerSimplifying.d.ts.map +1 -1
- package/lib/exercises/functions/logarithm/log10PowerSimplifying.js +3 -2
- package/lib/exercises/functions/logarithm/logPowerEquation.d.ts +7 -1
- package/lib/exercises/functions/logarithm/logPowerEquation.d.ts.map +1 -1
- package/lib/exercises/functions/logarithm/logPowerEquation.js +47 -17
- package/lib/exercises/trigonometry/associatePoint.d.ts +7 -0
- package/lib/exercises/trigonometry/associatePoint.d.ts.map +1 -0
- package/lib/exercises/trigonometry/associatePoint.js +64 -0
- package/lib/exercises/trigonometry/index.d.ts +1 -0
- package/lib/exercises/trigonometry/index.d.ts.map +1 -1
- package/lib/exercises/trigonometry/index.js +1 -0
- package/lib/exercises/trigonometry/remarkableValues.d.ts +1 -1
- package/lib/exercises/trigonometry/remarkableValues.d.ts.map +1 -1
- package/lib/exercises/trigonometry/remarkableValues.js +9 -7
- package/lib/index.d.ts +13 -3
- package/lib/index.d.ts.map +1 -1
- package/lib/math/numbers/nombre.js +1 -1
- package/lib/math/numbers/reals/extendedRingElement.d.ts +2 -1
- package/lib/math/numbers/reals/extendedRingElement.d.ts.map +1 -1
- package/lib/math/polynomials/trinom.d.ts +2 -2
- package/lib/math/trigonometry/remarkableValue.d.ts +3 -10
- package/lib/math/trigonometry/remarkableValue.d.ts.map +1 -1
- package/lib/math/trigonometry/remarkableValue.js +5 -15
- package/lib/math/trigonometry/remarkableValues.d.ts +7 -1
- package/lib/math/trigonometry/remarkableValues.d.ts.map +1 -1
- package/lib/math/trigonometry/remarkableValues.js +63 -13
- package/lib/math/utils/arithmetic/gcd.js +1 -1
- package/lib/server.js +1 -7
- package/lib/tree/nodes/algebraicNode.d.ts +3 -0
- package/lib/tree/nodes/algebraicNode.d.ts.map +1 -1
- package/lib/tree/nodes/functions/absNode.d.ts +3 -1
- package/lib/tree/nodes/functions/absNode.d.ts.map +1 -1
- package/lib/tree/nodes/functions/absNode.js +5 -1
- package/lib/tree/nodes/functions/cosNode.d.ts +3 -1
- package/lib/tree/nodes/functions/cosNode.d.ts.map +1 -1
- package/lib/tree/nodes/functions/cosNode.js +21 -0
- package/lib/tree/nodes/functions/expNode.d.ts +3 -1
- package/lib/tree/nodes/functions/expNode.d.ts.map +1 -1
- package/lib/tree/nodes/functions/expNode.js +4 -0
- package/lib/tree/nodes/functions/log10Node.d.ts +3 -1
- package/lib/tree/nodes/functions/log10Node.d.ts.map +1 -1
- package/lib/tree/nodes/functions/log10Node.js +28 -0
- package/lib/tree/nodes/functions/logNode.d.ts +3 -1
- package/lib/tree/nodes/functions/logNode.d.ts.map +1 -1
- package/lib/tree/nodes/functions/logNode.js +32 -0
- package/lib/tree/nodes/functions/oppositeNode.d.ts +3 -0
- package/lib/tree/nodes/functions/oppositeNode.d.ts.map +1 -1
- package/lib/tree/nodes/functions/oppositeNode.js +7 -0
- package/lib/tree/nodes/functions/sinNode.d.ts +3 -1
- package/lib/tree/nodes/functions/sinNode.d.ts.map +1 -1
- package/lib/tree/nodes/functions/sinNode.js +21 -0
- package/lib/tree/nodes/functions/sqrtNode.d.ts +3 -0
- package/lib/tree/nodes/functions/sqrtNode.d.ts.map +1 -1
- package/lib/tree/nodes/functions/sqrtNode.js +41 -0
- package/lib/tree/nodes/geometry/lengthNode.d.ts +5 -1
- package/lib/tree/nodes/geometry/lengthNode.d.ts.map +1 -1
- package/lib/tree/nodes/geometry/lengthNode.js +12 -1
- package/lib/tree/nodes/node.d.ts +1 -0
- package/lib/tree/nodes/node.d.ts.map +1 -1
- package/lib/tree/nodes/node.js +14 -1
- package/lib/tree/nodes/numbers/constantNode.d.ts +3 -0
- package/lib/tree/nodes/numbers/constantNode.d.ts.map +1 -1
- package/lib/tree/nodes/numbers/constantNode.js +7 -0
- package/lib/tree/nodes/numbers/numberNode.d.ts +3 -0
- package/lib/tree/nodes/numbers/numberNode.d.ts.map +1 -1
- package/lib/tree/nodes/numbers/numberNode.js +7 -0
- package/lib/tree/nodes/operators/addNode.d.ts +3 -0
- package/lib/tree/nodes/operators/addNode.d.ts.map +1 -1
- package/lib/tree/nodes/operators/addNode.js +173 -0
- package/lib/tree/nodes/operators/divideNode.d.ts +3 -0
- package/lib/tree/nodes/operators/divideNode.d.ts.map +1 -1
- package/lib/tree/nodes/operators/divideNode.js +12 -0
- package/lib/tree/nodes/operators/fractionNode.d.ts +3 -0
- package/lib/tree/nodes/operators/fractionNode.d.ts.map +1 -1
- package/lib/tree/nodes/operators/fractionNode.js +86 -0
- package/lib/tree/nodes/operators/multiplyNode.d.ts +5 -0
- package/lib/tree/nodes/operators/multiplyNode.d.ts.map +1 -1
- package/lib/tree/nodes/operators/multiplyNode.js +127 -10
- package/lib/tree/nodes/operators/powerNode.d.ts +3 -0
- package/lib/tree/nodes/operators/powerNode.d.ts.map +1 -1
- package/lib/tree/nodes/operators/powerNode.js +46 -0
- package/lib/tree/nodes/operators/substractNode.d.ts +3 -0
- package/lib/tree/nodes/operators/substractNode.d.ts.map +1 -1
- package/lib/tree/nodes/operators/substractNode.js +12 -0
- package/lib/tree/nodes/variables/variableNode.d.ts +3 -0
- package/lib/tree/nodes/variables/variableNode.d.ts.map +1 -1
- package/lib/tree/nodes/variables/variableNode.js +10 -0
- package/package.json +1 -1
|
@@ -7,6 +7,9 @@ const operatorNode_1 = require("./operatorNode");
|
|
|
7
7
|
const numberNode_1 = require("../numbers/numberNode");
|
|
8
8
|
const round_1 = require("../../../math/utils/round");
|
|
9
9
|
const oppositeNode_1 = require("../functions/oppositeNode");
|
|
10
|
+
const multiplyNode_1 = require("./multiplyNode");
|
|
11
|
+
const rational_1 = require("../../../math/numbers/rationals/rational");
|
|
12
|
+
const operatorComposition_1 = require("../../../tree/utilities/operatorComposition");
|
|
10
13
|
function isFractionNode(a) {
|
|
11
14
|
return (0, operatorNode_1.isOperatorNode)(a) && a.id === operatorNode_1.OperatorIds.fraction;
|
|
12
15
|
}
|
|
@@ -18,6 +21,7 @@ class FractionNode {
|
|
|
18
21
|
this.rightChild = rightChild;
|
|
19
22
|
this.type = node_1.NodeType.operator;
|
|
20
23
|
this.opts = opts;
|
|
24
|
+
this.isNumeric = leftChild.isNumeric && rightChild.isNumeric;
|
|
21
25
|
}
|
|
22
26
|
toMathString() {
|
|
23
27
|
return `(${this.leftChild.toMathString()}) / (${this.rightChild.toMathString()})`;
|
|
@@ -66,5 +70,87 @@ class FractionNode {
|
|
|
66
70
|
evaluate(vars) {
|
|
67
71
|
return this.leftChild.evaluate(vars) / this.rightChild.evaluate(vars);
|
|
68
72
|
}
|
|
73
|
+
// toMathjs() {
|
|
74
|
+
// return fraction(this.leftChild.toMathjs(), this.rightChild.toMathjs());
|
|
75
|
+
// }
|
|
76
|
+
simplify() {
|
|
77
|
+
const simplifiedNum = this.leftChild.simplify();
|
|
78
|
+
const simplifiedDenum = this.rightChild.simplify();
|
|
79
|
+
const copy = new FractionNode(simplifiedNum, simplifiedDenum, this.opts);
|
|
80
|
+
const externalsNums = [];
|
|
81
|
+
const externalsDenums = [];
|
|
82
|
+
const recursiveNums = (node) => {
|
|
83
|
+
if ((0, multiplyNode_1.isMultiplyNode)(node)) {
|
|
84
|
+
recursiveNums(node.leftChild);
|
|
85
|
+
recursiveNums(node.rightChild);
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
externalsNums.push(node);
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
const recursiveDenums = (node) => {
|
|
92
|
+
if ((0, multiplyNode_1.isMultiplyNode)(node)) {
|
|
93
|
+
recursiveDenums(node.leftChild);
|
|
94
|
+
recursiveDenums(node.rightChild);
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
externalsDenums.push(node);
|
|
98
|
+
}
|
|
99
|
+
};
|
|
100
|
+
recursiveNums(copy.leftChild);
|
|
101
|
+
recursiveDenums(copy.rightChild);
|
|
102
|
+
const simplifyExternalNodes = (num, denum) => {
|
|
103
|
+
if ((0, numberNode_1.isNumberNode)(num) && (0, numberNode_1.isNumberNode)(denum)) {
|
|
104
|
+
const frac = new rational_1.Rational(num.value, denum.value);
|
|
105
|
+
console.log(frac.isIrreductible());
|
|
106
|
+
if (frac.isIrreductible())
|
|
107
|
+
return null;
|
|
108
|
+
return frac.simplify().toTree();
|
|
109
|
+
}
|
|
110
|
+
//!ya mieux à faire pour gérer tous les cas d'un coup
|
|
111
|
+
//! s'insiprer de multiply
|
|
112
|
+
if (num.equals(denum))
|
|
113
|
+
return new numberNode_1.NumberNode(1);
|
|
114
|
+
return null;
|
|
115
|
+
};
|
|
116
|
+
console.log(externalsNums, externalsDenums);
|
|
117
|
+
const simplifyIteration = () => {
|
|
118
|
+
for (let i = 0; i < externalsNums.length; i++) {
|
|
119
|
+
const num = externalsNums[i];
|
|
120
|
+
for (let j = 0; j < externalsDenums.length; j++) {
|
|
121
|
+
const denum = externalsDenums[j];
|
|
122
|
+
const simplified = simplifyExternalNodes(num, denum);
|
|
123
|
+
if (simplified) {
|
|
124
|
+
if (isFractionNode(simplified)) {
|
|
125
|
+
externalsNums[i] = simplified.leftChild;
|
|
126
|
+
externalsDenums[j] = simplified.rightChild;
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
externalsNums[i] = simplified;
|
|
130
|
+
externalsDenums.splice(j, 1);
|
|
131
|
+
}
|
|
132
|
+
simplifyIteration();
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
};
|
|
138
|
+
simplifyIteration();
|
|
139
|
+
const nums = externalsNums.length === 1
|
|
140
|
+
? externalsNums[0]
|
|
141
|
+
: (0, operatorComposition_1.operatorComposition)(multiplyNode_1.MultiplyNode, externalsNums).simplify();
|
|
142
|
+
if (externalsDenums.length === 0) {
|
|
143
|
+
return nums;
|
|
144
|
+
}
|
|
145
|
+
const denums = externalsDenums.length === 1
|
|
146
|
+
? externalsDenums[0]
|
|
147
|
+
: (0, operatorComposition_1.operatorComposition)(multiplyNode_1.MultiplyNode, externalsDenums);
|
|
148
|
+
return new FractionNode(nums, denums);
|
|
149
|
+
}
|
|
150
|
+
equals(node) {
|
|
151
|
+
return (isFractionNode(node) &&
|
|
152
|
+
node.leftChild.equals(this.leftChild) &&
|
|
153
|
+
node.rightChild.equals(this.rightChild));
|
|
154
|
+
}
|
|
69
155
|
}
|
|
70
156
|
exports.FractionNode = FractionNode;
|
|
@@ -2,12 +2,14 @@ import { Node, NodeOptions, NodeType } from "../node";
|
|
|
2
2
|
import { CommutativeOperatorNode, OperatorIds } from "./operatorNode";
|
|
3
3
|
import { AlgebraicNode } from "../algebraicNode";
|
|
4
4
|
export declare function isMultiplyNode(a: Node): a is MultiplyNode;
|
|
5
|
+
export declare const sortMultiplyNodes: (arr: AlgebraicNode[]) => void;
|
|
5
6
|
export declare class MultiplyNode implements CommutativeOperatorNode {
|
|
6
7
|
opts?: NodeOptions;
|
|
7
8
|
id: OperatorIds;
|
|
8
9
|
leftChild: AlgebraicNode;
|
|
9
10
|
rightChild: AlgebraicNode;
|
|
10
11
|
type: NodeType;
|
|
12
|
+
isNumeric: boolean;
|
|
11
13
|
constructor(leftChild: AlgebraicNode, rightChild: AlgebraicNode, opts?: NodeOptions);
|
|
12
14
|
shuffle: () => void;
|
|
13
15
|
toMathString(): string;
|
|
@@ -16,5 +18,8 @@ export declare class MultiplyNode implements CommutativeOperatorNode {
|
|
|
16
18
|
toEquivalentNodes(opts?: NodeOptions): MultiplyNode[];
|
|
17
19
|
toAllValidTexs(opts?: NodeOptions): string[];
|
|
18
20
|
evaluate(vars: Record<string, number>): number;
|
|
21
|
+
copy(): MultiplyNode;
|
|
22
|
+
simplify(): AlgebraicNode;
|
|
23
|
+
equals(node: AlgebraicNode): boolean;
|
|
19
24
|
}
|
|
20
25
|
//# sourceMappingURL=multiplyNode.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"multiplyNode.d.ts","sourceRoot":"","sources":["../../../../src/tree/nodes/operators/multiplyNode.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACtD,OAAO,EACL,uBAAuB,EACvB,WAAW,EAEZ,MAAM,gBAAgB,CAAC;AAYxB,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"multiplyNode.d.ts","sourceRoot":"","sources":["../../../../src/tree/nodes/operators/multiplyNode.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACtD,OAAO,EACL,uBAAuB,EACvB,WAAW,EAEZ,MAAM,gBAAgB,CAAC;AAYxB,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAKjD,wBAAgB,cAAc,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,IAAI,YAAY,CAEzD;AAED,eAAO,MAAM,iBAAiB,QAAS,aAAa,EAAE,SAWrD,CAAC;AACF,qBAAa,YAAa,YAAW,uBAAuB;IAC1D,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,EAAE,EAAE,WAAW,CAAC;IAChB,SAAS,EAAE,aAAa,CAAC;IACzB,UAAU,EAAE,aAAa,CAAC;IAC1B,IAAI,EAAE,QAAQ,CAAC;IACf,SAAS,EAAE,OAAO,CAAC;gBAEjB,SAAS,EAAE,aAAa,EACxB,UAAU,EAAE,aAAa,EACzB,IAAI,CAAC,EAAE,WAAW;IAUpB,OAAO,aAGL;IAEF,YAAY,IAAI,MAAM;IAItB,KAAK,IAAI,MAAM;IAkDf,SAAS;IAkDT,iBAAiB,CAAC,IAAI,CAAC,EAAE,WAAW,GAAG,YAAY,EAAE;IAwFrD,cAAc,CAAC,IAAI,CAAC,EAAE,WAAW,GAAG,MAAM,EAAE;IAQ5C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAIrC,IAAI;IAGJ,QAAQ,IAAI,aAAa;IAqGzB,MAAM,CAAC,IAAI,EAAE,aAAa;CAU3B"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.MultiplyNode = exports.isMultiplyNode = void 0;
|
|
3
|
+
exports.MultiplyNode = exports.sortMultiplyNodes = exports.isMultiplyNode = void 0;
|
|
4
4
|
// import { multiply } from "mathjs";
|
|
5
5
|
const node_1 = require("../node");
|
|
6
6
|
const operatorNode_1 = require("./operatorNode");
|
|
@@ -12,30 +12,37 @@ const powerNode_1 = require("./powerNode");
|
|
|
12
12
|
const numberNode_1 = require("../numbers/numberNode");
|
|
13
13
|
const isInt_1 = require("../../../utils/isInt");
|
|
14
14
|
const variableNode_1 = require("../variables/variableNode");
|
|
15
|
+
const sqrtNode_1 = require("../functions/sqrtNode");
|
|
16
|
+
const oppositeNode_1 = require("../functions/oppositeNode");
|
|
17
|
+
const fractionNode_1 = require("./fractionNode");
|
|
18
|
+
const functionNode_1 = require("../functions/functionNode");
|
|
15
19
|
function isMultiplyNode(a) {
|
|
16
20
|
return (0, operatorNode_1.isOperatorNode)(a) && a.id === operatorNode_1.OperatorIds.multiply;
|
|
17
21
|
}
|
|
18
22
|
exports.isMultiplyNode = isMultiplyNode;
|
|
23
|
+
const sortMultiplyNodes = (arr) => {
|
|
24
|
+
arr.sort((a, b) => {
|
|
25
|
+
return (Number(b.isNumeric) - Number(a.isNumeric) ||
|
|
26
|
+
Number((0, numberNode_1.isNumberNode)(b) && b.value === -1) -
|
|
27
|
+
Number((0, numberNode_1.isNumberNode)(a) && a.value === -1) ||
|
|
28
|
+
Number((0, numberNode_1.isNumberNode)(b)) - Number((0, numberNode_1.isNumberNode)(a)) ||
|
|
29
|
+
Number((0, functionNode_1.isFunctionNode)(b)) - Number((0, functionNode_1.isFunctionNode)(a)) ||
|
|
30
|
+
Number((0, operatorNode_1.isOperatorNode)(b)) - Number((0, operatorNode_1.isOperatorNode)(a)));
|
|
31
|
+
});
|
|
32
|
+
};
|
|
33
|
+
exports.sortMultiplyNodes = sortMultiplyNodes;
|
|
19
34
|
class MultiplyNode {
|
|
20
35
|
constructor(leftChild, rightChild, opts) {
|
|
21
36
|
this.shuffle = () => {
|
|
22
37
|
if ((0, coinFlip_1.coinFlip)())
|
|
23
38
|
[this.leftChild, this.rightChild] = [this.rightChild, this.leftChild];
|
|
24
39
|
};
|
|
25
|
-
// let [left, right] = [leftChild, rightChild];
|
|
26
|
-
// const shouldSwitch =
|
|
27
|
-
// (rightChild.type === NodeType.function &&
|
|
28
|
-
// (rightChild as FunctionNode).id === FunctionsIds.opposite) ||
|
|
29
|
-
// (leftChild.type === NodeType.constant &&
|
|
30
|
-
// rightChild.type === NodeType.number);
|
|
31
|
-
// if (shouldSwitch) {
|
|
32
|
-
// [left, right] = [rightChild, leftChild];
|
|
33
|
-
// }
|
|
34
40
|
this.id = operatorNode_1.OperatorIds.multiply;
|
|
35
41
|
this.leftChild = leftChild;
|
|
36
42
|
this.rightChild = rightChild;
|
|
37
43
|
this.type = node_1.NodeType.operator;
|
|
38
44
|
this.opts = opts;
|
|
45
|
+
this.isNumeric = leftChild.isNumeric && rightChild.isNumeric;
|
|
39
46
|
}
|
|
40
47
|
toMathString() {
|
|
41
48
|
return `(${this.leftChild.toMathString()})*(${this.rightChild.toMathString()})`;
|
|
@@ -191,5 +198,115 @@ class MultiplyNode {
|
|
|
191
198
|
evaluate(vars) {
|
|
192
199
|
return this.leftChild.evaluate(vars) * this.rightChild.evaluate(vars);
|
|
193
200
|
}
|
|
201
|
+
copy() {
|
|
202
|
+
return new MultiplyNode(this.leftChild, this.rightChild, this.opts);
|
|
203
|
+
}
|
|
204
|
+
simplify() {
|
|
205
|
+
const leftSimplified = this.leftChild.simplify();
|
|
206
|
+
const rightSimplified = this.rightChild.simplify();
|
|
207
|
+
const copy = new MultiplyNode(leftSimplified, rightSimplified, this.opts);
|
|
208
|
+
/**get externals nodes
|
|
209
|
+
* les opposites sont supprimés et on ajoute *-1 à la fin si leur nb est impair
|
|
210
|
+
*/
|
|
211
|
+
let externals = [];
|
|
212
|
+
let oppositesCount = 0;
|
|
213
|
+
//TODO Fractions
|
|
214
|
+
const recursive = (node) => {
|
|
215
|
+
if (isMultiplyNode(node)) {
|
|
216
|
+
recursive(node.leftChild);
|
|
217
|
+
recursive(node.rightChild);
|
|
218
|
+
}
|
|
219
|
+
else if ((0, oppositeNode_1.isOppositeNode)(node)) {
|
|
220
|
+
oppositesCount++;
|
|
221
|
+
recursive(node.child);
|
|
222
|
+
}
|
|
223
|
+
else {
|
|
224
|
+
externals.push(node);
|
|
225
|
+
}
|
|
226
|
+
};
|
|
227
|
+
recursive(copy);
|
|
228
|
+
//si 0 on s'arrete
|
|
229
|
+
if (externals.some((node) => (0, numberNode_1.isNumberNode)(node) && node.value === 0)) {
|
|
230
|
+
return new numberNode_1.NumberNode(0);
|
|
231
|
+
}
|
|
232
|
+
if (oppositesCount % 2 === 1) {
|
|
233
|
+
externals.unshift(new numberNode_1.NumberNode(-1));
|
|
234
|
+
}
|
|
235
|
+
//suppression des 1
|
|
236
|
+
externals = externals.filter((node) => !(0, numberNode_1.isNumberNode)(node) || node.value !== 1);
|
|
237
|
+
if (!externals.length)
|
|
238
|
+
return new numberNode_1.NumberNode(1);
|
|
239
|
+
if (externals.length === 1)
|
|
240
|
+
return externals[0];
|
|
241
|
+
//s'il y a une fraction on transforme en fracNode
|
|
242
|
+
if (externals.some((node) => (0, fractionNode_1.isFractionNode)(node))) {
|
|
243
|
+
const nums = [];
|
|
244
|
+
const denums = [];
|
|
245
|
+
externals.forEach((node) => {
|
|
246
|
+
if ((0, fractionNode_1.isFractionNode)(node)) {
|
|
247
|
+
nums.push(node.leftChild);
|
|
248
|
+
denums.push(node.rightChild);
|
|
249
|
+
}
|
|
250
|
+
else
|
|
251
|
+
nums.push(node);
|
|
252
|
+
});
|
|
253
|
+
if (nums.some((node) => (0, numberNode_1.isNumberNode)(node) && node.value === 0)) {
|
|
254
|
+
return new numberNode_1.NumberNode(0);
|
|
255
|
+
}
|
|
256
|
+
(0, exports.sortMultiplyNodes)(nums);
|
|
257
|
+
(0, exports.sortMultiplyNodes)(denums);
|
|
258
|
+
const numNode = (0, operatorComposition_1.operatorComposition)(MultiplyNode, nums);
|
|
259
|
+
const denumNode = denums.length === 1
|
|
260
|
+
? denums[0]
|
|
261
|
+
: (0, operatorComposition_1.operatorComposition)(MultiplyNode, denums);
|
|
262
|
+
return new fractionNode_1.FractionNode(numNode, denumNode).simplify();
|
|
263
|
+
}
|
|
264
|
+
(0, exports.sortMultiplyNodes)(externals);
|
|
265
|
+
console.log(externals.map((n) => n.toTex()));
|
|
266
|
+
const simplifyExternalNodes = (a, b) => {
|
|
267
|
+
if ((0, numberNode_1.isNumberNode)(a) && (0, numberNode_1.isNumberNode)(b)) {
|
|
268
|
+
return new numberNode_1.NumberNode(a.value * b.value);
|
|
269
|
+
}
|
|
270
|
+
if ((0, sqrtNode_1.isSqrtNode)(a) && (0, sqrtNode_1.isSqrtNode)(b)) {
|
|
271
|
+
return new sqrtNode_1.SqrtNode(new MultiplyNode(a.child, b.child)).simplify();
|
|
272
|
+
}
|
|
273
|
+
//TODo continue
|
|
274
|
+
return null;
|
|
275
|
+
};
|
|
276
|
+
//pour chaque paire on essaye de simplifier,
|
|
277
|
+
//chaque simplification déclenche le reboot du process
|
|
278
|
+
const simplifyIteration = () => {
|
|
279
|
+
for (let i = 0; i < externals.length - 1; i++) {
|
|
280
|
+
const left = externals[i];
|
|
281
|
+
for (let j = i + 1; j < externals.length; j++) {
|
|
282
|
+
const right = externals[j];
|
|
283
|
+
const simplified = simplifyExternalNodes(left, right);
|
|
284
|
+
if (simplified) {
|
|
285
|
+
externals[i] = simplified;
|
|
286
|
+
externals.splice(j, 1);
|
|
287
|
+
if ((0, numberNode_1.isNumberNode)(simplified) && simplified.value === 1) {
|
|
288
|
+
externals.splice(i, 1);
|
|
289
|
+
}
|
|
290
|
+
simplifyIteration();
|
|
291
|
+
return;
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
};
|
|
296
|
+
simplifyIteration();
|
|
297
|
+
if (!externals.length)
|
|
298
|
+
return new numberNode_1.NumberNode(1);
|
|
299
|
+
if (externals.length === 1)
|
|
300
|
+
return externals[0];
|
|
301
|
+
return (0, operatorComposition_1.operatorComposition)(MultiplyNode, externals);
|
|
302
|
+
}
|
|
303
|
+
equals(node) {
|
|
304
|
+
//!incorrect, il faut plutot vérifier qu'ils ont les meme externals
|
|
305
|
+
return (isMultiplyNode(node) &&
|
|
306
|
+
((node.leftChild.equals(this.leftChild) &&
|
|
307
|
+
node.rightChild.equals(this.rightChild)) ||
|
|
308
|
+
(node.leftChild.equals(this.rightChild) &&
|
|
309
|
+
node.rightChild.equals(this.leftChild))));
|
|
310
|
+
}
|
|
194
311
|
}
|
|
195
312
|
exports.MultiplyNode = MultiplyNode;
|
|
@@ -8,12 +8,15 @@ export declare class PowerNode implements OperatorNode {
|
|
|
8
8
|
leftChild: AlgebraicNode;
|
|
9
9
|
rightChild: AlgebraicNode;
|
|
10
10
|
type: NodeType;
|
|
11
|
+
isNumeric: boolean;
|
|
11
12
|
constructor(leftChild: AlgebraicNode, rightChild: AlgebraicNode, opts?: NodeOptions);
|
|
12
13
|
toMathString(): string;
|
|
13
14
|
toEquivalentNodes(): AlgebraicNode[];
|
|
14
15
|
toAllValidTexs(): string[];
|
|
15
16
|
toTex(): string;
|
|
16
17
|
evaluate(vars: Record<string, number>): number;
|
|
18
|
+
simplify(): this;
|
|
19
|
+
equals(node: AlgebraicNode): boolean;
|
|
17
20
|
}
|
|
18
21
|
export declare class SquareNode extends PowerNode {
|
|
19
22
|
constructor(child: AlgebraicNode, opts?: NodeOptions);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"powerNode.d.ts","sourceRoot":"","sources":["../../../../src/tree/nodes/operators/powerNode.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,YAAY,EAAkB,MAAM,gBAAgB,CAAC;AAG3E,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAKjD,wBAAgB,WAAW,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,IAAI,SAAS,CAEnD;AAED,qBAAa,SAAU,YAAW,YAAY;IAC5C,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,EAAE,EAAE,WAAW,CAAC;IAChB,SAAS,EAAE,aAAa,CAAC;IACzB,UAAU,EAAE,aAAa,CAAC;IAC1B,IAAI,EAAE,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"powerNode.d.ts","sourceRoot":"","sources":["../../../../src/tree/nodes/operators/powerNode.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,YAAY,EAAkB,MAAM,gBAAgB,CAAC;AAG3E,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAKjD,wBAAgB,WAAW,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,IAAI,SAAS,CAEnD;AAED,qBAAa,SAAU,YAAW,YAAY;IAC5C,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,EAAE,EAAE,WAAW,CAAC;IAChB,SAAS,EAAE,aAAa,CAAC;IACzB,UAAU,EAAE,aAAa,CAAC;IAC1B,IAAI,EAAE,QAAQ,CAAC;IACf,SAAS,EAAE,OAAO,CAAC;gBAEjB,SAAS,EAAE,aAAa,EACxB,UAAU,EAAE,aAAa,EACzB,IAAI,CAAC,EAAE,WAAW;IAUpB,YAAY,IAAI,MAAM;IAItB,iBAAiB;IAqBjB,cAAc,IAAI,MAAM,EAAE;IAI1B,KAAK,IAAI,MAAM;IAuBf,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IA6CrC,QAAQ;IAGR,MAAM,CAAC,IAAI,EAAE,aAAa;CAO3B;AAED,qBAAa,UAAW,SAAQ,SAAS;gBAC3B,KAAK,EAAE,aAAa,EAAE,IAAI,CAAC,EAAE,WAAW;CAGrD"}
|
|
@@ -17,6 +17,7 @@ class PowerNode {
|
|
|
17
17
|
this.rightChild = rightChild;
|
|
18
18
|
this.type = node_1.NodeType.operator;
|
|
19
19
|
this.opts = opts;
|
|
20
|
+
this.isNumeric = leftChild.isNumeric && rightChild.isNumeric;
|
|
20
21
|
}
|
|
21
22
|
toMathString() {
|
|
22
23
|
return `(${this.leftChild.toMathString()})^(${this.rightChild.toMathString()})`;
|
|
@@ -73,6 +74,51 @@ class PowerNode {
|
|
|
73
74
|
evaluate(vars) {
|
|
74
75
|
return Math.pow(this.leftChild.evaluate(vars), this.rightChild.evaluate(vars));
|
|
75
76
|
}
|
|
77
|
+
// simplify(): AlgebraicNode {
|
|
78
|
+
// const leftSimplified = this.leftChild.simplify();
|
|
79
|
+
// const rightSimplified = this.rightChild.simplify();
|
|
80
|
+
// if (isNumberNode(rightSimplified)) {
|
|
81
|
+
// const value = rightSimplified.value;
|
|
82
|
+
// if (value === 0) return new NumberNode(1);
|
|
83
|
+
// if (value === 1) return leftSimplified;
|
|
84
|
+
// }
|
|
85
|
+
// if (isNumberNode(leftSimplified)) {
|
|
86
|
+
// const value = leftSimplified.value;
|
|
87
|
+
// if (value === 0) return leftSimplified;
|
|
88
|
+
// if (value === 1) return leftSimplified;
|
|
89
|
+
// }
|
|
90
|
+
// if (isNumberNode(rightSimplified) && isNumberNode(leftSimplified)) {
|
|
91
|
+
// const value = this.evaluate({});
|
|
92
|
+
// // à partir de ^21 et de ^-7, javascript returns des écritures scientifiques
|
|
93
|
+
// if (
|
|
94
|
+
// Math.abs(value) < Math.pow(10, 21) ||
|
|
95
|
+
// Math.abs(value) < Math.pow(10, -7)
|
|
96
|
+
// ) {
|
|
97
|
+
// return new NumberNode(value);
|
|
98
|
+
// } else return this;
|
|
99
|
+
// }
|
|
100
|
+
// if (isExpNode(leftSimplified) && isLogNode(rightSimplified)) {
|
|
101
|
+
// return rightSimplified.child;
|
|
102
|
+
// }
|
|
103
|
+
// if (isPowerNode(leftSimplified)) {
|
|
104
|
+
// return new PowerNode(
|
|
105
|
+
// leftSimplified.leftChild,
|
|
106
|
+
// new MultiplyNode(leftSimplified.rightChild, rightSimplified),
|
|
107
|
+
// ).simplify();
|
|
108
|
+
// }
|
|
109
|
+
// if (isSqrtNode(leftSimplified) && isNumberNode(rightSimplified)) {
|
|
110
|
+
// }
|
|
111
|
+
// //! simplifications possibles :
|
|
112
|
+
// // puissances négatives ?
|
|
113
|
+
// }
|
|
114
|
+
simplify() {
|
|
115
|
+
return this;
|
|
116
|
+
}
|
|
117
|
+
equals(node) {
|
|
118
|
+
return (isPowerNode(node) &&
|
|
119
|
+
node.leftChild.equals(this.leftChild) &&
|
|
120
|
+
node.rightChild.equals(this.rightChild));
|
|
121
|
+
}
|
|
76
122
|
}
|
|
77
123
|
exports.PowerNode = PowerNode;
|
|
78
124
|
class SquareNode extends PowerNode {
|
|
@@ -7,11 +7,14 @@ export declare class SubstractNode implements OperatorNode {
|
|
|
7
7
|
leftChild: AlgebraicNode;
|
|
8
8
|
rightChild: AlgebraicNode;
|
|
9
9
|
type: NodeType;
|
|
10
|
+
isNumeric: boolean;
|
|
10
11
|
constructor(leftChild: AlgebraicNode, rightChild: AlgebraicNode);
|
|
11
12
|
toMathString(): string;
|
|
12
13
|
toEquivalentNodes(): AlgebraicNode[];
|
|
13
14
|
toAllValidTexs(): string[];
|
|
14
15
|
toTex(): string;
|
|
15
16
|
evaluate(vars: Record<string, number>): number;
|
|
17
|
+
simplify(): this;
|
|
18
|
+
equals(node: AlgebraicNode): boolean;
|
|
16
19
|
}
|
|
17
20
|
//# sourceMappingURL=substractNode.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"substractNode.d.ts","sourceRoot":"","sources":["../../../../src/tree/nodes/operators/substractNode.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,YAAY,EAAkB,MAAM,gBAAgB,CAAC;AAG3E,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,wBAAgB,eAAe,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,IAAI,aAAa,CAE3D;AACD,qBAAa,aAAc,YAAW,YAAY;IAChD,EAAE,EAAE,WAAW,CAAC;IAChB,SAAS,EAAE,aAAa,CAAC;IACzB,UAAU,EAAE,aAAa,CAAC;IAC1B,IAAI,EAAE,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"substractNode.d.ts","sourceRoot":"","sources":["../../../../src/tree/nodes/operators/substractNode.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,YAAY,EAAkB,MAAM,gBAAgB,CAAC;AAG3E,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,wBAAgB,eAAe,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,IAAI,aAAa,CAE3D;AACD,qBAAa,aAAc,YAAW,YAAY;IAChD,EAAE,EAAE,WAAW,CAAC;IAChB,SAAS,EAAE,aAAa,CAAC;IACzB,UAAU,EAAE,aAAa,CAAC;IAC1B,IAAI,EAAE,QAAQ,CAAC;IACf,SAAS,EAAE,OAAO,CAAC;gBACP,SAAS,EAAE,aAAa,EAAE,UAAU,EAAE,aAAa;IAQ/D,YAAY,IAAI,MAAM;IAItB,iBAAiB,IAAI,aAAa,EAAE;IAapC,cAAc,IAAI,MAAM,EAAE;IAG1B,KAAK,IAAI,MAAM;IAef,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAMrC,QAAQ;IAGR,MAAM,CAAC,IAAI,EAAE,aAAa;CAO3B"}
|
|
@@ -16,6 +16,7 @@ class SubstractNode {
|
|
|
16
16
|
this.leftChild = leftChild;
|
|
17
17
|
this.rightChild = rightChild;
|
|
18
18
|
this.type = node_1.NodeType.operator;
|
|
19
|
+
this.isNumeric = leftChild.isNumeric && rightChild.isNumeric;
|
|
19
20
|
}
|
|
20
21
|
toMathString() {
|
|
21
22
|
return `${this.leftChild.toMathString()}-(${this.rightChild.toMathString()})`;
|
|
@@ -48,5 +49,16 @@ class SubstractNode {
|
|
|
48
49
|
evaluate(vars) {
|
|
49
50
|
return this.leftChild.evaluate(vars) - this.rightChild.evaluate(vars);
|
|
50
51
|
}
|
|
52
|
+
// toMathjs() {
|
|
53
|
+
// return subtract(this.leftChild.toMathjs(), this.rightChild.toMathjs());
|
|
54
|
+
// }
|
|
55
|
+
simplify() {
|
|
56
|
+
return this;
|
|
57
|
+
}
|
|
58
|
+
equals(node) {
|
|
59
|
+
return (isSubstractNode(node) &&
|
|
60
|
+
node.leftChild.equals(this.leftChild) &&
|
|
61
|
+
node.rightChild.equals(this.rightChild));
|
|
62
|
+
}
|
|
51
63
|
}
|
|
52
64
|
exports.SubstractNode = SubstractNode;
|
|
@@ -4,6 +4,7 @@ export declare function isVariableNode(a: Node): a is VariableNode;
|
|
|
4
4
|
export declare class VariableNode implements AlgebraicNode {
|
|
5
5
|
name: string;
|
|
6
6
|
type: NodeType;
|
|
7
|
+
isNumeric: boolean;
|
|
7
8
|
constructor(name: string);
|
|
8
9
|
toTex(): string;
|
|
9
10
|
toMathString(): string;
|
|
@@ -11,5 +12,7 @@ export declare class VariableNode implements AlgebraicNode {
|
|
|
11
12
|
toAllValidTexs(): string[];
|
|
12
13
|
toEquivalentNodes(): this[];
|
|
13
14
|
evaluate(vars: Record<string, number>): number;
|
|
15
|
+
simplify(): this;
|
|
16
|
+
equals(node: AlgebraicNode): boolean;
|
|
14
17
|
}
|
|
15
18
|
//# sourceMappingURL=variableNode.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"variableNode.d.ts","sourceRoot":"","sources":["../../../../src/tree/nodes/variables/variableNode.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEzC,wBAAgB,cAAc,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,IAAI,YAAY,CAEzD;AACD,qBAAa,YAAa,YAAW,aAAa;IAChD,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,WAAqB;
|
|
1
|
+
{"version":3,"file":"variableNode.d.ts","sourceRoot":"","sources":["../../../../src/tree/nodes/variables/variableNode.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEzC,wBAAgB,cAAc,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,IAAI,YAAY,CAEzD;AACD,qBAAa,YAAa,YAAW,aAAa;IAChD,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,WAAqB;IACzB,SAAS,EAAE,OAAO,CAAC;gBACP,IAAI,EAAE,MAAM;IAKxB,KAAK,IAAI,MAAM;IAGf,YAAY,IAAI,MAAM;IAGtB,QAAQ;IAGR,cAAc;IAGd,iBAAiB;IAIjB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IASrC,QAAQ;IAGR,MAAM,CAAC,IAAI,EAAE,aAAa;CAG3B"}
|
|
@@ -10,6 +10,7 @@ class VariableNode {
|
|
|
10
10
|
constructor(name) {
|
|
11
11
|
this.type = node_1.NodeType.variable;
|
|
12
12
|
this.name = name;
|
|
13
|
+
this.isNumeric = false;
|
|
13
14
|
}
|
|
14
15
|
toTex() {
|
|
15
16
|
return `${this.name}`;
|
|
@@ -32,5 +33,14 @@ class VariableNode {
|
|
|
32
33
|
throw Error(`Can't evaluate variable ${this.name}`);
|
|
33
34
|
return value;
|
|
34
35
|
}
|
|
36
|
+
// simplify(): Node {
|
|
37
|
+
// return this;
|
|
38
|
+
// }
|
|
39
|
+
simplify() {
|
|
40
|
+
return this;
|
|
41
|
+
}
|
|
42
|
+
equals(node) {
|
|
43
|
+
return isVariableNode(node) && node.name === this.name;
|
|
44
|
+
}
|
|
35
45
|
}
|
|
36
46
|
exports.VariableNode = VariableNode;
|