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.
Files changed (99) hide show
  1. package/lib/exercises/complex/argumentFromAlgebraicComplex.d.ts +6 -0
  2. package/lib/exercises/complex/argumentFromAlgebraicComplex.d.ts.map +1 -1
  3. package/lib/exercises/complex/argumentFromAlgebraicComplex.js +62 -51
  4. package/lib/exercises/complex/index.d.ts +1 -0
  5. package/lib/exercises/complex/index.d.ts.map +1 -1
  6. package/lib/exercises/complex/index.js +1 -0
  7. package/lib/exercises/functions/exponential/expEquation.d.ts +1 -0
  8. package/lib/exercises/functions/exponential/expEquation.d.ts.map +1 -1
  9. package/lib/exercises/functions/logarithm/index.d.ts +1 -0
  10. package/lib/exercises/functions/logarithm/index.d.ts.map +1 -1
  11. package/lib/exercises/functions/logarithm/index.js +1 -1
  12. package/lib/exercises/functions/logarithm/log10PowerSimplifying.d.ts.map +1 -1
  13. package/lib/exercises/functions/logarithm/log10PowerSimplifying.js +3 -2
  14. package/lib/exercises/functions/logarithm/logPowerEquation.d.ts +7 -1
  15. package/lib/exercises/functions/logarithm/logPowerEquation.d.ts.map +1 -1
  16. package/lib/exercises/functions/logarithm/logPowerEquation.js +47 -17
  17. package/lib/exercises/trigonometry/associatePoint.d.ts +7 -0
  18. package/lib/exercises/trigonometry/associatePoint.d.ts.map +1 -0
  19. package/lib/exercises/trigonometry/associatePoint.js +64 -0
  20. package/lib/exercises/trigonometry/index.d.ts +1 -0
  21. package/lib/exercises/trigonometry/index.d.ts.map +1 -1
  22. package/lib/exercises/trigonometry/index.js +1 -0
  23. package/lib/exercises/trigonometry/remarkableValues.d.ts +1 -1
  24. package/lib/exercises/trigonometry/remarkableValues.d.ts.map +1 -1
  25. package/lib/exercises/trigonometry/remarkableValues.js +9 -7
  26. package/lib/index.d.ts +13 -3
  27. package/lib/index.d.ts.map +1 -1
  28. package/lib/math/numbers/nombre.js +1 -1
  29. package/lib/math/numbers/reals/extendedRingElement.d.ts +2 -1
  30. package/lib/math/numbers/reals/extendedRingElement.d.ts.map +1 -1
  31. package/lib/math/polynomials/trinom.d.ts +2 -2
  32. package/lib/math/trigonometry/remarkableValue.d.ts +3 -10
  33. package/lib/math/trigonometry/remarkableValue.d.ts.map +1 -1
  34. package/lib/math/trigonometry/remarkableValue.js +5 -15
  35. package/lib/math/trigonometry/remarkableValues.d.ts +7 -1
  36. package/lib/math/trigonometry/remarkableValues.d.ts.map +1 -1
  37. package/lib/math/trigonometry/remarkableValues.js +63 -13
  38. package/lib/math/utils/arithmetic/gcd.js +1 -1
  39. package/lib/server.js +1 -7
  40. package/lib/tree/nodes/algebraicNode.d.ts +3 -0
  41. package/lib/tree/nodes/algebraicNode.d.ts.map +1 -1
  42. package/lib/tree/nodes/functions/absNode.d.ts +3 -1
  43. package/lib/tree/nodes/functions/absNode.d.ts.map +1 -1
  44. package/lib/tree/nodes/functions/absNode.js +5 -1
  45. package/lib/tree/nodes/functions/cosNode.d.ts +3 -1
  46. package/lib/tree/nodes/functions/cosNode.d.ts.map +1 -1
  47. package/lib/tree/nodes/functions/cosNode.js +21 -0
  48. package/lib/tree/nodes/functions/expNode.d.ts +3 -1
  49. package/lib/tree/nodes/functions/expNode.d.ts.map +1 -1
  50. package/lib/tree/nodes/functions/expNode.js +4 -0
  51. package/lib/tree/nodes/functions/log10Node.d.ts +3 -1
  52. package/lib/tree/nodes/functions/log10Node.d.ts.map +1 -1
  53. package/lib/tree/nodes/functions/log10Node.js +28 -0
  54. package/lib/tree/nodes/functions/logNode.d.ts +3 -1
  55. package/lib/tree/nodes/functions/logNode.d.ts.map +1 -1
  56. package/lib/tree/nodes/functions/logNode.js +32 -0
  57. package/lib/tree/nodes/functions/oppositeNode.d.ts +3 -0
  58. package/lib/tree/nodes/functions/oppositeNode.d.ts.map +1 -1
  59. package/lib/tree/nodes/functions/oppositeNode.js +7 -0
  60. package/lib/tree/nodes/functions/sinNode.d.ts +3 -1
  61. package/lib/tree/nodes/functions/sinNode.d.ts.map +1 -1
  62. package/lib/tree/nodes/functions/sinNode.js +21 -0
  63. package/lib/tree/nodes/functions/sqrtNode.d.ts +3 -0
  64. package/lib/tree/nodes/functions/sqrtNode.d.ts.map +1 -1
  65. package/lib/tree/nodes/functions/sqrtNode.js +41 -0
  66. package/lib/tree/nodes/geometry/lengthNode.d.ts +5 -1
  67. package/lib/tree/nodes/geometry/lengthNode.d.ts.map +1 -1
  68. package/lib/tree/nodes/geometry/lengthNode.js +12 -1
  69. package/lib/tree/nodes/node.d.ts +1 -0
  70. package/lib/tree/nodes/node.d.ts.map +1 -1
  71. package/lib/tree/nodes/node.js +14 -1
  72. package/lib/tree/nodes/numbers/constantNode.d.ts +3 -0
  73. package/lib/tree/nodes/numbers/constantNode.d.ts.map +1 -1
  74. package/lib/tree/nodes/numbers/constantNode.js +7 -0
  75. package/lib/tree/nodes/numbers/numberNode.d.ts +3 -0
  76. package/lib/tree/nodes/numbers/numberNode.d.ts.map +1 -1
  77. package/lib/tree/nodes/numbers/numberNode.js +7 -0
  78. package/lib/tree/nodes/operators/addNode.d.ts +3 -0
  79. package/lib/tree/nodes/operators/addNode.d.ts.map +1 -1
  80. package/lib/tree/nodes/operators/addNode.js +173 -0
  81. package/lib/tree/nodes/operators/divideNode.d.ts +3 -0
  82. package/lib/tree/nodes/operators/divideNode.d.ts.map +1 -1
  83. package/lib/tree/nodes/operators/divideNode.js +12 -0
  84. package/lib/tree/nodes/operators/fractionNode.d.ts +3 -0
  85. package/lib/tree/nodes/operators/fractionNode.d.ts.map +1 -1
  86. package/lib/tree/nodes/operators/fractionNode.js +86 -0
  87. package/lib/tree/nodes/operators/multiplyNode.d.ts +5 -0
  88. package/lib/tree/nodes/operators/multiplyNode.d.ts.map +1 -1
  89. package/lib/tree/nodes/operators/multiplyNode.js +127 -10
  90. package/lib/tree/nodes/operators/powerNode.d.ts +3 -0
  91. package/lib/tree/nodes/operators/powerNode.d.ts.map +1 -1
  92. package/lib/tree/nodes/operators/powerNode.js +46 -0
  93. package/lib/tree/nodes/operators/substractNode.d.ts +3 -0
  94. package/lib/tree/nodes/operators/substractNode.d.ts.map +1 -1
  95. package/lib/tree/nodes/operators/substractNode.js +12 -0
  96. package/lib/tree/nodes/variables/variableNode.d.ts +3 -0
  97. package/lib/tree/nodes/variables/variableNode.d.ts.map +1 -1
  98. package/lib/tree/nodes/variables/variableNode.js +10 -0
  99. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"remarkableValue.d.ts","sourceRoot":"","sources":["../../../src/math/trigonometry/remarkableValue.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAC;AAM7C,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AAErD,OAAO,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AAKzD,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,OAAO,GAAG,QAAQ,CAAC;IAC/B,KAAK,EAAE,IAAI,CAAC;IACZ,GAAG,EAAE,IAAI,CAAC;IACV,GAAG,EAAE,IAAI,CAAC;CACX;AAED,8BAAsB,0BAA0B;IAC9C,MAAM,CAAC,YAAY,QAAO,eAAe,CAIvC;IAEF,MAAM,CAAC,YAAY;eAAkC,MAAM;MAwBzD;CACH"}
