math-exercises 2.2.70 → 2.2.71

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 (55) hide show
  1. package/lib/exercises/math/calcul/fractions/fractionsOperations.d.ts.map +1 -1
  2. package/lib/exercises/math/calcul/fractions/fractionsOperations.js +6 -2
  3. package/lib/exercises/math/calculLitteral/distributivity/doubleDistributivitySubstract.d.ts +12 -0
  4. package/lib/exercises/math/calculLitteral/distributivity/doubleDistributivitySubstract.d.ts.map +1 -0
  5. package/lib/exercises/math/calculLitteral/distributivity/doubleDistributivitySubstract.js +128 -0
  6. package/lib/exercises/math/calculLitteral/distributivity/index.d.ts +1 -0
  7. package/lib/exercises/math/calculLitteral/distributivity/index.d.ts.map +1 -1
  8. package/lib/exercises/math/calculLitteral/distributivity/index.js +1 -0
  9. package/lib/exercises/math/geometry/angles/index.d.ts +2 -0
  10. package/lib/exercises/math/geometry/angles/index.d.ts.map +1 -0
  11. package/lib/exercises/math/geometry/angles/index.js +17 -0
  12. package/lib/exercises/math/geometry/angles/recognizeAngleType.d.ts +11 -0
  13. package/lib/exercises/math/geometry/angles/recognizeAngleType.d.ts.map +1 -0
  14. package/lib/exercises/math/geometry/angles/recognizeAngleType.js +272 -0
  15. package/lib/exercises/math/geometry/euclidianConstructions/pointImageFromTranslation.js +1 -1
  16. package/lib/exercises/math/geometry/index.d.ts +1 -0
  17. package/lib/exercises/math/geometry/index.d.ts.map +1 -1
  18. package/lib/exercises/math/geometry/index.js +1 -0
  19. package/lib/exercises/math/geometry/volumes/parallelepipedVolume.d.ts.map +1 -1
  20. package/lib/exercises/math/geometry/volumes/parallelepipedVolume.js +0 -1
  21. package/lib/index.d.ts +11 -0
  22. package/lib/index.d.ts.map +1 -1
  23. package/lib/math/geometry/angle.d.ts +22 -1
  24. package/lib/math/geometry/angle.d.ts.map +1 -1
  25. package/lib/math/geometry/angle.js +138 -1
  26. package/lib/math/geometry/line.d.ts +2 -0
  27. package/lib/math/geometry/line.d.ts.map +1 -1
  28. package/lib/math/geometry/line.js +16 -0
  29. package/lib/math/geometry/point.d.ts +1 -0
  30. package/lib/math/geometry/point.d.ts.map +1 -1
  31. package/lib/math/geometry/point.js +4 -0
  32. package/lib/math/geometry/vector.d.ts +3 -0
  33. package/lib/math/geometry/vector.d.ts.map +1 -1
  34. package/lib/math/geometry/vector.js +9 -0
  35. package/lib/math/polynomials/generalAffine.d.ts +3 -0
  36. package/lib/math/polynomials/generalAffine.d.ts.map +1 -1
  37. package/lib/math/polynomials/generalAffine.js +4 -0
  38. package/lib/playground.d.ts.map +1 -1
  39. package/lib/tree/nodes/node.d.ts +4 -2
  40. package/lib/tree/nodes/node.d.ts.map +1 -1
  41. package/lib/tree/nodes/node.js +2 -0
  42. package/lib/tree/nodes/nodeConstructor.d.ts.map +1 -1
  43. package/lib/tree/nodes/nodeConstructor.js +4 -0
  44. package/lib/tree/nodes/operators/addNode.d.ts.map +1 -1
  45. package/lib/tree/nodes/operators/addNode.js +123 -90
  46. package/lib/tree/nodes/polynomials/monomNode.d.ts +47 -0
  47. package/lib/tree/nodes/polynomials/monomNode.d.ts.map +1 -0
  48. package/lib/tree/nodes/polynomials/monomNode.js +214 -0
  49. package/lib/tree/parsers/affineParser.js +1 -1
  50. package/lib/tree/parsers/monomParser.d.ts +2 -2
  51. package/lib/tree/parsers/monomParser.d.ts.map +1 -1
  52. package/lib/tree/parsers/monomParser.js +59 -6
  53. package/lib/tree/parsers/powerParser.d.ts +1 -1
  54. package/lib/tree/parsers/trinomParser.js +1 -1
  55. package/package.json +1 -1
@@ -1,10 +1,27 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.Angle = void 0;
3
+ exports.Angle = exports.AngleConstructor = void 0;
4
4
  const piNode_1 = require("../../tree/nodes/numbers/piNode");
5
5
  const fractionNode_1 = require("../../tree/nodes/operators/fractionNode");
6
6
  const multiplyNode_1 = require("../../tree/nodes/operators/multiplyNode");
7
7
  const round_1 = require("../utils/round");