1
+ {"version":3,"file":"remarkableValue.d.ts","sourceRoot":"","sources":["../../../src/math/trigonometry/remarkableValue.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAa/D,OAAO,EAAE,eAAe,EAAyB,MAAM,oBAAoB,CAAC;AAE5E,8BAAsB,0BAA0B;IAC9C,MAAM,CAAC,YAAY,QAAO,eAAe,CAGvC;IACF,MAAM,CAAC,YAAY,QAAO,eAAe,GAAG;QAC1C,SAAS,EAAE,aAAa,CAAC;KAC1B,CAeC;CACH"}
@@ -3,12 +3,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.RemarkableValueConstructor = void 0;
4
4
  const numberNode_1 = require("../../tree/nodes/numbers/numberNode");
5
5
  const piNode_1 = require("../../tree/nodes/numbers/piNode");
6
- const fractionNode_1 = require("../../tree/nodes/operators/fractionNode");
6
+ const addNode_1 = require("../../tree/nodes/operators/addNode");
7
7
  const multiplyNode_1 = require("../../tree/nodes/operators/multiplyNode");
8
8
  const random_1 = require("../../utils/random");
9
- const integer_1 = require("../numbers/integer/integer");
10
- const nombre_1 = require("../numbers/nombre");
11
- const rational_1 = require("../numbers/rationals/rational");
12
9
  const randint_1 = require("../utils/random/randint");
13
10
  const remarkableValues_1 = require("./remarkableValues");
14
11
  class RemarkableValueConstructor {
@@ -17,24 +14,17 @@ exports.RemarkableValueConstructor = RemarkableValueConstructor;
17
14
  RemarkableValueConstructor.mainInterval = () => {
18
15
  const randValue = (0, random_1.random)(remarkableValues_1.remarkableTrigoValues);
19
16
  return randValue;
20
- // return new RemarkableValue(randValue.angle, randValue.cos, randValue.sin);
21
17
  };
22
18
  RemarkableValueConstructor.simplifiable = () => {
23
19
  const index = (0, randint_1.randint)(0, remarkableValues_1.remarkableTrigoValues.length);
24
20
  const randValue = remarkableValues_1.remarkableTrigoValues[index];
25
- const isInt = randValue.angleValue.type === nombre_1.NumberType.Integer;
26
21
  const toAdd = (0, randint_1.randint)(-3, 4) * 2;
27
- const newRadian = isInt
28
- ? new integer_1.Integer(randValue.angleValue.value + toAdd)
29
- : new rational_1.Rational(randValue.angleValue.num, randValue.angleValue.denum).add(new integer_1.Integer(toAdd));
30
- const newAngle = isInt
31
- ? new multiplyNode_1.MultiplyNode(new numberNode_1.NumberNode(newRadian.value), piNode_1.PiNode)
32
- : new fractionNode_1.FractionNode(new multiplyNode_1.MultiplyNode(new numberNode_1.NumberNode(newRadian.num), piNode_1.PiNode), new numberNode_1.NumberNode(newRadian.denum));
22
+ const newRadian = new addNode_1.AddNode(randValue.angle, new multiplyNode_1.MultiplyNode(new numberNode_1.NumberNode(toAdd), piNode_1.PiNode)).simplify();
33
23
  return {
34
- angleValue: newRadian,
35
- angle: newAngle,
24
+ mainAngle: randValue.angle,
25
+ angle: newRadian,
36
26
  cos: randValue.cos,
37
27
  sin: randValue.sin,
38
- index,
28
+ point: randValue.point,
39
29
  };
40
30
  };
@@ -1,3 +1,9 @@
1
- import { RemarkableValue } from "./remarkableValue";
1
+ import { AlgebraicNode } from "../../tree/nodes/algebraicNode";
2
+ export interface RemarkableValue {
3
+ angle: AlgebraicNode;
4
+ cos: AlgebraicNode;
5
+ sin: AlgebraicNode;
6
+ point: string;
7
+ }
2
8
  export declare const remarkableTrigoValues: RemarkableValue[];
3
9
  //# sourceMappingURL=remarkableValues.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"remarkableValues.d.ts","sourceRoot":"","sources":["../../../src/math/trigonometry/remarkableValues.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,eAAO,MAAM,qBAAqB,EAAE,eAAe,EA+ElD,CAAC"}
1
+ {"version":3,"file":"remarkableValues.d.ts","sourceRoot":"","sources":["../../../src/math/trigonometry/remarkableValues.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAW/D,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,aAAa,CAAC;IACrB,GAAG,EAAE,aAAa,CAAC;IACnB,GAAG,EAAE,aAAa,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;CACf;AACD,eAAO,MAAM,qBAAqB,EAAE,eAAe,EA2KlD,CAAC"}
@@ -7,61 +7,111 @@ const numberNode_1 = require("../../tree/nodes/numbers/numberNode");
7
7
  const piNode_1 = require("../../tree/nodes/numbers/piNode");
8
8
  const fractionNode_1 = require("../../tree/nodes/operators/fractionNode");
9
9
  const multiplyNode_1 = require("../../tree/nodes/operators/multiplyNode");
10
- const integer_1 = require("../numbers/integer/integer");
11
- const rational_1 = require("../numbers/rationals/rational");
12
10
  exports.remarkableTrigoValues = [
13
11
  {
14
- angleValue: new integer_1.Integer(0),
12
+ // angleValue: 0,
15
13
  angle: new numberNode_1.NumberNode(0),
16
14
  cos: new numberNode_1.NumberNode(1),
17
15
  sin: new numberNode_1.NumberNode(0),
16
+ point: "I",
18
17
  },
19
18
  {
20
- angleValue: new rational_1.Rational(1, 6),
19
+ // angleValue: Math.PI / 6,
21
20
  angle: new fractionNode_1.FractionNode(piNode_1.PiNode, new numberNode_1.NumberNode(6)),
22
21
  cos: new fractionNode_1.FractionNode(new sqrtNode_1.SqrtNode(new numberNode_1.NumberNode(3)), new numberNode_1.NumberNode(2)),
23
22
  sin: new fractionNode_1.FractionNode(new numberNode_1.NumberNode(1), new numberNode_1.NumberNode(2)),
23
+ point: "A",
24
24
  },
25
25
  {
26
- angleValue: new rational_1.Rational(1, 4),
26
+ // angleValue: Math.PI / 4,
27
27
  angle: new fractionNode_1.FractionNode(piNode_1.PiNode, new numberNode_1.NumberNode(4)),
28
28
  cos: new fractionNode_1.FractionNode(new sqrtNode_1.SqrtNode(new numberNode_1.NumberNode(2)), new numberNode_1.NumberNode(2)),
29
29
  sin: new fractionNode_1.FractionNode(new sqrtNode_1.SqrtNode(new numberNode_1.NumberNode(2)), new numberNode_1.NumberNode(2)),
30
+ point: "B",
30
31
  },
31
32
  {
32
- angleValue: new rational_1.Rational(1, 3),
33
+ // angleValue: Math.PI / 3,
33
34
  angle: new fractionNode_1.FractionNode(piNode_1.PiNode, new numberNode_1.NumberNode(3)),
34
35
  cos: new fractionNode_1.FractionNode(new numberNode_1.NumberNode(1), new numberNode_1.NumberNode(2)),
35
36
  sin: new fractionNode_1.FractionNode(new sqrtNode_1.SqrtNode(new numberNode_1.NumberNode(3)), new numberNode_1.NumberNode(2)),
37
+ point: "C",
36
38
  },
37
39
  {
38
- angleValue: new rational_1.Rational(1, 2),
40
+ // angleValue: Math.PI / 2,
39
41
  angle: new fractionNode_1.FractionNode(piNode_1.PiNode, new numberNode_1.NumberNode(2)),
40
42
  cos: new numberNode_1.NumberNode(0),
41
43
  sin: new numberNode_1.NumberNode(1),
44
+ point: "J",
42
45
  },
43
46
  {
44
- angleValue: new rational_1.Rational(2, 3),
47
+ // angleValue: (Math.PI * 2) / 3,
45
48
  angle: new fractionNode_1.FractionNode(new multiplyNode_1.MultiplyNode(new numberNode_1.NumberNode(2), piNode_1.PiNode), new numberNode_1.NumberNode(3)),
46
49
  cos: new oppositeNode_1.OppositeNode(new fractionNode_1.FractionNode(new numberNode_1.NumberNode(1), new numberNode_1.NumberNode(2))),
47
50
  sin: new fractionNode_1.FractionNode(new sqrtNode_1.SqrtNode(new numberNode_1.NumberNode(3)), new numberNode_1.NumberNode(2)),
51
+ point: "D",
48
52
  },
49
53
  {
50
- angleValue: new rational_1.Rational(3, 4),
54
+ // angleValue: (Math.PI * 3) / 4,
51
55
  angle: new fractionNode_1.FractionNode(new multiplyNode_1.MultiplyNode(new numberNode_1.NumberNode(3), piNode_1.PiNode), new numberNode_1.NumberNode(4)),
52
56
  cos: new oppositeNode_1.OppositeNode(new fractionNode_1.FractionNode(new sqrtNode_1.SqrtNode(new numberNode_1.NumberNode(2)), new numberNode_1.NumberNode(2))),
53
57
  sin: new fractionNode_1.FractionNode(new sqrtNode_1.SqrtNode(new numberNode_1.NumberNode(2)), new numberNode_1.NumberNode(2)),
58
+ point: "E",
54
59
  },
55
60
  {
56
- angleValue: new rational_1.Rational(5, 6),
61
+ // angleValue: (Math.PI * 5) / 6,
57
62
  angle: new fractionNode_1.FractionNode(new multiplyNode_1.MultiplyNode(new numberNode_1.NumberNode(5), piNode_1.PiNode), new numberNode_1.NumberNode(6)),
58
- cos: new oppositeNode_1.OppositeNode(new fractionNode_1.FractionNode(new numberNode_1.NumberNode(1), new numberNode_1.NumberNode(2))),
59
- sin: new oppositeNode_1.OppositeNode(new fractionNode_1.FractionNode(new sqrtNode_1.SqrtNode(new numberNode_1.NumberNode(3)), new numberNode_1.NumberNode(2))),
63
+ cos: new oppositeNode_1.OppositeNode(new fractionNode_1.FractionNode(new sqrtNode_1.SqrtNode(new numberNode_1.NumberNode(3)), new numberNode_1.NumberNode(2))),
64
+ sin: new fractionNode_1.FractionNode(new numberNode_1.NumberNode(1), new numberNode_1.NumberNode(2)),
65
+ point: "F",
60
66
  },
61
67
  {
62
- angleValue: new integer_1.Integer(1),
68
+ // angleValue: Math.PI,
69
+ //
63
70
  angle: piNode_1.PiNode,
64
71
  cos: new numberNode_1.NumberNode(-1),
65
72
  sin: new numberNode_1.NumberNode(0),
73
+ point: "G",
74
+ },
75
+ {
76
+ angle: new fractionNode_1.FractionNode(new multiplyNode_1.MultiplyNode(new numberNode_1.NumberNode(7), piNode_1.PiNode), new numberNode_1.NumberNode(6)),
77
+ cos: new oppositeNode_1.OppositeNode(new fractionNode_1.FractionNode(new sqrtNode_1.SqrtNode(new numberNode_1.NumberNode(3)), new numberNode_1.NumberNode(2))),
78
+ sin: new oppositeNode_1.OppositeNode(new fractionNode_1.FractionNode(new numberNode_1.NumberNode(1), new numberNode_1.NumberNode(2))),
79
+ point: "H",
80
+ },
81
+ {
82
+ angle: new fractionNode_1.FractionNode(new multiplyNode_1.MultiplyNode(new numberNode_1.NumberNode(5), piNode_1.PiNode), new numberNode_1.NumberNode(4)),
83
+ cos: new oppositeNode_1.OppositeNode(new fractionNode_1.FractionNode(new sqrtNode_1.SqrtNode(new numberNode_1.NumberNode(2)), new numberNode_1.NumberNode(2))),
84
+ sin: new oppositeNode_1.OppositeNode(new fractionNode_1.FractionNode(new sqrtNode_1.SqrtNode(new numberNode_1.NumberNode(2)), new numberNode_1.NumberNode(2))),
85
+ point: "K",
86
+ },
87
+ {
88
+ angle: new fractionNode_1.FractionNode(new multiplyNode_1.MultiplyNode(new numberNode_1.NumberNode(7), piNode_1.PiNode), new numberNode_1.NumberNode(3)),
89
+ cos: new oppositeNode_1.OppositeNode(new fractionNode_1.FractionNode(new numberNode_1.NumberNode(1), new numberNode_1.NumberNode(2))),
90
+ sin: new oppositeNode_1.OppositeNode(new fractionNode_1.FractionNode(new sqrtNode_1.SqrtNode(new numberNode_1.NumberNode(3)), new numberNode_1.NumberNode(2))),
91
+ point: "L",
92
+ },
93
+ {
94
+ angle: new fractionNode_1.FractionNode(new multiplyNode_1.MultiplyNode(new numberNode_1.NumberNode(3), piNode_1.PiNode), new numberNode_1.NumberNode(2)),
95
+ cos: new numberNode_1.NumberNode(0),
96
+ sin: new numberNode_1.NumberNode(-1),
97
+ point: "M",
98
+ },
99
+ {
100
+ angle: new fractionNode_1.FractionNode(new multiplyNode_1.MultiplyNode(new numberNode_1.NumberNode(5), piNode_1.PiNode), new numberNode_1.NumberNode(3)),
101
+ cos: new fractionNode_1.FractionNode(new numberNode_1.NumberNode(1), new numberNode_1.NumberNode(2)),
102
+ sin: new oppositeNode_1.OppositeNode(new fractionNode_1.FractionNode(new sqrtNode_1.SqrtNode(new numberNode_1.NumberNode(3)), new numberNode_1.NumberNode(2))),
103
+ point: "N",
104
+ },
105
+ {
106
+ angle: new fractionNode_1.FractionNode(new multiplyNode_1.MultiplyNode(new numberNode_1.NumberNode(7), piNode_1.PiNode), new numberNode_1.NumberNode(4)),
107
+ cos: new fractionNode_1.FractionNode(new sqrtNode_1.SqrtNode(new numberNode_1.NumberNode(2)), new numberNode_1.NumberNode(2)),
108
+ sin: new oppositeNode_1.OppositeNode(new fractionNode_1.FractionNode(new sqrtNode_1.SqrtNode(new numberNode_1.NumberNode(2)), new numberNode_1.NumberNode(2))),
109
+ point: "P",
110
+ },
111
+ {
112
+ angle: new fractionNode_1.FractionNode(new multiplyNode_1.MultiplyNode(new numberNode_1.NumberNode(11), piNode_1.PiNode), new numberNode_1.NumberNode(6)),
113
+ cos: new fractionNode_1.FractionNode(new sqrtNode_1.SqrtNode(new numberNode_1.NumberNode(3)), new numberNode_1.NumberNode(2)),
114
+ sin: new oppositeNode_1.OppositeNode(new fractionNode_1.FractionNode(new numberNode_1.NumberNode(1), new numberNode_1.NumberNode(2))),
115
+ point: "Q",
66
116
  },
67
117
  ];
@@ -2,7 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.gcd = void 0;
4
4
  function pgcd(a, b) {
5
- return b ? gcd(b, a % b) : a;
5
+ return b ? pgcd(b, a % b) : Math.abs(a);
6
6
  }
7
7
  function gcd(...args) {
8
8
  if (args.length === 2)
package/lib/server.js CHANGED
@@ -35,22 +35,16 @@ const express_1 = __importDefault(require("express"));
35
35
  const body_parser_1 = __importDefault(require("body-parser"));
36
36
  const dotenv_1 = __importDefault(require("dotenv"));
37
37
  const cors_1 = __importDefault(require("cors"));
38
- const multiplyNode_1 = require("./tree/nodes/operators/multiplyNode");
39
- const numberNode_1 = require("./tree/nodes/numbers/numberNode");
40
- const addNode_1 = require("./tree/nodes/operators/addNode");
41
- const powerNode_1 = require("./tree/nodes/operators/powerNode");
42
38
  const jsonParser = body_parser_1.default.json();
43
39
  const allExercises = [...exercises];
44
40
  const runServer = () => {
45
41
  dotenv_1.default.config();
46
42
  const app = (0, express_1.default)();
47
43
  app.use((0, cors_1.default)());
48
- console.log(exercises.length);
44
+ console.log(exercises.length + " exercices");
49
45
  app.get("/", (req, res) => {
50
46
  res.json(allExercises);
51
47
  });
52
- const tree = new multiplyNode_1.MultiplyNode(new numberNode_1.NumberNode(3), new addNode_1.AddNode(new powerNode_1.SquareNode(new numberNode_1.NumberNode(4)), new powerNode_1.PowerNode(new numberNode_1.NumberNode(2), new numberNode_1.NumberNode(3))));
53
- console.log(tree.evaluate({}));
54
48
  app.get("/exo", (req, res) => {
55
49
  const exoId = req.query.exoId;
56
50
  const exoIndex = allExercises.findIndex((exo) => exo.id == exoId);
@@ -2,5 +2,8 @@ import { Node, NodeOptions } from "./node";
2
2
  export interface AlgebraicNode extends Node {
3
3
  evaluate: (vars: Record<string, number>) => number;
4
4
  toEquivalentNodes: (opts?: NodeOptions) => AlgebraicNode[];
5
+ simplify: () => AlgebraicNode;
6
+ equals: (node: AlgebraicNode) => boolean;
7
+ isNumeric: boolean;
5
8
  }
6
9
  //# sourceMappingURL=algebraicNode.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"algebraicNode.d.ts","sourceRoot":"","sources":["../../../src/tree/nodes/algebraicNode.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAE3C,MAAM,WAAW,aAAc,SAAQ,IAAI;IAEzC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,MAAM,CAAC;IACnD,iBAAiB,EAAE,CAAC,IAAI,CAAC,EAAE,WAAW,KAAK,aAAa,EAAE,CAAC;CAC5D"}
1
+ {"version":3,"file":"algebraicNode.d.ts","sourceRoot":"","sources":["../../../src/tree/nodes/algebraicNode.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAE3C,MAAM,WAAW,aAAc,SAAQ,IAAI;IAEzC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,MAAM,CAAC;IACnD,iBAAiB,EAAE,CAAC,IAAI,CAAC,EAAE,WAAW,KAAK,aAAa,EAAE,CAAC;IAC3D,QAAQ,EAAE,MAAM,aAAa,CAAC;IAC9B,MAAM,EAAE,CAAC,IAAI,EAAE,aAAa,KAAK,OAAO,CAAC;IACzC,SAAS,EAAE,OAAO,CAAC;CACpB"}
@@ -6,12 +6,14 @@ export declare class AbsNode implements FunctionNode {
6
6
  id: FunctionsIds;
7
7
  child: AlgebraicNode;
8
8
  type: NodeType;
9
+ isNumeric: boolean;
9
10
  constructor(child: AlgebraicNode);
10
11
  toMathString(): string;
11
12
  toTex(): string;
12
13
  toEquivalentNodes(): AlgebraicNode[];
13
14
  toAllValidTexs(): string[];
14
- simplify(): Node;
15
+ simplify(): AbsNode;
15
16
  evaluate(vars: Record<string, number>): number;
17
+ equals(node: AlgebraicNode): boolean;
16
18
  }
17
19
  //# sourceMappingURL=absNode.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"absNode.d.ts","sourceRoot":"","sources":["../../../../src/tree/nodes/functions/absNode.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,YAAY,EAAkB,MAAM,gBAAgB,CAAC;AAC5E,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,wBAAgB,SAAS,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,IAAI,OAAO,CAE/C;AACD,qBAAa,OAAQ,YAAW,YAAY;IAC1C,EAAE,EAAE,YAAY,CAAC;IACjB,KAAK,EAAE,aAAa,CAAC;IACrB,IAAI,EAAE,QAAQ,CAAC;gBAEH,KAAK,EAAE,aAAa;IAMhC,YAAY,IAAI,MAAM;IAItB,KAAK,IAAI,MAAM;IAOf,iBAAiB,IAAI,aAAa,EAAE;IASpC,cAAc,IAAI,MAAM,EAAE;IAG1B,QAAQ,IAAI,IAAI;IAIhB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;CAGtC"}
1
+ {"version":3,"file":"absNode.d.ts","sourceRoot":"","sources":["../../../../src/tree/nodes/functions/absNode.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,YAAY,EAAkB,MAAM,gBAAgB,CAAC;AAC5E,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,wBAAgB,SAAS,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,IAAI,OAAO,CAE/C;AACD,qBAAa,OAAQ,YAAW,YAAY;IAC1C,EAAE,EAAE,YAAY,CAAC;IACjB,KAAK,EAAE,aAAa,CAAC;IACrB,IAAI,EAAE,QAAQ,CAAC;IACf,SAAS,EAAE,OAAO,CAAC;gBACP,KAAK,EAAE,aAAa;IAOhC,YAAY,IAAI,MAAM;IAItB,KAAK,IAAI,MAAM;IAOf,iBAAiB,IAAI,aAAa,EAAE;IASpC,cAAc,IAAI,MAAM,EAAE;IAG1B,QAAQ;IAIR,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAGrC,MAAM,CAAC,IAAI,EAAE,aAAa;CAG3B"}
@@ -13,6 +13,7 @@ class AbsNode {
13
13
  this.id = functionNode_1.FunctionsIds.abs;
14
14
  this.child = child;
15
15
  this.type = node_1.NodeType.function;
16
+ this.isNumeric = child.isNumeric;
16
17
  }
17
18
  toMathString() {
18
19
  return `abs(${this.child.toMathString()})`;
@@ -35,10 +36,13 @@ class AbsNode {
35
36
  return this.toEquivalentNodes().map((node) => node.toTex());
36
37
  }
37
38
  simplify() {
38
- return this;
39
+ return new AbsNode(this.child.simplify());
39
40
  }
40
41
  evaluate(vars) {
41
42
  return Math.abs(this.child.evaluate(vars));
42
43
  }
44
+ equals(node) {
45
+ return isAbsNode(node) && node.child.equals(this.child);
46
+ }
43
47
  }
44
48
  exports.AbsNode = AbsNode;
@@ -6,12 +6,14 @@ export declare class CosNode implements FunctionNode {
6
6
  id: FunctionsIds;
7
7
  child: AlgebraicNode;
8
8
  type: NodeType;
9
+ isNumeric: boolean;
9
10
  constructor(child: AlgebraicNode);
10
11
  toMathString(): string;
11
12
  toEquivalentNodes(): AlgebraicNode[];
12
13
  toAllValidTexs(): string[];
13
14
  toTex(): string;
14
- simplify(): Node;
15
+ simplify(): AlgebraicNode | this;
15
16
  evaluate(vars: Record<string, number>): number;
17
+ equals(node: AlgebraicNode): boolean;
16
18
  }
17
19
  //# sourceMappingURL=cosNode.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"cosNode.d.ts","sourceRoot":"","sources":["../../../../src/tree/nodes/functions/cosNode.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,YAAY,EAAkB,MAAM,gBAAgB,CAAC;AAC5E,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,wBAAgB,SAAS,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,IAAI,OAAO,CAE/C;AACD,qBAAa,OAAQ,YAAW,YAAY;IAC1C,EAAE,EAAE,YAAY,CAAC;IACjB,KAAK,EAAE,aAAa,CAAC;IACrB,IAAI,EAAE,QAAQ,CAAC;gBAEH,KAAK,EAAE,aAAa;IAMhC,YAAY,IAAI,MAAM;IAItB,iBAAiB,IAAI,aAAa,EAAE;IASpC,cAAc,IAAI,MAAM,EAAE;IAI1B,KAAK,IAAI,MAAM;IAQf,QAAQ,IAAI,IAAI;IAGhB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;CAGtC"}
1
+ {"version":3,"file":"cosNode.d.ts","sourceRoot":"","sources":["../../../../src/tree/nodes/functions/cosNode.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAmB,MAAM,SAAS,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,YAAY,EAAkB,MAAM,gBAAgB,CAAC;AAC5E,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAKjD,wBAAgB,SAAS,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,IAAI,OAAO,CAE/C;AACD,qBAAa,OAAQ,YAAW,YAAY;IAC1C,EAAE,EAAE,YAAY,CAAC;IACjB,KAAK,EAAE,aAAa,CAAC;IACrB,IAAI,EAAE,QAAQ,CAAC;IACf,SAAS,EAAE,OAAO,CAAC;gBACP,KAAK,EAAE,aAAa;IAOhC,YAAY,IAAI,MAAM;IAItB,iBAAiB,IAAI,aAAa,EAAE;IASpC,cAAc,IAAI,MAAM,EAAE;IAI1B,KAAK,IAAI,MAAM;IAQf,QAAQ;IAkBR,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAGrC,MAAM,CAAC,IAAI,EAAE,aAAa;CAG3B"}
@@ -4,6 +4,7 @@ exports.CosNode = exports.isCosNode = void 0;
4
4
  // import { cos } from "mathjs";
5
5
  const node_1 = require("../node");
6
6
  const functionNode_1 = require("./functionNode");
7
+ const remarkableValues_1 = require("../../../math/trigonometry/remarkableValues");
7
8
  function isCosNode(a) {
8
9
  return (0, functionNode_1.isFunctionNode)(a) && a.id === functionNode_1.FunctionsIds.cos;
9
10
  }
@@ -13,6 +14,7 @@ class CosNode {
13
14
  this.id = functionNode_1.FunctionsIds.opposite;
14
15
  this.child = child;
15
16
  this.type = node_1.NodeType.function;
17
+ this.isNumeric = child.isNumeric;
16
18
  }
17
19
  toMathString() {
18
20
  return `cos(${this.child.toMathString()})`;
@@ -35,10 +37,29 @@ class CosNode {
35
37
  // return cos(this.child.toMathjs());
36
38
  // }
37
39
  simplify() {
40
+ const simplifiedChild = this.child.simplify();
41
+ if (!(0, node_1.hasVariableNode)(simplifiedChild)) {
42
+ const value = simplifiedChild.evaluate({});
43
+ const moduled = Math.abs(value % (2 * Math.PI));
44
+ const trigoPoint = remarkableValues_1.remarkableTrigoValues.find((value) => value.angle.evaluate({}) === moduled);
45
+ if (!trigoPoint)
46
+ return this;
47
+ else
48
+ return trigoPoint.cos;
49
+ }
50
+ else {
51
+ //écrire les regles albgeiruqe
52
+ //chaque simplification doit relancer tout le simplify
53
+ //cos(x+2PI)
54
+ //cos(-x)
55
+ }
38
56
  return this;
39
57
  }
40
58
  evaluate(vars) {
41
59
  return Math.cos(this.child.evaluate(vars));
42
60
  }
61
+ equals(node) {
62
+ return isCosNode(node) && node.child.equals(this.child);
63
+ }
43
64
  }
44
65
  exports.CosNode = CosNode;
@@ -7,12 +7,14 @@ export declare class ExpNode implements FunctionNode {
7
7
  id: FunctionsIds;
8
8
  child: AlgebraicNode;
9
9
  type: NodeType;
10
+ isNumeric: boolean;
10
11
  constructor(child: AlgebraicNode, opts?: NodeOptions);
11
12
  toMathString(): string;
12
13
  toTex(): string;
13
14
  toEquivalentNodes(): AlgebraicNode[];
14
15
  toAllValidTexs(): string[];
15
- simplify(): Node;
16
+ simplify(): this;
16
17
  evaluate(vars: Record<string, number>): number;
18
+ equals(node: AlgebraicNode): boolean;
17
19
  }
18
20
  //# sourceMappingURL=expNode.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"expNode.d.ts","sourceRoot":"","sources":["../../../../src/tree/nodes/functions/expNode.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,YAAY,EAAkB,MAAM,gBAAgB,CAAC;AAC5E,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,wBAAgB,SAAS,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,IAAI,OAAO,CAE/C;AACD,qBAAa,OAAQ,YAAW,YAAY;IAC1C,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,EAAE,EAAE,YAAY,CAAC;IACjB,KAAK,EAAE,aAAa,CAAC;IACrB,IAAI,EAAE,QAAQ,CAAC;gBACH,KAAK,EAAE,aAAa,EAAE,IAAI,CAAC,EAAE,WAAW;IAOpD,YAAY,IAAI,MAAM;IAItB,KAAK,IAAI,MAAM;IAgBf,iBAAiB,IAAI,aAAa,EAAE;IAUpC,cAAc,IAAI,MAAM,EAAE;IAI1B,QAAQ,IAAI,IAAI;IAGhB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;CAGtC"}
1
+ {"version":3,"file":"expNode.d.ts","sourceRoot":"","sources":["../../../../src/tree/nodes/functions/expNode.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,YAAY,EAAkB,MAAM,gBAAgB,CAAC;AAC5E,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,wBAAgB,SAAS,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,IAAI,OAAO,CAE/C;AACD,qBAAa,OAAQ,YAAW,YAAY;IAC1C,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,EAAE,EAAE,YAAY,CAAC;IACjB,KAAK,EAAE,aAAa,CAAC;IACrB,IAAI,EAAE,QAAQ,CAAC;IACf,SAAS,EAAE,OAAO,CAAC;gBACP,KAAK,EAAE,aAAa,EAAE,IAAI,CAAC,EAAE,WAAW;IAQpD,YAAY,IAAI,MAAM;IAItB,KAAK,IAAI,MAAM;IAgBf,iBAAiB,IAAI,aAAa,EAAE;IAUpC,cAAc,IAAI,MAAM,EAAE;IAI1B,QAAQ;IAGR,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAGrC,MAAM,CAAC,IAAI,EAAE,aAAa;CAG3B"}
@@ -14,6 +14,7 @@ class ExpNode {
14
14
  this.child = child;
15
15
  this.type = node_1.NodeType.function;
16
16
  this.opts = opts;
17
+ this.isNumeric = child.isNumeric;
17
18
  }
18
19
  toMathString() {
19
20
  return `e^(${this.child.toMathString()})`;
@@ -52,5 +53,8 @@ class ExpNode {
52
53
  evaluate(vars) {
53
54
  return Math.exp(this.child.evaluate(vars));
54
55
  }
56
+ equals(node) {
57
+ return isExpNode(node) && node.child.equals(this.child);
58
+ }
55
59
  }
56
60
  exports.ExpNode = ExpNode;
@@ -7,12 +7,14 @@ export declare class Log10Node implements FunctionNode {
7
7
  child: AlgebraicNode;
8
8
  type: NodeType;
9
9
  opts?: NodeOptions;
10
+ isNumeric: boolean;
10
11
  constructor(child: AlgebraicNode, opts?: NodeOptions);
11
12
  toMathString(): string;
12
13
  toTex(): string;
13
14
  toEquivalentNodes(): AlgebraicNode[];
14
15
  toAllValidTexs(): string[];
15
- simplify(): Node;
16
+ simplify(): AlgebraicNode;
16
17
  evaluate(vars: Record<string, number>): number;
18
+ equals(node: AlgebraicNode): boolean;
17
19
  }
18
20
  //# sourceMappingURL=log10Node.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"log10Node.d.ts","sourceRoot":"","sources":["../../../../src/tree/nodes/functions/log10Node.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,YAAY,EAAkB,MAAM,gBAAgB,CAAC;AAE5E,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,wBAAgB,WAAW,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,IAAI,SAAS,CAEnD;AACD,qBAAa,SAAU,YAAW,YAAY;IAC5C,EAAE,EAAE,YAAY,CAAC;IACjB,KAAK,EAAE,aAAa,CAAC;IACrB,IAAI,EAAE,QAAQ,CAAC;IACf,IAAI,CAAC,EAAE,WAAW,CAAC;gBAEP,KAAK,EAAE,aAAa,EAAE,IAAI,CAAC,EAAE,WAAW;IAOpD,YAAY,IAAI,MAAM;IAItB,KAAK,IAAI,MAAM;IAaf,iBAAiB,IAAI,aAAa,EAAE;IASpC,cAAc,IAAI,MAAM,EAAE;IAG1B,QAAQ,IAAI,IAAI;IAGhB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;CAGtC"}
1
+ {"version":3,"file":"log10Node.d.ts","sourceRoot":"","sources":["../../../../src/tree/nodes/functions/log10Node.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,YAAY,EAAkB,MAAM,gBAAgB,CAAC;AAE5E,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAMjD,wBAAgB,WAAW,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,IAAI,SAAS,CAEnD;AACD,qBAAa,SAAU,YAAW,YAAY;IAC5C,EAAE,EAAE,YAAY,CAAC;IACjB,KAAK,EAAE,aAAa,CAAC;IACrB,IAAI,EAAE,QAAQ,CAAC;IACf,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;gBACP,KAAK,EAAE,aAAa,EAAE,IAAI,CAAC,EAAE,WAAW;IAQpD,YAAY,IAAI,MAAM;IAItB,KAAK,IAAI,MAAM;IAaf,iBAAiB,IAAI,aAAa,EAAE;IASpC,cAAc,IAAI,MAAM,EAAE;IAG1B,QAAQ,IAAI,aAAa;IA0BzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAGrC,MAAM,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO;CAGrC"}
@@ -5,6 +5,11 @@ exports.Log10Node = exports.isLog10Node = void 0;
5
5
  const node_1 = require("../node");
6
6
  const functionNode_1 = require("./functionNode");
7
7
  const absNode_1 = require("./absNode");
8
+ const numberNode_1 = require("../numbers/numberNode");
9
+ const isInt_1 = require("../../../utils/isInt");
10
+ const powerNode_1 = require("../operators/powerNode");
11
+ const multiplyNode_1 = require("../operators/multiplyNode");
12
+ const primeFactors_1 = require("../../../math/utils/arithmetic/primeFactors");
8
13
  function isLog10Node(a) {
9
14
  return (0, functionNode_1.isFunctionNode)(a) && a.id === functionNode_1.FunctionsIds.log10;
10
15
  }
@@ -15,6 +20,7 @@ class Log10Node {
15
20
  this.child = child;
16
21
  this.type = node_1.NodeType.function;
17
22
  this.opts = opts;
23
+ this.isNumeric = child.isNumeric;
18
24
  }
19
25
  toMathString() {
20
26
  return `log_{10}(${this.child.toMathString()})`;
@@ -45,10 +51,32 @@ class Log10Node {
45
51
  return this.toEquivalentNodes().map((node) => node.toTex());
46
52
  }
47
53
  simplify() {
54
+ const simplifiedChild = this.child.simplify();
55
+ if ((0, numberNode_1.isNumberNode)(simplifiedChild)) {
56
+ const value = simplifiedChild.value;
57
+ const log10 = Math.log10(value);
58
+ if ((0, isInt_1.isInt)(log10))
59
+ return new numberNode_1.NumberNode(log10);
60
+ if ((0, isInt_1.isInt)(value)) {
61
+ const factors = (0, primeFactors_1.primeFactors)(value);
62
+ if (factors.length === 1)
63
+ return this; //isPrime
64
+ if (factors.every((nb) => nb === factors[0])) {
65
+ return new multiplyNode_1.MultiplyNode(new numberNode_1.NumberNode(factors.length), new Log10Node(new numberNode_1.NumberNode(factors[0]))).simplify();
66
+ }
67
+ }
68
+ }
69
+ //si int il faut voir si on peut écrire a^b
70
+ if ((0, powerNode_1.isPowerNode)(simplifiedChild)) {
71
+ return new multiplyNode_1.MultiplyNode(simplifiedChild.rightChild, new Log10Node(simplifiedChild.leftChild)).simplify();
72
+ }
48
73
  return this;
49
74
  }
50
75
  evaluate(vars) {
51
76
  return Math.log10(this.child.evaluate(vars));
52
77
  }
78
+ equals(node) {
79
+ return isLog10Node(node) && node.child.equals(this.child);
80
+ }
53
81
  }
54
82
  exports.Log10Node = Log10Node;
@@ -7,12 +7,14 @@ export declare class LogNode implements FunctionNode {
7
7
  child: AlgebraicNode;
8
8
  type: NodeType;
9
9
  opts?: NodeOptions;
10
+ isNumeric: boolean;
10
11
  constructor(child: AlgebraicNode, opts?: NodeOptions);
11
12
  toMathString(): string;
12
13
  toTex(): string;
13
14
  toEquivalentNodes(): AlgebraicNode[];
14
15
  toAllValidTexs(): string[];
15
- simplify(): Node;
16
+ simplify(): AlgebraicNode;
16
17
  evaluate(vars: Record<string, number>): number;
18
+ equals(node: AlgebraicNode): boolean;
17
19
  }
18
20
  //# sourceMappingURL=logNode.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"logNode.d.ts","sourceRoot":"","sources":["../../../../src/tree/nodes/functions/logNode.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,YAAY,EAAkB,MAAM,gBAAgB,CAAC;AAE5E,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,wBAAgB,SAAS,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,IAAI,OAAO,CAE/C;AACD,qBAAa,OAAQ,YAAW,YAAY;IAC1C,EAAE,EAAE,YAAY,CAAC;IACjB,KAAK,EAAE,aAAa,CAAC;IACrB,IAAI,EAAE,QAAQ,CAAC;IACf,IAAI,CAAC,EAAE,WAAW,CAAC;gBAEP,KAAK,EAAE,aAAa,EAAE,IAAI,CAAC,EAAE,WAAW;IAOpD,YAAY,IAAI,MAAM;IAItB,KAAK,IAAI,MAAM;IAaf,iBAAiB,IAAI,aAAa,EAAE;IASpC,cAAc,IAAI,MAAM,EAAE;IAG1B,QAAQ,IAAI,IAAI;IAGhB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;CAGtC"}
1
+ {"version":3,"file":"logNode.d.ts","sourceRoot":"","sources":["../../../../src/tree/nodes/functions/logNode.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,YAAY,EAAkB,MAAM,gBAAgB,CAAC;AAE5E,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAOjD,wBAAgB,SAAS,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,IAAI,OAAO,CAE/C;AACD,qBAAa,OAAQ,YAAW,YAAY;IAC1C,EAAE,EAAE,YAAY,CAAC;IACjB,KAAK,EAAE,aAAa,CAAC;IACrB,IAAI,EAAE,QAAQ,CAAC;IACf,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;gBACP,KAAK,EAAE,aAAa,EAAE,IAAI,CAAC,EAAE,WAAW;IAQpD,YAAY,IAAI,MAAM;IAItB,KAAK,IAAI,MAAM;IAaf,iBAAiB,IAAI,aAAa,EAAE;IASpC,cAAc,IAAI,MAAM,EAAE;IAG1B,QAAQ,IAAI,aAAa;IA6BzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAGrC,MAAM,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO;CAGrC"}
@@ -5,6 +5,12 @@ exports.LogNode = exports.isLogNode = void 0;
5
5
  const node_1 = require("../node");
6
6
  const functionNode_1 = require("./functionNode");
7
7
  const absNode_1 = require("./absNode");
8
+ const multiplyNode_1 = require("../operators/multiplyNode");
9
+ const powerNode_1 = require("../operators/powerNode");
10
+ const numberNode_1 = require("../numbers/numberNode");
11
+ const isInt_1 = require("../../../utils/isInt");
12
+ const primeFactors_1 = require("../../../math/utils/arithmetic/primeFactors");
13
+ const expNode_1 = require("./expNode");
8
14
  function isLogNode(a) {
9
15
  return (0, functionNode_1.isFunctionNode)(a) && a.id === functionNode_1.FunctionsIds.log;
10
16
  }
@@ -15,6 +21,7 @@ class LogNode {
15
21
  this.child = child;
16
22
  this.type = node_1.NodeType.function;
17
23
  this.opts = opts;
24
+ this.isNumeric = child.isNumeric;
18
25
  }
19
26
  toMathString() {
20
27
  return `log(${this.child.toMathString()})`;
@@ -45,10 +52,35 @@ class LogNode {
45
52
  return this.toEquivalentNodes().map((node) => node.toTex());
46
53
  }
47
54
  simplify() {
55
+ const simplifiedChild = this.child.simplify();
56
+ if ((0, numberNode_1.isNumberNode)(simplifiedChild)) {
57
+ const value = simplifiedChild.value;
58
+ const log = Math.log(value);
59
+ if ((0, isInt_1.isInt)(log))
60
+ return new numberNode_1.NumberNode(log);
61
+ if ((0, isInt_1.isInt)(value)) {
62
+ const factors = (0, primeFactors_1.primeFactors)(value);
63
+ if (factors.length === 1)
64
+ return this; //isPrime
65
+ if (factors.every((nb) => nb === factors[0])) {
66
+ return new multiplyNode_1.MultiplyNode(new numberNode_1.NumberNode(factors.length), new LogNode(new numberNode_1.NumberNode(factors[0]))).simplify();
67
+ }
68
+ }
69
+ }
70
+ if ((0, expNode_1.isExpNode)(simplifiedChild)) {
71
+ return simplifiedChild.child;
72
+ }
73
+ //si int il faut voir si on peut écrire a^b
74
+ if ((0, powerNode_1.isPowerNode)(simplifiedChild)) {
75
+ return new multiplyNode_1.MultiplyNode(simplifiedChild.rightChild, new LogNode(simplifiedChild.leftChild)).simplify();
76
+ }
48
77
  return this;
49
78
  }
50
79
  evaluate(vars) {
51
80
  return Math.log(this.child.evaluate(vars));
52
81
  }
82
+ equals(node) {
83
+ return isLogNode(node) && node.child.equals(this.child);
84
+ }
53
85
  }
54
86
  exports.LogNode = LogNode;
@@ -7,6 +7,7 @@ export declare class OppositeNode implements FunctionNode {
7
7
  child: AlgebraicNode;
8
8
  type: NodeType;
9
9
  opts?: NodeOptions;
10
+ isNumeric: boolean;
10
11
  constructor(child: AlgebraicNode, opts?: NodeOptions);
11
12
  toMathString(): string;
12
13
  toTex(): string;
@@ -18,5 +19,7 @@ export declare class OppositeNode implements FunctionNode {
18
19
  */
19
20
  toAllValidTexs(opts?: NodeOptions): string[];
20
21
  evaluate(vars: Record<string, number>): number;
22
+ simplify(): this;
23
+ equals(node: AlgebraicNode): boolean;
21
24
  }
22
25
  //# sourceMappingURL=oppositeNode.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"oppositeNode.d.ts","sourceRoot":"","sources":["../../../../src/tree/nodes/functions/oppositeNode.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAMtD,OAAO,EAAE,YAAY,EAAE,YAAY,EAAkB,MAAM,gBAAgB,CAAC;AAE5E,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAMjD,wBAAgB,cAAc,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,IAAI,YAAY,CAEzD;AAGD,qBAAa,YAAa,YAAW,YAAY;IAC/C,EAAE,EAAE,YAAY,CAAC;IACjB,KAAK,EAAE,aAAa,CAAC;IACrB,IAAI,EAAE,QAAQ,CAAC;IACf,IAAI,CAAC,EAAE,WAAW,CAAC;gBACP,KAAK,EAAE,aAAa,EAAE,IAAI,CAAC,EAAE,WAAW;IAMpD,YAAY,IAAI,MAAM;IAGtB,KAAK,IAAI,MAAM;IAef,iBAAiB,CAAC,IAAI,CAAC,EAAE,WAAW,GAAG,aAAa,EAAE;IAgCtD;;;;OAIG;IACH,cAAc,CAAC,IAAI,CAAC,EAAE,WAAW,GAAG,MAAM,EAAE;IAQ5C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;CAGtC"}
1
+ {"version":3,"file":"oppositeNode.d.ts","sourceRoot":"","sources":["../../../../src/tree/nodes/functions/oppositeNode.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAMtD,OAAO,EAAE,YAAY,EAAE,YAAY,EAAkB,MAAM,gBAAgB,CAAC;AAE5E,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAMjD,wBAAgB,cAAc,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,IAAI,YAAY,CAEzD;AAGD,qBAAa,YAAa,YAAW,YAAY;IAC/C,EAAE,EAAE,YAAY,CAAC;IACjB,KAAK,EAAE,aAAa,CAAC;IACrB,IAAI,EAAE,QAAQ,CAAC;IACf,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;gBACP,KAAK,EAAE,aAAa,EAAE,IAAI,CAAC,EAAE,WAAW;IAOpD,YAAY,IAAI,MAAM;IAGtB,KAAK,IAAI,MAAM;IAef,iBAAiB,CAAC,IAAI,CAAC,EAAE,WAAW,GAAG,aAAa,EAAE;IAgCtD;;;;OAIG;IACH,cAAc,CAAC,IAAI,CAAC,EAAE,WAAW,GAAG,MAAM,EAAE;IAQ5C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAGrC,QAAQ;IAGR,MAAM,CAAC,IAAI,EAAE,aAAa;CAG3B"}
@@ -18,6 +18,7 @@ class OppositeNode {
18
18
  this.child = child;
19
19
  this.type = node_1.NodeType.function;
20
20
  this.opts = opts;
21
+ this.isNumeric = child.isNumeric;
21
22
  }
22
23
  toMathString() {
23
24
  return `-(${this.child.toMathString()})`;
@@ -68,5 +69,11 @@ class OppositeNode {
68
69
  evaluate(vars) {
69
70
  return -this.child.evaluate(vars);
70
71
  }
72
+ simplify() {
73
+ return this;
74
+ }
75
+ equals(node) {
76
+ return isOppositeNode(node) && node.child.equals(this.child);
77
+ }
71
78
  }
72
79
  exports.OppositeNode = OppositeNode;
@@ -6,12 +6,14 @@ export declare class SinNode implements FunctionNode {
6
6
  id: FunctionsIds;
7
7
  child: AlgebraicNode;
8
8
  type: NodeType;
9
+ isNumeric: boolean;
9
10
  constructor(child: AlgebraicNode);
10
11
  toMathString(): string;
11
12
  toTex(): string;
12
13
  toEquivalentNodes(): AlgebraicNode[];
13
14
  toAllValidTexs(): string[];
14
- simplify(): Node;
15
+ simplify(): AlgebraicNode;
15
16
  evaluate(vars: Record<string, number>): number;
17
+ equals(node: AlgebraicNode): boolean;
16
18
  }
17
19
  //# sourceMappingURL=sinNode.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"sinNode.d.ts","sourceRoot":"","sources":["../../../../src/tree/nodes/functions/sinNode.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,YAAY,EAAkB,MAAM,gBAAgB,CAAC;AAC5E,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,wBAAgB,SAAS,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,IAAI,OAAO,CAE/C;AACD,qBAAa,OAAQ,YAAW,YAAY;IAC1C,EAAE,EAAE,YAAY,CAAC;IACjB,KAAK,EAAE,aAAa,CAAC;IACrB,IAAI,EAAE,QAAQ,CAAC;gBAEH,KAAK,EAAE,aAAa;IAMhC,YAAY,IAAI,MAAM;IAItB,KAAK,IAAI,MAAM;IAMf,iBAAiB,IAAI,aAAa,EAAE;IASpC,cAAc,IAAI,MAAM,EAAE;IAI1B,QAAQ,IAAI,IAAI;IAGhB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;CAGtC"}
1
+ {"version":3,"file":"sinNode.d.ts","sourceRoot":"","sources":["../../../../src/tree/nodes/functions/sinNode.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAmB,MAAM,SAAS,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,YAAY,EAAkB,MAAM,gBAAgB,CAAC;AAC5E,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjD,wBAAgB,SAAS,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,IAAI,OAAO,CAE/C;AACD,qBAAa,OAAQ,YAAW,YAAY;IAC1C,EAAE,EAAE,YAAY,CAAC;IACjB,KAAK,EAAE,aAAa,CAAC;IACrB,IAAI,EAAE,QAAQ,CAAC;IACf,SAAS,EAAE,OAAO,CAAC;gBACP,KAAK,EAAE,aAAa;IAOhC,YAAY,IAAI,MAAM;IAItB,KAAK,IAAI,MAAM;IAMf,iBAAiB,IAAI,aAAa,EAAE;IASpC,cAAc,IAAI,MAAM,EAAE;IAI1B,QAAQ,IAAI,aAAa;IAkBzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAGrC,MAAM,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO;CAGrC"}