8
+ const point_1 = require("./point");
9
+ const nodeConstructor_1 = require("../../tree/nodes/nodeConstructor");
10
+ const vector_1 = require("./vector");
11
+ const line_1 = require("./line");
12
+ class AngleConstructor {
13
+ static fromIdentifiers(identifiers) {
14
+ return new Angle(identifiers.points.map(point_1.PointConstructor.fromIdentifiers), {
15
+ degreeValueNode: identifiers.props?.degreeValueNode
16
+ ? (0, nodeConstructor_1.reifyAlgebraic)(identifiers.props.degreeValueNode)
17
+ : undefined,
18
+ radianValueNode: identifiers.props?.radianValueNode
19
+ ? (0, nodeConstructor_1.reifyAlgebraic)(identifiers.props.radianValueNode)
20
+ : undefined,
21
+ });
22
+ }
23
+ }
24
+ exports.AngleConstructor = AngleConstructor;
8
25
  class Angle {
9
26
  /**
10
27
  *
@@ -12,6 +29,7 @@ class Angle {
12
29
  */
13
30
  constructor(points, props) {
14
31
  this.points = points;
32
+ this.props = props;
15
33
  this.radianValueNode = props?.radianValueNode;
16
34
  this.degreeValueNode = props?.degreeValueNode;
17
35
  if (props?.radianValueNode && !props.degreeValueNode) {
@@ -21,6 +39,125 @@ class Angle {
21
39
  this.radianValueNode = (0, fractionNode_1.frac)((0, multiplyNode_1.multiply)(props.degreeValueNode, piNode_1.PiNode), (180).toTree());
22
40
  }
23
41
  }
42
+ toIdentifiers() {
43
+ return {
44
+ points: this.points.map((p) => p.toIdentifiers()),
45
+ props: {
46
+ degreeValueNode: this.degreeValueNode?.toIdentifiers(),
47
+ radianValueNode: this.radianValueNode?.toIdentifiers(),
48
+ },
49
+ };
50
+ }
51
+ hasSameApex(a) {
52
+ return this.points[1].equals(a.points[1]);
53
+ }
54
+ equals(a) {
55
+ if (!this.hasSameApex(a))
56
+ return false;
57
+ const vecs = [
58
+ [
59
+ vector_1.VectorConstructor.fromPoints(this.points[1], this.points[0]),
60
+ vector_1.VectorConstructor.fromPoints(this.points[1], this.points[2]),
61
+ ],
62
+ [
63
+ vector_1.VectorConstructor.fromPoints(a.points[1], a.points[0]),
64
+ vector_1.VectorConstructor.fromPoints(a.points[1], a.points[2]),
65
+ ],
66
+ ];
67
+ if (vecs[0][0].hasSameOrientation(vecs[1][0])) {
68
+ return vecs[0][1].hasSameOrientation(vecs[1][1]);
69
+ }
70
+ if (vecs[0][0].hasSameOrientation(vecs[1][1])) {
71
+ return vecs[0][1].hasSameOrientation(vecs[1][0]);
72
+ }
73
+ return false;
74
+ }
75
+ isAlterne(a) {
76
+ if (this.hasSameApex(a))
77
+ return false;
78
+ const symetric = new Angle([
79
+ a.points[0].centralSymetric(a.points[1]),
80
+ a.points[1],
81
+ a.points[2].centralSymetric(a.points[1]),
82
+ ]);
83
+ return symetric.isCorrespondant(this);
84
+ }
85
+ isAlterneInterne(a) {
86
+ if (this.hasSameApex(a))
87
+ return false;
88
+ if (this.isFlat() || a.isFlat())
89
+ return false;
90
+ const apexesVec = vector_1.VectorConstructor.fromPoints(this.points[1], a.points[1]);
91
+ const line = new line_1.Line(this.points[1], a.points[1]);
92
+ const aPointIndexOnLine = a.points.findIndex((p, i) => i !== 1 && line.includes(p, true));
93
+ const thisPointIndexOnLine = this.points.findIndex((p, i) => i !== 1 && line.includes(p, true));
94
+ if (aPointIndexOnLine < 0 || thisPointIndexOnLine < 0)
95
+ return false;
96
+ const vecs = [
97
+ [
98
+ vector_1.VectorConstructor.fromPoints(this.points[1], this.points[thisPointIndexOnLine]),
99
+ vector_1.VectorConstructor.fromPoints(this.points[1], this.points[2 - thisPointIndexOnLine]),
100
+ ],
101
+ [
102
+ vector_1.VectorConstructor.fromPoints(a.points[1], a.points[aPointIndexOnLine]),
103
+ vector_1.VectorConstructor.fromPoints(a.points[1], a.points[2 - aPointIndexOnLine]),
104
+ ],
105
+ ];
106
+ return (vecs[0][0].hasSameOrientation(apexesVec) &&
107
+ vecs[1][0].hasOppositeOrientation(apexesVec) &&
108
+ vecs[0][1].scalarProduct(vecs[1][1]).evaluate() < 0);
109
+ }
110
+ isFlat() {
111
+ return vector_1.VectorConstructor.fromPoints(this.points[1], this.points[2]).isColinear(vector_1.VectorConstructor.fromPoints(this.points[1], this.points[0]));
112
+ }
113
+ isCorrespondant(a) {
114
+ if (this.hasSameApex(a))
115
+ return false;
116
+ //angles plats ne sont pas créés par intersections de droites donc ne peuvent pas etre correspondants
117
+ if (this.isFlat() || a.isFlat())
118
+ return false;
119
+ const line = new line_1.Line(this.points[1], a.points[1]);
120
+ const aPointIndexOnLine = a.points.findIndex((p, i) => i !== 1 && line.includes(p, true));
121
+ const thisPointIndexOnLine = this.points.findIndex((p, i) => i !== 1 && line.includes(p, true));
122
+ if (aPointIndexOnLine < 0 || thisPointIndexOnLine < 0)
123
+ return false;
124
+ //angle non plat
125
+ if (line.includes(a.points[2 - aPointIndexOnLine], true))
126
+ return false;
127
+ const vecs = [
128
+ [
129
+ vector_1.VectorConstructor.fromPoints(this.points[1], this.points[thisPointIndexOnLine]),
130
+ vector_1.VectorConstructor.fromPoints(this.points[1], this.points[2 - thisPointIndexOnLine]),
131
+ ],
132
+ [
133
+ vector_1.VectorConstructor.fromPoints(a.points[1], a.points[aPointIndexOnLine]),
134
+ vector_1.VectorConstructor.fromPoints(a.points[1], a.points[2 - aPointIndexOnLine]),
135
+ ],
136
+ ];
137
+ return (vecs[0][0].hasSameOrientation(vecs[1][0]) &&
138
+ vecs[0][1].scalarProduct(vecs[1][1]).evaluate() > 0);
139
+ }
140
+ isSummitOpposite(a) {
141
+ if (!this.hasSameApex(a))
142
+ return false;
143
+ const vecs = [
144
+ [
145
+ vector_1.VectorConstructor.fromPoints(this.points[1], this.points[0]),
146
+ vector_1.VectorConstructor.fromPoints(this.points[1], this.points[2]),
147
+ ],
148
+ [
149
+ vector_1.VectorConstructor.fromPoints(a.points[1], a.points[0]),
150
+ vector_1.VectorConstructor.fromPoints(a.points[1], a.points[2]),
151
+ ],
152
+ ];
153
+ if (vecs[0][0].hasOppositeOrientation(vecs[1][0])) {
154
+ return vecs[0][1].hasOppositeOrientation(vecs[1][1]);
155
+ }
156
+ if (vecs[0][0].hasOppositeOrientation(vecs[1][1])) {
157
+ return vecs[0][1].hasOppositeOrientation(vecs[1][0]);
158
+ }
159
+ return false;
160
+ }
24
161
  evaluate(inRadian = false) {
25
162
  if (this.degreeValueNode || this.radianValueNode) {
26
163
  if (inRadian)
@@ -36,6 +36,8 @@ export declare class Line {
36
36
  getParallele(point: Point): Line;
37
37
  getPerpendicular(point: Point): Line;
38
38
  includes(point: Point, allowApprox?: boolean): boolean;
39
+ getPointWithX(x: AlgebraicNode, name?: string): Point;
40
+ getPointWithY(y: AlgebraicNode, name?: string): Point;
39
41
  getRandomPoint(name?: string): Point;
40
42
  getEquation: (u: Vector, a: Point) => EqualNode;
41
43
  getCartesianEquation(): EqualNode;
@@ -1 +1 @@
1
- {"version":3,"file":"line.d.ts","sourceRoot":"","sources":["../../../src/math/geometry/line.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,mDAAmD,CAAC;AAEvF,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAC/D,OAAO,EAAE,SAAS,EAAE,MAAM,sCAAsC,CAAC;AAGjE,OAAO,EAAE,OAAO,EAAO,MAAM,oCAAoC,CAAC;AAMlE,OAAO,EACL,aAAa,EAEd,MAAM,0CAA0C,CAAC;AAKlD,OAAO,EAAE,KAAK,EAAoB,gBAAgB,EAAE,MAAM,SAAS,CAAC;AACpE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,MAAM,EAAqB,MAAM,UAAU,CAAC;AAErD,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,gBAAgB,CAAC;IACzB,MAAM,EAAE,gBAAgB,CAAC;CAC1B,CAAC;AACF,8BAAsB,eAAe;IACnC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM;IAK3B,MAAM,CAAC,eAAe,CAAC,WAAW,EAAE,eAAe;IAOnD,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,OAAO;CAGpC;AACD,qBAAa,IAAI;IACf,MAAM,EAAE,KAAK,CAAC;IACd,MAAM,EAAE,KAAK,CAAC;IACd,UAAU,EAAE,OAAO,CAAC;IACpB,CAAC,EAAE,aAAa,GAAG,SAAS,CAAC;IAC7B,CAAC,EAAE,aAAa,GAAG,SAAS,CAAC;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;gBACJ,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,MAAM;IAsBvD,aAAa;;;;;IAOb,WAAW,CAAC,IAAI,EAAE,IAAI;IAYtB,iBAAiB;IAIjB,YAAY,CAAC,KAAK,EAAE,KAAK;IAYzB,gBAAgB,CAAC,KAAK,EAAE,KAAK;IAW7B,QAAQ,CAAC,KAAK,EAAE,KAAK,EAAE,WAAW,GAAE,OAAe;IAenD,cAAc,CAAC,IAAI,CAAC,EAAE,MAAM;IAa5B,WAAW,MAAO,MAAM,KAAK,KAAK,KAAG,SAAS,CAmB5C;IAEF,oBAAoB,IAAI,SAAS;IAuBjC,WAAW;IAMX,iBAAiB;;;;;IAcjB,KAAK;IAGL,gBAAgB;IAIhB,aAAa,CACX,iBAAiB,EAAE,OAAO,EAC1B,EACE,OAAc,EACd,SAAiB,EACjB,yBAAgC,GACjC,GAAE,kBAAuB;IAqB5B,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,aAAa,CAAC,EAAE,MAAM;CAW7C"}
1
+ {"version":3,"file":"line.d.ts","sourceRoot":"","sources":["../../../src/math/geometry/line.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,mDAAmD,CAAC;AAEvF,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAC/D,OAAO,EAAE,SAAS,EAAE,MAAM,sCAAsC,CAAC;AAGjE,OAAO,EAAE,OAAO,EAAO,MAAM,oCAAoC,CAAC;AAMlE,OAAO,EACL,aAAa,EAEd,MAAM,0CAA0C,CAAC;AAKlD,OAAO,EAAE,KAAK,EAAoB,gBAAgB,EAAE,MAAM,SAAS,CAAC;AACpE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,MAAM,EAAqB,MAAM,UAAU,CAAC;AAErD,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,gBAAgB,CAAC;IACzB,MAAM,EAAE,gBAAgB,CAAC;CAC1B,CAAC;AACF,8BAAsB,eAAe;IACnC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM;IAK3B,MAAM,CAAC,eAAe,CAAC,WAAW,EAAE,eAAe;IAOnD,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,OAAO;CAGpC;AACD,qBAAa,IAAI;IACf,MAAM,EAAE,KAAK,CAAC;IACd,MAAM,EAAE,KAAK,CAAC;IACd,UAAU,EAAE,OAAO,CAAC;IACpB,CAAC,EAAE,aAAa,GAAG,SAAS,CAAC;IAC7B,CAAC,EAAE,aAAa,GAAG,SAAS,CAAC;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;gBACJ,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,MAAM;IAsBvD,aAAa;;;;;IAOb,WAAW,CAAC,IAAI,EAAE,IAAI;IAYtB,iBAAiB;IAIjB,YAAY,CAAC,KAAK,EAAE,KAAK;IAYzB,gBAAgB,CAAC,KAAK,EAAE,KAAK;IAW7B,QAAQ,CAAC,KAAK,EAAE,KAAK,EAAE,WAAW,GAAE,OAAe;IAgBnD,aAAa,CAAC,CAAC,EAAE,aAAa,EAAE,IAAI,CAAC,EAAE,MAAM;IAK7C,aAAa,CAAC,CAAC,EAAE,aAAa,EAAE,IAAI,CAAC,EAAE,MAAM;IAW7C,cAAc,CAAC,IAAI,CAAC,EAAE,MAAM;IAa5B,WAAW,MAAO,MAAM,KAAK,KAAK,KAAG,SAAS,CAmB5C;IAEF,oBAAoB,IAAI,SAAS;IAuBjC,WAAW;IAMX,iBAAiB;;;;;IAcjB,KAAK;IAGL,gBAAgB;IAIhB,aAAa,CACX,iBAAiB,EAAE,OAAO,EAC1B,EACE,OAAc,EACd,SAAiB,EACjB,yBAAgC,GACjC,GAAE,kBAAuB;IAqB5B,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,aAAa,CAAC,EAAE,MAAM;CAW7C"}
@@ -104,6 +104,7 @@ class Line {
104
104
  includes(point, allowApprox = false) {
105
105
  if (this.isVertical) {
106
106
  if (allowApprox) {
107
+ return (Math.abs(point.x.evaluate() - this.pointA.x.evaluate()) < 0.0000001);
107
108
  }
108
109
  else
109
110
  return point.x.equals(this.pointA.x);
@@ -115,6 +116,21 @@ class Line {
115
116
  else
116
117
  return evaluation === 0;
117
118
  }
119
+ getPointWithX(x, name) {
120
+ if (this.isVertical)
121
+ return this.pointA.midpoint(this.pointB, name);
122
+ const y = (0, addNode_1.add)((0, multiplyNode_1.multiply)(this.a, x), this.b).simplify();
123
+ return new point_1.Point(name ?? "P", x, y);
124
+ }
125
+ getPointWithY(y, name) {
126
+ if (this.a?.evaluate() === 0)
127
+ return this.pointA.midpoint(this.pointB, name);
128
+ if (this.isVertical) {
129
+ return new point_1.Point(name ?? "P", this.pointA.x, y);
130
+ }
131
+ const x = (0, fractionNode_1.frac)((0, substractNode_1.substract)(y, this.b), this.a).simplify();
132
+ return new point_1.Point(name ?? "P", x, y);
133
+ }
118
134
  //! caution: simplify ne gère pas bien ici
119
135
  getRandomPoint(name) {
120
136
  if (this.isVertical) {
@@ -36,5 +36,6 @@ export declare class Point {
36
36
  toMathString(): string;
37
37
  toGGBCommand({ isFixed, showLabel, style, size, color, }?: ToGGBCommandsProps): string[];
38
38
  rotate(angle: number, center: Point): Point;
39
+ centralSymetric(center: Point, name?: string): Point;
39
40
  }
40
41
  //# sourceMappingURL=point.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"point.d.ts","sourceRoot":"","sources":["../../../src/math/geometry/point.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAG/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,mDAAmD,CAAC;AACvF,OAAO,EAEL,eAAe,EAChB,MAAM,kCAAkC,CAAC;AAM1C,MAAM,MAAM,gBAAgB,GAAG;IAC7B,EAAE,EAAE,OAAO,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,CAAC,EAAE,eAAe,CAAC;IACnB,CAAC,EAAE,eAAe,CAAC;CACpB,CAAC;AACF,8BAAsB,gBAAgB;IACpC,MAAM,CAAC,MAAM,CAAC,IAAI,SAAM;IAGxB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,SAAM,EAAE,GAAG,SAAK,GAAG,KAAK;IAMvD,MAAM,CAAC,eAAe,CAAC,WAAW,EAAE,gBAAgB;IAQpD,MAAM,CAAC,SAAS,CACd,CAAC,EAAE,KAAK,EACR,CAAC,EAAE,KAAK,EACR,IAAI,EAAE,MAAM,EACZ,EACE,OAAa,EACb,WAAW,GACZ,GAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAO;IAQpD,MAAM,CAAC,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE;IAetC,MAAM,CAAC,cAAc,CAAC,GAAG,EAAE,MAAM;CAclC;AAED,qBAAa,KAAK;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,CAAC,EAAE,aAAa,CAAC;IACjB,CAAC,EAAE,aAAa,CAAC;gBACL,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,aAAa;IAM5D,KAAK,IAAI,MAAM;IAGf,aAAa,IAAI,gBAAgB;IAQjC,eAAe,IAAI,MAAM;IAGzB,QAAQ,IAAI,MAAM;IAIlB,UAAU,IAAI,MAAM;IAIpB,UAAU,IAAI,MAAM;IAIpB,QAAQ,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,SAAM,GAAG,KAAK;IAiBrC,UAAU,CAAC,CAAC,EAAE,KAAK,GAAG,MAAM;IAM5B,MAAM,CAAC,CAAC,EAAE,KAAK,GAAG,OAAO;IAGzB,SAAS,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK;IAK5B,YAAY;IAGZ,YAAY,CAAC,EACX,OAAc,EACd,SAAgB,EAChB,KAAK,EACL,IAAI,EACJ,KAAK,GACN,GAAE,kBAAuB;IAiB1B,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK;CAiBpC"}
1
+ {"version":3,"file":"point.d.ts","sourceRoot":"","sources":["../../../src/math/geometry/point.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAG/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,mDAAmD,CAAC;AACvF,OAAO,EAEL,eAAe,EAChB,MAAM,kCAAkC,CAAC;AAM1C,MAAM,MAAM,gBAAgB,GAAG;IAC7B,EAAE,EAAE,OAAO,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,CAAC,EAAE,eAAe,CAAC;IACnB,CAAC,EAAE,eAAe,CAAC;CACpB,CAAC;AACF,8BAAsB,gBAAgB;IACpC,MAAM,CAAC,MAAM,CAAC,IAAI,SAAM;IAGxB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,SAAM,EAAE,GAAG,SAAK,GAAG,KAAK;IAMvD,MAAM,CAAC,eAAe,CAAC,WAAW,EAAE,gBAAgB;IAQpD,MAAM,CAAC,SAAS,CACd,CAAC,EAAE,KAAK,EACR,CAAC,EAAE,KAAK,EACR,IAAI,EAAE,MAAM,EACZ,EACE,OAAa,EACb,WAAW,GACZ,GAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAO;IAQpD,MAAM,CAAC,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE;IAetC,MAAM,CAAC,cAAc,CAAC,GAAG,EAAE,MAAM;CAclC;AAED,qBAAa,KAAK;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,CAAC,EAAE,aAAa,CAAC;IACjB,CAAC,EAAE,aAAa,CAAC;gBACL,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,aAAa;IAM5D,KAAK,IAAI,MAAM;IAGf,aAAa,IAAI,gBAAgB;IAQjC,eAAe,IAAI,MAAM;IAGzB,QAAQ,IAAI,MAAM;IAIlB,UAAU,IAAI,MAAM;IAIpB,UAAU,IAAI,MAAM;IAIpB,QAAQ,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,SAAM,GAAG,KAAK;IAiBrC,UAAU,CAAC,CAAC,EAAE,KAAK,GAAG,MAAM;IAM5B,MAAM,CAAC,CAAC,EAAE,KAAK,GAAG,OAAO;IAGzB,SAAS,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK;IAK5B,YAAY;IAGZ,YAAY,CAAC,EACX,OAAc,EACd,SAAgB,EAChB,KAAK,EACL,IAAI,EACJ,KAAK,GACN,GAAE,kBAAuB;IAiB1B,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK;IAiBnC,eAAe,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,SAAkB;CAItD"}
@@ -136,5 +136,9 @@ class Point {
136
136
  const sin = Math.sin(angle);
137
137
  return new Point(this.name, (0, substractNode_1.substract)((0, multiplyNode_1.multiply)(cos, this.x).simplify(), (0, multiplyNode_1.multiply)(sin, this.y).simplify()).simplify(), (0, addNode_1.add)((0, multiplyNode_1.multiply)(sin, this.x).simplify(), (0, multiplyNode_1.multiply)(cos, this.y).simplify()).simplify());
138
138
  }
139
+ centralSymetric(center, name = this.name + "'") {
140
+ const vec = vector_1.VectorConstructor.fromPoints(this, center).opposite();
141
+ return vec.getEndPoint(center, name);
142
+ }
139
143
  }
140
144
  exports.Point = Point;
@@ -14,8 +14,11 @@ export declare class Vector {
14
14
  toTexWithCoords(): string;
15
15
  toInlineCoordsTex(): string;
16
16
  isColinear(v: Vector): boolean;
17
+ hasOppositeOrientation(v: Vector): boolean;
18
+ hasSameOrientation(v: Vector): boolean;
17
19
  determinant(v: Vector): AlgebraicNode;
18
20
  times(k: AlgebraicNode, name?: string): Vector;
21
+ opposite(): Vector;
19
22
  scalarProduct(v: Vector): AlgebraicNode;
20
23
  add(v: Vector): Vector;
21
24
  getNorm(): AlgebraicNode;
@@ -1 +1 @@
1
- {"version":3,"file":"vector.d.ts","sourceRoot":"","sources":["../../../src/math/geometry/vector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAgB/D,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAEhC,8BAAsB,iBAAiB;IACrC,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,GAAG,MAAM;IAOpD,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,UAAO,GAAG,MAAM;CAOtD;AAED,qBAAa,MAAM;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,CAAC,EAAE,aAAa,CAAC;IACjB,CAAC,EAAE,aAAa,CAAC;gBACL,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,aAAa;IAO5D,KAAK,IAAI,MAAM;IAIf,eAAe,IAAI,MAAM;IAMzB,iBAAiB,IAAI,MAAM;IAM3B,UAAU,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO;IAK9B,WAAW,CAAC,CAAC,EAAE,MAAM,GAAG,aAAa;IAIrC,KAAK,CAAC,CAAC,EAAE,aAAa,EAAE,IAAI,CAAC,EAAE,MAAM;IAOrC,aAAa,CAAC,CAAC,EAAE,MAAM;IAgBvB,GAAG,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM;IAYtB,OAAO,IAAI,aAAa;IAUxB,WAAW,CAAC,UAAU,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,MAAM;IAO5C,MAAM,CAAC,CAAC,EAAE,MAAM;IAIhB,YAAY;IAMZ,YAAY;IAOZ,aAAa;CAGd"}
1
+ {"version":3,"file":"vector.d.ts","sourceRoot":"","sources":["../../../src/math/geometry/vector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAgB/D,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAEhC,8BAAsB,iBAAiB;IACrC,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,GAAG,MAAM;IAOpD,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,UAAO,GAAG,MAAM;CAOtD;AAED,qBAAa,MAAM;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,CAAC,EAAE,aAAa,CAAC;IACjB,CAAC,EAAE,aAAa,CAAC;gBACL,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,aAAa;IAO5D,KAAK,IAAI,MAAM;IAIf,eAAe,IAAI,MAAM;IAMzB,iBAAiB,IAAI,MAAM;IAM3B,UAAU,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO;IAK9B,sBAAsB,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO;IAI1C,kBAAkB,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO;IAItC,WAAW,CAAC,CAAC,EAAE,MAAM,GAAG,aAAa;IAIrC,KAAK,CAAC,CAAC,EAAE,aAAa,EAAE,IAAI,CAAC,EAAE,MAAM;IAOrC,QAAQ;IAGR,aAAa,CAAC,CAAC,EAAE,MAAM;IAgBvB,GAAG,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM;IAYtB,OAAO,IAAI,aAAa;IAUxB,WAAW,CAAC,UAAU,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,MAAM;IAO5C,MAAM,CAAC,CAAC,EAAE,MAAM;IAIhB,YAAY;IAMZ,YAAY;IAOZ,aAAa;CAGd"}
@@ -44,12 +44,21 @@ class Vector {
44
44
  const ev = det.evaluate();
45
45
  return Math.abs(ev) < 0.000001;
46
46
  }
47
+ hasOppositeOrientation(v) {
48
+ return this.isColinear(v) && this.scalarProduct(v).evaluate() < 0;
49
+ }
50
+ hasSameOrientation(v) {
51
+ return this.isColinear(v) && this.scalarProduct(v).evaluate() > 0;
52
+ }
47
53
  determinant(v) {
48
54
  return (0, substractNode_1.substract)((0, multiplyNode_1.multiply)(this.x, v.y), (0, multiplyNode_1.multiply)(this.y, v.x)).simplify();
49
55
  }
50
56
  times(k, name) {
51
57
  return new Vector(name ?? "v", new multiplyNode_1.MultiplyNode(this.x, k).simplify(), new multiplyNode_1.MultiplyNode(this.y, k).simplify());
52
58
  }
59
+ opposite() {
60
+ return this.times((-1).toTree());
61
+ }
53
62
  scalarProduct(v) {
54
63
  // if (
55
64
  // [this.x.type, this.y.type, v.x.type, v.y.type].some(
@@ -2,6 +2,9 @@ import { AlgebraicNode } from "../../tree/nodes/algebraicNode";
2
2
  import { NodeIdentifiers } from "../../tree/nodes/nodeConstructor";
3
3
  export declare abstract class GeneralAffineConstructor {
4
4
  static fromIdentifiers(identifiers: GeneralAffineIdentifiers): GeneralAffine;
5
+ static randomInts({ allowBNull }: {
6
+ allowBNull?: boolean | undefined;
7
+ }, variable?: string): GeneralAffine;
5
8
  }
6
9
  export type GeneralAffineIdentifiers = {
7
10
  id: "affine";
@@ -1 +1 @@
1
- {"version":3,"file":"generalAffine.d.ts","sourceRoot":"","sources":["../../../src/math/polynomials/generalAffine.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAG/D,OAAO,EAEL,eAAe,EAEhB,MAAM,kCAAkC,CAAC;AAQ1C,8BAAsB,wBAAwB;IAC5C,MAAM,CAAC,eAAe,CAAC,WAAW,EAAE,wBAAwB;CAM7D;AACD,MAAM,MAAM,wBAAwB,GAAG;IACrC,EAAE,EAAE,QAAQ,CAAC;IACb,CAAC,EAAE,eAAe,CAAC;IACnB,CAAC,EAAE,eAAe,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AACF,qBAAa,aAAa;IACxB,CAAC,EAAE,aAAa,CAAC;IACjB,CAAC,EAAE,aAAa,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;gBAGf,CAAC,EAAE,MAAM,GAAG,aAAa,EACzB,CAAC,EAAE,MAAM,GAAG,aAAa,EACzB,QAAQ,GAAE,MAAY;IAUxB,aAAa,IAAI,wBAAwB;IAQzC,OAAO,IAAI,aAAa;IAIxB,MAAM;IAMN,UAAU,CAAC,GAAG,EAAE,aAAa;IAI7B,QAAQ;CAMT"}
1
+ {"version":3,"file":"generalAffine.d.ts","sourceRoot":"","sources":["../../../src/math/polynomials/generalAffine.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAG/D,OAAO,EAEL,eAAe,EAEhB,MAAM,kCAAkC,CAAC;AAS1C,8BAAsB,wBAAwB;IAC5C,MAAM,CAAC,eAAe,CAAC,WAAW,EAAE,wBAAwB;IAM5D,MAAM,CAAC,UAAU,CAAC,EAAE,UAAiB,EAAE;;KAAA,EAAE,QAAQ,SAAM;CAOxD;AACD,MAAM,MAAM,wBAAwB,GAAG;IACrC,EAAE,EAAE,QAAQ,CAAC;IACb,CAAC,EAAE,eAAe,CAAC;IACnB,CAAC,EAAE,eAAe,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AACF,qBAAa,aAAa;IACxB,CAAC,EAAE,aAAa,CAAC;IACjB,CAAC,EAAE,aAAa,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;gBAGf,CAAC,EAAE,MAAM,GAAG,aAAa,EACzB,CAAC,EAAE,MAAM,GAAG,aAAa,EACzB,QAAQ,GAAE,MAAY;IAUxB,aAAa,IAAI,wBAAwB;IAQzC,OAAO,IAAI,aAAa;IAIxB,MAAM;IAMN,UAAU,CAAC,GAAG,EAAE,aAAa;IAI7B,QAAQ;CAMT"}
@@ -7,10 +7,14 @@ const addNode_1 = require("../../tree/nodes/operators/addNode");
7
7
  const fractionNode_1 = require("../../tree/nodes/operators/fractionNode");
8
8
  const multiplyNode_1 = require("../../tree/nodes/operators/multiplyNode");
9
9
  const substractNode_1 = require("../../tree/nodes/operators/substractNode");
10
+ const randint_1 = require("../utils/random/randint");
10
11
  class GeneralAffineConstructor {
11
12
  static fromIdentifiers(identifiers) {
12
13
  return new GeneralAffine((0, nodeConstructor_1.reifyAlgebraic)(identifiers.a), (0, nodeConstructor_1.reifyAlgebraic)(identifiers.b));
13
14
  }
15
+ static randomInts({ allowBNull = true }, variable = "x") {
16
+ return new GeneralAffine((0, randint_1.randint)(-10, 11, [0]), (0, randint_1.randint)(-10, 11, allowBNull ? [] : [0]), variable);
17
+ }
14
18
  }
15
19
  exports.GeneralAffineConstructor = GeneralAffineConstructor;
16
20
  class GeneralAffine {
@@ -1 +1 @@
1
- {"version":3,"file":"playground.d.ts","sourceRoot":"","sources":["../src/playground.ts"],"names":[],"mappings":"AAgDA,eAAO,MAAM,UAAU,YAAW,CAAC"}
1
+ {"version":3,"file":"playground.d.ts","sourceRoot":"","sources":["../src/playground.ts"],"names":[],"mappings":"AAoDA,eAAO,MAAM,UAAU,YAAW,CAAC"}
@@ -11,7 +11,8 @@ export declare enum NodeType {
11
11
  belongs = 9,
12
12
  vector = 10,
13
13
  set = 11,
14
- trinom = 12
14
+ trinom = 12,
15
+ monom = 13
15
16
  }
16
17
  export type NodeOptions = {
17
18
  forceTimesSign?: boolean;
@@ -80,7 +81,8 @@ export declare enum NodeIds {
80
81
  inequation = 36,
81
82
  inequationSolution = 37,
82
83
  binomialCoefficient = 38,
83
- trinom = 39
84
+ trinom = 39,
85
+ monom = 40
84
86
  }
85
87
  export interface Node {
86
88
  type: NodeType;
@@ -1 +1 @@
1
- {"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../../src/tree/nodes/node.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../../src/tree/nodes/node.ts"],"names":[],"mappings":"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"}
@@ -16,6 +16,7 @@ var NodeType;
16
16
  NodeType[NodeType["vector"] = 10] = "vector";
17
17
  NodeType[NodeType["set"] = 11] = "set";
18
18
  NodeType[NodeType["trinom"] = 12] = "trinom";
19
+ NodeType[NodeType["monom"] = 13] = "monom";
19
20
  })(NodeType || (exports.NodeType = NodeType = {}));
20
21
  var NodeIds;
21
22
  (function (NodeIds) {
@@ -59,4 +60,5 @@ var NodeIds;
59
60
  NodeIds[NodeIds["inequationSolution"] = 37] = "inequationSolution";
60
61
  NodeIds[NodeIds["binomialCoefficient"] = 38] = "binomialCoefficient";
61
62
  NodeIds[NodeIds["trinom"] = 39] = "trinom";
63
+ NodeIds[NodeIds["monom"] = 40] = "monom";
62
64
  })(NodeIds || (exports.NodeIds = NodeIds = {}));
@@ -1 +1 @@
1
- {"version":3,"file":"nodeConstructor.d.ts","sourceRoot":"","sources":["../../../src/tree/nodes/nodeConstructor.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAwBhD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAmBvC,eAAO,MAAM,cAAc,gBAAiB,eAAe,kBACI,CAAC;AAChE,eAAO,MAAM,SAAS,gBAAiB,eAAe,SACR,CAAC;AAC/C,MAAM,MAAM,eAAe,GAAG;IAAE,EAAE,EAAE,OAAO,CAAA;CAAE,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AACpE,8BAAsB,eAAe;IACnC,MAAM,CAAC,eAAe,CAAC,WAAW,EAAE,eAAe,GAAG,IAAI;CA6R3D"}
1
+ {"version":3,"file":"nodeConstructor.d.ts","sourceRoot":"","sources":["../../../src/tree/nodes/nodeConstructor.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAwBhD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAoBvC,eAAO,MAAM,cAAc,gBAAiB,eAAe,kBACI,CAAC;AAChE,eAAO,MAAM,SAAS,gBAAiB,eAAe,SACR,CAAC;AAE/C,MAAM,MAAM,eAAe,GAAG;IAAE,EAAE,EAAE,OAAO,CAAA;CAAE,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AACpE,8BAAsB,eAAe;IACnC,MAAM,CAAC,eAAe,CAAC,WAAW,EAAE,eAAe,GAAG,IAAI;CAoS3D"}
@@ -38,6 +38,7 @@ const limitNode_1 = require("./operators/limitNode");
38
38
  const multiplyNode_1 = require("./operators/multiplyNode");
39
39
  const powerNode_1 = require("./operators/powerNode");
40
40
  const substractNode_1 = require("./operators/substractNode");
41
+ const monomNode_1 = require("./polynomials/monomNode");
41
42
  const belongsNode_1 = require("./sets/belongsNode");
42
43
  const discreteSetNode_1 = require("./sets/discreteSetNode");
43
44
  const intervalNode_1 = require("./sets/intervalNode");
@@ -173,6 +174,9 @@ class NodeConstructor {
173
174
  case node_1.NodeIds.trinom: {
174
175
  return new trinomNode_1.TrinomNode(NodeConstructor.fromIdentifiers(identifiers.a), NodeConstructor.fromIdentifiers(identifiers.b), NodeConstructor.fromIdentifiers(identifiers.c));
175
176
  }
177
+ case node_1.NodeIds.monom: {
178
+ return new monomNode_1.MonomNode(NodeConstructor.fromIdentifiers(identifiers.a), identifiers.degree, identifiers.opts);
179
+ }
176
180
  case node_1.NodeIds.binomialCoefficient: {
177
181
  return new binomialCoefficientNode_1.BinomialCoefficientNode(NodeConstructor.fromIdentifiers(identifiers.leftChild), NodeConstructor.fromIdentifiers(identifiers.rightChild));
178
182
  }
@@ -1 +1 @@
1
- {"version":3,"file":"addNode.d.ts","sourceRoot":"","sources":["../../../../src/tree/nodes/operators/addNode.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EACL,uBAAuB,EACvB,WAAW,EAGZ,MAAM,gBAAgB,CAAC;AAKxB,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AASlE,wBAAgB,SAAS,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,IAAI,OAAO,CAE/C;AAED,eAAO,MAAM,GAAG,MACX,aAAa,GAAG,MAAM,GAAG,MAAM,KAC/B,aAAa,GAAG,MAAM,GAAG,MAAM,YAOnC,CAAC;AAEF,qBAAa,OAAQ,YAAW,uBAAuB;IACrD,EAAE,EAAE,WAAW,CAAC;IAChB,SAAS,EAAE,aAAa,CAAC;IACzB,UAAU,EAAE,aAAa,CAAC;IAC1B,IAAI,EAAE,QAAQ,CAAC;IACf,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;gBAEjB,SAAS,EAAE,aAAa,EACxB,UAAU,EAAE,aAAa,EACzB,IAAI,CAAC,EAAE,WAAW;IASpB,OAAO,aAGL;IAEF,YAAY,IAAI,MAAM;IAItB,iBAAiB,CAAC,IAAI,CAAC,EAAE,WAAW,GAAG,aAAa,EAAE;IAoCtD,SAAS,IAAI,MAAM,EAAE;IAIrB,cAAc,CAAC,IAAI,CAAC,EAAE,WAAW,GAAG,MAAM,EAAE;IAK5C,KAAK,CAAC,OAAO,CAAC,EAAE,YAAY,GAAG,MAAM;IAerC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAMtC,QAAQ,CAAC,IAAI,CAAC,EAAE,eAAe,GAAG,aAAa;IAqQ/C,aAAa;;;;;;;;;IAOb,MAAM,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO;IAUpC,oBAAoB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC;IAMxD,UAAU,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,aAAa;CAMxD"}
1
+ {"version":3,"file":"addNode.d.ts","sourceRoot":"","sources":["../../../../src/tree/nodes/operators/addNode.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EACL,uBAAuB,EACvB,WAAW,EAGZ,MAAM,gBAAgB,CAAC;AAKxB,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAYlE,wBAAgB,SAAS,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,IAAI,OAAO,CAE/C;AAED,eAAO,MAAM,GAAG,MACX,aAAa,GAAG,MAAM,GAAG,MAAM,KAC/B,aAAa,GAAG,MAAM,GAAG,MAAM,YAOnC,CAAC;AAEF,qBAAa,OAAQ,YAAW,uBAAuB;IACrD,EAAE,EAAE,WAAW,CAAC;IAChB,SAAS,EAAE,aAAa,CAAC;IACzB,UAAU,EAAE,aAAa,CAAC;IAC1B,IAAI,EAAE,QAAQ,CAAC;IACf,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;gBAEjB,SAAS,EAAE,aAAa,EACxB,UAAU,EAAE,aAAa,EACzB,IAAI,CAAC,EAAE,WAAW;IASpB,OAAO,aAGL;IAEF,YAAY,IAAI,MAAM;IAItB,iBAAiB,CAAC,IAAI,CAAC,EAAE,WAAW,GAAG,aAAa,EAAE;IAoCtD,SAAS,IAAI,MAAM,EAAE;IAIrB,cAAc,CAAC,IAAI,CAAC,EAAE,WAAW,GAAG,MAAM,EAAE;IAK5C,KAAK,CAAC,OAAO,CAAC,EAAE,YAAY,GAAG,MAAM;IAerC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAMtC,QAAQ,CAAC,IAAI,CAAC,EAAE,eAAe,GAAG,aAAa;IAmI/C,aAAa;;;;;;;;;IAOb,MAAM,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO;IAUpC,oBAAoB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC;IAMxD,UAAU,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,aAAa;CAMxD"}
@@ -15,6 +15,7 @@ const multiplyNode_1 = require("./multiplyNode");
15
15
  const fractionNode_1 = require("./fractionNode");
16
16
  const colorize_1 = require("../../../utils/latex/colorize");
17
17
  const round_1 = require("../../../math/utils/round");
18
+ const monomNode_1 = require("../polynomials/monomNode");
18
19
  function isAddNode(a) {
19
20
  return (0, operatorNode_1.isOperatorNode)(a) && a.id === operatorNode_1.OperatorIds.add;
20
21
  }
@@ -130,96 +131,17 @@ class AddNode {
130
131
  if (externals.length === 1)
131
132
  return externals[0];
132
133
  const simplifyExternalNodes = (a, b) => {
133
- if (!opts?.towardsDistribute && (0, fractionNode_1.isFractionNode)(a) && (0, fractionNode_1.isFractionNode)(b)) {
134
- //c/d + e/f = cf+ed / df
135
- const c = a.leftChild;
136
- const d = a.rightChild;
137
- const e = b.leftChild;
138
- const f = b.rightChild;
139
- return new fractionNode_1.FractionNode(new AddNode(new multiplyNode_1.MultiplyNode(c, f), new multiplyNode_1.MultiplyNode(e, d)), new multiplyNode_1.MultiplyNode(d, f)).simplify(opts);
140
- }
141
- if (!opts?.towardsDistribute &&
142
- (0, oppositeNode_1.isOppositeNode)(a) &&
143
- (0, fractionNode_1.isFractionNode)(a.child) &&
144
- (0, fractionNode_1.isFractionNode)(b)) {
145
- //-(c/d) + e/f = -cf+ed / df
146
- const c = a.child.leftChild;
147
- const d = a.child.rightChild;
148
- const e = b.leftChild;
149
- const f = b.rightChild;
150
- return new fractionNode_1.FractionNode(new AddNode(new multiplyNode_1.MultiplyNode(new oppositeNode_1.OppositeNode(c), f), new multiplyNode_1.MultiplyNode(e, d)), new multiplyNode_1.MultiplyNode(d, f)).simplify(opts);
151
- }
152
- if (!opts?.towardsDistribute &&
153
- (0, oppositeNode_1.isOppositeNode)(b) &&
154
- (0, fractionNode_1.isFractionNode)(b.child) &&
155
- (0, fractionNode_1.isFractionNode)(a)) {
156
- //(c/d) + (-e/f) = cf-ed / df
157
- const c = a.leftChild;
158
- const d = a.rightChild;
159
- const e = b.child.leftChild;
160
- const f = b.child.rightChild;
161
- return new fractionNode_1.FractionNode(new AddNode(new multiplyNode_1.MultiplyNode(c, f), new multiplyNode_1.MultiplyNode(new oppositeNode_1.OppositeNode(e), d)), new multiplyNode_1.MultiplyNode(d, f)).simplify(opts);
162
- }
163
- if (!opts?.towardsDistribute &&
164
- (0, oppositeNode_1.isOppositeNode)(b) &&
165
- (0, fractionNode_1.isFractionNode)(b.child) &&
166
- (0, oppositeNode_1.isOppositeNode)(a) &&
167
- (0, fractionNode_1.isFractionNode)(a.child)) {
168
- //-(c/d) + (-e/f) = -cf-ed / df
169
- const c = a.child.leftChild;
170
- const d = a.child.rightChild;
171
- const e = b.child.leftChild;
172
- const f = b.child.rightChild;
173
- return new fractionNode_1.FractionNode(new AddNode(new multiplyNode_1.MultiplyNode(new oppositeNode_1.OppositeNode(c), f), new multiplyNode_1.MultiplyNode(new oppositeNode_1.OppositeNode(e), d)), new multiplyNode_1.MultiplyNode(d, f)).simplify(opts);
174
- }
175
- if (!opts?.towardsDistribute && (0, fractionNode_1.isFractionNode)(a)) {
176
- //c/d + b
177
- const c = a.leftChild;
178
- const d = a.rightChild;
179
- return new fractionNode_1.FractionNode(new AddNode(c, new multiplyNode_1.MultiplyNode(d, b)), d).simplify(opts);
180
- }
181
- if (!opts?.towardsDistribute &&
182
- (0, oppositeNode_1.isOppositeNode)(a) &&
183
- (0, fractionNode_1.isFractionNode)(a.child)) {
184
- //-(c/d) + b = (-c+bd)/d
185
- const c = a.child.leftChild;
186
- const d = a.child.rightChild;
187
- return new fractionNode_1.FractionNode(new AddNode(new oppositeNode_1.OppositeNode(c), new multiplyNode_1.MultiplyNode(d, b)), d).simplify(opts);
188
- }
189
- if (!opts?.towardsDistribute &&
190
- (0, fractionNode_1.isFractionNode)(b) &&
191
- !opts?.forceDistributeFractions) {
192
- //a+c/d
193
- const c = b.leftChild;
194
- const d = b.rightChild;
195
- return new fractionNode_1.FractionNode(new AddNode(c, new multiplyNode_1.MultiplyNode(d, a)), d).simplify(opts);
196
- }
197
- if (!opts?.towardsDistribute &&
198
- (0, oppositeNode_1.isOppositeNode)(b) &&
199
- (0, fractionNode_1.isFractionNode)(b.child) &&
200
- !opts?.forceDistributeFractions) {
201
- //a+-(c/d) = (da-c)/d
202
- const c = b.child.leftChild;
203
- const d = b.child.rightChild;
204
- return new fractionNode_1.FractionNode(new AddNode(new oppositeNode_1.OppositeNode(c), new multiplyNode_1.MultiplyNode(d, a)), d).simplify(opts);
205
- }
206
- if ((0, numberNode_1.isNumberNode)(a) && (0, numberNode_1.isNumberNode)(b)) {
207
- //geogebra rounds to 12, il faut mettre <12
208
- return new numberNode_1.NumberNode((0, round_1.round)(a.value + b.value, 10));
209
- }
210
- if ((0, oppositeNode_1.isOppositeNode)(a) && (0, numberNode_1.isNumberNode)(a.child) && (0, numberNode_1.isNumberNode)(b)) {
211
- return new numberNode_1.NumberNode(-a.child.value + b.value);
212
- }
213
- if ((0, oppositeNode_1.isOppositeNode)(b) && (0, numberNode_1.isNumberNode)(b.child) && (0, numberNode_1.isNumberNode)(a)) {
214
- return new numberNode_1.NumberNode(-b.child.value + a.value);
215
- }
216
- if ((0, oppositeNode_1.isOppositeNode)(a) &&
217
- (0, numberNode_1.isNumberNode)(a.child) &&
218
- (0, oppositeNode_1.isOppositeNode)(b) &&
219
- (0, numberNode_1.isNumberNode)(b.child)) {
220
- return new numberNode_1.NumberNode(a.child.value + b.child.value);
221
- }
222
- //gérer opposites, fractions
134
+ const fracSimplify = addSimplifyFrac(a, b, opts);
135
+ if (fracSimplify)
136
+ return fracSimplify;
137
+ const nbSimplify = addSimplifyNumbers(a, b, opts);
138
+ if (nbSimplify)
139
+ return nbSimplify;
140
+ const monomSimplify = addSimplifyMonoms(a, b, opts);
141
+ if (monomSimplify)
142
+ return monomSimplify;
143
+ //TODO gérer le reste
144
+ //la suite s'occupe des factorisations
223
145
  if (opts?.forbidFactorize)
224
146
  return null;
225
147
  const aSubExternals = [];
@@ -338,3 +260,114 @@ class AddNode {
338
260
  }
339
261
  }
340
262
  exports.AddNode = AddNode;
263
+ const addSimplifyFrac = (a, b, opts) => {
264
+ if (!opts?.towardsDistribute && (0, fractionNode_1.isFractionNode)(a) && (0, fractionNode_1.isFractionNode)(b)) {
265
+ //c/d + e/f = cf+ed / df
266
+ const c = a.leftChild;
267
+ const d = a.rightChild;
268
+ const e = b.leftChild;
269
+ const f = b.rightChild;
270
+ return new fractionNode_1.FractionNode(new AddNode(new multiplyNode_1.MultiplyNode(c, f), new multiplyNode_1.MultiplyNode(e, d)), new multiplyNode_1.MultiplyNode(d, f)).simplify(opts);
271
+ }
272
+ if (!opts?.towardsDistribute &&
273
+ (0, oppositeNode_1.isOppositeNode)(a) &&
274
+ (0, fractionNode_1.isFractionNode)(a.child) &&
275
+ (0, fractionNode_1.isFractionNode)(b)) {
276
+ //-(c/d) + e/f = -cf+ed / df
277
+ const c = a.child.leftChild;
278
+ const d = a.child.rightChild;
279
+ const e = b.leftChild;
280
+ const f = b.rightChild;
281
+ return new fractionNode_1.FractionNode(new AddNode(new multiplyNode_1.MultiplyNode(new oppositeNode_1.OppositeNode(c), f), new multiplyNode_1.MultiplyNode(e, d)), new multiplyNode_1.MultiplyNode(d, f)).simplify(opts);
282
+ }
283
+ if (!opts?.towardsDistribute &&
284
+ (0, oppositeNode_1.isOppositeNode)(b) &&
285
+ (0, fractionNode_1.isFractionNode)(b.child) &&
286
+ (0, fractionNode_1.isFractionNode)(a)) {
287
+ //(c/d) + (-e/f) = cf-ed / df
288
+ const c = a.leftChild;
289
+ const d = a.rightChild;
290
+ const e = b.child.leftChild;
291
+ const f = b.child.rightChild;
292
+ return new fractionNode_1.FractionNode(new AddNode(new multiplyNode_1.MultiplyNode(c, f), new multiplyNode_1.MultiplyNode(new oppositeNode_1.OppositeNode(e), d)), new multiplyNode_1.MultiplyNode(d, f)).simplify(opts);
293
+ }
294
+ if (!opts?.towardsDistribute &&
295
+ (0, oppositeNode_1.isOppositeNode)(b) &&
296
+ (0, fractionNode_1.isFractionNode)(b.child) &&
297
+ (0, oppositeNode_1.isOppositeNode)(a) &&
298
+ (0, fractionNode_1.isFractionNode)(a.child)) {
299
+ //-(c/d) + (-e/f) = -cf-ed / df
300
+ const c = a.child.leftChild;
301
+ const d = a.child.rightChild;
302
+ const e = b.child.leftChild;
303
+ const f = b.child.rightChild;
304
+ return new fractionNode_1.FractionNode(new AddNode(new multiplyNode_1.MultiplyNode(new oppositeNode_1.OppositeNode(c), f), new multiplyNode_1.MultiplyNode(new oppositeNode_1.OppositeNode(e), d)), new multiplyNode_1.MultiplyNode(d, f)).simplify(opts);
305
+ }
306
+ if (!opts?.towardsDistribute && (0, fractionNode_1.isFractionNode)(a)) {
307
+ //c/d + b
308
+ const c = a.leftChild;
309
+ const d = a.rightChild;
310
+ return new fractionNode_1.FractionNode(new AddNode(c, new multiplyNode_1.MultiplyNode(d, b)), d).simplify(opts);
311
+ }
312
+ if (!opts?.towardsDistribute &&
313
+ (0, oppositeNode_1.isOppositeNode)(a) &&
314
+ (0, fractionNode_1.isFractionNode)(a.child)) {
315
+ //-(c/d) + b = (-c+bd)/d
316
+ const c = a.child.leftChild;
317
+ const d = a.child.rightChild;
318
+ return new fractionNode_1.FractionNode(new AddNode(new oppositeNode_1.OppositeNode(c), new multiplyNode_1.MultiplyNode(d, b)), d).simplify(opts);
319
+ }
320
+ if (!opts?.towardsDistribute &&
321
+ (0, fractionNode_1.isFractionNode)(b) &&
322
+ !opts?.forceDistributeFractions) {
323
+ //a+c/d
324
+ const c = b.leftChild;
325
+ const d = b.rightChild;
326
+ return new fractionNode_1.FractionNode(new AddNode(c, new multiplyNode_1.MultiplyNode(d, a)), d).simplify(opts);
327
+ }
328
+ if (!opts?.towardsDistribute &&
329
+ (0, oppositeNode_1.isOppositeNode)(b) &&
330
+ (0, fractionNode_1.isFractionNode)(b.child) &&
331
+ !opts?.forceDistributeFractions) {
332
+ //a+-(c/d) = (da-c)/d
333
+ const c = b.child.leftChild;
334
+ const d = b.child.rightChild;
335
+ return new fractionNode_1.FractionNode(new AddNode(new oppositeNode_1.OppositeNode(c), new multiplyNode_1.MultiplyNode(d, a)), d).simplify(opts);
336
+ }
337
+ };
338
+ const addSimplifyNumbers = (a, b, opts) => {
339
+ if ((0, numberNode_1.isNumberNode)(a) && (0, numberNode_1.isNumberNode)(b)) {
340
+ //geogebra rounds to 12, il faut mettre <12
341
+ return new numberNode_1.NumberNode((0, round_1.round)(a.value + b.value, 10));
342
+ }
343
+ if ((0, oppositeNode_1.isOppositeNode)(a) && (0, numberNode_1.isNumberNode)(a.child) && (0, numberNode_1.isNumberNode)(b)) {
344
+ return new numberNode_1.NumberNode(-a.child.value + b.value);
345
+ }
346
+ if ((0, oppositeNode_1.isOppositeNode)(b) && (0, numberNode_1.isNumberNode)(b.child) && (0, numberNode_1.isNumberNode)(a)) {
347
+ return new numberNode_1.NumberNode(-b.child.value + a.value);
348
+ }
349
+ if ((0, oppositeNode_1.isOppositeNode)(a) &&
350
+ (0, numberNode_1.isNumberNode)(a.child) &&
351
+ (0, oppositeNode_1.isOppositeNode)(b) &&
352
+ (0, numberNode_1.isNumberNode)(b.child)) {
353
+ return new numberNode_1.NumberNode(a.child.value + b.child.value);
354
+ }
355
+ };
356
+ const addSimplifyMonoms = (a, b, opts) => {
357
+ const aMonom = (0, monomNode_1.parseToMonomNode)(a);
358
+ if (!aMonom)
359
+ return;
360
+ const bMonom = (0, monomNode_1.parseToMonomNode)(b);
361
+ if (!bMonom)
362
+ return;
363
+ if (aMonom.degree === bMonom.degree) {
364
+ if (aMonom.variable !== bMonom.variable)
365
+ return;
366
+ const sum = (0, exports.add)(aMonom.a, bMonom.a).simplify(opts);
367
+ if (sum.evaluate() === 0)
368
+ return new numberNode_1.NumberNode(0);
369
+ return new monomNode_1.MonomNode(sum, aMonom.degree, {
370
+ variable: aMonom.variable,
371
+ }).toTree();
372
+ }
373
+ };