pimath 0.0.123 → 0.0.125

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 (132) hide show
  1. package/.idea/inspectionProfiles/Project_Default.xml +6 -0
  2. package/.idea/shelf/Uncommitted_changes_before_Checkout_at_07_11_2023_08_30_[Default_Changelist]/shelved.patch +192 -0
  3. package/.idea/shelf/Uncommitted_changes_before_Checkout_at_07_11_2023_08_30_[Default_Changelist]1/shelved.patch +0 -0
  4. package/.idea/shelf/Uncommitted_changes_before_Checkout_at_07_11_2023_08_30__Default_Changelist_.xml +4 -0
  5. package/.idea/shelf/Uncommitted_changes_before_Checkout_at_09_11_2023_10_43_[Default_Changelist]/shelved.patch +2404 -0
  6. package/.idea/shelf/Uncommitted_changes_before_Checkout_at_09_11_2023_10_43__Default_Changelist_.xml +4 -0
  7. package/.idea/shelf/Uncommitted_changes_before_Checkout_at_09_11_2023_11_01_[Default_Changelist]/shelved.patch +1362 -0
  8. package/.idea/shelf/Uncommitted_changes_before_Checkout_at_09_11_2023_11_01__Default_Changelist_.xml +4 -0
  9. package/dist/pimath.js +53 -14
  10. package/dist/pimath.js.map +1 -1
  11. package/dist/pimath.min.js +1 -1
  12. package/dist/pimath.min.js.map +1 -1
  13. package/esm/maths/algebra/rational.d.ts +1 -0
  14. package/esm/maths/algebra/rational.js +12 -1
  15. package/esm/maths/algebra/rational.js.map +1 -1
  16. package/esm/maths/geometry/triangle.d.ts +6 -0
  17. package/esm/maths/geometry/triangle.js +14 -7
  18. package/esm/maths/geometry/triangle.js.map +1 -1
  19. package/esm/maths/randomization/random.d.ts +1 -1
  20. package/esm/maths/randomization/random.js +2 -2
  21. package/esm/maths/randomization/random.js.map +1 -1
  22. package/esm/maths/randomization/rndHelpers.d.ts +1 -1
  23. package/esm/maths/randomization/rndHelpers.js +25 -4
  24. package/esm/maths/randomization/rndHelpers.js.map +1 -1
  25. package/package.json +8 -8
  26. package/src/maths/algebra/rational.ts +13 -1
  27. package/src/maths/geometry/triangle.ts +24 -8
  28. package/src/maths/randomization/random.ts +2 -2
  29. package/src/maths/randomization/rndHelpers.ts +49 -18
  30. package/tests/algebra/rationnal.test.ts +5 -0
  31. package/tests/geometry/circle.test.ts +125 -10
  32. package/tests/numexp.test.ts +15 -2
  33. package/dev/pimath.js +0 -7935
  34. package/dev/pimath.js.map +0 -1
  35. package/docs/.nojekyll +0 -1
  36. package/docs/assets/highlight.css +0 -78
  37. package/docs/assets/main.js +0 -58
  38. package/docs/assets/search.js +0 -1
  39. package/docs/assets/style.css +0 -1367
  40. package/docs/classes/Logicalset.Logicalset.html +0 -221
  41. package/docs/classes/Polynom.Rational.html +0 -391
  42. package/docs/classes/Vector-1.Vector.html +0 -494
  43. package/docs/classes/Vector.Point.html +0 -341
  44. package/docs/classes/algebra_equation.Equation.html +0 -796
  45. package/docs/classes/algebra_linearSystem.LinearSystem.html +0 -408
  46. package/docs/classes/algebra_monom.Monom.html +0 -967
  47. package/docs/classes/algebra_polynom.Polynom.html +0 -1281
  48. package/docs/classes/coefficients_fraction.Fraction.html +0 -939
  49. package/docs/classes/geometry_circle.Circle.html +0 -476
  50. package/docs/classes/geometry_line.Line.html +0 -779
  51. package/docs/classes/geometry_triangle.Triangle.html +0 -429
  52. package/docs/classes/numeric.Numeric.html +0 -269
  53. package/docs/classes/shutingyard.Shutingyard.html +0 -259
  54. package/docs/enums/algebra_equation.PARTICULAR_SOLUTION.html +0 -89
  55. package/docs/enums/geometry_line.LinePropriety.html +0 -102
  56. package/docs/enums/shutingyard.ShutingyardMode.html +0 -106
  57. package/docs/enums/shutingyard.ShutingyardType.html +0 -120
  58. package/docs/index.html +0 -63
  59. package/docs/interfaces/algebra_equation.ISolution.html +0 -111
  60. package/docs/interfaces/algebra_polynom.IEuclidian.html +0 -93
  61. package/docs/interfaces/geometry_triangle.remarquableLines.html +0 -150
  62. package/docs/modules/Logicalset.html +0 -69
  63. package/docs/modules/Polynom.html +0 -69
  64. package/docs/modules/Vector-1.html +0 -69
  65. package/docs/modules/Vector.html +0 -69
  66. package/docs/modules/algebra_equation.html +0 -75
  67. package/docs/modules/algebra_linearSystem.html +0 -65
  68. package/docs/modules/algebra_monom.html +0 -70
  69. package/docs/modules/algebra_polynom.html +0 -75
  70. package/docs/modules/coefficients_fraction.html +0 -70
  71. package/docs/modules/geometry_circle.html +0 -65
  72. package/docs/modules/geometry_line.html +0 -70
  73. package/docs/modules/geometry_triangle.html +0 -70
  74. package/docs/modules/numeric.html +0 -65
  75. package/docs/modules/shutingyard.html +0 -84
  76. package/docs/types/algebra_monom.literalType.html +0 -66
  77. package/docs/types/algebra_polynom.PolynomParsingType.html +0 -62
  78. package/docs/types/coefficients_fraction.FractionParsingType.html +0 -61
  79. package/docs/types/shutingyard.Token.html +0 -72
  80. package/docs/types/shutingyard.tokenType.html +0 -77
  81. package/docs/variables/shutingyard.tokenConstant.html +0 -70
  82. package/esm/maths/expressions/ExpressionTree.d.ts +0 -17
  83. package/esm/maths/expressions/ExpressionTree.js +0 -150
  84. package/esm/maths/expressions/ExpressionTree.js.map +0 -1
  85. package/esm/maths/expressions/expression.d.ts +0 -27
  86. package/esm/maths/expressions/expression.js +0 -239
  87. package/esm/maths/expressions/expression.js.map +0 -1
  88. package/esm/maths/expressions/expressionFactor.d.ts +0 -36
  89. package/esm/maths/expressions/expressionFactor.js +0 -156
  90. package/esm/maths/expressions/expressionFactor.js.map +0 -1
  91. package/esm/maths/expressions/expressionMember.d.ts +0 -27
  92. package/esm/maths/expressions/expressionMember.js +0 -199
  93. package/esm/maths/expressions/expressionMember.js.map +0 -1
  94. package/esm/maths/expressions/expressionOperators.d.ts +0 -8
  95. package/esm/maths/expressions/expressionOperators.js +0 -42
  96. package/esm/maths/expressions/expressionOperators.js.map +0 -1
  97. package/esm/maths/expressions/expressionParser.d.ts +0 -14
  98. package/esm/maths/expressions/expressionParser.js +0 -259
  99. package/esm/maths/expressions/expressionParser.js.map +0 -1
  100. package/esm/maths/expressions/factors/ExpFactor.d.ts +0 -7
  101. package/esm/maths/expressions/factors/ExpFactor.js +0 -34
  102. package/esm/maths/expressions/factors/ExpFactor.js.map +0 -1
  103. package/esm/maths/expressions/factors/ExpFactorConstant.d.ts +0 -14
  104. package/esm/maths/expressions/factors/ExpFactorConstant.js +0 -52
  105. package/esm/maths/expressions/factors/ExpFactorConstant.js.map +0 -1
  106. package/esm/maths/expressions/factors/ExpFactorExponential.d.ts +0 -8
  107. package/esm/maths/expressions/factors/ExpFactorExponential.js +0 -22
  108. package/esm/maths/expressions/factors/ExpFactorExponential.js.map +0 -1
  109. package/esm/maths/expressions/factors/ExpFactorNumber.d.ts +0 -14
  110. package/esm/maths/expressions/factors/ExpFactorNumber.js +0 -59
  111. package/esm/maths/expressions/factors/ExpFactorNumber.js.map +0 -1
  112. package/esm/maths/expressions/factors/ExpFactorPower.d.ts +0 -13
  113. package/esm/maths/expressions/factors/ExpFactorPower.js +0 -35
  114. package/esm/maths/expressions/factors/ExpFactorPower.js.map +0 -1
  115. package/esm/maths/expressions/factors/ExpFactorTrigo.d.ts +0 -20
  116. package/esm/maths/expressions/factors/ExpFactorTrigo.js +0 -48
  117. package/esm/maths/expressions/factors/ExpFactorTrigo.js.map +0 -1
  118. package/esm/maths/expressions/factors/ExpFactorVariable.d.ts +0 -13
  119. package/esm/maths/expressions/factors/ExpFactorVariable.js +0 -36
  120. package/esm/maths/expressions/factors/ExpFactorVariable.js.map +0 -1
  121. package/esm/maths/expressions/internals.d.ts +0 -12
  122. package/esm/maths/expressions/internals.js +0 -29
  123. package/esm/maths/expressions/internals.js.map +0 -1
  124. package/esm/maths/expressions/numexp.d.ts +0 -19
  125. package/esm/maths/expressions/numexp.js +0 -186
  126. package/esm/maths/expressions/numexp.js.map +0 -1
  127. package/esm/maths/expressions/polynomexp.bkp.d.ts +0 -33
  128. package/esm/maths/expressions/polynomexp.bkp.js +0 -184
  129. package/esm/maths/expressions/polynomexp.bkp.js.map +0 -1
  130. package/esm/maths/expressions/polynomexp.d.ts +0 -52
  131. package/esm/maths/expressions/polynomexp.js +0 -246
  132. package/esm/maths/expressions/polynomexp.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"pimath.js","mappings":"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AAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,I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","sources":["webpack://pimath/./src/index.ts","webpack://pimath/./src/maths/algebra/equation.ts","webpack://pimath/./src/maths/algebra/linearSystem.ts","webpack://pimath/./src/maths/algebra/logicalset.ts","webpack://pimath/./src/maths/algebra/monom.ts","webpack://pimath/./src/maths/algebra/polynom.ts","webpack://pimath/./src/maths/algebra/rational.ts","webpack://pimath/./src/maths/algebra/study.ts","webpack://pimath/./src/maths/algebra/study/rationalStudy.ts","webpack://pimath/./src/maths/coefficients/fraction.ts","webpack://pimath/./src/maths/coefficients/nthRoot.ts","webpack://pimath/./src/maths/geometry/circle.ts","webpack://pimath/./src/maths/geometry/line.ts","webpack://pimath/./src/maths/geometry/point.ts","webpack://pimath/./src/maths/geometry/triangle.ts","webpack://pimath/./src/maths/geometry/vector.ts","webpack://pimath/./src/maths/numeric.ts","webpack://pimath/./src/maths/numexp.ts","webpack://pimath/./src/maths/randomization/random.ts","webpack://pimath/./src/maths/randomization/randomCore.ts","webpack://pimath/./src/maths/randomization/rndFraction.ts","webpack://pimath/./src/maths/randomization/rndGeometryLine.ts","webpack://pimath/./src/maths/randomization/rndGeometryPoint.ts","webpack://pimath/./src/maths/randomization/rndHelpers.ts","webpack://pimath/./src/maths/randomization/rndMonom.ts","webpack://pimath/./src/maths/randomization/rndPolynom.ts","webpack://pimath/./src/maths/randomization/rndTypes.ts","webpack://pimath/./src/maths/shutingyard.ts","webpack://pimath/webpack/bootstrap","webpack://pimath/webpack/before-startup","webpack://pimath/webpack/startup","webpack://pimath/webpack/after-startup"],"sourcesContent":["import {Numeric} from \"./maths/numeric\";\r\nimport {NumExp} from \"./maths/numexp\";\r\nimport {Shutingyard} from \"./maths/shutingyard\";\r\nimport {Random} from \"./maths/randomization/random\";\r\nimport {Fraction} from \"./maths/coefficients/fraction\";\r\nimport {NthRoot} from \"./maths/coefficients/nthRoot\";\r\nimport {Monom} from \"./maths/algebra/monom\";\r\nimport {Polynom} from \"./maths/algebra/polynom\";\r\nimport {Equation} from \"./maths/algebra/equation\";\r\nimport {LinearSystem} from \"./maths/algebra/linearSystem\";\r\nimport {Rational} from \"./maths/algebra/rational\";\r\nimport {Logicalset} from \"./maths/algebra/logicalset\";\r\nimport {Vector} from \"./maths/geometry/vector\";\r\nimport {Line} from \"./maths/geometry/line\";\r\nimport {Triangle} from \"./maths/geometry/triangle\";\r\nimport {Circle} from \"./maths/geometry/circle\";\r\nimport {Point} from \"./maths/geometry/point\";\r\n\r\n// Expose as global\r\nexport const PiMath = {\r\n ShutingYard: Shutingyard,\r\n Numeric: Numeric,\r\n NumExp: NumExp,\r\n Fraction: Fraction,\r\n Root: NthRoot,\r\n Monom: Monom,\r\n Polynom: Polynom,\r\n Equation: Equation,\r\n LinearSystem: LinearSystem,\r\n Rational: Rational,\r\n Logicalset: Logicalset,\r\n Random: Random,\r\n Geometry: {\r\n Vector: Vector,\r\n Point: Point,\r\n Line: Line,\r\n Triangle: Triangle,\r\n Circle: Circle\r\n }\r\n};\r\n\r\n(<any>window).Pi = PiMath\r\n","import {Polynom} from \"./polynom\";\r\nimport {literalType, Monom} from \"./monom\";\r\nimport {Numeric} from \"../numeric\";\r\nimport {Fraction} from \"../coefficients/fraction\";\r\nimport {NthRoot} from \"../coefficients/nthRoot\";\r\n\r\n/**\r\n * Equation is a class to manage equations...\r\n */\r\nexport interface ISolution {\r\n tex: string,\r\n display: string,\r\n value: number,\r\n exact: unknown\r\n}\r\n\r\nexport enum PARTICULAR_SOLUTION {\r\n real=\"\\\\mathbb{R}\",\r\n varnothing=\"\\\\varnothing\"\r\n}\r\n\r\nexport class Equation {\r\n private _polynom: Polynom; // Used to solve the equation // TODO: remove the private value ?\r\n\r\n // Undetermined texSolutions.\r\n private _varnothing: string = PARTICULAR_SOLUTION.varnothing;\r\n private _real: string = PARTICULAR_SOLUTION.real;\r\n\r\n /**\r\n * Create an Equation using two polynoms.\r\n * Markdown *support* is cool\r\n * @param equations\r\n */\r\n constructor(...equations: unknown[]) {\r\n // Default equation\r\n this._left = new Polynom().zero();\r\n this._right = new Polynom().zero();\r\n this._sign = '=';\r\n\r\n if (equations.length === 1) {\r\n if (equations[0] instanceof Equation) {\r\n return equations[0].clone();\r\n } else if (typeof equations[0] === 'string') {\r\n this.parse(equations[0]);\r\n }\r\n } else if (equations.length === 2) {\r\n if (equations[0] instanceof Polynom) {\r\n this.left = equations[0].clone()\r\n } else if (typeof equations[0] === 'string') {\r\n this.left = new Polynom(equations[0])\r\n }\r\n\r\n if (equations[1] instanceof Polynom) {\r\n this.right = equations[1].clone()\r\n } else if (typeof equations[1] === 'string') {\r\n this.right = new Polynom(equations[1])\r\n }\r\n } else {\r\n // Return default empty equation\r\n return this;\r\n }\r\n\r\n return this;\r\n }\r\n\r\n private _left: Polynom; // Left part of the equation\r\n\r\n get left(): Polynom {\r\n return this._left;\r\n }\r\n\r\n set left(value: Polynom) {\r\n this._left = value;\r\n }\r\n\r\n private _right: Polynom; // Right part of the equation\r\n\r\n get right(): Polynom {\r\n return this._right;\r\n }\r\n\r\n // ------------------------------------------\r\n // Getter and setter\r\n\r\n set right(value: Polynom) {\r\n this._right = value;\r\n }\r\n\r\n private _sign: string; // Signe of the equation, by default =\r\n\r\n get sign(): string {\r\n return this._sign;\r\n }\r\n\r\n set sign(value: string) {\r\n // Set the sign value as formatted.\r\n this._sign = this._formatSign(value);\r\n }\r\n\r\n private _solutions: ISolution[]\r\n\r\n // ------------------------------------------\r\n get solutions(): ISolution[] {\r\n return this._solutions\r\n }\r\n\r\n get isEquation() {\r\n return true;\r\n }\r\n\r\n get solution(): string {\r\n if (this._solutions.length === 1\r\n &&\r\n (\r\n this._solutions[0].tex === this._real\r\n || this._solutions[0].tex === this._varnothing\r\n || this._solutions[0].tex.includes('\\\\left')\r\n )\r\n ) {\r\n return `S = ${this._solutions[0]}`;\r\n }\r\n return `S = \\\\left{ ${this._solutions.map(x => x.tex).join(';')} \\\\right}`;\r\n }\r\n\r\n get isReal(): boolean {\r\n if (this._solutions === undefined) {\r\n this.solve();\r\n }\r\n return this._solutions[0].tex === this._real;\r\n }\r\n\r\n get isVarnothing(): boolean {\r\n if (this._solutions === undefined) {\r\n this.solve();\r\n }\r\n return this._solutions[0].tex === this._varnothing;\r\n }\r\n\r\n get signAsTex(): string {\r\n if (this._sign === '>=' || this._sign === '=>' || this._sign === 'geq') {\r\n return '\\\\geq';\r\n }\r\n if (this._sign === '<=' || this._sign === '=<' || this._sign === 'leq') {\r\n return '\\\\leq';\r\n }\r\n return this._sign;\r\n }\r\n\r\n get tex(): string {\r\n return `${this._left.tex}${this.signAsTex}${this._right.tex}`;\r\n }\r\n\r\n get display(): string {\r\n return `${this._left.display}${this.signAsTex}${this._right.display}`;\r\n }\r\n\r\n get raw(): string {\r\n return `${this._left.raw}${this.signAsTex}${this._right.raw}`;\r\n }\r\n\r\n get variables(): string[] {\r\n return [...new Set(this._right.variables.concat(this._left.variables))];\r\n }\r\n\r\n get numberOfVars(): number {\r\n return this.variables.length;\r\n }\r\n\r\n hasVariable = (letter: string): boolean => {\r\n return this.variables.includes(letter)\r\n }\r\n\r\n // ------------------------------------------\r\n // Creation / parsing functions\r\n\r\n // -----------------------------------------------\r\n private _randomizeDefaults: { [key: string]: number | string | boolean } = {\r\n degree: 2\r\n };\r\n\r\n get randomizeDefaults(): { [key: string]: number | string | boolean } {\r\n return this._randomizeDefaults;\r\n }\r\n\r\n set randomizeDefaults(value) {\r\n this._randomizeDefaults = value;\r\n }\r\n\r\n // ------------------------------------------\r\n parse = (equationString: string): Equation => {\r\n let pStr: string[], strSign: string | false;\r\n // Find the string separator\r\n strSign = this._findSign(equationString);\r\n\r\n if (strSign === false) {\r\n console.error('The equation is not valid (no sign found)');\r\n return;\r\n }\r\n\r\n // The StrSign is found\r\n pStr = equationString.split(strSign);\r\n\r\n return this.create(new Polynom(pStr[0]), new Polynom(pStr[1]), this._formatSign(strSign));\r\n };\r\n\r\n create = (left: Polynom, right: Polynom, sign?: string): Equation => {\r\n this._left = left;\r\n this._right = right;\r\n this._sign = this._formatSign(sign);\r\n return this;\r\n };\r\n\r\n clone = (): Equation => {\r\n return new Equation().create(this._left.clone(), this._right.clone(), this._sign + '');\r\n };\r\n\r\n // -----------------------------------------------\r\n // Equations generators and randomizers\r\n\r\n randomize = (opts?: {}, sign?: string): Equation => {\r\n // TODO: Generate equations randomly, using config.\r\n return new Equation().create(new Polynom(), new Polynom(), sign);\r\n };\r\n\r\n // -----------------------------------------------\r\n /**\r\n * Reorder will move all monoms containing a letter on the left, all the other on the right.\r\n */\r\n moveLeft = (): Equation => {\r\n this._left = this._left.clone().subtract(this._right)\r\n this._right.zero()\r\n return this;\r\n }\r\n\r\n reorder = (allLeft?: boolean): Equation => {\r\n // Move all monoms of degree greater than 0 to the left.\r\n // and all zero degree monoms to the right.\r\n this._left.subtract(this._right);\r\n this._right.zero();\r\n this._left.reorder()\r\n\r\n // we eant all left (so equal zero) : it's done !\r\n if (allLeft) return this\r\n\r\n // Fetch all zero degree monoms.\r\n this._left.monoms\r\n .filter(m=>m.degree().isZero())\r\n .forEach(m=> {\r\n const move = m.clone()\r\n this._left.subtract(move)\r\n this._right.subtract(move)\r\n })\r\n\r\n\r\n // Reorder the left and right polynoms\r\n this._left.reorder();\r\n this._right.reorder();\r\n return this;\r\n };\r\n\r\n /**\r\n * Multiply by the lcm denominator and divide by the gcm numerators.\r\n */\r\n simplify = (): Equation => {\r\n this.multiply(Numeric.lcm(...this._left.getDenominators(), ...this._right.getDenominators()));\r\n this.divide(Numeric.gcd(...this._left.getNumerators(), ...this._right.getNumerators()));\r\n return this;\r\n }\r\n\r\n\r\n // -----------------------------------------------\r\n // Equations operations\r\n\r\n /**\r\n * Reorder the polynom to have only one letter on the left, the rest on the right.\r\n * @param letter\r\n */\r\n isolate = (letter?: string): Equation | false => {\r\n // Determine if we can isolate the variables.\r\n\r\n // Both part of the equations must be of the first degree.\r\n //TODO: handle equations of degree two or more ?\r\n if (!this.degree(letter).isOne()) {\r\n return false;\r\n }\r\n\r\n // Modify the equation to isolate the asked variable.\r\n // TODO: must handle equations like 3xy+5y=4 => y = 4/(3x-5)\r\n if (this.isMultiVariable()) {\r\n return false;\r\n }\r\n\r\n // Isolate the letter.\r\n let mMove: Monom, cMove: Fraction;\r\n // Start by moving everything to the left.\r\n this._left.subtract(this._right);\r\n this._right.zero();\r\n let values = [...this._left.monoms]\r\n for (let m of values) {\r\n if (!m.hasLetter(letter)) {\r\n mMove = m.clone();\r\n this._left.subtract(mMove);\r\n this._right.subtract(mMove);\r\n }\r\n }\r\n\r\n // In theory, we should have only one item on the left.\r\n if (this._left.length !== 1) {\r\n return false;\r\n }\r\n cMove = this._left.monoms[0].coefficient.clone();\r\n this._left.divide(cMove);\r\n this._right.divide(cMove);\r\n return this;\r\n };\r\n\r\n replaceBy = (letter: string, P: Polynom): Equation => {\r\n this._left.replaceBy(letter, P)\r\n this._right.replaceBy(letter, P)\r\n return this;\r\n }\r\n\r\n /**\r\n * Multiple an equation by a fraction value.\r\n * @param value\r\n */\r\n multiply = (value: unknown): Equation => {\r\n\r\n // Make sure we have a fraction.\r\n let F: Fraction = new Fraction(value);\r\n\r\n // Multiply each part of the equation by the fraction\r\n this._left.multiply(F);\r\n this._right.multiply(F);\r\n\r\n // The sign of the inequation must be changed.\r\n if (this._sign !== '=' && F.sign() === -1) {\r\n this._reverseSign();\r\n }\r\n\r\n return this;\r\n };\r\n\r\n /**\r\n * divide an equation by a given value (transformed as a fraction)\r\n *\r\n * ```\r\n * 8x+10=6x \\vert 2\r\n * 4x+5=3x\r\n * ```\r\n *\r\n * |>Alternatively with $3x-4$ maybe it's working ?\r\n * $$\\frac{3x}{5}$$\r\n *\r\n * @param value\r\n * @returns {Equation}\r\n */\r\n divide = (value: unknown): Equation => {\r\n // Make sure we have a fraction.\r\n let F: Fraction = new Fraction(value);\r\n\r\n if (F.isZero()) {\r\n return this;\r\n } else {\r\n return this.multiply(F.invert());\r\n }\r\n }\r\n\r\n /**\r\n * Get the degree of the equation\r\n * @param letter\r\n */\r\n degree = (letter?: string): Fraction => {\r\n return Fraction.max(this._left.degree(letter), this._right.degree(letter));\r\n };\r\n\r\n /**\r\n * Determine if the equation contains more than one letter/variable.\r\n */\r\n isMultiVariable = (): boolean => {\r\n return this._left.isMultiVariable || this._right.isMultiVariable;\r\n };\r\n\r\n letters = (): string[] => {\r\n // @ts-ignore\r\n return [...new Set([...this._left.letters(), ...this._right.letters()])];\r\n }\r\n\r\n // -----------------------------------------------\r\n // Equations helpers\r\n // -----------------------------------------------\r\n\r\n // -----------------------------------------------\r\n solve = (): Equation => {\r\n // Initialise the variables:\r\n this._solutions = [];\r\n\r\n // TODO: consolidate solving equations (inequations vs equations)\r\n // TODO: work with not natural degrees ?\r\n this._polynom = this._left.clone().subtract(this._right);\r\n\r\n switch (this._polynom.degree().value) {\r\n case 0:\r\n case 1:\r\n this._solveDegree1();\r\n break;\r\n case 2:\r\n this._solveDegree2();\r\n break;\r\n default:\r\n this._solveDegree3plus();\r\n }\r\n\r\n // cleanup the solutions.\r\n this._solutions = Equation.makeSolutionsUnique(this._solutions)\r\n return this;\r\n };\r\n\r\n static makeSolutionsUnique(solutions: ISolution[], sorted?: boolean):ISolution[] {\r\n let solutionAsTex:string[] = [],\r\n uniqueSolutions = solutions.filter(sol=>{\r\n if(!solutionAsTex.includes(sol.tex)){\r\n solutionAsTex.push(sol.tex)\r\n return true\r\n }else{\r\n return false\r\n }\r\n })\r\n\r\n if(sorted===true){\r\n uniqueSolutions.sort((a, b)=>a.value-b.value)\r\n }\r\n return uniqueSolutions\r\n }\r\n\r\n test = (values: literalType): Boolean => {\r\n return this.left.evaluate(values).isEqual(this.right.evaluate(values))\r\n }\r\n\r\n isSameAs = (equ: Equation): Boolean => {\r\n let p1 = equ.clone().moveLeft().left,\r\n p2 = this.clone().moveLeft().left\r\n\r\n // They are the same.\r\n return p1.isEqual(p2) || p1.isOpposedAt(p2)\r\n }\r\n isLinearTo = (equ: Equation): Boolean => {\r\n // Move all left.\r\n let p1 = equ.clone().moveLeft().simplify().left,\r\n p2 = this.clone().moveLeft().simplify().left\r\n\r\n // They are the same.\r\n return p1.isEqual(p2) || p1.isOpposedAt(p2)\r\n }\r\n\r\n private _findSign = (equationString: string): string | false => {\r\n let strSign: string = '';\r\n\r\n if (equationString.includes('geq')) {\r\n return (equationString.includes('\\\\geq')) ? '\\\\geq' : 'geq';\r\n } else if (equationString.includes('leq')) {\r\n return (equationString.includes('\\\\leq')) ? '\\\\leq' : 'leq';\r\n } else if (equationString.includes('>=')) {\r\n return '>=';\r\n } else if (equationString.includes('=>')) {\r\n return '=>';\r\n } else if (equationString.includes('>')) {\r\n return '>';\r\n } else if (equationString.includes('<=')) {\r\n return '<=';\r\n } else if (equationString.includes('=<')) {\r\n return '=<';\r\n } else if (equationString.includes('<')) {\r\n return '<';\r\n } else if (equationString.includes('=')) {\r\n return '='\r\n }\r\n if (strSign === '') {\r\n console.log('Equation: parse string : sign not found');\r\n return false;\r\n }\r\n };\r\n\r\n // -----------------------------------------------\r\n // Equations solving algorithms\r\n\r\n private _formatSign = (signStr: string): string => {\r\n if (signStr === undefined) {\r\n return '=';\r\n }\r\n\r\n if (signStr.includes('geq')) {\r\n return '>=';\r\n } else if (signStr.includes('>=')) {\r\n return '>=';\r\n } else if (signStr.includes('=>')) {\r\n return '>=';\r\n } else if (signStr.includes('>')) {\r\n return '>';\r\n } else if (signStr.includes('leq')) {\r\n return '<=';\r\n } else if (signStr.includes('<=')) {\r\n return '<=';\r\n } else if (signStr.includes('=<')) {\r\n return '<=';\r\n } else if (signStr.includes('<')) {\r\n return '<';\r\n } else {\r\n return '='\r\n }\r\n };\r\n\r\n private _reverseSign = (): Equation => {\r\n if (this._sign === '=') {\r\n return this;\r\n }\r\n\r\n if (this._sign.includes('<')) {\r\n this._sign.replace('<', '>');\r\n return this;\r\n }\r\n if (this._sign.includes('>')) {\r\n this._sign.replace('>', '<');\r\n return this;\r\n }\r\n\r\n return this;\r\n };\r\n\r\n private isGreater = (): boolean => {\r\n if (this._sign.indexOf('>') !== -1) {\r\n return true;\r\n }\r\n return this._sign.indexOf('geq') !== -1;\r\n\r\n };\r\n\r\n private isStrictEqual = (): boolean => {\r\n return this._sign === '=';\r\n };\r\n\r\n private isAlsoEqual = (): boolean => {\r\n if (this._sign.indexOf('=') !== -1) {\r\n return true;\r\n }\r\n if (this._sign.indexOf('geq') !== -1) {\r\n return true;\r\n }\r\n if (this._sign.indexOf('leq') !== -1) {\r\n return true;\r\n }\r\n };\r\n\r\n private _solveDegree1 = (letter?: string): ISolution[] => {\r\n const m1 = this._polynom.monomByDegree(1, letter).coefficient,\r\n m0 = this._polynom.monomByDegree(0, letter).coefficient,\r\n v = m0.clone().opposed().divide(m1);\r\n let s: string, d: string;\r\n\r\n if (this.isStrictEqual()) {\r\n if (m1.value === 0) {\r\n // In this case, the coefficient of the x variable is zero.\r\n if (m0.value === 0) {\r\n this._solutions = [{\r\n tex: this._real,\r\n display: \"RR\",\r\n value: NaN,\r\n exact: false\r\n }];\r\n } else {\r\n this._solutions = [{\r\n tex: this._varnothing,\r\n display: \"O/\",\r\n value: NaN,\r\n exact: false\r\n }];\r\n }\r\n } else {\r\n this._solutions = [{\r\n tex: v.tex,\r\n display: v.display,\r\n value: v.value,\r\n exact: v\r\n }]\r\n }\r\n }\r\n else {\r\n if (m1.value === 0) {\r\n // In this case, the coefficient of the x variable is zero.\r\n if (m0.value === 0 && this.isAlsoEqual()) {\r\n s = '\\\\mathbb{R}';\r\n d = \"RR\"\r\n } else {\r\n if (m0.value > 0) {\r\n s = this.isGreater() ? this._real : this._varnothing;\r\n s = this.isGreater() ? \"RR\" : \"O/\";\r\n } else {\r\n s = !this.isGreater() ? this._real : this._varnothing;\r\n s = !this.isGreater() ? \"RR\" : \"O/\";\r\n }\r\n }\r\n } else {\r\n // Must handle the case if the m1 monom is negative.\r\n if ((this.isGreater() && m1.sign() === 1) || (!this.isGreater() && m1.sign() === -1)) {\r\n s = `\\\\left${this.isAlsoEqual() ? '[' : ']'}${v.tex};+\\\\infty\\\\right[`;\r\n d = `${this.isAlsoEqual() ? '[' : ']'}${v.tex};+oo[`;\r\n } else {\r\n s = `\\\\left]-\\\\infty;${v.tex} \\\\right${this.isAlsoEqual() ? ']' : '['}`;\r\n d = `]-oo;${v.tex}${this.isAlsoEqual() ? ']' : '['}`;\r\n }\r\n }\r\n this._solutions = [{\r\n tex: s,\r\n display: d,\r\n value: NaN,\r\n exact: false\r\n }];\r\n }\r\n\r\n return this._solutions;\r\n };\r\n\r\n private _solveDegree2 = (letter?: string): ISolution[] => {\r\n let aF = this._polynom.monomByDegree(2, letter).coefficient,\r\n bF = this._polynom.monomByDegree(1, letter).coefficient,\r\n cF = this._polynom.monomByDegree(0, letter).coefficient,\r\n delta: number, nthDelta: NthRoot,\r\n lcm = Numeric.lcm(aF.denominator, bF.denominator, cF.denominator),\r\n a = aF.multiply(lcm).value,\r\n b = bF.multiply(lcm).value,\r\n c = cF.multiply(lcm).value,\r\n realX1: number, realX2: number,\r\n sX1: string, sX2: string;\r\n\r\n delta = b * b - 4 * a * c;\r\n\r\n if (delta > 0) {\r\n realX1 = (-b - Math.sqrt(delta)) / (2 * a);\r\n realX2 = (-b + Math.sqrt(delta)) / (2 * a);\r\n\r\n if (delta > 1.0e5) {\r\n // The delta is too big to be parsed !\r\n let v1 = ((-b - Math.sqrt(delta)) / (2 * a)).toFixed(5),\r\n v2 = ((-b + Math.sqrt(delta)) / (2 * a)).toFixed(5)\r\n\r\n this._solutions = [\r\n {\r\n tex: v1,\r\n display: v1,\r\n value: realX1,\r\n exact: false\r\n },\r\n {\r\n tex: v2,\r\n display: v2,\r\n value: realX2,\r\n exact: false\r\n }\r\n ]\r\n } else {\r\n nthDelta = new NthRoot(delta).reduce();\r\n if (nthDelta.hasRadical()) {\r\n // -b +- coeff\\sqrt{radical}\r\n // -------------------------\r\n // 2a\r\n let gcd = Numeric.gcd(b, 2 * a, nthDelta.coefficient),\r\n am = a/gcd, bm = b/gcd\r\n nthDelta.coefficient = nthDelta.coefficient / gcd;\r\n\r\n if (a < 0) {\r\n am = -am\r\n bm = -bm\r\n }\r\n\r\n let tex1 = \"\", tex2 = \"\", display1 = \"\", display2 = \"\"\r\n\r\n tex1 = `${bm !== 0 ? ((-bm) + ' - ') : ''}${nthDelta.tex}`\r\n tex2 = `${bm !== 0 ? ((-bm) + ' + ') : ''}${nthDelta.tex}`\r\n display1 = `${bm !== 0 ? ((-bm) + ' - ') : ''}${nthDelta.display}`\r\n display2 = `${bm !== 0 ? ((-bm) + ' + ') : ''}${nthDelta.display}`\r\n\r\n if (am !== 1) {\r\n tex1 = `\\\\frac{ ${tex1} }{ ${2 * am} }`\r\n tex2 = `\\\\frac{ ${tex2} }{ ${2 * am} }`\r\n }\r\n\r\n this._solutions = [\r\n {\r\n tex: tex1,\r\n display: tex1,\r\n value: realX1,\r\n exact: false\r\n },\r\n {\r\n tex: tex2,\r\n display: tex2,\r\n value: realX2,\r\n exact: false\r\n },\r\n ]\r\n\r\n\r\n // if (b !== 0) {\r\n // if (2 * a / gcd === 1) {\r\n // this._solutions = [\r\n // {\r\n // tex: `${-b / gcd} - ${nthDelta.tex}`,\r\n // value: realX1,\r\n // exact: false // TODO: implement exact value with nthroot\r\n // },\r\n // {\r\n // tex: `${-b / gcd} + ${nthDelta.tex}`,\r\n // value: realX2,\r\n // exact: false\r\n // },\r\n //\r\n // ]\r\n // } else {\r\n // this._solutions = [\r\n // {\r\n // tex: `\\\\frac{${-b / gcd} - ${nthDelta.tex} }{ ${2 * a / gcd} }`,\r\n // value: realX1,\r\n // exact: false\r\n // },\r\n // {\r\n // tex: `\\\\frac{${-b / gcd} + ${nthDelta.tex} }{ ${2 * a / gcd} }`,\r\n // value: realX2,\r\n // exact: false\r\n // },\r\n // ]\r\n // }\r\n // } else {\r\n // if (2 * a / gcd === 1) {\r\n // this._solutions = [\r\n // {\r\n // tex: `- ${nthDelta.tex}`,\r\n // value: realX1,\r\n // exact: false\r\n // },\r\n // {\r\n // tex: `${nthDelta.tex}`,\r\n // value: realX2,\r\n // exact: false\r\n // },\r\n // ]\r\n // } else {\r\n // this._solutions = [\r\n // {\r\n // tex: `\\\\frac{- ${nthDelta.tex} }{ ${2 * a / gcd} }`,\r\n // value: realX1,\r\n // exact: false\r\n // },\r\n // {\r\n // tex: `\\\\frac{${nthDelta.tex} }{ ${2 * a / gcd} }`,\r\n // value: realX2,\r\n // exact: false\r\n // },\r\n // ]\r\n // }\r\n // }\r\n } else {\r\n // -b +- d / 2a\r\n const S1 = new Fraction(-b - nthDelta.coefficient, 2 * a).reduce(),\r\n S2 = new Fraction(-b + nthDelta.coefficient, 2 * a).reduce()\r\n this._solutions = [\r\n {\r\n tex: S1.frac,\r\n display: S1.display,\r\n value: realX1,\r\n exact: S1\r\n },\r\n {\r\n tex: S2.frac,\r\n display: S2.display,\r\n value: realX2,\r\n exact: S2\r\n }\r\n ]\r\n }\r\n }\r\n\r\n } else if (delta === 0) {\r\n const sol = new Fraction(-b, 2 * a).reduce()\r\n this._solutions = [{\r\n tex: sol.frac,\r\n display: sol.display,\r\n value: sol.value,\r\n exact: sol\r\n }];\r\n } else {\r\n this._solutions = [{\r\n tex: this._varnothing,\r\n display: \"O/\",\r\n value: NaN,\r\n exact: false\r\n }];\r\n }\r\n\r\n // Handle now the inequations.\r\n if (!this.isStrictEqual()) {\r\n if (this._solutions.length === 2) {\r\n sX1 = (realX1 < realX2) ? this._solutions[0].tex : this._solutions[1].tex;\r\n sX2 = (realX1 < realX2) ? this._solutions[1].tex : this._solutions[0].tex;\r\n\r\n if ((this.isGreater() && aF.sign() === 1) || (!this.isGreater() && aF.sign() === -1)) {\r\n this._solutions = [{\r\n tex: `\\\\left]-\\\\infty ; ${sX1}\\\\right${this.isAlsoEqual() ? ']' : '['} \\\\cup \\\\left${this.isAlsoEqual() ? '[' : ']'}${sX2};+\\\\infty\\\\right[`,\r\n display: `]-oo;${sX1}${this.isAlsoEqual() ? ']' : '['}uu${this.isAlsoEqual() ? '[' : ']'}${sX2};+oo[`,\r\n value: NaN,\r\n exact: false\r\n }\r\n ];\r\n } else {\r\n this._solutions = [{\r\n tex: `\\\\left${this.isAlsoEqual() ? '[' : ']'}${sX1} ; ${sX2}\\\\right${this.isAlsoEqual() ? ']' : '['}`,\r\n display: `${this.isAlsoEqual() ? '[' : ']'}${sX1};${sX2}${this.isAlsoEqual() ? ']' : '['}`,\r\n value: NaN,\r\n exact: false\r\n }]\r\n }\r\n } else if (this._solutions.length === 1 && this._solutions[0].tex !== this._varnothing) {\r\n if (!this.isAlsoEqual()) {\r\n if ((this.isGreater() && aF.sign() === 1) || (!this.isGreater() && aF.sign() === -1)) {\r\n this._solutions = [{\r\n tex: `\\\\left]-\\\\infty ; ${this._solutions[0].tex}\\\\right[ \\\\cup \\\\left]${this._solutions[0].tex};+\\\\infty\\\\right[`,\r\n display: `]-oo;${this._solutions[0].tex}[uu]${this._solutions[0].tex};+oo[`,\r\n value: NaN,\r\n exact: false\r\n }\r\n ];\r\n } else {\r\n this._solutions = [{\r\n tex: this._varnothing,\r\n display: \"O/\",\r\n value: NaN,\r\n exact: false\r\n }];\r\n }\r\n } else {\r\n if ((this.isGreater() && aF.sign() === 1) || (!this.isGreater() && aF.sign() === -1)) {\r\n this._solutions = [{\r\n tex: this._real,\r\n display: \"RR\",\r\n value: NaN,\r\n exact: false\r\n }];\r\n } else {\r\n // this._texSolutions = [ this._texSolutions[0] ];\r\n }\r\n }\r\n } else {\r\n if (this.isGreater()) {\r\n this._solutions = [{\r\n tex: aF.sign() === 1 ? this._real : this._varnothing,\r\n display: aF.sign() === 1 ? \"RR\" : \"O/\",\r\n value: NaN,\r\n exact: false\r\n }];\r\n } else {\r\n this._solutions = [{\r\n tex: aF.sign() === -1 ? this._real : this._varnothing,\r\n display: aF.sign() === -1 ? \"RR\" : \"O/\",\r\n value: NaN,\r\n exact: false\r\n }];\r\n }\r\n }\r\n }\r\n return this._solutions;\r\n };\r\n\r\n private _solveDegree3plus = (letter?: string): ISolution[] => {\r\n // Push everything to the left\r\n // factorize\r\n // solve each factors.\r\n let equ = this.clone().moveLeft()\r\n equ.left.factorize()\r\n\r\n this._solutions = []\r\n\r\n equ.left.factors.forEach(factor=>{\r\n if(factor.degree(letter).leq(2)) {\r\n let factorAsEquation = new Equation(factor, 0)\r\n factorAsEquation.solve()\r\n factorAsEquation.solutions.forEach(solution => {\r\n this._solutions.push(solution)\r\n })\r\n }else{\r\n console.log(factor.tex, ': cannot actually get the solution of this equation')\r\n }\r\n })\r\n\r\n // TODO: check equation resolution for more than degree 2\r\n // this._solutions = [{tex: 'solve x - not yet handled', value: NaN, exact: false}]; // ESLint remove system :(\r\n return this._solutions;\r\n };\r\n}","import {Equation, ISolution} from \"./equation\";\r\nimport {Monom} from \"./monom\";\r\nimport {Fraction} from \"../coefficients/fraction\";\r\nimport {Polynom} from \"./polynom\";\r\nimport {Numeric} from \"../numeric\";\r\n\r\n// TODO: Must check and rework\r\nexport class LinearSystem {\r\n // Stores the original equations\r\n private _equations: Equation[];\r\n // Determine the letters in the linear system, usually ['x', 'y']\r\n private _letters: string[];\r\n // Resolution steps contains each steps\r\n // letter : target letter\r\n // steps: {system: current LinearSystem, operations: [*3,/5] or [[*3,*2], [,*5], [*2,]]}\r\n private _resolutionSteps: {\r\n [key: string]: {\r\n equations: Equation[],\r\n operations: (string[])[]\r\n }[]\r\n };\r\n // Get the solution of the equation\r\n private _solutions: { [letter: string]: ISolution };\r\n\r\n constructor(...equationStrings: (string | Equation)[]) {\r\n // TODO: allow construction to accept an array of values (like a matrix) to build the equations\r\n this._equations = [];\r\n this._letters = 'xyz'.split('');\r\n\r\n if (equationStrings !== undefined && equationStrings.length > 0) {\r\n this.parse(...equationStrings);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n // ------------------------------------------\r\n // Getter and setter\r\n // ------------------------------------------\r\n get equations(): Equation[] {\r\n return this._equations;\r\n }\r\n\r\n set equations(value) {\r\n this._equations = value;\r\n }\r\n\r\n get letters(): string {\r\n return this._letters.join('')\r\n }\r\n\r\n set letters(value: string) {\r\n this._letters = value.split('');\r\n }\r\n\r\n get isSolvable(): boolean {\r\n let V = this.variables;\r\n\r\n // TODO: in some case, it is possible to resolve systems if there isn't the isSame number of vars and equations\r\n if (V.length !== this._equations.length) {\r\n return false;\r\n }\r\n\r\n //TODO: Must check if two equations isn't a linear combination of the others ?\r\n\r\n return true;\r\n }\r\n\r\n get variables(): string[] {\r\n return this._letters\r\n }\r\n\r\n get tex(): string {\r\n // Build the array of values.\r\n // Reorder\r\n // This clone the system :!!!\r\n //TODO: Avoid cloning this linear system\r\n let LS = this.clone().reorder(),\r\n letters = LS.variables\r\n\r\n return this.buildTex(LS.equations)\r\n }\r\n\r\n get solution(): string {\r\n let tex: string[] = [];\r\n\r\n if (this._solutions === undefined) {\r\n this.solve();\r\n }\r\n\r\n for (let letter in this._solutions) {\r\n if (this._solutions[letter].display === \"RR\") {\r\n return `\\\\left\\\\{ \\\\left(${this._letters.join(';')}\\\\right) \\\\big\\\\vert ${this.equations[0].tex} \\\\right\\\\}`;\r\n }\r\n if (this._solutions[letter].display === \"O/\") {\r\n return `\\\\varnothing`\r\n }\r\n\r\n tex.push(this._solutions[letter].tex);\r\n }\r\n return `\\\\left(${tex.join(';')}\\\\right)`;\r\n }\r\n\r\n get solutionAsDisplay(): string {\r\n let display: string[] = [];\r\n\r\n if (this._solutions === undefined) {\r\n this.solve();\r\n }\r\n\r\n for (let letter in this._solutions) {\r\n if (this._solutions[letter].display === \"RR\") {\r\n return `{(${this._letters.join(';')}) | ${this.equations[0].display} }`;\r\n }\r\n if (this._solutions[letter].display === \"O/\") {\r\n return \"O/\"\r\n }\r\n\r\n display.push(this._solutions[letter].display);\r\n }\r\n return `(${display.join(';')})`;\r\n }\r\n\r\n buildTex = (equations: Equation[], operators?: (string[])[]): string => {\r\n let equStr: string[],\r\n equArray: string[] = [],\r\n m: Monom,\r\n letters: string[] = []\r\n\r\n // Get the letters from the linear system\r\n for (let equ of equations) {\r\n letters = letters.concat(equ.letters())\r\n }\r\n letters = [...new Set(letters)]\r\n letters.sort()\r\n\r\n for (let i = 0; i < equations.length; i++) {\r\n let equ = equations[i]\r\n\r\n equStr = [];\r\n for (let L of letters) {\r\n m = equ.left.monomByLetter(L);\r\n\r\n if (equStr.length === 0) {\r\n equStr.push(m.isZero() ? '' : m.tex);\r\n } else {\r\n equStr.push(m.isZero() ? '' : ((m.coefficient.sign() === 1) ? '+' : '') + m.tex);\r\n }\r\n }\r\n\r\n // Add the equal sign\r\n equStr.push('=');\r\n\r\n // Add the right hand part of the equation (should be only a number, because it has been reordered)\r\n equStr.push(equ.right.tex);\r\n\r\n // Add the operations if existing\r\n if (operators !== undefined && operators[i] !== undefined) {\r\n // add extra space at the end of the equation\r\n equStr[equStr.length - 1] = equStr[equStr.length - 1] + ' \\\\phantom{\\\\quad}'\r\n for (let o of operators[i]) {\r\n equStr.push(`\\\\ \\\\cdot\\\\ ${o.startsWith('-') ? \"\\\\left(\" + o + \"\\\\right)\" : o}`)\r\n }\r\n }\r\n\r\n // Add to the list.\r\n equArray.push(equStr.join('&'));\r\n }\r\n\r\n let operatorsColumns = 0\r\n if (operators !== undefined && operators.length > 0) {\r\n operatorsColumns = operators[0].length\r\n }\r\n return `\\\\left\\\\{\\\\begin{array}{${\"r\".repeat(letters.length)}cl ${\"|l\".repeat(operatorsColumns)}}${equArray.join('\\\\\\\\\\ ')}\\\\end{array}\\\\right.`;\r\n }\r\n\r\n stepTex = (letter: string): string => {\r\n const steps = this._resolutionSteps[letter]\r\n\r\n if (steps === undefined) {\r\n return ''\r\n }\r\n\r\n // steps = { equations[], operations: [[],[]]\r\n let tex: string[] = []\r\n for (let i = 0; i < steps.length; i++) {\r\n tex.push(this.buildTex(steps[i].equations, steps[i].operations))\r\n }\r\n\r\n return `\\\\begin{aligned}&${tex.join('\\\\\\\\&')}\\\\end{aligned}`\r\n\r\n }\r\n\r\n\r\n get resolutionSteps(): { [p: string]: { equations: Equation[]; operations: string[][] }[] } {\r\n return this._resolutionSteps;\r\n }\r\n\r\n// ------------------------------------------\r\n // Creation / parsing functions\r\n\r\n // ------------------------------------------\r\n parse = (...equations: (string | Equation)[]): LinearSystem => {\r\n // make the original equations\r\n this._equations = equations.map(value => new Equation(value));\r\n // get the letters.\r\n this._findLetters();\r\n return this;\r\n };\r\n\r\n clone = (): LinearSystem => {\r\n return new LinearSystem().parse(...this._equations.map(equ => equ.clone()));\r\n };\r\n\r\n // ------------------------------------------\r\n reorder = (): LinearSystem => {\r\n for (let E of this._equations) {\r\n E.reorder();\r\n }\r\n return this;\r\n };\r\n\r\n\r\n // -----------------------------------------------\r\n // Equations solving algorithms\r\n\r\n solve = (withResolution?: boolean): LinearSystem => {\r\n // Solve it by linear\r\n this._solutions = {};\r\n this._resolutionSteps = {};\r\n\r\n // Reorder all equations.\r\n this.reorder();\r\n\r\n if (withResolution === undefined) {\r\n withResolution = false\r\n }\r\n\r\n for (let letter of this.variables) {\r\n this._solutions[letter] = this._solveOneLetter(letter, withResolution)\r\n }\r\n\r\n // TODO: LinearSystem - solve: optimization and handle undetermined and undefined systems.\r\n return this;\r\n };\r\n\r\n mergeEquations = (eq1: Equation, eq2: Equation, factor1: Fraction, factor2: Fraction): Equation => {\r\n // Set and clone the equations.\r\n\r\n let eq1multiplied = eq1.clone().multiply(new Fraction(factor1)),\r\n eq2multiplied = eq2.clone().multiply(new Fraction(factor2));\r\n\r\n // Add both equations together.\r\n eq1multiplied.left.add(eq2multiplied.left);\r\n eq1multiplied.right.add(eq2multiplied.right);\r\n\r\n return eq1multiplied;\r\n }\r\n\r\n private _findLetters = (): LinearSystem => {\r\n // Find all letters used.\r\n let variables: Set<string> = new Set();\r\n\r\n for (let equ of this._equations) {\r\n variables = new Set([...variables, ...equ.variables]);\r\n }\r\n\r\n this._letters = [...variables];\r\n this._letters.sort()\r\n return this;\r\n }\r\n\r\n private _linearReduction(eq1: Equation, eq2: Equation, letter: string): { merged: Equation, factors: Fraction[] } {\r\n // Get the monom for the particular letter.\r\n let c1 = eq1.left.monomByDegree(1, letter).coefficient.clone(),\r\n c2 = eq2.left.monomByDegree(1, letter).coefficient.clone().opposed();\r\n\r\n // Reduce c1 and c2 by the gcd\r\n const gcdN = Numeric.gcd(c1.numerator, c2.numerator),\r\n gcdD = Numeric.gcd(c1.denominator, c2.denominator)\r\n c1.divide(gcdN).multiply(gcdD)\r\n c2.divide(gcdN).multiply(gcdD)\r\n\r\n // if one value is -1, use 1 and make the other one opposed\r\n if (c2.isNegativeOne()) {\r\n c1.opposed()\r\n c2.opposed()\r\n } else if (c1.isNegativeOne()) {\r\n c1.opposed()\r\n c2.opposed()\r\n }\r\n\r\n return {\r\n merged: this.mergeEquations(eq1, eq2, c2, c1),\r\n factors: [c2, c1]\r\n }\r\n }\r\n\r\n /**\r\n * Linear reduction of the equations to have only one letter\r\n * @param letter letter to isolate\r\n * @private\r\n */\r\n private _solveOneLetter(letter: string, withResolution: boolean): ISolution {\r\n // list of equations.\r\n let LE: Equation[] = this.clone().equations,\r\n reducedEquations: Equation[] = [],\r\n lastIndex\r\n\r\n this._resolutionSteps[letter] = []\r\n\r\n // Reduce the equations.\r\n // Do it as long as there is more than one step, but no more than the number of equations.\r\n for (let L of this.variables) {\r\n // Reset the stack\r\n reducedEquations = [];\r\n\r\n // remove the setLetter from all equations using linear combinations\r\n if (L === letter) continue;\r\n\r\n if (withResolution) {\r\n this._resolutionSteps[letter].push({\r\n equations: LE.map(x => x.clone()),\r\n operations: [...new Array(LE.length)].map(x => [...new Array(LE.length - 1)].map(x => \"\"))\r\n })\r\n lastIndex = this._resolutionSteps[letter].length - 1\r\n }\r\n\r\n // Linear reduction.\r\n for (let i = 0; i < LE.length - 1; i++) {\r\n const result = this._linearReduction(LE[i], LE[i + 1], L)\r\n reducedEquations.push(result.merged)\r\n\r\n if (withResolution) {\r\n this._resolutionSteps[letter][lastIndex].operations[i][i] = result.factors[0].tex\r\n this._resolutionSteps[letter][lastIndex].operations[i + 1][i] = result.factors[1].tex\r\n }\r\n }\r\n\r\n LE = [...reducedEquations]\r\n }\r\n\r\n // Solve the equations\r\n // let E = this._resolutionSteps[this._resolutionSteps.length - 1].equations[0];\r\n let E = LE[0];\r\n E.solve()\r\n const solution = E.solutions[0]\r\n\r\n if (withResolution) {\r\n this._resolutionSteps[letter].push({\r\n equations: [LE[0]],\r\n operations: [[LE[0].left.monoms[0].coefficient.tex]]\r\n })\r\n\r\n let P: Polynom\r\n if (solution.exact instanceof Fraction || typeof solution.exact === \"string\") {\r\n P = new Polynom(solution.exact)\r\n } else {\r\n P = new Polynom(solution.value)\r\n }\r\n this._resolutionSteps[letter].push({\r\n equations: [new Equation(new Polynom(letter), P)],\r\n operations: []\r\n })\r\n\r\n }\r\n return E.solutions[0]\r\n }\r\n\r\n}\r\n","/**\r\n * Polynom module contains everything necessary to handle polynoms.\r\n * @module Logicalset\r\n */\r\n\r\nimport {Shutingyard, ShutingyardMode} from '../shutingyard';\r\n\r\n/**\r\n * Polynom class can handle polynoms, reorder, resolve, ...\r\n */\r\n export class Logicalset {\r\n private _rawString: string;\r\n private _rpn: { token: string, tokenType: string }[]\r\n\r\n /**\r\n *\r\n * @param {string} value (optional) Default polynom to parse on class creation\r\n */\r\n constructor(value: string) {\r\n this._rawString = value\r\n this.parse(value)\r\n return this;\r\n }\r\n\r\n get isLogicalset() {\r\n return true;\r\n };\r\n\r\n private parse = (value: string): Logicalset => {\r\n // TODO: Must format the value string to convert some items...\r\n\r\n // Parse the updated value to the shutingyard algorithm\r\n this._rpn = new Shutingyard(ShutingyardMode.SET).parse(value).rpn;\r\n\r\n return this;\r\n }\r\n\r\n evaluate(tokenSets: { [key: string]: unknown[] }, reference?: unknown[]): unknown[] {\r\n let varStack: (Set<unknown>)[] = []\r\n\r\n let referenceSet: Set<unknown>\r\n if (reference === undefined) {\r\n referenceSet = new Set()\r\n for (let key in tokenSets) {\r\n referenceSet = new Set([...referenceSet, ...tokenSets[key]])\r\n }\r\n } else {\r\n referenceSet = new Set(reference)\r\n }\r\n\r\n for (let token of this._rpn) {\r\n if (token.tokenType === 'variable') {\r\n // The variable has no token - assume it's empty.\r\n if (tokenSets[token.token] === undefined) {\r\n varStack.push(new Set())\r\n } else {\r\n varStack.push(new Set(tokenSets[token.token]));\r\n }\r\n\r\n } else {\r\n switch (token.token) {\r\n case '&':\r\n if (varStack.length >= 2) {\r\n let second = varStack.pop(),\r\n first = varStack.pop()\r\n\r\n varStack.push(new Set([...first].filter(x => second.has(x))))\r\n }\r\n break\r\n case '|':\r\n if (varStack.length >= 2) {\r\n let second = varStack.pop(),\r\n first = varStack.pop()\r\n varStack.push(new Set([...first, ...second]))\r\n }\r\n break\r\n case '-':\r\n if (varStack.length >= 2) {\r\n let second = varStack.pop(),\r\n first = varStack.pop()\r\n varStack.push(new Set([...first].filter(x => !second.has(x))))\r\n }\r\n break\r\n case '!':\r\n if (varStack.length >= 1) {\r\n let first = varStack.pop()\r\n\r\n varStack.push(new Set([...referenceSet].filter(x => !first.has(x))))\r\n }\r\n break\r\n }\r\n }\r\n }\r\n\r\n return [...varStack[0]].sort();\r\n }\r\n\r\n vennAB(): any[] {\r\n return this.evaluate({\r\n A: ['A', 'AB'],\r\n B: ['B', 'AB']\r\n },\r\n ['A', 'B', 'AB', 'E']\r\n )\r\n }\r\n\r\n vennABC(): any[] {\r\n return this.evaluate({\r\n A: ['A', 'AB', 'AC', 'ABC'],\r\n B: ['B', 'AB', 'BC', 'ABC'],\r\n C: ['C', 'AC', 'BC', 'ABC']\r\n },\r\n ['A', 'B', 'C', 'AB', 'AC', 'BC', 'E']\r\n )\r\n }\r\n\r\n get rpn(): { token: string, tokenType: string }[] {\r\n return this._rpn\r\n }\r\n\r\n get tex(): string {\r\n let varStack: { token: string, tokenType: string } [] = []\r\n\r\n for (let token of this._rpn) {\r\n if (token.tokenType === 'variable') {\r\n varStack.push(token);\r\n } else {\r\n switch (token.token) {\r\n case '&':\r\n if (varStack.length >= 2) {\r\n let second = varStack.pop(),\r\n first = varStack.pop()\r\n\r\n if (first.tokenType === 'mix') {\r\n first.token = `( ${first.token} )`\r\n }\r\n if (second.tokenType === 'mix') {\r\n second.token = `( ${second.token} )`\r\n }\r\n varStack.push({token: `${first.token} \\\\cap ${second.token}`, tokenType: 'mix'})\r\n }\r\n break\r\n case '|':\r\n if (varStack.length >= 2) {\r\n let second = varStack.pop(),\r\n first = varStack.pop()\r\n\r\n if (first.tokenType === 'mix') {\r\n first.token = `( ${first.token} )`\r\n }\r\n if (second.tokenType === 'mix') {\r\n second.token = `( ${second.token} )`\r\n }\r\n varStack.push({token: `${first.token} \\\\cup ${second.token}`, tokenType: 'mix'})\r\n }\r\n break\r\n case '-':\r\n if (varStack.length >= 2) {\r\n let second = varStack.pop(),\r\n first = varStack.pop()\r\n\r\n if (first.tokenType === 'mix') {\r\n first.token = `( ${first.token} )`\r\n }\r\n if (second.tokenType === 'mix') {\r\n second.token = `( ${second.token} )`\r\n }\r\n varStack.push({token: `${first.token} \\\\setminus ${second.token}`, tokenType: 'mix'})\r\n }\r\n break\r\n case '!':\r\n if (varStack.length >= 1) {\r\n let first = varStack.pop()\r\n varStack.push({token: `\\\\overline{ ${first.token} }`, tokenType: 'variable'})\r\n }\r\n break\r\n }\r\n }\r\n }\r\n\r\n return varStack[0].token\r\n }\r\n }","/***\r\n * Monom class\r\n */\r\nimport {Numeric} from \"../numeric\";\r\nimport {Shutingyard, ShutingyardType, Token} from \"../shutingyard\";\r\nimport {Fraction} from \"../coefficients/fraction\";\r\n\r\nexport type literalType = {\r\n [Key: string]: Fraction\r\n}\r\n\r\nexport class Monom {\r\n private _coefficient: Fraction;\r\n private _literal: literalType;\r\n\r\n /**\r\n * Create a Monom\r\n * Defined as \\\\(k \\\\cdot x^{n}\\\\), where \\\\( k,n \\in \\\\mathbb{Q}\\\\).\r\n * Examples: \\\\(3x^2\\\\) or \\\\(3/5x^2\\\\)\r\n * @param value (optional) string The value that should be parse. Can be a Monom, a Fraction, a string or a number. If nothing is provided, it will return the trivial monom (0).\r\n */\r\n constructor(value?: unknown) {\r\n this.zero();\r\n\r\n if (value !== undefined) {\r\n // A string is given - try to parse the value.\r\n this.parse(value);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n // ------------------------------------------\r\n // Getter and setter\r\n // ------------------------------------------\r\n /**\r\n * Get the coefficient \\\\(k\\\\) of the Monom \\\\(k\\\\cdot x^{n}\\\\)\r\n * @returns {Fraction}\r\n */\r\n get coefficient(): Fraction {\r\n return this._coefficient;\r\n }\r\n\r\n /**\r\n * Set the coefficient \\\\(k\\\\) value of the monom\r\n * @param {Fraction | number | string} F\r\n */\r\n set coefficient(F: Fraction | number | string) {\r\n this._coefficient = new Fraction(F);\r\n }\r\n\r\n /**\r\n * Get the literal part of \\\\(x^{n_1}y^{n_2}\\\\) as dictionary \\\\[\\\\begin{array}{ll}x&=n_1\\\\\\\\y&=n_2\\\\end{array}\\\\]\r\n * @returns {literalType}\r\n */\r\n get literal(): literalType {\r\n return this._literal;\r\n }\r\n\r\n /**\r\n * Get the literal square roots of the Monom.\r\n * TODO: remove this getter ? Is it used and is it correct ?\r\n * @returns {literalType}\r\n */\r\n get literalSqrt(): literalType {\r\n if (this.isLiteralSquare()) {\r\n let L: literalType = {}\r\n for (let key in this._literal) {\r\n L[key] = this._literal[key].clone().sqrt()\r\n }\r\n return L;\r\n } else {\r\n return this._literal;\r\n }\r\n }\r\n\r\n /**\r\n * Set the literal part of the monom. Must be a dictionary {x: Fraction, y: Fraction, ...}\r\n * @param {literalType} L\r\n */\r\n set literal(L: literalType) {\r\n this._literal = L;\r\n }\r\n\r\n /**\r\n * Set the literal part of the monom from a string\r\n * @param inputStr String like x^2y^3\r\n */\r\n set literalStr(inputStr: string) {\r\n // TODO : parse using shutingyard tree !\r\n\r\n // Match all x^n\r\n for (const v of [...inputStr.matchAll(/([a-z])\\^([+-]?[0-9]+)/g)]) {\r\n // Create the default letter entry if necessary.\r\n if (!(v[1] in this._literal)) {\r\n this._literal[v[1]] = new Fraction().zero();\r\n }\r\n\r\n // Add the new value.\r\n // TODO: actually, it adds only numeric value\r\n this._literal[v[1]].add(+v[2]);\r\n }\r\n\r\n // Match all x\r\n for (const v of [...inputStr.matchAll(/([a-z](?!\\^))/g)]) {\r\n // Match all single letters\r\n if (!(v[1] in this._literal)) {\r\n this._literal[v[1]] = new Fraction().zero();\r\n }\r\n\r\n // Add one to the value.\r\n this._literal[v[1]].add(1)\r\n }\r\n }\r\n\r\n // Getter helpers.\r\n /**\r\n * Get the variables letters\r\n */\r\n get variables(): string[] {\r\n let M = this.clone().clean();\r\n return Object.keys(M.literal)\r\n }\r\n\r\n // Display getter\r\n /**\r\n * This display getter is to be used in the polynom display getter\r\n */\r\n get display(): string {\r\n let L: string = '',\r\n letters = Object.keys(this._literal).sort()\r\n for (let letter of letters) {\r\n if (this._literal[letter].isNotZero()) {\r\n L += `${letter}`;\r\n if (this._literal[letter].isNotEqual(1)) {\r\n L += `^(${this._literal[letter].display})`;\r\n }\r\n }\r\n }\r\n\r\n if (L === '') {\r\n // No setLetter - means it's only a number !\r\n if (this._coefficient.value != 0) {\r\n return `${this._coefficient.display}`;\r\n } else {\r\n return '';\r\n }\r\n } else {\r\n if (this._coefficient.value === 1) {\r\n return L;\r\n } else if (this._coefficient.value === -1) {\r\n return `-${L}`;\r\n } else if (this._coefficient.value === 0) {\r\n return '0';\r\n } else {\r\n return `${this._coefficient.display}${L}`;\r\n }\r\n }\r\n }\r\n\r\n get dividers(): Monom[] {\r\n // Decompose only if the coefficient is a natural number\r\n if (!this.coefficient.isRelative()) {\r\n return [this.clone()]\r\n }\r\n\r\n\r\n // Decompose only if the power values are natural numbers.\r\n if (this.hasFractionCoefficient()) {\r\n return [this.clone()]\r\n }\r\n\r\n // Security : do not do this if greater than 10000\r\n if (this.coefficient.numerator > 1000000) {\r\n return [this.clone()]\r\n }\r\n\r\n const dividers = Numeric.dividers(Math.abs(this.coefficient.numerator))\r\n\r\n // Decompose the literals parts.\r\n let literals: literalType[] = [];\r\n for (let L in this.literal) {\r\n // L is the letter.\r\n literals = this._getLiteralDividers(literals, L)\r\n }\r\n\r\n const monomDividers: Monom[] = [];\r\n if (literals.length > 0 && dividers.length > 0) {\r\n for (let N of dividers) {\r\n for (let L of literals) {\r\n let M = new Monom();\r\n M.coefficient = new Fraction(N)\r\n M.literal = L\r\n monomDividers.push(M)\r\n }\r\n }\r\n } else if (dividers.length === 0) {\r\n for (let L of literals) {\r\n let M = new Monom();\r\n M.coefficient = new Fraction().one()\r\n M.literal = L\r\n monomDividers.push(M)\r\n }\r\n } else {\r\n for (let N of dividers) {\r\n let M = new Monom();\r\n M.coefficient = new Fraction(N)\r\n monomDividers.push(M)\r\n }\r\n }\r\n\r\n return monomDividers.length === 0 ? [new Monom().one()] : monomDividers;\r\n }\r\n\r\n private _getLiteralDividers(arr: literalType[], letter: string): literalType[] {\r\n let tmpList: { [key: string]: Fraction }[] = [];\r\n\r\n // Be default, this.literal[letter] should be a rational number.\r\n for (let d = 0; d <= this.literal[letter].value; d++) {\r\n if (arr.length === 0) {\r\n let litt: literalType = {}\r\n litt[letter] = new Fraction(d)\r\n tmpList.push(litt)\r\n } else {\r\n for (let item of arr) {\r\n let litt: literalType = {}\r\n for (let currentLetter in item) {\r\n litt[currentLetter] = item[currentLetter]\r\n }\r\n litt[letter] = new Fraction(d)\r\n tmpList.push(litt)\r\n }\r\n }\r\n }\r\n return tmpList;\r\n }\r\n\r\n /**\r\n * Display the monom, forcing the '+' sign to appear\r\n */\r\n get displayWithSign(): string {\r\n let d: String = this.display;\r\n return (d[0] !== '-' ? '+' : '') + d;\r\n }\r\n\r\n get texWithSign(): string {\r\n if (this.coefficient.isStrictlyPositive()) {\r\n return '+' + this.tex\r\n }\r\n\r\n return this.tex\r\n }\r\n\r\n get plotFunction(): string {\r\n\r\n let L: string = '',\r\n letters = Object.keys(this._literal).sort()\r\n\r\n for (let letter of letters) {\r\n if (this._literal[letter].isNotZero()) {\r\n L += (L===''?\"\":\"*\") + `${letter}`\r\n if (this._literal[letter].isNotEqual(1)) {\r\n L += `^(${this._literal[letter].display})`;\r\n }\r\n }\r\n }\r\n\r\n // No literal part\r\n if (L === '') {\r\n // No setLetter - means it's only a number !\r\n if (this._coefficient.value != 0) {\r\n return `${this._coefficient.display}`;\r\n } else {\r\n return '';\r\n }\r\n } else {\r\n if (this._coefficient.value === 1) {\r\n return L;\r\n } else if (this._coefficient.value === -1) {\r\n return `-${L}`;\r\n } else if (this._coefficient.value === 0) {\r\n return '0';\r\n } else {\r\n return `${this._coefficient.display}*${L}`;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Get the tex output of the monom\r\n */\r\n get tex(): string {\r\n // TODO: display with square root !\r\n let L: string = '',\r\n letters = Object.keys(this._literal).sort()\r\n\r\n for (let letter of letters) {\r\n if (this._literal[letter].isNotZero()) {\r\n L += `${letter}`;\r\n if (this._literal[letter].isNotEqual(1)) {\r\n L += `^{${this._literal[letter].tfrac}}`;\r\n }\r\n }\r\n }\r\n\r\n if (L === '') {\r\n // No setLetter - means it's only a number !\r\n if (this._coefficient.value != 0) {\r\n return `${this._coefficient.frac}`;\r\n } else {\r\n return '0';\r\n }\r\n } else {\r\n if (this._coefficient.value === 1) {\r\n return L;\r\n } else if (this._coefficient.value === -1) {\r\n return `-${L}`;\r\n } else if (this._coefficient.value === 0) {\r\n return '0';\r\n } else {\r\n return `${this._coefficient.frac}${L}`;\r\n }\r\n }\r\n }\r\n\r\n // ------------------------------------------\r\n // Creation / parsing functions\r\n // -----------------------------------------\r\n /**\r\n * Parse a string to a monom. The string may include fraction.\r\n * @param inputStr\r\n */\r\n parse = (inputStr: unknown): Monom => {\r\n\r\n if (typeof inputStr === 'string') {\r\n this._shutingYardToReducedMonom(inputStr)\r\n } else if (typeof inputStr === 'number') {\r\n this._coefficient = new Fraction(inputStr)\r\n this._literal = {}\r\n } else if (inputStr instanceof Fraction) {\r\n this._coefficient = inputStr.clone()\r\n this._literal = {}\r\n } else if (inputStr instanceof Monom) {\r\n this._coefficient = inputStr._coefficient.clone()\r\n this._literal = this.copyLiterals(inputStr.literal)\r\n }\r\n\r\n return this;\r\n };\r\n\r\n addToken = (stack: Monom[], element: Token): void => {\r\n\r\n let q1: Monom, q2: Monom, m: Monom, letter: string, pow: Fraction\r\n\r\n if (element.tokenType === ShutingyardType.COEFFICIENT) {\r\n stack.push(new Monom(new Fraction(element.token)))\r\n\r\n } else if (element.tokenType === ShutingyardType.VARIABLE) {\r\n let M = new Monom().one()\r\n M.setLetter(element.token, 1)\r\n stack.push(M.clone())\r\n\r\n } else if (element.tokenType === ShutingyardType.OPERATION) {\r\n switch (element.token) {\r\n case '-':\r\n // this should only happen for negative powers or for negative coefficient.\r\n q2 = (stack.pop()) || new Monom().zero()\r\n q1 = (stack.pop()) || new Monom().zero()\r\n\r\n stack.push(q1.subtract(q2))\r\n\r\n break;\r\n case '*':\r\n // Get the last element in the stack\r\n q2 = (stack.pop()) || new Monom().one()\r\n q1 = (stack.pop()) || new Monom().one()\r\n\r\n stack.push(q1.multiply(q2))\r\n break\r\n case '/':\r\n // Get the last element in the stack\r\n q2 = (stack.pop()) || new Monom().one()\r\n q1 = (stack.pop()) || new Monom().one()\r\n\r\n stack.push(q1.divide(q2))\r\n break\r\n case '^':\r\n // get the two last elements in the stack\r\n pow = (stack.pop().coefficient) || new Fraction().one()\r\n m = (stack.pop()) || new Monom().one()\r\n\r\n letter = m.variables[0]\r\n\r\n if (letter !== undefined) {\r\n m.setLetter(letter, pow)\r\n }\r\n\r\n stack.push(m)\r\n // this.multiply(m.clone())\r\n break\r\n }\r\n }\r\n }\r\n private _shutingYardToReducedMonom = (inputStr: string): Monom => {\r\n // Get the RPN array of the current expression\r\n const SY: Shutingyard = new Shutingyard().parse(inputStr);\r\n const rpn: { token: string, tokenType: string }[] = SY.rpn;\r\n\r\n let stack: Monom[] = [], m, pow, letter, q1, q2\r\n\r\n if (rpn.length === 0) {\r\n this.zero()\r\n return this\r\n } else if (rpn.length === 1) {\r\n const element = rpn[0]\r\n\r\n this.one()\r\n if (element.tokenType === 'coefficient') {\r\n this.coefficient = new Fraction(element.token)\r\n } else if (element.tokenType === 'variable') {\r\n this.setLetter(element.token, 1)\r\n }\r\n return this\r\n } else {\r\n // Reset the monom\r\n for (const element of rpn) {\r\n this.addToken(stack, element)\r\n }\r\n }\r\n\r\n this.one()\r\n this.multiply(stack[0])\r\n return this\r\n }\r\n /**\r\n * Clone the current Monom.\r\n */\r\n clone = (): Monom => {\r\n let F: Monom = new Monom();\r\n\r\n F.coefficient = this._coefficient.clone();\r\n\r\n // Copy the literal parts.\r\n for (let k in this._literal) {\r\n F.setLetter(k, this._literal[k].clone());\r\n }\r\n return F;\r\n };\r\n\r\n copyLiterals = (literal: literalType): literalType => {\r\n let L: literalType = {}\r\n\r\n for (let k in literal) {\r\n L[k] = literal[k].clone()\r\n }\r\n return L\r\n }\r\n\r\n makeSame = (M: Monom): Monom => {\r\n // Copy the literal parts.\r\n for (let k in M._literal) {\r\n this.setLetter(k, M._literal[k].clone());\r\n }\r\n return this\r\n }\r\n\r\n /**\r\n * Create a zero value monom\r\n */\r\n zero = (): Monom => {\r\n this._coefficient = new Fraction().zero();\r\n this._literal = {};\r\n return this;\r\n };\r\n\r\n /**\r\n * Create a one value monom\r\n */\r\n one = (): Monom => {\r\n this._coefficient = new Fraction().one();\r\n this._literal = {};\r\n return this;\r\n };\r\n\r\n /**\r\n * Clean the monom by removing each letters with a power of zero.\r\n */\r\n clean = (): Monom => {\r\n for (let letter in this._literal) {\r\n if (this._literal[letter].isZero()) {\r\n delete this._literal[letter];\r\n }\r\n }\r\n return this;\r\n };\r\n\r\n reduce = (): Monom => {\r\n this.clean()\r\n this.coefficient.reduce()\r\n return this\r\n }\r\n\r\n // ------------------------------------------\r\n // Mathematical operations\r\n // ------------------------------------------\r\n\r\n /**\r\n * Get the opposed\r\n * Returns a monom.\r\n */\r\n opposed = (): Monom => {\r\n this._coefficient.opposed();\r\n return this;\r\n };\r\n\r\n /**\r\n * Add all similar monoms. If they aren't similar, they are simply skipped.\r\n * @param M (Monom[]) The monoms to add.\r\n */\r\n add = (...M: Monom[]): Monom => {\r\n for (let m of M) {\r\n if (this.isSameAs(m)) {\r\n if (this.isZero()) {\r\n this.makeSame(m)\r\n }\r\n this._coefficient.add(m.coefficient);\r\n } else {\r\n console.log('Add monom: ' + this.display + ' is not similar with ', m.display);\r\n }\r\n }\r\n return this;\r\n };\r\n\r\n /**\r\n * Subtract multiple monoms\r\n * @param M (Monom[]) The monoms to subtract\r\n */\r\n subtract = (...M: Monom[]): Monom => {\r\n for (let m of M) {\r\n if (this.isSameAs(m)) {\r\n if (this.isZero()) {\r\n this.makeSame(m)\r\n }\r\n this._coefficient.add(m.clone().coefficient.opposed());\r\n } else {\r\n console.log('Subtract: Is not similar: ', m.display);\r\n }\r\n }\r\n return this;\r\n };\r\n\r\n /**\r\n * Multiple multiple monoms to the current monom\r\n * @param M (Monom[]) The monoms to multiply to.\r\n */\r\n multiply = (...M: Monom[]): Monom => {\r\n for (let m of M) {\r\n // Multiply the coefficient.\r\n this._coefficient.multiply(m.coefficient);\r\n\r\n // Multiply the literal parts.\r\n for (let letter in m.literal) {\r\n if (this._literal[letter] === undefined) {\r\n this._literal[letter] = m.literal[letter].clone()\r\n } else {\r\n this._literal[letter].add(m.literal[letter])\r\n }\r\n\r\n }\r\n }\r\n return this;\r\n };\r\n\r\n multiplyByNumber = (F: Fraction | number): Monom => {\r\n this._coefficient.multiply(F);\r\n return this;\r\n }\r\n\r\n /**\r\n * Divide the current monoms by multiple monoms\r\n * @param M (Monom[])\r\n */\r\n divide = (...M: Monom[]): Monom => {\r\n // Depending on the given value, choose the current item\r\n for (let v of M) {\r\n // Divide the coefficient\r\n this._coefficient.divide(v.coefficient);\r\n\r\n // Subtract the power values\r\n for (let letter in v.literal) {\r\n this._literal[letter] = (this._literal[letter] === undefined) ? v.literal[letter].clone().opposed() : this._literal[letter].subtract(v.literal[letter])\r\n\r\n // If the power of a particular setLetter is zero, delete it from the literal part..\r\n if (this._literal[letter].isZero()) {\r\n delete this._literal[letter];\r\n }\r\n }\r\n }\r\n return this;\r\n };\r\n\r\n /**\r\n * Get the pow of a monom.\r\n * @param nb (number) : Mathematical pow\r\n */\r\n pow = (nb: number|Fraction): Monom => {\r\n this._coefficient.pow(nb);\r\n for (let letter in this._literal) {\r\n this._literal[letter].multiply(nb)\r\n }\r\n return this;\r\n };\r\n\r\n /**\r\n * Get the nth-root of the monom\r\n * @param p\r\n */\r\n root = (p: number): Monom => {\r\n // TODO: determiner the nth root of a monom\r\n return this;\r\n }\r\n\r\n /**\r\n * Return the square root of a monom\r\n */\r\n sqrt = (): Monom => {\r\n if (this.isSquare()) {\r\n this._coefficient.sqrt();\r\n for (let letter in this._literal) {\r\n this._literal[letter].clone().divide(2)\r\n }\r\n }\r\n return this.root(2);\r\n }\r\n\r\n // ------------------------------------------\r\n // Compare functions\r\n // ------------------------------------------\r\n compare = (M: Monom, sign?: string): boolean => {\r\n // TODO: Build the compare systems.\r\n if (sign === undefined) {\r\n sign = '=';\r\n }\r\n\r\n\r\n switch (sign) {\r\n case '=':\r\n // To be equal, they must be the isSame\r\n if (!this.compare(M, 'same')) {\r\n return false;\r\n }\r\n\r\n // The literal parts are the isSame. The coefficient must be equal\r\n return this._coefficient.isEqual(M.coefficient);\r\n case 'same':\r\n // Get the list of all variables from both monoms.\r\n let M1: string[] = this.variables,\r\n M2: string[] = M.variables,\r\n K: string[] = M1.concat(M2.filter((item) => M1.indexOf(item) < 0));\r\n\r\n if(M1.length===0 && M2.length===0){return true}\r\n // To compare, both must be different than zero.\r\n if (!this.isZero() && !M.isZero()) {\r\n for (let key of K) {\r\n // The setLetter is not available in one of the monom\r\n if (this._literal[key] === undefined || M.literal[key] === undefined) {\r\n return false;\r\n }\r\n // The setLetter does not have the isSame power in each monoms.\r\n if (!this._literal[key].isEqual(M.literal[key])) {\r\n return false;\r\n }\r\n }\r\n }\r\n\r\n // All are positive check - the monoms are the sames.\r\n return true;\r\n default:\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Determine if the monom is null\r\n */\r\n isZero(): boolean {\r\n return this._coefficient.value === 0;\r\n }\r\n\r\n /**\r\n * Determine if the monom is one\r\n */\r\n isOne(): boolean {\r\n return this._coefficient.value === 1 && this.variables.length === 0;\r\n }\r\n\r\n /**\r\n * Determine if two monoms are equals\r\n * @param M\r\n */\r\n isEqual = (M: Monom): boolean => {\r\n return this.compare(M, '=');\r\n };\r\n\r\n /**\r\n * Determine if two monoms are similar\r\n * @param M\r\n */\r\n isSameAs = (M: Monom): boolean => {\r\n return this.compare(M, 'same');\r\n };\r\n\r\n isSquare = (): boolean => {\r\n if (!this.coefficient.isSquare()) {\r\n return false;\r\n }\r\n return this.isLiteralSquare();\r\n }\r\n\r\n isLiteralSquare = (): boolean => {\r\n for (let letter in this.literal) {\r\n // A literal square must have a natural power\r\n if (this.literal[letter].isRational()) {\r\n return false\r\n }\r\n\r\n // The natural power must be be even\r\n if (this.literal[letter].isEven()) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n hasFractionCoefficient = (): boolean => {\r\n for (let letter in this._literal) {\r\n if (this._literal[letter].isRational()) {\r\n return true\r\n }\r\n }\r\n\r\n return false\r\n }\r\n // ------------------------------------------\r\n // Misc monoms functions\r\n // -------------------------------------\r\n /**\r\n * Determine if a monom contains a setLetter in it's literal part\r\n * @param letter\r\n */\r\n hasLetter = (letter?: string): boolean => {\r\n // The letter was not found\r\n if (this._literal[letter === undefined ? 'x' : letter] === undefined) {\r\n return false\r\n }\r\n\r\n // The letter is found and is not zero !\r\n return this._literal[letter === undefined ? 'x' : letter].isNotZero();\r\n };\r\n\r\n /**\r\n * Set the power of a particular setLetter\r\n * @param letter (string) Letter to change\r\n * @param pow (number) Power of the setLetter (must be positive integer.\r\n */\r\n setLetter = (letter: string, pow: Fraction | number): void => {\r\n if (pow instanceof Fraction) {\r\n // Set the power of the letter to zero => remove it\r\n if (this.hasLetter(letter) && pow.isZero()) {\r\n delete this._literal[letter]\r\n }\r\n\r\n this._literal[letter] = pow.clone()\r\n } else {\r\n this.setLetter(letter, new Fraction(pow))\r\n }\r\n };\r\n\r\n /**\r\n * Get the degree of a monom. If no setLetter is given, the result will be the global degree.\r\n * @param letter (string) Letter to get to degree (power)\r\n */\r\n degree = (letter?: string): Fraction => {\r\n if (this.variables.length === 0) {\r\n return new Fraction().zero();\r\n }\r\n if (letter === undefined) {\r\n // Not setLetter given -> we get the global monom degree (sum of all the letters).\r\n return Object.values(this._literal).reduce((t, n) => t.clone().add(n));\r\n } else {\r\n // A setLetter is given -> get the corresponding power.\r\n return this._literal[letter] === undefined ? new Fraction().zero() : this._literal[letter].clone();\r\n }\r\n };\r\n\r\n /**\r\n * Evaluate a monom. Each setLetter must be assigned to a Fraction.\r\n * @param values Dictionary of <setLetter: Fraction>\r\n */\r\n evaluate = (values: literalType | Fraction | number): Fraction => {\r\n let r = this.coefficient.clone();\r\n\r\n if (typeof values === 'number' || values instanceof Fraction) {\r\n let tmpValues: literalType = {}\r\n tmpValues[this.variables[0]] = new Fraction(values)\r\n return this.evaluate(tmpValues);\r\n }\r\n\r\n if (typeof values === 'object') {\r\n if(this.variables.length===0){\r\n return this.coefficient\r\n }\r\n for (let L in this._literal) {\r\n if (values[L] === undefined) {\r\n return new Fraction().zero();\r\n }\r\n\r\n let value = new Fraction(values[L])\r\n\r\n r.multiply(value.pow(this._literal[L]))\r\n }\r\n }\r\n\r\n return r;\r\n };\r\n\r\n evaluateAsNumeric = (values: { [Key: string]: number } | number): number => {\r\n let r = this.coefficient.value\r\n\r\n if (typeof values === 'number') {\r\n let tmpValues: { [Key: string]: number } = {}\r\n tmpValues[this.variables[0]] = values\r\n return this.evaluateAsNumeric(tmpValues);\r\n }\r\n\r\n if (typeof values === 'object') {\r\n if (this.variables.length === 0) {\r\n return this.coefficient.value\r\n }\r\n for (let L in this._literal) {\r\n if (values[L] === undefined) {\r\n return 0;\r\n }\r\n\r\n r *= values[L] ** (this._literal[L].value)\r\n }\r\n }\r\n\r\n return r\r\n }\r\n\r\n /**\r\n * Derivative the monom\r\n * @param letter\r\n */\r\n derivative = (letter?: string): Monom => {\r\n // No setLetter given - assume it's the setLetter 'x'\r\n if (letter === undefined) {\r\n letter = 'x';\r\n }\r\n\r\n if (this.hasLetter(letter)) {\r\n let d = this._literal[letter].clone(),\r\n dM = this.clone();\r\n\r\n // Subtract one to the degree.\r\n dM._literal[letter].subtract(1)\r\n\r\n // Multiply the coefficient by the previous degree\r\n dM._coefficient.multiply(new Fraction(d.clone()));\r\n return dM;\r\n } else {\r\n return new Monom().zero();\r\n }\r\n };\r\n\r\n primitive = (letter?: string): Monom => {\r\n // TODO: derivative including the ln value => implies creating different monom system ?\r\n if (letter === undefined) {\r\n letter = 'x'\r\n }\r\n\r\n // Zero monom\r\n let M = this.clone(), degree\r\n\r\n if (M.hasLetter(letter)) {\r\n degree = M.degree(letter).clone().add(1)\r\n M.coefficient = M.coefficient.clone().divide(degree)\r\n M.setLetter(letter, degree)\r\n } else {\r\n // There is no letter.\r\n\r\n // The coefficient might be zero (=> x) or a number a (=> ax)\r\n if (M.coefficient.isZero()) {\r\n M.coefficient = new Fraction().one()\r\n }\r\n M.setLetter(letter, 1)\r\n }\r\n\r\n return M\r\n }\r\n // ----------------------------------------\r\n // Static functions\r\n // ----------------------------------------\r\n\r\n /**\r\n * Get the least common multiple of monoms\r\n * @param monoms Array of monoms\r\n */\r\n static lcm = (...monoms: Monom[]): Monom => {\r\n // All the monoms must be with natural powers...\r\n for (let m of monoms) {\r\n if (m.hasFractionCoefficient()) {\r\n return new Monom().zero()\r\n }\r\n }\r\n\r\n\r\n let M = new Monom(),\r\n coeffN: number[] = monoms.map(value => value.coefficient.numerator),\r\n coeffD: number[] = monoms.map(value => value.coefficient.denominator),\r\n n = Numeric.gcd(...coeffN),\r\n d = Numeric.lcm(...coeffD);\r\n\r\n // Get the coefficient.\r\n M.coefficient = new Fraction(n, d).reduce();\r\n\r\n // Set the literal parts - go through each monoms literal parts and get only the lowest degree of each letters.\r\n for (let m of monoms) {\r\n // Remove the inexistant letters from the resulting monom\r\n for (let letter in M.literal) {\r\n if (!(letter in m.literal)) {\r\n M.literal[letter].zero();\r\n }\r\n }\r\n for (let letter in m.literal) {\r\n if (M.literal[letter] === undefined && m.literal[letter].isStrictlyPositive()) {\r\n M.literal[letter] = m.literal[letter].clone();\r\n } else {\r\n M.literal[letter] = new Fraction(Math.min(m.literal[letter].value, M.literal[letter].value))\r\n }\r\n }\r\n }\r\n\r\n return M;\r\n };\r\n\r\n /**\r\n * Multiply two monoms and return a NEW monom.\r\n * @param monoms\r\n */\r\n static xmultiply = (...monoms: Monom[]): Monom => {\r\n let M = new Monom().one();\r\n\r\n for (let m of monoms) {\r\n M.multiply(m);\r\n }\r\n\r\n return M;\r\n };\r\n\r\n\r\n // TODO: The rest of the functions are not used or unnecessary ?\r\n /**\r\n * Determine if multiple monoms are similar\r\n * @param M\r\n */\r\n areSameAs = (...M: Monom[]): boolean => {\r\n let result: boolean = true;\r\n\r\n // Check all monoms if they are the isSame as the \"this\" one.\r\n for (let i = 0; i < M.length; i++) {\r\n if (!this.isSameAs(M[i])) {\r\n return false;\r\n }\r\n }\r\n\r\n // All check passed -> all the monoms are similar.\r\n return result;\r\n };\r\n\r\n /**\r\n * Determine if multiple monoms are equals\r\n * @param M\r\n */\r\n areEquals = (...M: Monom[]): boolean => {\r\n // They are not similar.\r\n if (!this.areSameAs(...M)) {\r\n return false;\r\n }\r\n\r\n // Check all coefficient. They must be equals.\r\n for (let m of M) {\r\n if (!this._coefficient.isEqual(m.coefficient)) {\r\n return false;\r\n }\r\n }\r\n\r\n // All checks passed.\r\n return true;\r\n };\r\n\r\n isDivisible = (div:Monom):boolean => {\r\n // For all variables (letters), the current monom must have a degree higher than the divider\r\n if(div.degree().isStrictlyPositive()) {\r\n for (let letter of div.variables) {\r\n if (!this.degree(letter).geq(div.degree(letter))) {\r\n return false\r\n }\r\n }\r\n }\r\n\r\n // If the coefficient is rational, we suppose we don't need to check the division by the coefficient.\r\n if(this.coefficient.isRational() || div.coefficient.isRational()){return true}\r\n\r\n return this.coefficient.clone().divide(div.coefficient).isRelative()\r\n }\r\n\r\n}\r\n","/**\r\n * Polynom module contains everything necessary to handle polynoms.*\r\n */\r\n\r\nimport {literalType, Monom} from './monom';\r\nimport {Shutingyard, ShutingyardType, Token} from '../shutingyard';\r\nimport {Numeric} from '../numeric';\r\nimport {Fraction} from \"../coefficients/fraction\";\r\nimport {Equation, ISolution} from \"./equation\";\r\nimport {Random} from \"../randomization/random\";\r\nimport {loadHighlighter} from \"typedoc/dist/lib/utils/highlighter\";\r\n\r\nexport type PolynomParsingType = string | Polynom | number | Fraction | Monom\r\n\r\nexport interface IEuclidian {\r\n quotient: Polynom,\r\n reminder: Polynom\r\n}\r\n\r\n/**\r\n * Polynom class can handle polynoms, reorder, resolve, ...\r\n * ```\r\n * let P = new Polynom('3x-4')\r\n * ```\r\n */\r\nexport class Polynom {\r\n private _dirty_factors: boolean\r\n private _dirty_zeroes: boolean\r\n private _euclidianCache: { [Key: string]: IEuclidian }\r\n private _factors: Polynom[];\r\n private _monoms: Monom[];\r\n private _rawString: string;\r\n private _texString: string;\r\n private _zeroes: ISolution[]\r\n\r\n /**\r\n *\r\n * @param {string} polynomString (optional) Default polynom to parse on class creation\r\n * @param values\r\n */\r\n constructor(polynomString?: PolynomParsingType, ...values: unknown[]) {\r\n this._monoms = [];\r\n this._factors = [];\r\n this.mark_as_dirty()\r\n\r\n if (polynomString !== undefined) {\r\n this.parse(polynomString, ...values);\r\n }\r\n return this;\r\n }\r\n\r\n get euclidianCache(): { [p: string]: IEuclidian } {\r\n return this._euclidianCache;\r\n }\r\n\r\n set euclidianCache(value: { [p: string]: IEuclidian }) {\r\n this._euclidianCache = value;\r\n }\r\n\r\n get dirty_zeroes(): boolean {\r\n return this._dirty_zeroes;\r\n }\r\n\r\n set dirty_zeroes(value: boolean) {\r\n this._dirty_zeroes = value;\r\n }\r\n\r\n // ------------------------------------------\r\n get dirty_factors(): boolean {\r\n return this._dirty_factors;\r\n }\r\n\r\n set dirty_factors(value: boolean) {\r\n this._dirty_factors = value;\r\n }\r\n\r\n // ------------------------------------------\r\n get monoms() {\r\n return this._monoms;\r\n }\r\n\r\n set monoms(M: Monom[]) {\r\n this._monoms = M;\r\n }\r\n\r\n get zeroes(): ISolution[] {\r\n return this.getZeroes()\r\n }\r\n\r\n get factors(): Polynom[] {\r\n return this.factorize()\r\n }\r\n\r\n set factors(value: Polynom[]) {\r\n this.mark_as_dirty()\r\n this._factors = value;\r\n }\r\n\r\n get texString(): string {\r\n return this._texString;\r\n }\r\n\r\n get texFactors(): string {\r\n this.factorize()\r\n\r\n if (this.factors.length <= 1) {\r\n return this.tex\r\n }\r\n\r\n // Build an array of texFactors with the number of similar items.\r\n let factorsCount: { [Key: string]: { degree: number, factor: Polynom } } = {}\r\n for (let f of this.factors) {\r\n if (factorsCount[f.tex] !== undefined) {\r\n factorsCount[f.tex].degree++\r\n } else {\r\n factorsCount[f.tex] = {\r\n degree: 1,\r\n factor: f\r\n }\r\n }\r\n }\r\n\r\n // First round to put the 'monom' first\r\n let simpleFactor = new Polynom().one()\r\n\r\n for (let item of Object.values(factorsCount).filter(item => item.factor.monoms.length === 1)) {\r\n simpleFactor.multiply(item.factor)\r\n }\r\n\r\n let tex = simpleFactor.isOne() ? '' : simpleFactor.tex\r\n\r\n // Loop through all factors that contains at least 2 monoms.\r\n for (let item of Object.values(factorsCount).filter(item => item.factor.monoms.length > 1)) {\r\n if (item.factor.length > 1) {\r\n tex += `\\\\left( ${item.factor.tex} \\\\right)${item.degree > 1 ? '^{ ' + item.degree + ' }' : ''}`\r\n }\r\n }\r\n\r\n return tex;\r\n }\r\n\r\n get displayFactors() {\r\n this.factorize()\r\n\r\n if (this.factors.length <= 1) {\r\n return this.display\r\n }\r\n\r\n // Build an array of texFactors with the number of similar items.\r\n let factorsCount: { [Key: string]: { degree: number, factor: Polynom } } = {}\r\n for (let f of this.factors) {\r\n if (factorsCount[f.display] !== undefined) {\r\n factorsCount[f.display].degree++\r\n } else {\r\n factorsCount[f.display] = {\r\n degree: 1,\r\n factor: f\r\n }\r\n }\r\n }\r\n\r\n // First round to put the 'monom' first\r\n let simpleFactor = new Polynom().one()\r\n\r\n for (let item of Object.values(factorsCount).filter(item => item.factor.monoms.length === 1)) {\r\n simpleFactor.multiply(item.factor)\r\n }\r\n\r\n let display = simpleFactor.isOne() ? '' : simpleFactor.display\r\n\r\n // Loop through all factors that contains at least 2 monoms.\r\n for (let item of Object.values(factorsCount).filter(item => item.factor.monoms.length > 1)) {\r\n if (item.factor.length > 1) {\r\n display += `(${item.factor.display})${item.degree > 1 ? '^(' + item.degree + ')' : ''}`\r\n }\r\n }\r\n\r\n return display;\r\n }\r\n\r\n get length() {\r\n // TODO: Must reduce the monoms list to remove the zero coefficient.\r\n return this._monoms.length;\r\n }\r\n\r\n get display(): string {\r\n return this.genDisplay();\r\n }\r\n\r\n get raw(): string {\r\n return this._rawString\r\n }\r\n\r\n get tex(): string {\r\n return this.genDisplay('tex');\r\n }\r\n\r\n get isMultiVariable(): boolean {\r\n const B = false;\r\n for (const m of this._monoms) {\r\n if (m.variables.length > 1) {\r\n return true;\r\n }\r\n }\r\n return B;\r\n }\r\n\r\n get variables(): string[] {\r\n let V: string[] = [];\r\n\r\n for (const m of this._monoms) {\r\n V = V.concat(m.variables);\r\n }\r\n\r\n // Remove duplicates.\r\n V = [...new Set(V)];\r\n V.sort()\r\n return V;\r\n }\r\n\r\n get numberOfVars(): number {\r\n return this.variables.length;\r\n }\r\n\r\n get plotFunction(): string {\r\n return this.genDisplay('tex', false, false, true)\r\n }\r\n\r\n mark_as_dirty = (): void => {\r\n this.dirty_factors = true\r\n this.dirty_zeroes = true\r\n this.euclidianCache = {}\r\n }\r\n\r\n addToken = (stack: Polynom[], element: Token): void => {\r\n switch (element.tokenType) {\r\n case ShutingyardType.COEFFICIENT:\r\n stack.push(new Polynom(element.token))\r\n break\r\n\r\n case ShutingyardType.VARIABLE:\r\n stack.push(new Polynom().add(new Monom(element.token)))\r\n break\r\n\r\n case ShutingyardType.CONSTANT:\r\n // TODO: add constant support to Polynom parsing.\r\n console.log('Actually, not supported - will be added later !')\r\n break\r\n\r\n case ShutingyardType.OPERATION:\r\n if (stack.length >= 2) {\r\n const b = stack.pop(),\r\n a = stack.pop()\r\n\r\n if (element.token === '+') {\r\n stack.push(a.add(b))\r\n } else if (element.token === '-') {\r\n stack.push(a.subtract(b))\r\n } else if (element.token === '*') {\r\n stack.push(a.multiply(b))\r\n } else if (element.token === '/') {\r\n if (b.degree().isStrictlyPositive()) {\r\n console.log('divide by a polynom -> should create a rational polynom !')\r\n } else {\r\n stack.push(a.divide(b.monoms[0].coefficient))\r\n\r\n }\r\n } else if (element.token === '^') {\r\n if (b.degree().isStrictlyPositive()) {\r\n console.error('Cannot elevate a polynom with another polynom !', a.tex, b.tex)\r\n } else {\r\n if (b.monoms[0].coefficient.isRelative()) {\r\n // Integer power\r\n stack.push(a.pow(b.monoms[0].coefficient.value))\r\n } else {\r\n // Only allow power if the previous polynom is only a monom, without coefficient.\r\n if (a.monoms.length === 1 && a.monoms[0].coefficient.isOne()) {\r\n for (let letter in a.monoms[0].literal) {\r\n a.monoms[0].literal[letter].multiply(b.monoms[0].coefficient)\r\n }\r\n stack.push(a)\r\n } else {\r\n console.error('Cannot have power with fraction')\r\n }\r\n }\r\n }\r\n }\r\n } else {\r\n if (element.token === '-') {\r\n stack.push(stack.pop().opposed())\r\n } else {\r\n throw \"Error parsing the polynom \" + this._rawString\r\n }\r\n }\r\n break\r\n\r\n case ShutingyardType.MONOM:\r\n // Should never appear.\r\n console.error('The monom token should not appear here')\r\n break;\r\n\r\n case ShutingyardType.FUNCTION:\r\n // Should never appear.\r\n console.error('The function token should not appear here - might be introduced later.')\r\n break;\r\n }\r\n }\r\n\r\n\r\n // ------------------------------------------\r\n // Creation / parsing functions\r\n\r\n // ------------------------------------------\r\n /**\r\n * Parse a string to a polynom.\r\n * @param inputStr\r\n * @param values: as string, numbers or fractions\r\n */\r\n parse = (inputStr: PolynomParsingType, ...values: unknown[]): Polynom => {\r\n // Reset the main variables.\r\n this._monoms = []\r\n this._factors = []\r\n this.mark_as_dirty()\r\n\r\n // TODO: allow to enter a liste of Fraction (a, b, c, ...) to make a polynom ax^n + bx^(n-1) + cx^(n-2) + ...\r\n if (typeof inputStr === 'string') {\r\n return this._parseString(inputStr, ...values)\r\n } else if (\r\n (typeof inputStr === 'number' || inputStr instanceof Fraction || inputStr instanceof Monom)\r\n && (values === undefined || values.length === 0)\r\n ) {\r\n this._monoms.push(new Monom(inputStr))\r\n } else if (inputStr instanceof Monom && values.length > 0) {\r\n this._monoms.push(new Monom(inputStr))\r\n values.forEach(m => {\r\n this._monoms.push(new Monom(m))\r\n })\r\n } else if (inputStr instanceof Polynom) {\r\n for (const m of inputStr.monoms) {\r\n this._monoms.push(m.clone())\r\n }\r\n }\r\n\r\n return this\r\n };\r\n\r\n /**\r\n * Clone the polynom\r\n */\r\n clone = (): Polynom => {\r\n const P = new Polynom();\r\n const M: Monom[] = [];\r\n\r\n for (const m of this._monoms) {\r\n M.push(m.clone());\r\n }\r\n\r\n P.monoms = M;\r\n\r\n return P;\r\n };\r\n\r\n /**\r\n * Set the polynom to zero.\r\n * @returns {this}\r\n */\r\n zero = (): Polynom => {\r\n this._monoms = [];\r\n this._monoms.push(new Monom().zero());\r\n this._rawString = '0';\r\n this.mark_as_dirty()\r\n return this;\r\n };\r\n\r\n one = (): Polynom => {\r\n this._monoms = [];\r\n this._monoms.push(new Monom().one());\r\n this._rawString = '1';\r\n this.mark_as_dirty()\r\n return this;\r\n }\r\n\r\n empty = (): Polynom => {\r\n this._monoms = [];\r\n this._rawString = '';\r\n this.mark_as_dirty()\r\n return this;\r\n };\r\n\r\n // ------------------------------------------\r\n opposed = (): Polynom => {\r\n this._monoms = this._monoms.map(m => m.opposed());\r\n this.mark_as_dirty()\r\n return this;\r\n };\r\n\r\n\r\n // ------------------------------------------\r\n // Mathematical operations\r\n\r\n add = (...values: unknown[]): Polynom => {\r\n this.mark_as_dirty()\r\n\r\n // @ts-ignore\r\n for (let value of values) {\r\n if (value instanceof Polynom) {\r\n this._monoms = this._monoms.concat(value.monoms);\r\n } else if (value instanceof Monom) {\r\n this._monoms.push(value.clone());\r\n } else if (Number.isSafeInteger(value)) {\r\n this._monoms.push(new Monom(value.toString()));\r\n } else {\r\n this._monoms.push(new Monom(value));\r\n }\r\n }\r\n\r\n return this.reduce();\r\n };\r\n\r\n subtract = (...values: unknown[]): Polynom => {\r\n this.mark_as_dirty()\r\n\r\n for (let value of values) {\r\n if (value instanceof Polynom) {\r\n this._monoms = this._monoms.concat(value.clone().opposed().monoms);\r\n } else if (value instanceof Monom) {\r\n this._monoms.push(value.clone().opposed());\r\n } else if (Number.isSafeInteger(value)) {\r\n this._monoms.push(new Monom(value.toString()).opposed());\r\n } else {\r\n this._monoms.push(new Monom(value).opposed());\r\n }\r\n }\r\n\r\n return this.reduce();\r\n };\r\n\r\n multiply = (value: unknown): Polynom => {\r\n this.mark_as_dirty()\r\n\r\n if (value instanceof Polynom) {\r\n return this.multiplyByPolynom(value);\r\n } else if (value instanceof Fraction) {\r\n return this.multiplyByFraction(value);\r\n } else if (value instanceof Monom) {\r\n return this.multiplyByMonom(value);\r\n } else if (Number.isSafeInteger(value) && typeof value === 'number') {\r\n return this.multiplyByInteger(value);\r\n }\r\n\r\n // Something went wrong...\r\n return this;\r\n }\r\n\r\n /**\r\n * Divide the current polynom by another polynom.\r\n * @param P\r\n * returns {quotient: Polynom, reminder: Polynom}\r\n */\r\n euclidian = (P: Polynom): IEuclidian => {\r\n\r\n if (this.euclidianCache[P.tex] !== undefined) {\r\n return this.euclidianCache[P.tex]\r\n }\r\n\r\n const letter: string = P.variables[0];\r\n const quotient: Polynom = new Polynom().zero();\r\n const reminder: Polynom = this.clone().reorder(letter);\r\n\r\n // There is no variable - means it's a number\r\n if (P.variables.length === 0) {\r\n let q = this.clone().divide(P)\r\n return {\r\n quotient: this.clone().divide(P),\r\n reminder: new Polynom().zero()\r\n }\r\n }\r\n\r\n // Get at least a letter\r\n\r\n const maxMP: Monom = P.monomByDegree(undefined, letter);\r\n const degreeP: Fraction = P.degree(letter);\r\n\r\n let newM: Monom;\r\n\r\n // Make the euclidian division of the two polynoms.\r\n let MaxIteration = this.degree(letter).clone().multiply(2);\r\n while (reminder.degree(letter).geq(degreeP) && MaxIteration.isPositive()) {\r\n MaxIteration.subtract(1)\r\n\r\n // Get the greatest monom divided by the max monom of the divider\r\n newM = reminder.monomByDegree(undefined, letter).clone().divide(maxMP);\r\n\r\n if (newM.isZero()) {\r\n break;\r\n }\r\n\r\n // Get the new quotient and reminder.\r\n quotient.add(newM);\r\n reminder.subtract(P.clone().multiply(newM));\r\n }\r\n\r\n quotient.reduce()\r\n reminder.reduce()\r\n return {quotient, reminder};\r\n };\r\n\r\n divide = (value: unknown): Polynom => {\r\n this.mark_as_dirty()\r\n\r\n if (value instanceof Fraction) {\r\n return this.divideByFraction(value);\r\n } else if (typeof value === 'number' && Number.isSafeInteger(value)) {\r\n return this.divideByInteger(value);\r\n } else if (value instanceof Monom) {\r\n return this.divide(new Polynom(value))\r\n } else if (value instanceof Polynom) {\r\n if (value.monoms.length === 1 && value.variables.length === 0) {\r\n return this.divideByFraction(value.monoms[0].coefficient)\r\n }else {\r\n let {quotient, reminder} = this.euclidian(value)\r\n if(reminder.isZero()){\r\n return quotient\r\n }else{\r\n console.log(`${this.tex} is not divideable by ${value.tex}`)\r\n return new Polynom().zero()\r\n }\r\n }\r\n }\r\n }\r\n\r\n pow = (nb: number): Polynom => {\r\n this.mark_as_dirty()\r\n\r\n if (!Number.isSafeInteger(nb)) {\r\n return this.zero();\r\n }\r\n if (nb < 0) {\r\n return this.zero();\r\n }\r\n if (nb === 0) {\r\n return new Polynom();\r\n }\r\n\r\n const P = this.clone();\r\n for (let i = 1; i < nb; i++) {\r\n this.multiply(P);\r\n }\r\n return this.reduce();\r\n };\r\n\r\n // ------------------------------------------\r\n /**\r\n * Compare the current coefficient with another coefficient\r\n * @param P\r\n * @param sign (string| default is =): authorized values: =, <, <=, >, >= with some variations.\r\n */\r\n compare = (P: Polynom, sign?: string): boolean => {\r\n if (sign === undefined) {\r\n sign = '='\r\n }\r\n\r\n // Create clone version to reduce them without altering the original polynoms.\r\n const cP1 = this.clone().reduce().reorder();\r\n const cP2 = P.clone().reduce().reorder();\r\n\r\n switch (sign) {\r\n case '=':\r\n // They must have the isSame length and the isSame degree\r\n if (cP1.length !== cP2.length || cP1.degree().isNotEqual(cP2.degree())) {\r\n return false;\r\n }\r\n\r\n // Check if the coefficients are the isSame.\r\n for (const i in cP1.monoms) {\r\n if (!cP1.monoms[i].isEqual(cP2.monoms[i])) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n case 'same':\r\n // They must have the isSame length and the isSame degree\r\n if (cP1.length !== cP2.length || cP1.degree() !== cP2.degree()) {\r\n return false;\r\n }\r\n\r\n for (const i in cP1.monoms) {\r\n if (!cP1.monoms[i].isSameAs(cP2.monoms[i])) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n default:\r\n return false;\r\n }\r\n };\r\n\r\n isZero(): boolean {\r\n return (this._monoms.length === 1 && this._monoms[0].coefficient.isZero()) || this._monoms.length === 0;\r\n }\r\n\r\n isOne(): boolean {\r\n return this._monoms.length === 1 && this._monoms[0].coefficient.isOne();\r\n }\r\n\r\n isEqual = (P: Polynom): boolean => {\r\n return this.compare(P, '=');\r\n };\r\n\r\n isSameAs = (P: Polynom): boolean => {\r\n return this.compare(P, 'same');\r\n };\r\n\r\n isOpposedAt = (P: Polynom): boolean => {\r\n return this.compare(P.clone().opposed(), '=');\r\n };\r\n\r\n isFactorized = (polynomString: string, soft?: boolean): boolean => {\r\n let P;\r\n\r\n // Check if polynom is complete...\r\n if (polynomString.split('(').length !== polynomString.split(')').length) {\r\n return false\r\n }\r\n\r\n // Try to build the polynom\r\n try {\r\n P = new Polynom(polynomString);\r\n } catch (e) {\r\n return false;\r\n }\r\n\r\n // Both polynom aren't the same (once developed and reduced => they cannot be equivalent)\r\n if (!this.isEqual(P)) {\r\n return false;\r\n }\r\n\r\n // Check if the provided (string) version is fully factorized.\r\n // Run a regex on the string.\r\n let polynomStringNormalized = polynomString.replaceAll('*', ''),\r\n polynomStringReduced = '' + polynomStringNormalized,\r\n factors: string[] = [];\r\n\r\n for (let x of polynomStringNormalized.matchAll(/\\(([a-z0-9+\\-]+)\\)(\\^[0-9]*)?/g)) {\r\n\r\n if (x[2] !== undefined) {\r\n // if there is an exponential value, add it multiple times\r\n for (let i = 0; i < +x[2].substring(1); i++) {\r\n factors.push(x[1])\r\n }\r\n } else {\r\n // no power - add it once.\r\n factors.push(x[1]);\r\n }\r\n\r\n // Remove the current polynom\r\n polynomStringReduced = polynomStringReduced.replaceAll(x[0], '');\r\n }\r\n if (polynomStringReduced !== '') {\r\n factors.push(polynomStringReduced);\r\n }\r\n let polyFactors = factors.map(x => new Polynom(x));\r\n\r\n // polyFactors contain all polynoms.\r\n let checkPolyFactors = polyFactors.filter(x=>x.degree().geq(1) && !x.commonMonom().isOne())\r\n\r\n // Some polynoms are not completely factorized.\r\n if(checkPolyFactors.length>0 && !soft){return false}\r\n if(checkPolyFactors.length>0 && soft){\r\n polyFactors = polyFactors.filter(x=>x.commonMonom().isOne())\r\n\r\n let FactorizedConstant = new Fraction().one()\r\n for(let p of checkPolyFactors){\r\n let k = p.commonMonom(),\r\n pFactor = p.clone().divide(k)\r\n\r\n if(k.degree().isZero()){\r\n FactorizedConstant.multiply(k.coefficient)\r\n polyFactors.push(pFactor.clone())\r\n }\r\n }\r\n }\r\n\r\n\r\n // Factorize the current polynom.\r\n this.factorize();\r\n\r\n // Compare the given factors with the generated factors\r\n let sign = 1,\r\n notFoundedFactors = []\r\n for (let f of this.factors) {\r\n // The factor is just a coefficient. Might be opposed\r\n if (f.degree().isZero()) {\r\n if (f.monoms[0].coefficient.isNegativeOne()) {\r\n sign = -sign\r\n }\r\n }\r\n\r\n let factorFound = false\r\n for (let i = 0; i < polyFactors.length; i++) {\r\n if (f.isEqual(polyFactors[i])) {\r\n polyFactors.splice(i, 1);\r\n factorFound = true\r\n break;\r\n } else if (f.isOpposedAt(polyFactors[i])) {\r\n polyFactors.splice(i, 1);\r\n sign = -sign;\r\n factorFound = true\r\n break;\r\n }\r\n }\r\n\r\n if (!factorFound) {\r\n notFoundedFactors.push(f.clone())\r\n }\r\n }\r\n\r\n // The polyfactors must be empty and the cumulative opposite factors must be 1.\r\n return (polyFactors.length === 0 && sign === 1);\r\n }\r\n\r\n\r\n // ------------------------------------------\r\n // Compare functions\r\n\r\n isReduced = (polynomString: string): Boolean => {\r\n // The polynom must be developed to be reduced.\r\n if (!this.isDeveloped(polynomString)) {\r\n return false\r\n }\r\n\r\n let P = new Polynom(polynomString)\r\n if (P.monoms.length > this.monoms.length) {\r\n return false\r\n }\r\n\r\n // TODO: Not ur the reduced systme checking is working properly !\r\n for (let m of P.monoms) {\r\n if (!m.coefficient.isReduced()) {\r\n return false\r\n }\r\n }\r\n\r\n return false\r\n }\r\n\r\n isDeveloped = (polynomString: string): Boolean => {\r\n let P: Polynom;\r\n\r\n // Start by removing the parenthis after a \"power\"\r\n let pString = polynomString.replaceAll(/\\^\\(([-0-9/]+)\\)/g, '$1')\r\n\r\n // There is at least one parenthese - it is not developed.\r\n if (pString.includes('(') || pString.includes(')')) {\r\n return false\r\n }\r\n\r\n // Try to build the polynom\r\n try {\r\n // Build the polynom\r\n P = new Polynom(polynomString);\r\n } catch (e) {\r\n return false;\r\n }\r\n\r\n // Both polynom aren't the same (once developed and reduced => they cannot be equivalent)\r\n if (!this.isEqual(P)) {\r\n return false;\r\n }\r\n\r\n // Check that everything is completely developed. Actually, there are no parentheses... so it is fully developed\r\n return true\r\n\r\n // // maybe it wasn't reduced and not ordered...\r\n // // compare polynom string.\r\n //\r\n // // normalize the string\r\n // let polynomStringNormalized = polynomString.replaceAll('[*\\s]', '')\r\n //\r\n // // Determine if it's the exact same string.\r\n // // TODO: Maybe it's enough to just make this test !a\r\n // return polynomStringNormalized === P.reduce().reorder().display\r\n }\r\n\r\n // -------------------------------------\r\n reduce = (): Polynom => {\r\n // Reduce the polynom\r\n let values = [...this._monoms],\r\n vars = [...this.variables]\r\n\r\n this._monoms = []\r\n\r\n let coeffs = values.filter(x => x.variables.length === 0)\r\n\r\n if (coeffs.length > 0) {\r\n this._monoms.push(coeffs.reduce((a, b) => a.add(b)))\r\n }\r\n\r\n // Build the new monoms\r\n for (let letter of vars) {\r\n // Monom with same letters, but might be of different degrees\r\n let M = values.filter(x => x.hasLetter(letter))\r\n\r\n while (M.length > 0) {\r\n // Take the first element\r\n const m = M.shift(), degree = m.degree(letter)\r\n\r\n for (let a of M.filter(x => x.degree(letter).isEqual(degree))) {\r\n m.add(a)\r\n }\r\n\r\n this._monoms.push(m)\r\n\r\n // Make the new array.\r\n M = M.filter(x => x.degree(letter).isNotEqual(degree))\r\n }\r\n // reduce the monom\r\n\r\n }\r\n\r\n // Remove all null monoms\r\n this._monoms = this._monoms.filter((m) => {\r\n return m.coefficient.value !== 0\r\n });\r\n\r\n // Reduce all monoms coefficient.\r\n for (const m of this._monoms) {\r\n m.coefficient.reduce();\r\n }\r\n\r\n if (this.length === 0) {\r\n return new Polynom().zero();\r\n }\r\n return this.reorder();\r\n };\r\n\r\n reorder = (letter: string = 'x', revert?: boolean): Polynom => {\r\n if(revert===undefined){revert = false}\r\n\r\n // TODO: Must handle multiple setLetter reorder system\r\n let otherLetters = this.variables.filter(x => x !== letter)\r\n this._monoms.sort(function (a, b) {\r\n let da = a.degree(letter).value,\r\n db = b.degree(letter).value\r\n\r\n // Values are different\r\n if (da !== db) return revert?da-db : db - da\r\n\r\n // if values are equals, check other letters - it must be revert in that case !\r\n if (otherLetters.length > 0) {\r\n for (let L of otherLetters) {\r\n let da = a.degree(L).value,\r\n db = b.degree(L).value\r\n\r\n // Values are different\r\n if (da !== db) return revert?da - db : db - da\r\n }\r\n }\r\n\r\n return 0\r\n // return b.degree(letter).clone().subtract(a.degree(letter)).value\r\n });\r\n\r\n return this;\r\n };\r\n\r\n degree = (letter?: string): Fraction => {\r\n let d: Fraction = new Fraction().zero();\r\n for (const m of this._monoms) {\r\n d = Fraction.max(m.degree(letter).value, d);\r\n }\r\n return d;\r\n };\r\n\r\n letters = (): string[] => {\r\n let L: string[] = [], S = new Set();\r\n\r\n for (let m of this._monoms) {\r\n S = new Set([...S, ...m.variables]);\r\n }\r\n\r\n // @ts-ignore\r\n return [...S];\r\n }\r\n\r\n /**\r\n * Replace a variable (letter) by a polynom.\r\n * @param letter\r\n * @param P\r\n */\r\n replaceBy = (letter: string, P: Polynom): Polynom => {\r\n this.mark_as_dirty()\r\n\r\n let pow: Fraction;\r\n const resultPolynom: Polynom = new Polynom().zero();\r\n\r\n for (const m of this.monoms) {\r\n if (m.literal[letter] === undefined || m.literal[letter].isZero()) {\r\n resultPolynom.add(m.clone());\r\n } else {\r\n // We have found a setLetter.\r\n // Get the power and reset it.\r\n pow = m.literal[letter].clone();\r\n delete m.literal[letter];\r\n\r\n // TODO: replaceBy works only with positive and natural pow\r\n resultPolynom.add(P.clone().pow(Math.abs(pow.numerator)).multiply(m));\r\n }\r\n }\r\n\r\n this._monoms = resultPolynom.reduce().reorder().monoms;\r\n return this;\r\n };\r\n\r\n // Evaluate a polynom.\r\n evaluate = (values: literalType | Fraction | number): Fraction => {\r\n const r = new Fraction().zero();\r\n\r\n this._monoms.forEach(monom => {\r\n //console.log('Evaluate polynom: ', monom.display, values, monom.evaluate(values).display);\r\n r.add(monom.evaluate(values));\r\n });\r\n\r\n return r;\r\n };\r\n\r\n evaluateAsNumeric = (values: { [Key: string]: number } | number): number => {\r\n let r = 0\r\n this._monoms.forEach(monom => {\r\n r += monom.evaluateAsNumeric(values)\r\n })\r\n\r\n return r\r\n }\r\n\r\n derivative = (letter?: string): Polynom => {\r\n let dP = new Polynom();\r\n\r\n for (let m of this._monoms) {\r\n dP.add(m.derivative(letter));\r\n }\r\n return dP;\r\n }\r\n // ------------------------------------------\r\n // Misc polynoms functions\r\n\r\n primitive = (letter?: string): Polynom => {\r\n let dP = new Polynom();\r\n\r\n for (let m of this._monoms) {\r\n dP.add(m.primitive(letter))\r\n }\r\n return dP\r\n }\r\n\r\n integrate = (a: Fraction | number, b: Fraction | number, letter?: string): Fraction => {\r\n const primitive = this.primitive(letter)\r\n\r\n if (letter === undefined) {\r\n letter = 'x'\r\n }\r\n\r\n let valuesA: literalType = {},\r\n valuesB: literalType = {}\r\n valuesA[letter] = new Fraction(a);\r\n valuesB[letter] = new Fraction(b);\r\n\r\n return primitive.evaluate(valuesB).subtract(primitive.evaluate(valuesA))\r\n }\r\n\r\n // -------------------------------------\r\n /**\r\n * Factorize a polynom and store the best results in factors.\r\n * @param maxValue Defines the greatest value to search to (default is 20).\r\n */\r\n factorize = (letter?: string): Polynom[] => {\r\n if (!this.dirty_factors) {\r\n return this._factors\r\n }\r\n\r\n let factors: Polynom[] = [];\r\n let P = this.clone().reorder()\r\n\r\n // Extract the common monom\r\n // 2x^3+6x^2 => 2x^2\r\n let M = P.commonMonom()\r\n // If the polynom starts with a negative monom, factorize it.\r\n if (P.monomByDegree().coefficient.isStrictlyNegative() && M.coefficient.isStrictlyPositive() && !M.isOne()) {\r\n M.opposed()\r\n }\r\n\r\n if (!M.isOne()) {\r\n let tempPolynom: Polynom = new Polynom(M)\r\n factors = [tempPolynom.clone()]\r\n P = P.euclidian(tempPolynom).quotient;\r\n }\r\n\r\n // Main loop\r\n let securityLoop = P.degree().clone().multiply(2).value,\r\n maxDegree = 1\r\n while (securityLoop >= 0) {\r\n securityLoop--\r\n if (P.monoms.length < 2) {\r\n // The polynom has only one monom => 7x^2\r\n // No need to continue.\r\n if (!P.isOne()) {\r\n factors.push(P.clone())\r\n P.one()\r\n }\r\n break\r\n } else if (P.degree(letter).isOne()) {\r\n // The polynom is a first degree polynom => 3x-5\r\n // No need to continue\r\n factors.push(P.clone())\r\n P.one()\r\n break\r\n } else {\r\n // Create the list of all \"potential\" polynom dividers.\r\n let allDividers: Polynom[] = this._getAllPotentialFactors(P, maxDegree, letter)\r\n maxDegree = P.degree(letter).value\r\n\r\n // Actually: 100ms\r\n while (allDividers.length > 0) {\r\n let div = allDividers[0]\r\n\r\n if (!P.isDividableBy(div)) {\r\n // Not dividable. Remove it from the list\r\n allDividers.shift()\r\n } else {\r\n // It's dividable - so make the division\r\n let result = P.euclidian(div)\r\n\r\n // Add the factor\r\n factors.push(div)\r\n\r\n // As it's dividable, get the quotient.\r\n P = result.quotient.clone()\r\n\r\n // filter all dividers that are no more suitable.\r\n allDividers = allDividers.filter(x => {\r\n let pX = P.monoms[0],\r\n pC = P.monoms[P.monoms.length - 1],\r\n dX = x.monoms[0],\r\n dC = x.monoms[x.monoms.length - 1]\r\n\r\n // Check last item (degree zero)\r\n if (!pC.isDivisible(dC)) {\r\n return false\r\n }\r\n\r\n // Check the first item (degree max)\r\n if (!pX.isDivisible(dX)) {\r\n return false\r\n }\r\n\r\n return true\r\n })\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Maybe there is still something in the Polynom (not everything was possible to factorize)\r\n if (!P.isOne()) {\r\n factors.push(P.clone())\r\n }\r\n\r\n // Save the factors\r\n this._factors = factors\r\n\r\n // The factors list is no more dirty\r\n this.dirty_factors = false\r\n\r\n return this._factors;\r\n }\r\n\r\n isDividableBy = (div: Polynom): boolean => {\r\n // Quick evaluation.\r\n if (div.degree().isOne()) {\r\n let zero = div.getZeroes()[0]\r\n\r\n if (zero.exact instanceof Fraction) {\r\n return this.evaluate(zero.exact).isZero()\r\n } else {\r\n return false\r\n }\r\n } else {\r\n this.euclidianCache[div.tex] = this.euclidian(div)\r\n return this.euclidianCache[div.tex].reminder.isZero()\r\n }\r\n }\r\n // TODO: get zeroes for more than first degree and for more than natural degrees\r\n getZeroes = (): ISolution[] => {\r\n if (this.dirty_zeroes) {\r\n let equ = new Equation(this.clone(), 0)\r\n equ.solve()\r\n this._zeroes = equ.solutions\r\n this.dirty_zeroes = false\r\n }\r\n\r\n return this._zeroes\r\n };\r\n\r\n // TODO: analyse the next functions to determine if they are useful or not...\r\n monomByDegree = (degree?: Fraction | number, letter?: string): Monom => {\r\n if (degree === undefined) {\r\n // return the highest degree monom.\r\n return this.monomByDegree(this.degree(letter), letter);\r\n }\r\n\r\n // Reduce the polynom.\r\n const M = this.clone().reduce();\r\n for (const m of M._monoms) {\r\n if (m.degree(letter).isEqual(degree)) {\r\n return m.clone();\r\n }\r\n }\r\n\r\n // Nothing was found - return the null monom.\r\n return new Monom().zero();\r\n };\r\n\r\n monomsByDegree = (degree?: number | Fraction, letter?: string): Monom[] => {\r\n if (degree === undefined) {\r\n // return the highest degree monom.\r\n return this.monomsByDegree(this.degree(letter));\r\n }\r\n\r\n // Reduce the polynom.\r\n let Ms: Monom[] = [];\r\n\r\n const M = this.clone().reduce();\r\n for (const m of M._monoms) {\r\n if (m.degree(letter) === degree) {\r\n Ms.push(m.clone())\r\n }\r\n }\r\n\r\n return Ms\r\n // Nothing was found - retur\r\n }\r\n\r\n // Used in LinearSystem.tex\r\n monomByLetter = (letter: string): Monom => {\r\n const M = this.clone().reduce();\r\n for (const m of M._monoms) {\r\n if (m.hasLetter(letter)) {\r\n return m.clone();\r\n }\r\n }\r\n\r\n return new Monom().zero();\r\n };\r\n\r\n // Next functions are used for for commonMonom, which is used in the factorize method.\r\n getDenominators = (): number[] => {\r\n const denominators: number[] = [];\r\n for (const m of this._monoms) {\r\n denominators.push(m.coefficient.denominator);\r\n }\r\n return denominators;\r\n };\r\n\r\n getNumerators = (): number[] => {\r\n const numerators: number[] = [];\r\n for (const m of this._monoms) {\r\n numerators.push(m.coefficient.numerator);\r\n }\r\n return numerators;\r\n };\r\n\r\n lcmDenominator = (): number => {\r\n return Numeric.lcm(...this.getDenominators());\r\n };\r\n // ------------------------------------------\r\n // Polynoms factorization functions\r\n\r\n gcdDenominator = (): number => {\r\n return Numeric.gcd(...this.getDenominators());\r\n };\r\n\r\n lcmNumerator = (): number => {\r\n return Numeric.lcm(...this.getNumerators());\r\n };\r\n\r\n gcdNumerator = (): number => {\r\n return Numeric.gcd(...this.getNumerators());\r\n };\r\n // ------------------------------------------\r\n // Polynoms helpers functions\r\n // -------------------------------------\r\n\r\n commonMonom = (): Monom => {\r\n let M = new Monom().one(), numerator: number, denominator: number, degree = this.degree();\r\n\r\n numerator = this.gcdNumerator();\r\n denominator = this.gcdDenominator();\r\n\r\n M.coefficient = new Fraction(numerator, denominator);\r\n for (let L of this.variables) {\r\n // Initialize the setLetter with the max degree\r\n M.setLetter(L, degree);\r\n for (let m of this._monoms) {\r\n M.setLetter(L, Fraction.min(m.degree(L), M.degree(L)));\r\n if (M.degree(L).isZero()) {\r\n break;\r\n }\r\n }\r\n }\r\n return M;\r\n }\r\n\r\n limitToInfinity = (letter?: string): Fraction => {\r\n const M = this.monomByDegree(undefined, letter),\r\n sign = M.coefficient.sign(),\r\n degree = M.degree(letter)\r\n\r\n if (degree.isStrictlyPositive()) {\r\n return sign === 1 ? (new Fraction()).infinite() : (new Fraction()).infinite().opposed()\r\n } else if (degree.isZero()) {\r\n return M.coefficient\r\n }\r\n\r\n // Any other cases\r\n return (new Fraction()).zero()\r\n }\r\n limitToNegativeInfinity = (letter?: string): Fraction => {\r\n const M = this.monomByDegree(undefined, letter),\r\n sign = M.coefficient.sign(),\r\n degree = M.degree(letter)\r\n\r\n if (degree.isStrictlyPositive()) {\r\n return sign === -1 ? (new Fraction()).infinite() : (new Fraction()).infinite().opposed()\r\n } else if (degree.isZero()) {\r\n return M.coefficient\r\n }\r\n\r\n // Any other cases\r\n return (new Fraction()).zero()\r\n }\r\n\r\n private _getAllPotentialFactors = (P: Polynom, maxDegree: number, letter: string): Polynom[] => {\r\n let m1 = P.monoms[0].dividers,\r\n m2 = P.monoms[P.monoms.length - 1].dividers\r\n\r\n let allDividers: Polynom[] = []\r\n m1.forEach(m1d => {\r\n // Get only polynom that has a degree less than a specific value\r\n if (m1d.degree(letter).leq(maxDegree)) {\r\n m2.forEach(m2d => {\r\n if (m1d.degree(letter).isNotEqual(m2d.degree(letter))) {\r\n allDividers.push(new Polynom(m1d, m2d))\r\n allDividers.push(new Polynom(m1d, m2d.clone().opposed()))\r\n }\r\n })\r\n }\r\n })\r\n\r\n return allDividers\r\n\r\n }\r\n\r\n private _parseString(inputStr: string, ...values: unknown[]): Polynom {\r\n if (values === undefined || values.length === 0) {\r\n inputStr = '' + inputStr;\r\n this._rawString = inputStr.trim().replaceAll(' ', '');\r\n\r\n // Parse the polynom using the shutting yard algorithm\r\n if (inputStr !== '' && !isNaN(Number(inputStr))) {\r\n this.empty();\r\n // It's a simple number.\r\n let m = new Monom(inputStr);\r\n // m.coefficient = new Fraction(inputStr);\r\n // m.literalStr = '';\r\n this.add(m);\r\n return this;\r\n }\r\n\r\n // Parse the string.\r\n return this.shutingYardToReducedPolynom(inputStr);\r\n } else if (/^[a-z]/.test(inputStr)) {\r\n // We assume the inputStr contains only letters.\r\n this.empty();\r\n\r\n let fractions = values.map(x => new Fraction(x));\r\n // Multiple setLetter version\r\n if (inputStr.length > 1) {\r\n // TODO: check that the number of values given correspond to the letters (+1 eventually)\r\n let letters = inputStr.split(''),\r\n i = 0;\r\n for (let F of fractions) {\r\n let m = new Monom();\r\n m.coefficient = F.clone();\r\n m.literalStr = letters[i] || '';\r\n this.add(m);\r\n i++;\r\n }\r\n }\r\n // Single setLetter version\r\n else {\r\n let n = fractions.length - 1;\r\n for (let F of fractions) {\r\n let m = new Monom()\r\n m.coefficient = F.clone();\r\n m.literalStr = `${inputStr}^${n}`\r\n this.add(m);\r\n n--;\r\n }\r\n }\r\n return this;\r\n } else {\r\n return this.zero();\r\n }\r\n }\r\n\r\n private genDisplay = (output?: string, forceSign?: boolean, wrapParentheses?: boolean, withAllMultSign?: boolean): string => {\r\n let P: string = '';\r\n\r\n for (const k of this._monoms) {\r\n if (k.coefficient.value === 0) {\r\n continue;\r\n }\r\n\r\n // The monom to be displayed\r\n let m\r\n if (withAllMultSign) {\r\n m = k.plotFunction\r\n } else {\r\n m = (output === 'tex') ? k.tex : k.display\r\n }\r\n\r\n P += `${(k.coefficient.sign() === 1 && (P !== '' || forceSign === true)) ? '+' : ''}${m}`;\r\n }\r\n\r\n if (wrapParentheses === true && this.length > 1) {\r\n if (output === 'tex') {\r\n P = `\\\\left( ${P} \\\\right)`;\r\n } else {\r\n P = `(${P})`;\r\n }\r\n }\r\n\r\n if (P === '') {\r\n P = '0';\r\n }\r\n return P;\r\n };\r\n\r\n /**\r\n * Main parse using a shutting yard class\r\n * @param inputStr\r\n */\r\n private shutingYardToReducedPolynom = (inputStr: string): Polynom => {\r\n // Get the RPN array of the current expression\r\n const SY: Shutingyard = new Shutingyard().parse(inputStr);\r\n const rpn: { token: string, tokenType: string }[] = SY.rpn;\r\n\r\n // New version for reducing shuting yard.\r\n this.zero()\r\n\r\n let stack: Polynom[] = [],\r\n monom: Monom = new Monom()\r\n\r\n // Loop through the\r\n for (const element of rpn) {\r\n this.addToken(stack, element);\r\n }\r\n\r\n if (stack.length === 1) {\r\n this.add(stack[0])\r\n }\r\n\r\n return this.reorder()\r\n }\r\n\r\n private multiplyByPolynom = (P: Polynom): Polynom => {\r\n const M: Monom[] = [];\r\n for (const m1 of this._monoms) {\r\n for (const m2 of P.monoms) {\r\n M.push(Monom.xmultiply(m1, m2));\r\n }\r\n }\r\n\r\n this._monoms = M;\r\n return this.reduce();\r\n };\r\n\r\n private multiplyByFraction = (F: Fraction): Polynom => {\r\n for (const m of this._monoms) {\r\n m.coefficient.multiply(F);\r\n }\r\n\r\n return this.reduce();\r\n };\r\n\r\n private multiplyByInteger = (nb: number): Polynom => {\r\n return this.multiplyByFraction(new Fraction(nb));\r\n };\r\n\r\n private multiplyByMonom = (M: Monom): Polynom => {\r\n for (const m of this._monoms) {\r\n m.multiply(M)\r\n }\r\n return this.reduce();\r\n };\r\n\r\n private divideByInteger = (nb: number): Polynom => {\r\n const nbF = new Fraction(nb);\r\n for (const m of this._monoms) {\r\n m.coefficient.divide(nbF);\r\n }\r\n return this;\r\n };\r\n\r\n private divideByFraction = (F: Fraction): Polynom => {\r\n for (const m of this._monoms) {\r\n m.coefficient.divide(F);\r\n }\r\n return this;\r\n };\r\n\r\n private _factorize2ndDegree = (letter: string): Polynom[] => {\r\n let P1: Polynom, P2: Polynom,\r\n a, b, c, delta, x1, x2, factor;\r\n\r\n // One variable only\r\n if (this.numberOfVars === 1) {\r\n a = this.monomByDegree(2, letter).coefficient;\r\n b = this.monomByDegree(1, letter).coefficient;\r\n c = this.monomByDegree(0, letter).coefficient;\r\n delta = b.clone().pow(2).subtract(a.clone().multiply(c).multiply(4));\r\n\r\n if (delta.isZero()) {\r\n x1 = b.clone().opposed().divide(a.clone().multiply(2))\r\n P1 = new Polynom(letter).subtract(x1.display).multiply(x1.denominator)\r\n P2 = new Polynom(letter).subtract(x1.display).multiply(x1.denominator)\r\n factor = a.divide(x1.denominator).divide(x1.denominator);\r\n\r\n if (!factor.isOne()) {\r\n // TODO: Update new Polynom to accept anything...\r\n return [new Polynom(factor.display), P1, P2]\r\n } else {\r\n return [P1, P2]\r\n }\r\n } else if (delta.isPositive() && delta.isSquare()) {\r\n x1 = b.clone().opposed()\r\n .add(delta.clone().sqrt())\r\n .divide(a.clone().multiply(2))\r\n x2 = b.clone().opposed()\r\n .subtract(delta.clone().sqrt())\r\n .divide(a.clone().multiply(2))\r\n\r\n // (2x+5)(3x-2)\r\n // 6x^2+11x-10\r\n // a = 6, b = 11, c = -10\r\n // delta = 121-4*6*(-10) = 361= 19^2\r\n // x1 = (-11 + 19) / 12 = 8/12 = 2/3\r\n // x2 = (-11 - 19) / 12 = -30/12 = -5/2\r\n factor = a.divide(x1.denominator).divide(x2.denominator);\r\n if (factor.isOne()) {\r\n return [\r\n new Polynom(letter).subtract(x1.display).multiply(x1.denominator),\r\n new Polynom(letter).subtract(x2.display).multiply(x2.denominator),\r\n ]\r\n } else {\r\n return [\r\n new Polynom(factor.display),\r\n new Polynom(letter).subtract(x1.display).multiply(x1.denominator),\r\n new Polynom(letter).subtract(x2.display).multiply(x2.denominator),\r\n ]\r\n\r\n }\r\n } else {\r\n // No solution possible - return the complete value.\r\n return [this.clone()]\r\n }\r\n } else {\r\n // If multiple variables, only handle perfect squares...\r\n a = this.monomByDegree(2, letter);\r\n b = this.monomByDegree(1, letter);\r\n c = this.monomByDegree(0, letter);\r\n\r\n\r\n if (a.isLiteralSquare() && c.isLiteralSquare()) {\r\n // Check the middle item is same as...\r\n if (b.clone().pow(2).isSameAs(a.clone().multiply(c))) {\r\n // Determine if the coefficient values matches.\r\n\r\n // Search 4 values (r, s, t, u) that matches:\r\n // (r X + s Y)(t X + u Y) = rt X^2 + (ru + st) XY + su Y^2\r\n\r\n let xPolynom = new Polynom('x', a.coefficient, b.coefficient, c.coefficient);\r\n let xFactors = xPolynom._factorize2ndDegree('x');\r\n\r\n let factors = [], xyzPolynom: Polynom;\r\n\r\n if (xFactors.length >= 2) {\r\n for (let p of xFactors) {\r\n if (p.degree().isZero()) {\r\n factors.push(p.clone())\r\n } else {\r\n xyzPolynom = p.clone();\r\n xyzPolynom.monoms[0].literal = a.literalSqrt\r\n xyzPolynom.monoms[1].literal = c.literalSqrt\r\n factors.push(xyzPolynom.clone())\r\n }\r\n }\r\n return factors\r\n }\r\n }\r\n }\r\n\r\n return [this.clone()]\r\n }\r\n }\r\n\r\n private _factorizeByGroups = (): Polynom[] => {\r\n // TODO: Factorize by groups.\r\n return [];\r\n }\r\n}\r\n","/**\r\n * Rational polynom module contains everything necessary to handle rational polynoms.\r\n * @module Polynom\r\n */\r\n\r\nimport {IEuclidian, Polynom} from \"./polynom\";\r\nimport {Fraction} from \"../coefficients/fraction\";\r\nimport {literalType} from \"./monom\";\r\nimport {PARTICULAR_SOLUTION} from \"./equation\";\r\nimport {RationalStudy} from \"./study/rationalStudy\";\r\nimport {StudyConfig} from \"./study\";\r\n\r\n/**\r\n * Rational class can handle rational polynoms\r\n */\r\nexport class Rational {\r\n private _denominator: Polynom;\r\n private _numerator: Polynom;\r\n private _rawString: string;\r\n\r\n /**\r\n *\r\n * @param numerator\r\n * @param denominator\r\n */\r\n constructor(numerator?: Polynom | string, denominator?: Polynom | string) {\r\n if (numerator instanceof Polynom) {\r\n this._numerator = numerator.clone()\r\n } else if (typeof numerator === 'string') {\r\n this._numerator = new Polynom(numerator)\r\n } else {\r\n this._numerator = new Polynom()\r\n }\r\n\r\n if (denominator instanceof Polynom) {\r\n this._denominator = denominator.clone()\r\n } else if (typeof denominator === 'string') {\r\n this._denominator = new Polynom(denominator)\r\n } else {\r\n this._denominator = new Polynom()\r\n }\r\n\r\n }\r\n\r\n get numerator(): Polynom {\r\n return this._numerator\r\n }\r\n\r\n get denominator(): Polynom {\r\n return this._denominator\r\n }\r\n\r\n get tex(): string {\r\n return `\\\\frac{ ${this._numerator.tex} }{ ${this._denominator.tex} }`;\r\n }\r\n\r\n get texFactors(): string {\r\n return `\\\\frac{ ${this._numerator.texFactors} }{ ${this._denominator.texFactors} }`\r\n }\r\n\r\n get plotFunction(): string {\r\n return `(${this._numerator.plotFunction})/(${this._denominator.plotFunction})`\r\n }\r\n\r\n clone = (): Rational => {\r\n return new Rational(\r\n this._numerator.clone(),\r\n this._denominator.clone()\r\n )\r\n }\r\n\r\n domain = (): string => {\r\n let zeroes = this._denominator.getZeroes();\r\n\r\n if (zeroes.length === 0 || zeroes[0].tex === PARTICULAR_SOLUTION.real) {\r\n return PARTICULAR_SOLUTION.varnothing\r\n } else if (zeroes[0].tex === PARTICULAR_SOLUTION.varnothing) {\r\n return PARTICULAR_SOLUTION.real\r\n } else {\r\n return '\\\\mathbb{R}\\\\setminus\\\\left\\\\{' +\r\n zeroes.map(x => x.tex).join(';') + '\\\\right\\\\}'\r\n }\r\n }\r\n\r\n amplify = (P: Polynom): Rational => {\r\n this._numerator.multiply(P);\r\n this._denominator.multiply(P);\r\n\r\n return this;\r\n }\r\n\r\n derivative = (letter?: string): Rational => {\r\n let N = this._numerator.clone(),\r\n D = this._denominator.clone(),\r\n dN = N.clone().derivative(letter),\r\n dD = D.clone().derivative(letter)\r\n\r\n this._numerator = dN.clone().multiply(D).subtract(N.clone().multiply(dD))\r\n this._denominator = D.clone().pow(2)\r\n\r\n return this\r\n }\r\n\r\n factorize = (letter?: string): Rational => {\r\n this._numerator.factorize(letter)\r\n this._denominator.factorize(letter)\r\n return this\r\n }\r\n\r\n simplify = (P: Polynom): Rational => {\r\n let NumeratorEuclidien = this._numerator.euclidian(P);\r\n if (!NumeratorEuclidien.reminder.isZero()) {\r\n return this;\r\n }\r\n\r\n let DenominatorEuclidien = this._denominator.euclidian(P);\r\n if (!DenominatorEuclidien.reminder.isZero()) {\r\n return this;\r\n }\r\n\r\n this._numerator = NumeratorEuclidien.quotient;\r\n this._denominator = DenominatorEuclidien.quotient;\r\n return this;\r\n }\r\n\r\n reduce = (): Rational => {\r\n this._numerator.factorize();\r\n for (let f of this._numerator.factors) {\r\n this.simplify(f);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n opposed = (): Rational => {\r\n this._numerator.opposed();\r\n return this;\r\n }\r\n\r\n add = (R: Rational): Rational => {\r\n // 1. Make sure both rational are at the same denominator\r\n // 2. Add the numerators.\r\n // 3. Simplify\r\n\r\n // Store the adding denominator\r\n let denominator = this._denominator.clone()\r\n\r\n // Amplif the main rational polynom by the adding denominator\r\n this.amplify(R._denominator)\r\n\r\n // Add to the numerator the adding value...\r\n this._numerator.add(R._numerator.clone().multiply(denominator));\r\n\r\n return this;\r\n }\r\n\r\n subtract = (R: Rational): Rational => {\r\n return this.add(R.clone().opposed())\r\n }\r\n\r\n euclidian = (): IEuclidian => {\r\n return this._numerator.euclidian(this._denominator)\r\n }\r\n\r\n // TODO : where and how is used limits ?\r\n limits = (value: Fraction | number, offset?: string, letter?: string): Fraction => {\r\n if (value === Infinity || value === -Infinity) {\r\n let {quotient, reminder} = this._numerator.clone().euclidian(this._denominator)\r\n\r\n // quotient is positive => it will be infinite.\r\n if (quotient.degree(letter).isStrictlyPositive()) {\r\n return value === Infinity ? quotient.limitToInfinity(letter) : quotient.limitToNegativeInfinity(letter)\r\n // return quotient.monomByDegree(undefined, letter).coefficient.sign()===1?(new Fraction()).infinite():(new Fraction()).infinite().opposed()\r\n } else {\r\n return quotient.monomByDegree(undefined, letter).coefficient\r\n }\r\n } else {\r\n let evalValues: literalType = {},\r\n evalValuesOffset: literalType = {},\r\n theLimit: Fraction | number,\r\n theSign: number,\r\n FR = this.clone().reduce()\r\n\r\n evalValues[letter === undefined ? 'x' : letter] = new Fraction(value)\r\n\r\n if (offset !== 'above' && offset !== 'below') {\r\n theLimit = FR._numerator.evaluate(evalValues)\r\n .divide(FR._denominator.evaluate(evalValues))\r\n\r\n return theLimit.isInfinity() ? theLimit.abs() : theLimit\r\n } else {\r\n if (offset === 'above') {\r\n evalValuesOffset[letter === undefined ? 'x' : letter] = (new Fraction(value)).add(0.000001)\r\n } else if (offset === 'below') {\r\n evalValuesOffset[letter === undefined ? 'x' : letter] = (new Fraction(value)).subtract(0.000001)\r\n }\r\n\r\n theLimit = FR._numerator.evaluate(evalValues)\r\n .divide(FR._denominator.evaluate(evalValues))\r\n theSign = FR._numerator.evaluate(evalValuesOffset)\r\n .divide(FR._denominator.evaluate(evalValuesOffset)).sign()\r\n\r\n if (theLimit.isInfinity()) {\r\n return theSign === 1 ? theLimit.abs() : theLimit.abs().opposed()\r\n } else {\r\n return theLimit\r\n }\r\n }\r\n }\r\n }\r\n\r\n evaluate = (values: literalType | Fraction | number): Fraction => {\r\n const r = new Fraction().zero();\r\n\r\n let N = this._numerator.evaluate(values),\r\n D = this._denominator.evaluate(values)\r\n\r\n return N.divide(D)\r\n };\r\n\r\n evaluateAsNumeric = (values: { [Key: string]: number } | number): number => {\r\n return this._numerator.evaluateAsNumeric(values) / this._denominator.evaluateAsNumeric(values)\r\n }\r\n\r\n study = (config?:StudyConfig|string): RationalStudy => {\r\n return new RationalStudy(this, config)\r\n }\r\n}\r\n","/**\r\n * Rational polynom module contains everything necessary to handle rational polynoms.\r\n * @module Polynom\r\n */\r\n\r\nimport {Rational} from \"./rational\";\r\nimport {ISolution} from \"./equation\";\r\nimport {Polynom} from \"./polynom\";\r\nimport {Fraction} from \"../coefficients/fraction\";\r\nimport {Point} from \"../geometry/point\";\r\nimport {NumExp} from \"../numexp\";\r\n\r\nexport type StudyableFunction = Rational\r\n\r\n\r\nexport enum ZEROTYPE {\r\n ZERO = 'z',\r\n DEFENCE = 'd',\r\n NOTHING = 't'\r\n}\r\n\r\nexport interface IZero extends ISolution {\r\n extrema: FUNCTION_EXTREMA,\r\n type: ZEROTYPE\r\n}\r\n\r\nexport enum ASYMPTOTE {\r\n VERTICAL = \"av\",\r\n HORIZONTAL = \"ah\",\r\n SLOPE = \"ao\",\r\n HOLE = \"hole\"\r\n}\r\n\r\nexport enum ASYMPTOTE_POSITION {\r\n \"LT\" = \"LT\",\r\n \"RT\" = \"RT\",\r\n \"LB\" = \"LB\",\r\n \"RB\" = \"RB\"\r\n}\r\n\r\nexport interface IAsymptote {\r\n deltaX: StudyableFunction\r\n display: string,\r\n fx: Polynom,\r\n limits: string,\r\n position: ASYMPTOTE_POSITION[]\r\n tableOfSign: ITableOfSigns,\r\n tex: string,\r\n type: ASYMPTOTE,\r\n zero: IZero,\r\n}\r\n\r\nexport enum FUNCTION_EXTREMA {\r\n MIN = \"min\",\r\n MAX = \"max\",\r\n FLAT = \"flat\",\r\n NOTHING = \"\"\r\n}\r\n\r\nexport interface IExtrema {\r\n tex: {\r\n x: string,\r\n y: string\r\n },\r\n type: FUNCTION_EXTREMA,\r\n value: {\r\n x: number,\r\n y: number\r\n }\r\n\r\n}\r\n\r\nexport interface ITableOfSigns {\r\n extremes: { [Key: string]: IExtrema },\r\n factors: Polynom[],\r\n fx: StudyableFunction,\r\n signs: (string[])[],\r\n tex: string\r\n type: TABLE_OF_SIGNS\r\n zeroes: IZero[],\r\n}\r\n\r\nexport enum TABLE_OF_SIGNS {\r\n SIGNS = \"signs\",\r\n GROWS = \"grows\",\r\n VARIATIONS = \"variatins\"\r\n}\r\n\r\nexport interface StudyConfig {\r\n asymptotes?: boolean,\r\n derivative?: boolean,\r\n domain?: boolean,\r\n name?: string,\r\n variable?: string,\r\n signs?: boolean,\r\n variations?: boolean\r\n}\r\n\r\n/**\r\n * The study class is a \"function study\" class that will get:\r\n * fx : get the function\r\n * domain : string\r\n * zeroes : Object (tex, IZero)\r\n * signs : table of signs + tex output using tkz-tab\r\n * av : vertical asymptotic\r\n * ah : horizontal asymptotic\r\n * ao : obliques\r\n * deltaX : position relative\r\n * dx : derivative\r\n * grows : growing table + tex output using tkz-tab\r\n * ddx : dérivée seconde\r\n * variations : variation table + tex output using tkz-tab\r\n */\r\nexport class Study {\r\n fx: StudyableFunction\r\n private _asymptotes: IAsymptote[]\r\n private _derivative: ITableOfSigns\r\n private _signs: ITableOfSigns\r\n private _variations: ITableOfSigns\r\n private _zeroes: IZero[]\r\n private _config: StudyConfig\r\n private _name: string\r\n\r\n constructor(fx: StudyableFunction, config?: StudyConfig | string) {\r\n this.fx = fx\r\n\r\n this._config = {\r\n name :'f',\r\n variable: 'x',\r\n domain :true,\r\n asymptotes :true,\r\n signs :true,\r\n derivative :true,\r\n variations :true,\r\n }\r\n\r\n if (config) {\r\n if (typeof config === 'string') {\r\n const d = config.split(',')\r\n this._config = {}\r\n let n = d.filter(x=>x.includes('(') && x.includes(')'))\r\n\r\n if(n.length===1){\r\n this._config.name = n[0].split('(')[0]\r\n this._config.variable = n[0].split('(')[1].split(')')[0]\r\n }\r\n this._config.domain = d.includes('d')\r\n this._config.asymptotes = d.includes('a')\r\n this._config.signs = d.includes('signs')\r\n this._config.derivative = d.includes('dx')\r\n this._config.variations = d.includes('ddx')\r\n } else {\r\n this._config = config\r\n }\r\n }\r\n\r\n this.makeStudy()\r\n return this\r\n }\r\n\r\n get name(): string {\r\n return this._config.name;\r\n }\r\n\r\n set name(value: string) {\r\n this._config.name = value;\r\n }\r\n\r\n get config(): StudyConfig {\r\n return this._config;\r\n }\r\n\r\n set config(value: StudyConfig) {\r\n this._config = value;\r\n }\r\n\r\n get zeroes(): IZero[] {\r\n return this._zeroes;\r\n }\r\n\r\n get domain(): string {\r\n return this.fx.domain()\r\n }\r\n\r\n get signs(): ITableOfSigns {\r\n return this._signs;\r\n }\r\n\r\n get asymptotes(): IAsymptote[] {\r\n return this._asymptotes;\r\n }\r\n\r\n get derivative(): ITableOfSigns {\r\n return this._derivative;\r\n }\r\n\r\n get texSigns(): string {\r\n return this._makeTexFromTableOfSigns(this._signs)\r\n }\r\n\r\n get texGrows(): string {\r\n return this._makeTexFromTableOfSigns(this._derivative)\r\n }\r\n\r\n get texVariations(): string {\r\n return this._makeTexFromTableOfSigns(this._variations)\r\n }\r\n\r\n makeStudy = (): void => {\r\n this._zeroes = this.makeZeroes()\r\n\r\n if (this._config.signs) this._signs = this.makeSigns()\r\n\r\n if (this._config.asymptotes) this._asymptotes = this.makeAsymptotes()\r\n\r\n if (this._config.derivative) this._derivative = this.makeDerivative()\r\n\r\n if (this._config.variations) this._variations = this.makeVariation()\r\n\r\n // Table of signs / derivative / variation\r\n if (this._config.signs) this._signs.tex = this.texSigns\r\n\r\n if (this._config.derivative) this._derivative.tex = this.texGrows\r\n\r\n if (this._config.variations) this._variations.tex = this.texVariations\r\n };\r\n\r\n indexOfZero = (zeroes: IZero[], zero: IZero | ISolution): number => {\r\n for (let i = 0; i < zeroes.length; i++) {\r\n if (zeroes[i].tex === zero.tex) {\r\n return i\r\n }\r\n }\r\n return -1\r\n };\r\n\r\n makeOneLineForSigns = (factor: Polynom, zeroes: IZero[], zeroSign: ZEROTYPE): string[] => {\r\n let oneLine: string[] = [],\r\n currentZero = factor.getZeroes().map(x => x.tex)\r\n\r\n // First +/- sign, before the first zero\r\n oneLine.push('')\r\n if (factor.degree().isZero()) {\r\n oneLine.push(factor.monoms[0].coefficient.sign() === 1 ? '+' : '-')\r\n } else {\r\n oneLine.push(factor.evaluate(zeroes[0].value - 1).sign() === 1 ? '+' : '-')\r\n }\r\n\r\n for (let i = 0; i < zeroes.length; i++) {\r\n // Add the zero if it's the current one\r\n oneLine.push(currentZero.includes(zeroes[i].tex) ? zeroSign : ZEROTYPE.NOTHING)\r\n\r\n // + / - sign after the current zero\r\n if (i < zeroes.length - 1) {\r\n oneLine.push(factor.evaluate((zeroes[i].value + zeroes[i + 1].value) / 2).sign() === 1 ? '+' : '-')\r\n } else if (i === zeroes.length - 1) {\r\n oneLine.push(factor.evaluate(zeroes[i].value + 1).sign() === 1 ? '+' : '-')\r\n }\r\n\r\n }\r\n oneLine.push('')\r\n\r\n return oneLine\r\n }\r\n\r\n makeSignsResult = (signs: (string[])[]): string[] => {\r\n\r\n // Initialize the result line with the first line of the signs table\r\n let resultLine: string[] = signs[0].map((x, index) => {\r\n if (index === 0 || index === signs[0].length - 1) {\r\n return ''\r\n }\r\n\r\n if (index % 2 === 0) {\r\n return 't'\r\n }\r\n\r\n return '+'\r\n })\r\n\r\n // Go through each lines (except the first)\r\n for (let current of signs) {\r\n\r\n for (let i = 0; i < current.length; i++) {\r\n if (i % 2 === 0) {\r\n // t, z or d\r\n if (resultLine[i] === 'd') {\r\n continue\r\n }\r\n if (current[i] !== 't') {\r\n resultLine[i] = current[i]\r\n }\r\n } else {\r\n // + or -\r\n if (current[i] === '-') {\r\n resultLine[i] = resultLine[i] === '+' ? '-' : '+'\r\n }\r\n }\r\n }\r\n }\r\n\r\n return resultLine\r\n }\r\n\r\n makeGrowsResult = (tos: ITableOfSigns): { growsLine: string[], extremes: { [Key: string]: IExtrema } } => {\r\n\r\n // Use the last line (=> resultLine) to grab the necessary information\r\n let signsAsArray = Object.values(tos.signs),\r\n resultLine = signsAsArray[signsAsArray.length - 1],\r\n growsLine: string[] = [],\r\n extremes: { [Key: string]: IExtrema } = {},\r\n zeroes = tos.zeroes\r\n\r\n // Get the extremes\r\n for (let i = 0; i < zeroes.length; i++) {\r\n\r\n // Get the corresponding item in the resultLine.\r\n let pos = 2 * i + 2\r\n if (resultLine[pos] === 'z') {\r\n\r\n // It's a zero. Get the coordinates\r\n let x: number, y: number, zero = zeroes[i].exact,\r\n pt: Point,\r\n xTex: string, yTex: string,\r\n pointType: FUNCTION_EXTREMA\r\n\r\n // TODO: NumExp should parse something that isn't yet plotFunction\r\n let exp = new NumExp(this.fx.plotFunction)\r\n\r\n if (zero instanceof Fraction) {\r\n let value: Fraction = zero,\r\n evalY = this.fx.evaluate(value)\r\n\r\n x = zero.value\r\n y = evalY.value\r\n xTex = zero.tex\r\n yTex = evalY.tex\r\n } else {\r\n x = zeroes[i].value\r\n y = exp.evaluate({x})\r\n\r\n xTex = x.toFixed(2)\r\n yTex = y.toFixed(2)\r\n }\r\n\r\n // Determine the type of the zero.\r\n if (resultLine[pos - 1] === resultLine[pos + 1]) {\r\n pointType = FUNCTION_EXTREMA.FLAT\r\n } else if (resultLine[pos - 1] === '+') {\r\n pointType = FUNCTION_EXTREMA.MAX\r\n } else {\r\n pointType = FUNCTION_EXTREMA.MIN\r\n\r\n }\r\n\r\n // Add the point to the list\r\n extremes[zeroes[i].tex] = {\r\n type: pointType,\r\n tex: {x: xTex, y: yTex},\r\n value: {x, y}\r\n }\r\n }\r\n }\r\n\r\n // Create the grows line, based on tkz-tab\r\n // \\tkzTabLine{ , + , z , - , d , - , z , + , }\r\n // \\tkzTabVar{ -/ , +/$3$ , -D+/ , -/$1$ , +/ }\r\n growsLine.push(resultLine[1] === '+' ? '-/' : '+/')\r\n for (let i = 1; i < resultLine.length - 1; i++) {\r\n if (resultLine[i] === \"z\") {\r\n let extr = extremes[zeroes[(i - 2) / 2].tex]\r\n\r\n growsLine.push(`${resultLine[i - 1]}/\\\\(${extr.type}(${extr.tex.x};${extr.tex.y})\\\\)`)\r\n } else if (resultLine[i] === 'd') {\r\n growsLine.push(`${resultLine[i - 1]}D${resultLine[i + 1] === '+' ? '-' : '+'}/`)\r\n }\r\n }\r\n growsLine.push(`${resultLine[resultLine.length - 2]}/`)\r\n\r\n return {growsLine, extremes}\r\n }\r\n\r\n makeVariationsResult = (tos: ITableOfSigns): { varsLine: string[], extremes: { [Key: string]: IExtrema } } => {\r\n // TODO: make variations result is not yet implemented.\r\n let extremes = {},\r\n varsLine: string[] = []\r\n return {varsLine, extremes}\r\n }\r\n\r\n makeZeroes(): IZero[] {\r\n return []\r\n };\r\n\r\n makeSigns(): ITableOfSigns {\r\n return {\r\n type: TABLE_OF_SIGNS.SIGNS,\r\n fx: null,\r\n factors: [],\r\n zeroes: [],\r\n signs: [],\r\n extremes: {},\r\n tex: ''\r\n }\r\n };\r\n\r\n makeAsymptotes(): IAsymptote[] {\r\n return []\r\n }\r\n\r\n makeDerivative(): ITableOfSigns {\r\n return {\r\n type: TABLE_OF_SIGNS.GROWS,\r\n fx: null,\r\n factors: [],\r\n zeroes: [],\r\n signs: [],\r\n extremes: {},\r\n tex: ''\r\n }\r\n }\r\n\r\n makeVariation(): ITableOfSigns {\r\n return {\r\n type: TABLE_OF_SIGNS.VARIATIONS,\r\n fx: null,\r\n factors: [],\r\n zeroes: [],\r\n signs: [],\r\n extremes: {},\r\n tex: ''\r\n }\r\n }\r\n\r\n drawCode = (): string => {\r\n // Function as string\r\n let code = `f(x)=${this.fx.plotFunction}`\r\n\r\n // Asymptotes\r\n let i: number = 1\r\n this.asymptotes.forEach(asymptote => {\r\n if (asymptote.type === ASYMPTOTE.VERTICAL) {\r\n code += `\\nav_${i}=line x=${asymptote.zero.value}->red,dash`\r\n i++\r\n } else if (asymptote.type === ASYMPTOTE.HORIZONTAL) {\r\n code += `\\nah=line y=${asymptote.fx.monoms[0].coefficient.value}->orange,dash`\r\n } else if (asymptote.type === ASYMPTOTE.SLOPE) {\r\n code += `\\nao=line y=${asymptote.fx.plotFunction}->red,dash`\r\n }\r\n i++\r\n })\r\n\r\n // Extremes\r\n for (let zero in this.derivative.extremes) {\r\n let extreme = this.derivative.extremes[zero]\r\n\r\n code += `\\nM_${i}(${extreme.value.x},${extreme.value.y})*`\r\n i++\r\n }\r\n\r\n // Zeroes\r\n this.zeroes.forEach(zero => {\r\n if (zero.type === ZEROTYPE.ZERO) {\r\n code += `\\nZ_${i}(${zero.value},0)*`\r\n i++\r\n }\r\n })\r\n\r\n return code\r\n }\r\n\r\n private _makeTexFromTableOfSigns = (tos: ITableOfSigns): string => {\r\n let factors = tos.factors.map(x => `\\\\(${x.tex}\\\\)/1`),\r\n factorsFx = `\\\\(${this._config.name}(${this._config.variable})\\\\)/1.2`,\r\n zeroes = tos.zeroes\r\n\r\n // Add the last lines \"label\"\r\n if (tos.type === TABLE_OF_SIGNS.GROWS) {\r\n factorsFx = `\\\\(${this._config.name}'(${this._config.variable})\\\\)/1.2,\\\\(f(x${this._config.variable})\\\\)/2`\r\n } else if (tos.type === TABLE_OF_SIGNS.VARIATIONS) {\r\n factorsFx = `\\\\(${this._config.name}''(${this._config.variable})\\\\)/1.2,\\\\(f(${this._config.variable})\\\\)/2`\r\n }\r\n\r\n // Create the tikzPicture header\r\n let tex = `\\\\begin{tikzpicture}\r\n\\\\tkzTabInit[lgt=3,espcl=2,deltacl=0]{/1.2,${factors.join(',')},/.1,${factorsFx} }{{\\\\scriptsize \\\\hspace{1cm} \\\\(-\\\\infty\\\\)},\\\\(${zeroes.map(x => x.tex).join('\\\\),\\\\(')}\\\\),{\\\\scriptsize \\\\hspace{-1cm} \\\\(+\\\\infty\\\\)}}`\r\n\r\n let pos\r\n for (pos = 0; pos < tos.factors.length; pos++) {\r\n tex += (`\\n\\\\tkzTabLine{${tos.signs[pos].join(',')}}`)\r\n }\r\n\r\n // Add the result line\r\n tex += (`\\n\\\\tkzTabLine{${tos.signs[pos].join(',')}}`)\r\n // Add the grows / vars line\r\n if (tos.type === TABLE_OF_SIGNS.GROWS) {\r\n tex += (`\\n\\\\tkzTabVar{${tos.signs[pos + 1].join(',')}}`)\r\n } else if (tos.type === TABLE_OF_SIGNS.VARIATIONS) {\r\n // TODO: Check variations table for as tex\r\n tex += (`\\n\\\\tkzTabVar{${tos.signs[pos + 1].join(',')}}`)\r\n }\r\n\r\n tex += `\\n\\\\end{tikzpicture}`\r\n\r\n return tex\r\n }\r\n}\r\n","/**\r\n * The study class is a \"function study\" class that will get:\r\n * fx : get the function\r\n * domain : string\r\n * zeroes : Object (tex, IZero)\r\n * signs : table of signs + tex output using tkz-tab\r\n * av : vertical asymptotic\r\n * ah : horizontal asymptotic\r\n * ao : obliques\r\n * deltaX : position relative\r\n * dx : derivative\r\n * grows : growing table + tex output using tkz-tab\r\n * ddx : dérivée seconde\r\n * variations : variation table + tex output using tkz-tab\r\n */\r\nimport {\r\n ASYMPTOTE,\r\n ASYMPTOTE_POSITION,\r\n FUNCTION_EXTREMA,\r\n IAsymptote,\r\n ITableOfSigns,\r\n IZero,\r\n Study,\r\n StudyableFunction, StudyConfig,\r\n TABLE_OF_SIGNS,\r\n ZEROTYPE\r\n} from \"../study\";\r\nimport {Rational} from \"../rational\";\r\nimport {Fraction} from \"../../coefficients/fraction\";\r\nimport {Polynom} from \"../polynom\";\r\n\r\nexport class RationalStudy extends Study {\r\n constructor(fx: StudyableFunction, config?: StudyConfig|string) {\r\n super(fx, config)\r\n\r\n return this\r\n }\r\n\r\n makeZeroes(): IZero[] {\r\n return this._getZeroes(this.fx)\r\n };\r\n\r\n makeSigns(): ITableOfSigns {\r\n return this._getSigns(this.fx, this.zeroes)\r\n };\r\n\r\n makeAsymptotes(): IAsymptote[] {\r\n const reduced: Rational = this.fx.clone().reduce()\r\n\r\n // Vertical\r\n let asymptotes: IAsymptote[] = []\r\n this.zeroes.filter(x => x.type === ZEROTYPE.DEFENCE).forEach(zero => {\r\n // Check if it's a hole or an asymptote\r\n let Ztype = ASYMPTOTE.VERTICAL,\r\n tex = `x=${zero.tex}`,\r\n display = `x=${zero.display}`\r\n\r\n // Check if it's a hole: the reduced polynom should not be null\r\n if (zero.exact instanceof Fraction) {\r\n if (reduced.denominator.evaluate(zero.exact).isNotZero()) {\r\n Ztype = ASYMPTOTE.HOLE\r\n tex = `(${zero.tex};${reduced.evaluate(zero.exact).tex})`\r\n display = `(${zero.display};${reduced.evaluate(zero.exact).display})`\r\n }\r\n } else {\r\n if (reduced.denominator.evaluate(zero.value).isNotZero()) {\r\n Ztype = ASYMPTOTE.HOLE\r\n tex = `(${zero.tex};${reduced.evaluate(zero.value).tex})`\r\n display = `(${zero.display};${reduced.evaluate(zero.value).display})`\r\n }\r\n }\r\n\r\n // Get the position before and after the asymptote.\r\n const delta = 0.000001\r\n let before = this.fx.evaluateAsNumeric(zero.value - delta),\r\n after = this.fx.evaluateAsNumeric(zero.value + delta),\r\n position: ASYMPTOTE_POSITION[] = [],\r\n pm = \"\"\r\n\r\n if (after < -10000) {\r\n position.push(ASYMPTOTE_POSITION.RB)\r\n pm += \"m\"\r\n } else if (after > 10000) {\r\n position.push(ASYMPTOTE_POSITION.RT)\r\n pm += \"p\"\r\n }\r\n\r\n if (before < -10000) {\r\n position.push(ASYMPTOTE_POSITION.LB)\r\n pm += \"m\"\r\n } else if (before > 10000) {\r\n position.push(ASYMPTOTE_POSITION.LT)\r\n pm += \"p\"\r\n }\r\n\r\n // Left and right are to infinity\r\n // TODO: handle the case were one side of the asymptote isn't infinity (not possible in rational study?!)\r\n if (pm === \"pp\") {\r\n pm = \"+\"\r\n } else if (pm === \"mm\") {\r\n pm = \"-\"\r\n } else {\r\n pm = `\\\\${pm}`\r\n }\r\n\r\n asymptotes.push({\r\n fx: null,\r\n type: Ztype,\r\n tex,\r\n display,\r\n zero: zero,\r\n limits: `\\\\lim_{x\\\\to${zero.tex} }\\\\ f(x) = ${pm}\\\\infty`,\r\n deltaX: null,\r\n tableOfSign: null,\r\n position\r\n })\r\n })\r\n\r\n // Sloped asymptote\r\n let NDegree = this.fx.numerator.degree(),\r\n DDegree = this.fx.denominator.degree()\r\n if (NDegree.isEqual(DDegree)) {\r\n let H = this.fx.numerator.monomByDegree().coefficient.clone().divide(this.fx.denominator.monomByDegree().coefficient),\r\n Htex = H.tex\r\n\r\n let {reminder} = reduced.euclidian(),\r\n deltaX = new Rational(reminder, reduced.denominator)\r\n\r\n // Determine the position above or below on the left / right of the asymptote.\r\n asymptotes.push({\r\n fx: new Polynom(H),\r\n type: ASYMPTOTE.HORIZONTAL,\r\n tex: `y=${Htex}`,\r\n display: `y=${H.display}`,\r\n zero: null,\r\n limits: `\\\\lim_{x\\\\to\\\\infty}\\\\ f(x) = ${Htex}`,\r\n deltaX,\r\n tableOfSign: this._getSigns(deltaX),\r\n position: this._getHorizontalAsymptoteRelativePositon(deltaX)\r\n })\r\n } else if (DDegree.greater(NDegree)) {\r\n asymptotes.push({\r\n fx: new Polynom('0'),\r\n type: ASYMPTOTE.HORIZONTAL,\r\n tex: `y=0`,\r\n display: `y=0`,\r\n zero: null,\r\n limits: `\\\\lim_{x\\\\to\\\\infty}\\\\ f(x) = ${0}`,\r\n deltaX: null,\r\n tableOfSign: null,\r\n position: this._getHorizontalAsymptoteRelativePositon(this.fx)\r\n })\r\n } else if (NDegree.value - 1 === DDegree.value) {\r\n // Calculate the slope\r\n let {quotient, reminder} = reduced.euclidian(),\r\n deltaX = new Rational(reminder, reduced.denominator)\r\n\r\n asymptotes.push({\r\n fx: quotient.clone(),\r\n type: ASYMPTOTE.SLOPE,\r\n tex: `y=${quotient.tex}`,\r\n display: `y=${quotient.display}`,\r\n zero: null,\r\n limits: ``,\r\n deltaX: new Rational(reminder, reduced.denominator),\r\n tableOfSign: this._getSigns(deltaX),\r\n position: this._getHorizontalAsymptoteRelativePositon(deltaX)\r\n })\r\n }\r\n\r\n return asymptotes\r\n };\r\n\r\n _getHorizontalAsymptoteRelativePositon(deltaX: Rational, delta: number = 1000000): ASYMPTOTE_POSITION[] {\r\n\r\n let position: ASYMPTOTE_POSITION[] = [],\r\n before = deltaX.evaluateAsNumeric(-delta),\r\n after = deltaX.evaluateAsNumeric(delta)\r\n\r\n if (before >= 0) {\r\n position.push(ASYMPTOTE_POSITION.LT)\r\n } else {\r\n position.push(ASYMPTOTE_POSITION.LB)\r\n }\r\n\r\n if (after >= 0) {\r\n position.push(ASYMPTOTE_POSITION.RT)\r\n } else {\r\n position.push(ASYMPTOTE_POSITION.RB)\r\n }\r\n\r\n return position\r\n }\r\n\r\n makeDerivative(): ITableOfSigns {\r\n let dx = this.fx.clone().derivative(),\r\n tos = this._getSigns(dx, this._getZeroes(dx), TABLE_OF_SIGNS.GROWS)\r\n\r\n let result = this.makeGrowsResult(tos)\r\n tos.signs.push(result.growsLine)\r\n tos.extremes = result.extremes\r\n return tos\r\n };\r\n\r\n makeVariation(): ITableOfSigns {\r\n // Get the zeroes, make signs.\r\n let dx = this.derivative.fx.clone().derivative(),\r\n tos = this._getSigns(dx, this._getZeroes(dx), TABLE_OF_SIGNS.VARIATIONS)\r\n\r\n let result = this.makeVariationsResult(tos)\r\n tos.signs.push(result.varsLine)\r\n tos.extremes = result.extremes\r\n return tos\r\n };\r\n\r\n private _getZeroes(fx: StudyableFunction) {\r\n // All zeroes.\r\n let zeroes: IZero[] = []\r\n\r\n fx.numerator.getZeroes().filter(x => !isNaN(x.value)).forEach(z => {\r\n // add the item\r\n zeroes.push({\r\n tex: z.tex,\r\n display: z.display,\r\n value: z.value,\r\n exact: z.exact,\r\n extrema: FUNCTION_EXTREMA.NOTHING,\r\n type: ZEROTYPE.ZERO\r\n })\r\n })\r\n\r\n fx.denominator.getZeroes().filter(x => !isNaN(x.value)).forEach(z => {\r\n let idx = this.indexOfZero(zeroes, z)\r\n\r\n if (idx !== -1) {\r\n zeroes[idx].type = ZEROTYPE.DEFENCE\r\n } else {\r\n // Add the item\r\n zeroes.push({\r\n tex: z.tex,\r\n display: z.display,\r\n value: z.value,\r\n exact: z.exact,\r\n extrema: FUNCTION_EXTREMA.NOTHING,\r\n type: ZEROTYPE.DEFENCE\r\n })\r\n }\r\n })\r\n\r\n // sort all zeroes\r\n zeroes.sort((a, b) => a.value - b.value)\r\n\r\n return zeroes\r\n }\r\n\r\n private _getSigns(fx: Rational, zeroes?: IZero[], typeOfTable?: TABLE_OF_SIGNS): ITableOfSigns {\r\n // Factorize the rational\r\n let signs: (string[])[] = [],\r\n factors: Polynom[] = []\r\n\r\n if (zeroes === undefined) {\r\n zeroes = this._getZeroes(fx)\r\n }\r\n\r\n fx.numerator.factors.forEach(factor => {\r\n signs.push(this.makeOneLineForSigns(factor, zeroes, ZEROTYPE.ZERO))\r\n factors.push(factor.clone())\r\n })\r\n\r\n fx.denominator.factors.forEach(factor => {\r\n signs.push(this.makeOneLineForSigns(factor, zeroes, ZEROTYPE.DEFENCE))\r\n factors.push(factor.clone())\r\n })\r\n\r\n signs.push(this.makeSignsResult(signs))\r\n\r\n return {\r\n type: typeOfTable,\r\n fx,\r\n factors,\r\n zeroes,\r\n signs,\r\n extremes: {},\r\n tex: ''\r\n }\r\n }\r\n}\r\n","import {Numeric} from \"../numeric\";\r\n\r\nexport type FractionParsingType = number | string | Fraction\r\n\r\n/**\r\n * The fraction class make possible to handle\r\n * TODO: Write the documentation correctly.\r\n * \\\\(\\frac{a}{b}\\\\) or \\\\[\\frac{a}{b}\\\\] values.\r\n */\r\nexport class Fraction {\r\n private _denominator: number;\r\n private _numerator: number;\r\n\r\n constructor(value?: unknown, denominatorOrPeriodic?: number) {\r\n this._numerator = 1;\r\n this._denominator = 1;\r\n\r\n if (value !== undefined) {\r\n this.parse(value, denominatorOrPeriodic);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n // ------------------------------------------\r\n // Getter and setter\r\n // ------------------------------------------\r\n\r\n get numerator(): number {\r\n return this._numerator;\r\n }\r\n\r\n set numerator(value: number) {\r\n this._numerator = value;\r\n }\r\n\r\n get denominator(): number {\r\n return this._denominator;\r\n }\r\n\r\n set denominator(value: number) {\r\n this._denominator = value;\r\n }\r\n\r\n get value(): number {\r\n return this._numerator / this._denominator;\r\n }\r\n\r\n // Display getter\r\n get tex(): string {\r\n if (this.isInfinity()) {\r\n return `${this.sign() === 1 ? '+' : '-'}\\\\infty`\r\n }\r\n\r\n if (this.isExact()) {\r\n if (this._denominator === 1) {\r\n return `${this._numerator}`;\r\n } else if (this._numerator < 0) {\r\n return `-\\\\frac{ ${-this._numerator} }{ ${this._denominator} }`;\r\n } else {\r\n return `\\\\frac{ ${this._numerator} }{ ${this._denominator} }`;\r\n }\r\n } else {\r\n return this.value.toFixed(3)\r\n }\r\n }\r\n\r\n get texWithSign():string {\r\n return this.isPositive() ? `+${this.tex}` : this.tex;\r\n }\r\n\r\n get display(): string {\r\n if (this.isExact()) {\r\n if (this._denominator === 1) {\r\n return `${this._numerator}`;\r\n } else {\r\n return `${this._numerator}/${this._denominator}`;\r\n }\r\n } else {\r\n return this.value.toFixed(3)\r\n }\r\n }\r\n\r\n // Helper function to display fractions\r\n get frac(): string {\r\n return this.tex;\r\n }\r\n\r\n get dfrac(): string {\r\n return this.tex.replace('\\\\frac', '\\\\dfrac');\r\n }\r\n\r\n get tfrac(): string {\r\n return this.tex.replace('\\\\frac', '\\\\tfrac')\r\n }\r\n\r\n static max = (...fractions: (Fraction | number)[]): Fraction => {\r\n let M = new Fraction(fractions[0])\r\n\r\n for (let m of fractions) {\r\n let compare = new Fraction(m)\r\n if (compare.greater(M)) {\r\n M = compare.clone()\r\n }\r\n }\r\n\r\n return M\r\n }\r\n\r\n static min = (...fractions: (Fraction | number)[]): Fraction => {\r\n let M = new Fraction(fractions[0])\r\n\r\n for (let m of fractions) {\r\n let compare = new Fraction(m)\r\n if (compare.lesser(M)) {\r\n M = compare.clone()\r\n }\r\n }\r\n\r\n return M\r\n }\r\n\r\n // ------------------------------------------\r\n // Creation / parsing functions\r\n\r\n static average = (...fractions: (Fraction | number)[]): Fraction => {\r\n let M = new Fraction().zero()\r\n\r\n for (let f of fractions) {\r\n M.add(f)\r\n }\r\n\r\n M.divide(fractions.length)\r\n\r\n return M\r\n }\r\n\r\n static unique = (fractions: Fraction[], sorted?: boolean): Fraction[] => {\r\n // TODO: make sure it's wokring -> test !\r\n let unique: { [Key: string]: boolean } = {},\r\n distinct: Fraction[] = []\r\n fractions.forEach(x => {\r\n if (!unique[x.clone().reduce().tex]) {\r\n distinct.push(x.clone())\r\n unique[x.tex] = true\r\n }\r\n })\r\n\r\n if (sorted) {\r\n return Fraction.sort(distinct)\r\n } else {\r\n return distinct\r\n }\r\n }\r\n\r\n static sort = (fractions: Fraction[], reverse?: boolean): Fraction[] => {\r\n // Todo make sure it's the correct order, not reverse -> make a test\r\n let sorted = fractions.sort((a, b) => a.value - b.value)\r\n\r\n if (reverse) {\r\n sorted.reverse()\r\n }\r\n\r\n return sorted\r\n }\r\n\r\n isApproximative = (): boolean => {\r\n return this._numerator.toString().length >= 15 && this._denominator.toString().length >= 15\r\n }\r\n\r\n isExact = (): boolean => {\r\n return !this.isApproximative()\r\n }\r\n\r\n // ------------------------------------------\r\n /**\r\n * Parse the value to get the numerator and denominator\r\n * @param value : number or string to parse to get the fraction\r\n * @param denominatorOrPeriodic (optional|number) : length of the periodic part: 2.333333 => 1 or denominator value\r\n */\r\n parse = (value: unknown, denominatorOrPeriodic?: number): Fraction => {\r\n let S: string[];\r\n\r\n // A null value means a zero fraction.\r\n if (value === null || value === \"\") {\r\n this._numerator = 0;\r\n this._denominator = 1;\r\n return this;\r\n }\r\n\r\n switch (typeof value) {\r\n case \"string\":\r\n // Split the string value in two parts: Numerator/Denominator\r\n S = value.split('/');\r\n\r\n // Security checks\r\n if (S.length > 2) throw value + \" has too many divide signs\";\r\n if (S.map(x => x === '' || isNaN(Number(x))).includes(true)) throw value + \" is not a valid number\"\r\n\r\n if (S.length === 1) {\r\n // No divide sign - it's a number\r\n return this.parse(+S[0]);\r\n } else if (S.length === 2) {\r\n // One divide signe\r\n // We check if the denominator is zero\r\n if (S[1] === '0') {\r\n this._numerator = NaN;\r\n this._denominator = 1;\r\n } else {\r\n this._numerator = +S[0];\r\n this._denominator = +S[1];\r\n }\r\n } else {\r\n // More than one divide sign ?\r\n // This is impossible\r\n this._numerator = NaN;\r\n this._denominator = 1;\r\n }\r\n break;\r\n case \"number\":\r\n if (Number.isSafeInteger(value)) {\r\n // The given value is an integer\r\n this._numerator = +value;\r\n\r\n if (denominatorOrPeriodic === undefined || !Number.isSafeInteger(denominatorOrPeriodic)) {\r\n this._denominator = 1;\r\n } else {\r\n this._denominator = +denominatorOrPeriodic;\r\n }\r\n } else {\r\n // The given value is a float number\r\n // Get the number of decimals after the float sign\r\n let [unit, decimal] = (value.toString()).split('.')\r\n let p: number = decimal?decimal.length:0;\r\n\r\n // Detect if the decimal part is periodic or not...\r\n\r\n\r\n // Transform the float number in two integer\r\n if (denominatorOrPeriodic === undefined) {\r\n this._numerator = value * Math.pow(10, p);\r\n this._denominator = Math.pow(10, p);\r\n } else if (Number.isSafeInteger(denominatorOrPeriodic)) {\r\n this._numerator = value * Math.pow(10, p) - Math.floor(value * Math.pow(10, p - denominatorOrPeriodic));\r\n this.denominator = Math.pow(10, p) - Math.pow(10, p - denominatorOrPeriodic)\r\n }\r\n\r\n this.reduce()\r\n }\r\n break;\r\n case \"object\":\r\n if (value instanceof Fraction) {\r\n this._numerator = +value.numerator;\r\n this._denominator = +value.denominator;\r\n }\r\n break;\r\n }\r\n return this;\r\n };\r\n\r\n // ------------------------------------------\r\n // Mathematical operations\r\n\r\n clone = (): Fraction => {\r\n let F = new Fraction();\r\n F.numerator = +this._numerator;\r\n F.denominator = +this._denominator;\r\n return F;\r\n };\r\n\r\n zero = (): Fraction => {\r\n this._numerator = 0;\r\n this._denominator = 1;\r\n return this;\r\n };\r\n\r\n one = (): Fraction => {\r\n this._numerator = 1;\r\n this._denominator = 1;\r\n return this;\r\n };\r\n\r\n infinite = (): Fraction => {\r\n this._numerator = Infinity;\r\n this._denominator = 1;\r\n return this;\r\n };\r\n\r\n invalid = (): Fraction => {\r\n this._numerator = NaN;\r\n this._denominator = 1;\r\n return this;\r\n };\r\n\r\n // ------------------------------------------\r\n opposed = (): Fraction => {\r\n this._numerator = -this._numerator;\r\n return this;\r\n };\r\n\r\n add = (F: Fraction | number): Fraction => {\r\n if (F instanceof Fraction) {\r\n let N: number = this._numerator,\r\n D: number = this._denominator;\r\n\r\n this._numerator = N * F.denominator + F.numerator * D;\r\n this._denominator = D * F.denominator;\r\n } else {\r\n return this.add(new Fraction(F))\r\n }\r\n\r\n return this.reduce();\r\n };\r\n\r\n subtract = (F: Fraction | number): Fraction => {\r\n if (F instanceof Fraction) {\r\n return this.add(F.clone().opposed());\r\n } else {\r\n return this.add(-F)\r\n }\r\n };\r\n\r\n multiply = (F: Fraction | number): Fraction => {\r\n // Parse the value.\r\n // If it's a fraction, return a clone of it\r\n // If it's an integer, return the fraction F/1\r\n let Q = new Fraction(F);\r\n\r\n this._numerator = this._numerator * Q.numerator;\r\n this._denominator = this._denominator * Q.denominator;\r\n\r\n return this.reduce();\r\n };\r\n\r\n xMultiply = (...values: (Fraction | number)[]): Fraction => {\r\n // Parse the value.\r\n // If it's a fraction, return a clone of it\r\n // If it's an integer, return the fraction F/1\r\n for(let value of values){\r\n let F = new Fraction(value)\r\n this._numerator = this._numerator * F.numerator;\r\n this._denominator = this._denominator * F.denominator;\r\n }\r\n\r\n return this;\r\n };\r\n\r\n divide = (F: Fraction | number): Fraction => {\r\n let Q = new Fraction(F);\r\n\r\n if (Q.numerator === 0) {\r\n return new Fraction().infinite();\r\n }\r\n\r\n let N: number = +this._numerator,\r\n D: number = +this._denominator;\r\n\r\n this._numerator = N * Q.denominator;\r\n this._denominator = D * Q.numerator;\r\n return this.reduce();\r\n };\r\n\r\n invert = (): Fraction => {\r\n let n = +this._numerator, d = +this._denominator;\r\n this._numerator = d;\r\n this._denominator = n;\r\n\r\n return this;\r\n }\r\n\r\n pow = (p: number | Fraction): Fraction => {\r\n // TODO: Fraction.pow with a value different than a safe integer !\r\n if (p instanceof Fraction) {\r\n return this.pow(p.value)\r\n }\r\n\r\n this.reduce();\r\n if (p < 0) {\r\n this.invert()\r\n }\r\n\r\n // Check if numerator and denominator are roots of...\r\n // othervise, convert to numeric.\r\n let controlNumerator = Math.floor(Math.pow(this._numerator, Math.abs(p))),\r\n controlDenominator = Math.floor(Math.pow(this._denominator, Math.abs(p)))\r\n\r\n if (controlNumerator ** Math.abs(p) === this._numerator\r\n &&\r\n controlDenominator ** Math.abs(p) === this._denominator) {\r\n\r\n this._numerator = this._numerator ** Math.abs(p);\r\n this._denominator = this._denominator ** Math.abs(p);\r\n } else {\r\n this._numerator = this._numerator ** Math.abs(p);\r\n this._denominator = this._denominator ** Math.abs(p);\r\n }\r\n\r\n return this;\r\n };\r\n\r\n root = (p: number): Fraction => {\r\n // TODO: nth - root of a fraction => this will return another type of coefficient.\r\n\r\n // Check if they are perfect roots..\r\n if (p === 0) {\r\n return this;\r\n }\r\n\r\n // If negative, invert the fraction\r\n if (p < 0) {\r\n this.invert()\r\n }\r\n\r\n let n = Math.pow(this._numerator, Math.abs(1 / p)),\r\n d = Math.pow(this._denominator, Math.abs(1 / p));\r\n\r\n this._numerator = Math.pow(this._numerator, Math.abs(1 / p));\r\n this._denominator = Math.pow(this._denominator, Math.abs(1 / p));\r\n return this;\r\n }\r\n\r\n sqrt = (): Fraction => {\r\n return this.root(2);\r\n }\r\n\r\n abs = (): Fraction => {\r\n this._numerator = Math.abs(this._numerator);\r\n this._denominator = Math.abs(this._denominator);\r\n return this;\r\n };\r\n\r\n // ------------------------------------------\r\n // Mathematical operations specific to fractions\r\n\r\n // ------------------------------------------\r\n reduce = (): Fraction => {\r\n let g = Numeric.gcd(this._numerator, this._denominator);\r\n this._numerator = this._numerator / g;\r\n this._denominator = this._denominator / g;\r\n\r\n if (this._denominator < 0) {\r\n this._denominator = -this._denominator;\r\n this._numerator = -this._numerator;\r\n }\r\n return this;\r\n };\r\n\r\n amplify = (k: number): Fraction => {\r\n if (Number.isSafeInteger(k)) {\r\n this._numerator *= k;\r\n this._denominator *= k;\r\n }\r\n return this;\r\n };\r\n\r\n\r\n // ------------------------------------------\r\n // Compare functions\r\n // ------------------------------------------\r\n /**\r\n * Compare the current coefficient with another coefficient\r\n * @param F (Coefficient) The coefficient to compare\r\n * @param sign (string| default is =): authorized values: =, <, <=, >, >= with some variations.\r\n */\r\n compare = (F: unknown, sign?: string): boolean => {\r\n if (sign === undefined) {\r\n sign = '=';\r\n }\r\n\r\n let compareFraction: Fraction\r\n if (F instanceof Fraction) {\r\n compareFraction = F.clone()\r\n } else {\r\n compareFraction = new Fraction(F)\r\n }\r\n\r\n switch (sign) {\r\n case '>':\r\n return this.value > compareFraction.value;\r\n case \">=\" || \"=>\" || \"geq\":\r\n return this.value >= compareFraction.value;\r\n case \"<\":\r\n return this.value < compareFraction.value;\r\n case \"<=\" || \"=>\" || \"leq\":\r\n return this.value <= compareFraction.value;\r\n case \"=\":\r\n // let F2: Fraction = compareFraction.clone().reduce(),\r\n // F1: Fraction = this.clone().reduce();\r\n // return (F1.numerator === F2.numerator && F1.denominator === F2.denominator);\r\n return this.value === compareFraction.value;\r\n case \"<>\":\r\n return this.value !== compareFraction.value;\r\n default:\r\n return false;\r\n }\r\n };\r\n /* Compare shortcuts */\r\n lesser = (than: Fraction | number): Boolean => {\r\n return this.compare(than, '<');\r\n };\r\n leq = (than: Fraction | number): Boolean => {\r\n return this.compare(than, '<=');\r\n };\r\n greater = (than: Fraction | number): Boolean => {\r\n return this.compare(than, '>');\r\n };\r\n geq = (than: Fraction | number): Boolean => {\r\n return this.compare(than, '>=');\r\n };\r\n isEqual = (than: Fraction | number): boolean => {\r\n return this.compare(than, '=');\r\n }\r\n isNotEqual = (than: Fraction | number): boolean => {\r\n return this.compare(than, '<>');\r\n }\r\n isOpposed = (p: Fraction): boolean => {\r\n return this.isEqual(p.clone().opposed());\r\n }\r\n isInverted = (p: Fraction): boolean => {\r\n return this.isEqual(new Fraction().one().divide(p.clone()));\r\n }\r\n isZero = (): boolean => {\r\n return this._numerator === 0;\r\n }\r\n isNotZero = (): boolean => {\r\n return this._numerator !== 0;\r\n }\r\n isOne = (): boolean => {\r\n return this._numerator === 1 && this._denominator === 1;\r\n }\r\n isNegativeOne = (): boolean => {\r\n return this._numerator === -1 && this._denominator === 1;\r\n }\r\n isPositive = (): boolean => {\r\n return this.sign() === 1;\r\n }\r\n isNegative = (): boolean => {\r\n return this.sign() === -1;\r\n }\r\n isStrictlyPositive = (): boolean => {\r\n return this.value > 0\r\n }\r\n isStrictlyNegative = (): Boolean => {\r\n return this.value < 0\r\n }\r\n isNaN = (): boolean => {\r\n return isNaN(this._numerator);\r\n }\r\n isInfinity = (): boolean => {\r\n return Math.abs(this._numerator) === Infinity;\r\n }\r\n isFinite = (): boolean => {\r\n return !this.isInfinity() && !this.isNaN();\r\n }\r\n isSquare = (): boolean => {\r\n return Math.sqrt(this._numerator) % 1 === 0 && Math.sqrt(this._denominator) % 1 === 0\r\n }\r\n isReduced = (): boolean => {\r\n return Math.abs(Numeric.gcd(this._numerator, this._denominator)) === 1\r\n }\r\n isNatural = (): boolean => {\r\n return this.isRelative() && this.isPositive()\r\n }\r\n isRelative = (): boolean => {\r\n return this.clone().reduce().denominator === 1\r\n }\r\n isRational = (): boolean => {\r\n return !this.isRelative()\r\n }\r\n isEven = (): boolean => {\r\n return this.isRelative() && this.value % 2 === 0\r\n }\r\n isOdd = (): boolean => {\r\n return this.isRelative() && this.value % 2 === 1\r\n }\r\n sign = (): number => {\r\n return (this._numerator * this._denominator >= 0) ? 1 : -1;\r\n };\r\n\r\n\r\n // TODO: The rest of the functions are not used or unnecessary ?\r\n /**\r\n * Simple function to determine if it's a fraction\r\n */\r\n areEquals = (...F: Fraction[]): boolean => {\r\n for (let i = 0; i < F.length; i++) {\r\n if (!this.isEqual(F[i])) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n };\r\n}","/**\r\n * NthRoot is something like \"a+b\\sqrt{3}\r\n */\r\nexport class NthRoot {\r\n private _radical: number;\r\n private _nth: number;\r\n private _coefficient: number;\r\n private _isValid:boolean;\r\n\r\n constructor(...values: number[]) {\r\n this._radical = 1;\r\n this._coefficient = 1;\r\n this._nth = 2;\r\n this._isValid = true;\r\n\r\n if(values !== undefined){\r\n this.parse(values[0], values[1], values[2])\r\n }\r\n }\r\n\r\n // ------------------------------------------\r\n // Getter and setter\r\n // ------------------------------------------\r\n get radical(): number {\r\n return this._radical;\r\n }\r\n\r\n set radical(value: number) {\r\n this._radical = value;\r\n }\r\n\r\n get nth(): number {\r\n return this._nth;\r\n }\r\n\r\n set nth(value: number) {\r\n if (Number.isSafeInteger(value) && value >= 2) {\r\n this._nth = value;\r\n } else {\r\n // Error setting the nth root.\r\n console.log('Error setting the nth root');\r\n this._nth = 2;\r\n }\r\n }\r\n\r\n get coefficient(): number {\r\n return this._coefficient;\r\n }\r\n\r\n set coefficient(value: number) {\r\n this._coefficient = value;\r\n }\r\n\r\n get tex(): string {\r\n let C: string;\r\n\r\n if (this._coefficient === 1) {\r\n C = '';\r\n } else if (this._coefficient === -1) {\r\n C = '-';\r\n } else {\r\n C = this._coefficient.toString();\r\n }\r\n\r\n if (this._radical === 1) {\r\n return `${this._coefficient}`;\r\n } else {\r\n if (this._nth === 2) {\r\n return `${C}\\\\sqrt{${this._radical}}`\r\n } else {\r\n return `${C}\\\\sqrt[${this._nth}]{${this._radical}}`\r\n }\r\n }\r\n }\r\n\r\n get display(): string {\r\n let C: string;\r\n\r\n if (this._coefficient === 1) {\r\n C = '';\r\n } else if (this._coefficient === -1) {\r\n C = '-';\r\n } else {\r\n C = this._coefficient.toString();\r\n }\r\n\r\n if (this._radical === 1) {\r\n return `${this._coefficient}`;\r\n } else {\r\n if (this._nth === 2) {\r\n return `${C}sqrt{${this._radical}}`\r\n } else {\r\n return `${C}root(${this._nth}){${this._radical}}`\r\n }\r\n }\r\n }\r\n\r\n get value(): number {\r\n return this._coefficient * Math.pow(this._radical, 1 / this._nth);\r\n }\r\n\r\n // ------------------------------------------\r\n // Creation / parsing functions\r\n // ------------------------------------------\r\n parse = (radical: number, nthroot?: number, coefficient?: number): NthRoot => {\r\n this._coefficient = (coefficient === undefined) ? 1 : coefficient;\r\n this._nth = (nthroot === undefined) ? 2 : nthroot;\r\n this._radical = (radical === undefined) ? 1 : radical;\r\n\r\n if(this._nth%2===0 && this._radical<0){\r\n this._isValid = false;\r\n }\r\n return this;\r\n };\r\n\r\n // ------------------------------------------\r\n // Mathematical operations\r\n // ------------------------------------------\r\n reduce = (): NthRoot => {\r\n // Max value to test.\r\n let V = Math.floor(Math.pow(this._radical, 1 / this._nth));\r\n while (V > 1) {\r\n if (this._radical % Math.pow(V, this._nth) === 0) {\r\n // It's dividable by V^n\r\n this._coefficient *= V;\r\n this._radical = this._radical / Math.pow(V, this._nth);\r\n\r\n // Redifine the new testing value (this is optimization)\r\n V = Math.floor(Math.pow(this._radical, 1 / this._nth));\r\n continue;\r\n }\r\n V--;\r\n }\r\n return this;\r\n };\r\n\r\n multiply = (N: NthRoot): NthRoot => {\r\n this._radical *= N.radical;\r\n return this.reduce();\r\n };\r\n\r\n // ------------------------------------------\r\n // Help functions\r\n // ------------------------------------------\r\n hasRadical = ():boolean => {\r\n return !(this._radical===1 || this._radical===0 || this._isValid===false)\r\n };\r\n}","import {Point} from \"./point\";\r\nimport {Line, LinePropriety} from \"./line\";\r\nimport {Vector} from \"./vector\";\r\nimport {Triangle} from \"./triangle\";\r\nimport {Numeric} from \"../numeric\";\r\nimport {Fraction} from \"../coefficients/fraction\";\r\nimport {Equation} from \"../algebra/equation\";\r\nimport {Polynom} from \"../algebra/polynom\";\r\nimport {Monom} from \"../algebra/monom\";\r\n\r\nexport class Circle {\r\n constructor(...values: unknown[]) {\r\n this._exists = false\r\n\r\n if (values !== undefined) {\r\n this.parse(...values)\r\n }\r\n }\r\n\r\n private _center: Point;\r\n\r\n get center(): Point {\r\n return this._center;\r\n }\r\n\r\n private _squareRadius: Fraction;\r\n\r\n get squareRadius(): Fraction {\r\n return this._squareRadius\r\n }\r\n\r\n private _cartesian: Equation;\r\n\r\n get cartesian(): Equation {\r\n return this._cartesian\r\n }\r\n\r\n private _exists: boolean;\r\n\r\n get exists(): boolean {\r\n return this._exists;\r\n }\r\n\r\n get radius(): { tex: string, display: string, value: number } {\r\n if (this._squareRadius.isSquare()) {\r\n return {\r\n tex: this._squareRadius.clone().sqrt().tex,\r\n display: this._squareRadius.clone().sqrt().display,\r\n value: this._squareRadius.clone().sqrt().value\r\n }\r\n } else {\r\n return {\r\n tex: `\\\\sqrt{${this._squareRadius.tex}}`,\r\n display: `sqrt(${this._squareRadius.display})`,\r\n value: this._squareRadius.clone().sqrt().value\r\n }\r\n }\r\n return this._squareRadius\r\n }\r\n\r\n get tex(): string {\r\n if (this._exists) {\r\n let cx, cy\r\n if (this._center.x.isZero()) {\r\n cx = 'x^2'\r\n } else {\r\n cx = `\\\\left(x${this._center.x.isNegative() ? '+' : '-'}${this._center.x.clone().abs().tex}\\\\right)^2`\r\n }\r\n if (this._center.y.isZero()) {\r\n cy = 'y^2'\r\n } else {\r\n cy = `\\\\left(y${this._center.y.isNegative() ? '+' : '-'}${this._center.y.clone().abs().tex}\\\\right)^2`\r\n }\r\n return `${cx}+${cy}=${this._squareRadius.tex}`\r\n } else {\r\n return `\\\\text{le cercle n'existe pas.}`\r\n }\r\n }\r\n\r\n get developed(): string {\r\n return this._cartesian.tex\r\n }\r\n\r\n get display(): string {\r\n if (this._exists) {\r\n let cx, cy\r\n if (this._center.x.isZero()) {\r\n cx = 'x^2'\r\n } else {\r\n cx = `(x${this._center.x.isNegative() ? '+' : '-'}${this._center.x.clone().abs().tex})^2`\r\n }\r\n if (this._center.y.isZero()) {\r\n cy = 'y^2'\r\n } else {\r\n cy = `(y${this._center.y.isNegative() ? '+' : '-'}${this._center.y.clone().abs().tex})^2`\r\n }\r\n return `${cx}+${cy}=${this._squareRadius.display}`\r\n } else {\r\n return `\\\\text{le cercle n'existe pas.}`\r\n }\r\n }\r\n\r\n /**\r\n * Get the relative position between circle and line. It corresponds to the number of intersection.\r\n * @param {Line} L\r\n * @returns {number}\r\n */\r\n relativePosition = (L: Line): number => {\r\n let distance = L.distanceTo(this.center), radius = Math.sqrt(this._squareRadius.value)\r\n\r\n if (distance.value - radius > 0.0000000001) {\r\n return 0 // external\r\n } else if (Math.abs(distance.value - radius) < 0.0000000001) {\r\n return 1 // tangent\r\n } else {\r\n return 2 // external\r\n }\r\n }\r\n\r\n lineIntersection = (L: Line): Point[] => {\r\n let intersectionPoints: Point[] = [], solX: Fraction\r\n\r\n if (this._cartesian === null) {\r\n return []\r\n }\r\n const equX = this._cartesian.clone(), lineX = L.equation.clone().isolate('x'),\r\n lineY = L.equation.clone().isolate('y')\r\n\r\n if (lineX instanceof Equation && lineY instanceof Equation) {\r\n equX.replaceBy('y', lineY.right).simplify()\r\n equX.solve()\r\n\r\n for (let x of equX.solutions) {\r\n if (x.exact === false && isNaN(x.value)) {\r\n continue\r\n }\r\n\r\n solX = new Fraction(x.exact === false ? x.value : x.exact)\r\n intersectionPoints.push(new Point(solX.clone(), lineY.right.evaluate(solX)))\r\n }\r\n }\r\n\r\n return intersectionPoints\r\n }\r\n\r\n tangents = (P: Point | Fraction): Line[] => {\r\n if (P instanceof Fraction) {\r\n return this._tangentsWithSlope(P)\r\n } else if (this.isPointOnCircle(P)) {\r\n return this._tangentsThroughOnePointOnTheCircle(P)\r\n } else if (this.center.distanceTo(P).value > this.radius.value) {\r\n //TODO: Must check it's outside the circle\r\n return this._tangentsThroughOnePointOutsideTheCircle(P)\r\n } else {\r\n console.log('No tangents as the point is inside !')\r\n }\r\n return []\r\n }\r\n\r\n isPointOnCircle = (P: Point): Boolean => {\r\n return this._cartesian.test({x: P.x, y: P.y})\r\n }\r\n\r\n getPointsOnCircle = (numberIsInteger?: boolean): Point[] => {\r\n if (numberIsInteger === undefined) {\r\n numberIsInteger = false\r\n }\r\n\r\n // It means searching for pythagorician triples that make a perfect square.\r\n // (x-4)^2 + (y+3)^2 = 15\r\n\r\n let triplets = Numeric.pythagoricianTripletsWithTarget(this._squareRadius.value, true)\r\n\r\n let points: Point[] = [], pt\r\n triplets.forEach(triplet => {\r\n // Allow positive / negative values\r\n // x-a = t => x = a + t\r\n // x-a = -t => x = a - t\r\n\r\n for (let k of [[1, 1], [-1, 1], [-1, -1], [1, -1]]) {\r\n pt = new Point(\r\n this.center.x.clone().add(k[0] * triplet[0]),\r\n this.center.y.clone().add(k[1] * triplet[1])\r\n )\r\n // Check if the point is not already in points.\r\n if (!pt.isInListOfPoints(points)) {\r\n points.push(pt)\r\n }\r\n }\r\n })\r\n return points\r\n }\r\n\r\n clone(): Circle {\r\n this._center = this._center.clone()\r\n this._squareRadius = this._squareRadius.clone()\r\n this._calculateCartesian()\r\n return this\r\n }\r\n\r\n private _tangentsThroughOnePointOnTheCircle = (P: Point): Line[] => {\r\n let CT = new Vector(this._center, P)\r\n return [new Line(P, CT, LinePropriety.Perpendicular)]\r\n }\r\n\r\n private _tangentsThroughOnePointOutsideTheCircle = (P: Point): Line[] => {\r\n // y = mx + h\r\n // px, py => h = -m px + py => mx - y -m.px + py = 0 =>\r\n // Centre: cx, cy, radius: r\r\n // (m.cx - cy -m.px + py)^2 = r^2 * (m^2 + 1)\r\n // (m(cx-py) - (cy - py))^2 = r^2 * (m^2 + 1)\r\n\r\n let cx_px = this.center.x.clone().subtract(P.x), cy_py = this.center.y.clone().subtract(P.y),\r\n polyLeft = new Polynom('x'), polyRight = new Polynom('x^2+1')\r\n\r\n polyLeft.multiply(cx_px).subtract(cy_py).pow(2)\r\n polyRight.multiply(this.squareRadius)\r\n\r\n let equ = new Equation(polyLeft, polyRight)\r\n equ.moveLeft().simplify().solve()\r\n\r\n return equ.solutions.map(sol => {\r\n // h = -m px + py\r\n let h, equ = new Equation('y', 'x')\r\n\r\n if (sol.exact instanceof Fraction) {\r\n h = P.x.clone().opposed().multiply(sol.exact).add(P.y)\r\n equ.right.multiply(sol.exact).add(h)\r\n } else {\r\n h = P.x.clone().opposed().multiply(sol.value).add(P.y)\r\n equ.right.multiply(sol.value).add(h)\r\n }\r\n\r\n return new Line(equ)\r\n })\r\n\r\n }\r\n\r\n private _tangentsWithSlope = (slope: Fraction): Line[] => {\r\n // d(C;t)=r => ac1+bc2 + x = +- sqrt(a^2 + b^2)*r\r\n // x = -ac1-bc2 +- sqrt(a^2 + b^2)*r\r\n // y = a/bx + h => ax-by + H = 0\r\n\r\n const a = slope.numerator, b = -slope.denominator, c1 = this._center.x.clone(), c2 = this._center.y.clone(),\r\n r = this._squareRadius\r\n\r\n let sq = this._squareRadius.clone().multiply(slope.numerator ** 2 + slope.denominator ** 2),\r\n x1 = c1.clone().multiply(a).opposed().subtract(c2.clone().multiply(b)).add(sq.clone().sqrt()),\r\n x2 = c1.clone().multiply(a).opposed().subtract(c2.clone().multiply(b)).subtract(sq.clone().sqrt())\r\n\r\n return [new Line(a, b, x1), new Line(a, b, x2)]\r\n }\r\n\r\n private _reset(): Circle {\r\n this._center = null\r\n this._squareRadius = null\r\n this._cartesian = null\r\n this._exists = false\r\n\r\n return this\r\n }\r\n\r\n private parse(...values: unknown[]): Circle {\r\n // Data can be given in these formats:\r\n // one value, a string -> make it an Equation\r\n // one value, an Equation\r\n // one value, a circle -> clone it\r\n // two values: two points (center and pointThrough)\r\n // two values: point and Fraction (center and radius)\r\n // three values: Point, Fraction, Boolean (center, square radius, true)\r\n\r\n this._reset()\r\n\r\n if (typeof values[0] === 'string') {\r\n this._parseEquation(new Equation(values[0]))\r\n } else if (values[0] instanceof Equation) {\r\n this._parseEquation(values[0])\r\n } else if (values[0] instanceof Circle) {\r\n this._parseCopyCircle(values[0])\r\n } else if (values[0] instanceof Point && values.length > 1) {\r\n if (values[1] instanceof Point) {\r\n if (values[2] instanceof Point) {\r\n this._parseThroughtThreePoints(values[0], values[1], values[2])\r\n } else {\r\n this._parseCenterAndPointThrough(values[0], values[1])\r\n }\r\n } else if (values[1] instanceof Fraction || typeof values[1] === 'number') {\r\n this._parseCenterAndRadius(values[0], values[1], (typeof values[2] === \"boolean\") ? values[2] : false)\r\n }\r\n }\r\n\r\n // Calculate once the different values.\r\n if (this._exists) {\r\n this._calculateCartesian()\r\n\r\n // If the square radius is zero or positive, the circle exists.\r\n if (this._squareRadius !== undefined && this._squareRadius.isNegative()) {\r\n this._exists = false\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n private _calculateCartesian() {\r\n this._cartesian = (new Equation(new Polynom(`(x-(${this._center.x.display}))^2+(y-(${this._center.y.display}))^2`), new Polynom(`${this._squareRadius.display}`))).moveLeft()\r\n }\r\n\r\n private _parseCopyCircle(circle: Circle): Circle {\r\n this._center = circle.center.clone()\r\n this._squareRadius = circle.squareRadius.clone()\r\n this._calculateCartesian()\r\n this._exists = circle.exists\r\n return this\r\n }\r\n\r\n private _parseCenterAndRadius(center: Point, radius: Fraction | number, square?: boolean): Circle {\r\n this._center = center.clone()\r\n\r\n if (square) {\r\n this._squareRadius = (new Fraction(radius))\r\n } else {\r\n this._squareRadius = new Fraction(radius).pow(2)\r\n }\r\n\r\n this._exists = true\r\n return this\r\n }\r\n\r\n private _parseCenterAndPointThrough(center: Point, pointThrough: Point): Circle {\r\n this._center = center.clone()\r\n this._squareRadius = new Vector(this._center, pointThrough).normSquare\r\n this._exists = true\r\n return this\r\n }\r\n\r\n private _parseEquation(equ: Equation): Circle {\r\n this._exists = false\r\n\r\n // Move everything to the left.\r\n equ.moveLeft()\r\n\r\n if (equ.degree('x').value === 2 && equ.degree('y').value === 2) {\r\n // Both must be of degree 2.\r\n let x2 = equ.left.monomByDegree(2, 'x'), y2 = equ.left.monomByDegree(2, 'y'), x1: Monom, y1: Monom, c: Monom\r\n\r\n // Both square monoms must have the same coefficient.\r\n if (x2.coefficient.isEqual(y2.coefficient)) {\r\n equ.divide(x2.coefficient)\r\n\r\n x1 = equ.left.monomByDegree(1, 'x')\r\n y1 = equ.left.monomByDegree(1, 'y')\r\n\r\n c = equ.left.monomByDegree(0)\r\n\r\n this._center = new Point(x1.coefficient.clone().divide(2).opposed(), y1.coefficient.clone().divide(2).opposed())\r\n\r\n this._squareRadius = c.coefficient.clone().opposed()\r\n .add(this._center.x.clone().pow(2))\r\n .add(this._center.y.clone().pow(2))\r\n\r\n this._calculateCartesian()\r\n this._exists = true\r\n } else {\r\n // The circle is not a valid circle\r\n this._center = null\r\n this._squareRadius = null\r\n this._exists = false\r\n }\r\n }\r\n return this\r\n }\r\n\r\n private _parseThroughtThreePoints(A: Point, B: Point, C: Point): Circle {\r\n let T = new Triangle(A, B, C), mAB = T.remarquables.mediators.AB.clone(),\r\n mAC = T.remarquables.mediators.AC.clone()\r\n this.parse(mAB.intersection(mAC).point, A)\r\n\r\n return this\r\n }\r\n\r\n}","/**\r\n * This class works for 2d line in a plane.\r\n */\r\n\r\nimport {Vector} from \"./vector\";\r\nimport {Point} from \"./point\";\r\nimport {Numeric} from \"../numeric\";\r\nimport {Fraction} from \"../coefficients/fraction\";\r\nimport {Equation} from \"../algebra/equation\";\r\nimport {Polynom} from \"../algebra/polynom\";\r\nimport {Random} from \"../randomization/random\";\r\nimport {LinearSystem} from \"../algebra/linearSystem\";\r\nimport {Monom} from \"../algebra/monom\";\r\n\r\nexport enum LinePropriety {\r\n None,\r\n Parallel = 'parallel',\r\n Perpendicular = 'perpendicular',\r\n Tangent = 'tangent'\r\n}\r\n\r\nexport class Line {\r\n // A line is defined as the canonical form\r\n static PERPENDICULAR = LinePropriety.Perpendicular\r\n static PARALLEL = LinePropriety.Parallel\r\n private _referencePropriety: LinePropriety\r\n private _referenceLine: Line\r\n private _reduceBeforeDisplay: boolean\r\n\r\n constructor(...values: unknown[]) {\r\n\r\n this._exists = false;\r\n this._reduceBeforeDisplay = true\r\n\r\n if (values.length > 0) {\r\n this.parse(...values);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n // ax + by + c = 0\r\n private _a: Fraction;\r\n\r\n get a(): Fraction {\r\n return this._a;\r\n }\r\n\r\n set a(value: Fraction) {\r\n this._a = value;\r\n }\r\n\r\n private _b: Fraction;\r\n\r\n get b(): Fraction {\r\n return this._b;\r\n }\r\n\r\n set b(value: Fraction) {\r\n this._b = value;\r\n }\r\n\r\n private _c: Fraction;\r\n\r\n get c(): Fraction {\r\n return this._c;\r\n }\r\n\r\n // ------------------------------------------\r\n // Getter and setter\r\n\r\n set c(value: Fraction) {\r\n this._c = value;\r\n }\r\n\r\n private _OA: Point;\r\n\r\n get OA(): Point {\r\n return this._OA;\r\n }\r\n\r\n set OA(value: Point) {\r\n this._OA = value;\r\n }\r\n\r\n private _d: Vector;\r\n\r\n get d(): Vector {\r\n return this._d;\r\n }\r\n\r\n set d(value: Vector) {\r\n this._d = value;\r\n }\r\n\r\n private _n: Vector;\r\n\r\n get n(): Vector {\r\n return this._n;\r\n }\r\n\r\n private _exists: boolean\r\n\r\n get exists(): boolean {\r\n return this._exists;\r\n }\r\n\r\n // ------------------------------------------\r\n get equation(): Equation {\r\n let equ = new Equation(new Polynom().parse('xy', this._a, this._b, this._c), new Polynom('0'))\r\n if(this._reduceBeforeDisplay) {\r\n return equ.simplify();\r\n }else{\r\n return equ\r\n }\r\n }\r\n\r\n get system(): { x: Equation, y: Equation } {\r\n let e1 = new Equation(\r\n new Polynom('x'),\r\n new Polynom(this._OA.x)\r\n .add(new Monom('k').multiplyByNumber(this._d.x))\r\n ),\r\n e2 = new Equation(\r\n new Polynom('y'),\r\n new Polynom(this._OA.y)\r\n .add(new Monom('k').multiplyByNumber(this._d.y))\r\n )\r\n\r\n return {x: e1, y: e2}\r\n }\r\n\r\n get tex(): { canonical: string, mxh: string, parametric: string, equation: string, system: string } {\r\n // canonical => ax + by + c = 0\r\n // mxh => y = -a/b x - c/b\r\n // parametric => (xy) = OA + k*d\r\n // equation => ax + by = -c\r\n\r\n let canonical = this.equation.clone().reorder(true);\r\n // Make sur the first item is positive.\r\n if (this._a.isNegative()) {\r\n canonical.multiply(-1);\r\n }\r\n\r\n let d = this._d.clone()\r\n if (this._reduceBeforeDisplay) {\r\n d.simplifyDirection()\r\n }\r\n\r\n return {\r\n canonical: canonical.tex,\r\n equation: canonical.clone().reorder().tex,\r\n mxh: this.slope.isInfinity() ? 'x=' + this.OA.x.tex : 'y=' + new Polynom().parse('x', this.slope, this.height).tex,\r\n parametric: `${Point.pmatrix('x', 'y')} = ${Point.pmatrix(this._OA.x, this._OA.y)} + k\\\\cdot ${Point.pmatrix(d.x, d.y)}`,\r\n system: `\\\\left\\\\{\\\\begin{aligned}\r\n x &= ${(new Polynom(this._OA.x)\r\n .add(new Monom(this._d.x).multiply(new Monom('k'))))\r\n .reorder('k', true)\r\n .tex}\\\\\\\\\\ \r\n y &= ${(new Polynom(this._OA.y)\r\n .add(new Monom(this._d.y).multiply(new Monom('k'))))\r\n .reorder('k', true)\r\n .tex}\r\n \\\\end{aligned}\\\\right.`\r\n }\r\n }\r\n\r\n get reduceBeforeDisplay(): boolean {\r\n return this._reduceBeforeDisplay;\r\n }\r\n\r\n set reduceBeforeDisplay(value: boolean) {\r\n this._reduceBeforeDisplay = value;\r\n }\r\n\r\n get display(): { canonical: string, mxh: string, parametric: string } {\r\n // canonical => ax + by + c = 0\r\n // mxh => y = -a/b x - c/b\r\n // parametric => (xy) = OA + k*d // not relevant in display mode.\r\n\r\n let canonical = this.equation;\r\n // Make sur the first item is positive.\r\n if (this._a.isNegative()) {\r\n canonical.multiply(-1);\r\n }\r\n\r\n return {\r\n canonical: canonical.display,\r\n mxh: this.slope.isInfinity() ? 'x=' + this.OA.x.display : 'y=' + new Polynom().parse('x', this.slope, this.height).display,\r\n parametric: \"\"\r\n }\r\n }\r\n\r\n get normal(): Vector {\r\n return new Vector(this._a, this._b);\r\n }\r\n\r\n get director(): Vector {\r\n return this._d.clone()\r\n }\r\n\r\n get slope(): Fraction {\r\n return this._a.clone().opposed().divide(this._b);\r\n }\r\n\r\n get height(): Fraction {\r\n return this._c.clone().opposed().divide(this._b);\r\n }\r\n\r\n randomPoint = (k?: number): Point => {\r\n // Return a random point on the line.\r\n return this._d\r\n .clone()\r\n .multiplyByScalar(Random.numberSym((k === undefined || k <= 1) ? 3 : k, false))\r\n .add(this._OA.asVector)\r\n .asPoint\r\n }\r\n randomNearPoint = (k?: number): Point => {\r\n let pt = this.randomPoint(k)\r\n\r\n let maxIterationTest = 10\r\n while (this.isOnLine(pt) && maxIterationTest > 0) {\r\n pt.x.add(Random.numberSym(1, false))\r\n pt.y.add(Random.numberSym(1, false))\r\n maxIterationTest--\r\n\r\n }\r\n return pt\r\n }\r\n\r\n// ------------------------------------------\r\n // Creation / parsing functions\r\n\r\n // ------------------------------------------\r\n /**\r\n * Parse data to a line\r\n * @param {any} values\r\n * @returns {Line}\r\n */\r\n parse = (...values: unknown[]): Line => {\r\n this._exists = false;\r\n\r\n // Nothing is given...\r\n if (values.length === 0) {\r\n return this\r\n }\r\n\r\n // One value only: already a line (clone it), an Equation, a string (as Equation)\r\n if (values.length === 1) {\r\n if (values[0] instanceof Line) {\r\n // Already a Line\r\n return values[0].clone()\r\n } else if (values[0] instanceof Equation) {\r\n // It's an Equation\r\n return this.parseEquation(values[0])\r\n } else if (typeof values[0] === \"string\") {\r\n // It's a string - create an Equation from it.\r\n try {\r\n let E = new Equation(values[0])\r\n return this.parse(E)\r\n } catch (e) {\r\n return this\r\n }\r\n }\r\n }\r\n\r\n if (values.length === 2) {\r\n if (values[0] instanceof Point && values[1] instanceof Vector) {\r\n return this.parseByPointAndVector(values[0], values[1]);\r\n } else if (values[0] instanceof Point && values[1] instanceof Point) {\r\n return this.parseByPointAndVector(values[0], new Vector(values[0], values[1]));\r\n } else if (values[0] instanceof Vector && values[1] instanceof Point) {\r\n return this.parseByPointAndNormal(values[1], values[0])\r\n }\r\n }\r\n\r\n if (values.length === 3) {\r\n if (\r\n (values[0] instanceof Fraction || typeof values[0] === 'number')\r\n &&\r\n (values[1] instanceof Fraction || typeof values[1] === 'number')\r\n &&\r\n (values[2] instanceof Fraction || typeof values[2] === 'number')\r\n ) {\r\n return this.parseByCoefficient(values[0], values[1], values[2]);\r\n } else if (\r\n values[0] instanceof Point && values[1] instanceof Vector\r\n ) {\r\n if (values[2] === LinePropriety.Perpendicular) {\r\n return this.parseByPointAndNormal(values[0], values[1])\r\n } else if (values[2] === LinePropriety.Parallel) {\r\n return this.parseByPointAndVector(values[0], values[1])\r\n }\r\n } else if (values[0] instanceof Point && values[1] instanceof Line) {\r\n if (values[2] === LinePropriety.Parallel || values[2] === null) {\r\n return this.parseByPointAndLine(values[0], values[1], LinePropriety.Parallel)\r\n } else {\r\n return this.parseByPointAndLine(values[0], values[1], LinePropriety.Perpendicular)\r\n }\r\n }\r\n }\r\n\r\n // TODO: Add the ability to create line from a normal vector\r\n console.log('Someting wrong happend while creating the line')\r\n return this;\r\n }\r\n\r\n parseEquation = (equ: Equation): Line => {\r\n // Reorder the eequation\r\n equ.reorder(true)\r\n\r\n // It must contain either x, y or both.\r\n let letters = new Set(equ.letters());\r\n\r\n // No 'x', no 'y' in the equations\r\n if (!(letters.has('x') || letters.has('y'))) {\r\n return this\r\n }\r\n\r\n // Another letter in the equation ?\r\n for (let elem of ['x', 'y']) {\r\n if (letters.has(elem)) {\r\n letters.delete(elem)\r\n }\r\n }\r\n\r\n if (letters.size > 0) {\r\n return this\r\n }\r\n\r\n // Everything should be ok now...\r\n return this.parseByCoefficient(equ.left.monomByLetter('x').coefficient, equ.left.monomByLetter('y').coefficient, equ.left.monomByDegree(0).coefficient)\r\n }\r\n parseByCoefficient = (a: Fraction | number, b: Fraction | number, c: Fraction | number): Line => {\r\n this._a = new Fraction(a);\r\n this._b = new Fraction(b);\r\n this._c = new Fraction(c);\r\n\r\n this._d = new Vector(this._b.clone(), this._a.clone().opposed());\r\n this._OA = new Point(new Fraction().zero(), this._c.clone());\r\n this._n = this._d.clone().normal();\r\n\r\n this._exists = true;\r\n return this;\r\n }\r\n\r\n parseByPointAndVector = (P: Point, d: Vector): Line => {\r\n // OX = OP + k*d\r\n // x = px + kdx * dy\r\n // y = py + kdy * dx\r\n // ------------------\r\n // dy * x = px * dy + kdxdy\r\n // dx * y = py * dx + kdxdy\r\n // ------------------\r\n // dy * x - dx * y = px * dy - py * dx\r\n // dy * x - dx * y - (px * dy - py * dx) = 0\r\n this.parseByCoefficient(\r\n d.y,\r\n d.x.clone().opposed(),\r\n P.x.clone().multiply(d.y).subtract(P.y.clone().multiply(d.x)).opposed()\r\n )\r\n\r\n // Choose the current values as point and direction vector instead of the automatic version.\r\n this._OA = P.clone();\r\n this._d = d.clone();\r\n this._n = this._d.clone().normal();\r\n\r\n this._exists = true;\r\n return this;\r\n }\r\n\r\n parseByPointAndNormal = (P: Point, n: Vector): Line => {\r\n return this.parseByCoefficient(\r\n n.x,\r\n n.y,\r\n P.x.clone().multiply(n.x)\r\n .add(P.y.clone().multiply(n.y)).opposed()\r\n )\r\n }\r\n\r\n parseByPointAndLine = (P: Point, L: Line, orientation?: LinePropriety): Line => {\r\n\r\n if (orientation === undefined) {\r\n orientation = LinePropriety.Parallel\r\n }\r\n\r\n if (orientation === LinePropriety.Parallel) {\r\n return this.parseByPointAndNormal(P, L.normal)\r\n } else if (orientation === LinePropriety.Perpendicular) {\r\n return this.parseByPointAndNormal(P, L.director)\r\n }\r\n\r\n this._exists = false\r\n return this\r\n }\r\n\r\n clone = (): Line => {\r\n this._a = this._a.clone();\r\n this._b = this._b.clone();\r\n this._c = this._c.clone();\r\n\r\n this._d = this._d.clone();\r\n this._OA = this._OA.clone();\r\n this._n = this._n.clone();\r\n\r\n this._exists = this.exists\r\n return this;\r\n }\r\n // ------------------------------------------\r\n // Mathematical operations\r\n // ------------------------------------------\r\n isOnLine = (pt: Point): Boolean => {\r\n return this._a.clone()\r\n .multiply(pt.x)\r\n .add(\r\n this._b.clone()\r\n .multiply(pt.y)\r\n )\r\n .add(this._c)\r\n .isZero()\r\n }\r\n\r\n isParallelTo = (line: Line): Boolean => {\r\n // Do they have the isSame direction ?\r\n return this.slope.isEqual(line.slope) && this.height.isNotEqual(line.height);\r\n }\r\n isSameAs = (line: Line): Boolean => {\r\n return this.slope.isEqual(line.slope) && this.height.isEqual(line.height);\r\n }\r\n isPerpendicularTo = (line: Line): Boolean => {\r\n return this.d.isNormalTo(line.d)\r\n }\r\n isVertical = (): Boolean => {\r\n return this.slope.isInfinity()\r\n }\r\n simplify = (): Line => {\r\n let lcm = Numeric.lcm(this._a.denominator, this._b.denominator, this._c.denominator),\r\n gcd = Numeric.gcd(this._a.numerator, this._b.numerator, this._c.numerator);\r\n\r\n this.parseByCoefficient(\r\n this._a.clone().multiply(lcm).divide(gcd),\r\n this._b.clone().multiply(lcm).divide(gcd),\r\n this._c.clone().multiply(lcm).divide(gcd),\r\n )\r\n\r\n return this\r\n }\r\n\r\n simplifyDirection = (): Line => {\r\n this._d.simplifyDirection()\r\n return this;\r\n }\r\n intersection = (line: Line): { point: Point, hasIntersection: boolean, isParallel: boolean, isSame: boolean } => {\r\n let Pt = new Point(), isParallel = false, isSame = false, hasIntersection = true;\r\n\r\n // this => ax+by+c = 0\r\n // line => dx+ey+f = 0\r\n //\r\n // aex + bey + ce = 0\r\n // dbx + bey + bf = 0\r\n // (ae-db)x + ce-bf = 0\r\n //\r\n // adx + bdy + cd = 0\r\n // adx + aey + af = 0\r\n // (bd-ae)y + (cd-af)\r\n //\r\n // x = (bf-ce)/(ae-db)\r\n // y = (af-cd)/(bd-ae)\r\n\r\n\r\n // Theres is no 'y'\r\n if (this._b.isZero() || line.b.isZero()) {\r\n // TODO : handle no y in the line canonical form\r\n }\r\n\r\n if (this.isParallelTo(line)) {\r\n Pt.x = null;\r\n Pt.y = null;\r\n isParallel = true;\r\n } else if (this.isSameAs(line)) {\r\n Pt.x = null;\r\n Pt.y = null;\r\n isSame = true;\r\n } else {\r\n Pt.x = this._b.clone().multiply(line.c).subtract(this._c.clone().multiply(line.b))\r\n .divide(this._a.clone().multiply(line.b).subtract(this._b.clone().multiply(line.a)));\r\n Pt.y = this._a.clone().multiply(line.c).subtract(this._c.clone().multiply(line.a))\r\n .divide(this._b.clone().multiply(line.a).subtract(this._a.clone().multiply(line.b)));\r\n }\r\n\r\n return {\r\n point: Pt,\r\n hasIntersection: !(isParallel || isSame),\r\n isParallel,\r\n isSame\r\n };\r\n }\r\n\r\n distanceTo(pt: Point): { value: number, fraction: Fraction, tex: string } {\r\n let numerator = pt.x.clone().multiply(this._a)\r\n .add(pt.y.clone().multiply(this._b))\r\n .add(this._c).abs(),\r\n d2 = this.normal.normSquare;\r\n\r\n // The denominator is null - shouldn't be possible\r\n if (d2.isZero()) {\r\n return {\r\n value: NaN,\r\n tex: 'Not a line',\r\n fraction: new Fraction().infinite()\r\n }\r\n }\r\n // The denominator is a perfect square - simplify the tex result\r\n let value = numerator.value / Math.sqrt(d2.value),\r\n F = numerator.clone().divide(d2.clone().sqrt());\r\n\r\n // The denominator is a perfect square.\r\n if (d2.isSquare()) {\r\n return {\r\n value,\r\n tex: F.tex,\r\n fraction: F\r\n }\r\n }\r\n // Complete answer...\r\n return {\r\n value,\r\n tex: `\\\\frac{${numerator.tex}}{\\\\sqrt{${d2.tex}}}`,\r\n fraction: F\r\n };\r\n }\r\n\r\n hitSegment(A: Point, B: Point): boolean {\r\n let iPt = this.intersection(\r\n new Line(A, B)\r\n )\r\n\r\n // There is an intersection point\r\n if (iPt.hasIntersection) {\r\n return iPt.point.x.value >= Math.min(A.x.value, B.x.value)\r\n && iPt.point.x.value <= Math.max(A.x.value, B.x.value)\r\n && iPt.point.y.value >= Math.min(A.y.value, B.y.value)\r\n && iPt.point.y.value <= Math.max(A.y.value, B.y.value)\r\n }\r\n return false;\r\n }\r\n\r\n getValueAtX = (value: Fraction | number): Fraction => {\r\n const equ = this.equation.clone().isolate('y'),\r\n F = new Fraction(value)\r\n\r\n if (equ instanceof Equation) {\r\n return equ.right.evaluate({x: F})\r\n }\r\n return\r\n }\r\n getValueAtY = (value: Fraction | number): Fraction => {\r\n const equ = this.equation.clone().isolate('x'),\r\n F = new Fraction(value)\r\n\r\n if (equ instanceof Equation) {\r\n return equ.right.evaluate({y: F})\r\n }\r\n return\r\n }\r\n\r\n // ------------------------------------------\r\n // Special functions\r\n // ------------------------------------------\r\n canonicalAsFloatCoefficient(decimals: number): string {\r\n if (decimals === undefined) {\r\n decimals = 2;\r\n }\r\n\r\n let ca = this._a.value,\r\n cb = this._b.value,\r\n cc = this._c.value,\r\n canonical = '';\r\n\r\n if (!this._a.isZero()) {\r\n if (this._a.isOne()) {\r\n canonical = 'x'\r\n } else if (this._a.clone().opposed().isOne()) {\r\n canonical = '-x'\r\n } else {\r\n canonical = this._a.value.toFixed(decimals) + 'x'\r\n }\r\n }\r\n\r\n if (!this._b.isZero()) {\r\n if (this._b.isPositive()) {\r\n canonical += '+'\r\n }\r\n canonical += this._b.value.toFixed(decimals) + 'y'\r\n }\r\n\r\n if (!this._c.isZero()) {\r\n if (this._c.isPositive()) {\r\n canonical += '+'\r\n }\r\n canonical += this._c.value.toFixed(decimals)\r\n }\r\n\r\n\r\n return canonical + '=0';\r\n }\r\n}","/**\r\n * Vector module contains everything necessary to handle 2d or 3d vectors.\r\n * @module Vector\r\n */\r\nimport {Line} from \"./line\";\r\nimport {Vector} from \"./vector\";\r\nimport {Fraction} from \"../coefficients/fraction\";\r\n\r\n/**\r\n * Helper class - a way to identify an object {x: number, y: number}\r\n */\r\nclass PointXY {\r\n x: number\r\n y: number\r\n}\r\n\r\nexport class Point {\r\n private _x: Fraction; // 1st component\r\n private _y: Fraction; // 2nd component\r\n private _exist: Boolean;\r\n\r\n constructor(...values: unknown[]) {\r\n this._x = new Fraction().zero();\r\n this._y = new Fraction().zero();\r\n\r\n if (values !== undefined) {\r\n this.parse(...values);\r\n }\r\n\r\n return this\r\n };\r\n\r\n // ------------------------------------------\r\n // Getter and setter\r\n // ------------------------------------------\r\n get x(): Fraction {\r\n return this._x;\r\n }\r\n\r\n set x(value: Fraction) {\r\n this._x = value;\r\n }\r\n\r\n get y(): Fraction {\r\n return this._y;\r\n }\r\n\r\n set y(value: Fraction) {\r\n this._y = value;\r\n }\r\n\r\n get tex(): string {\r\n let pts = [];\r\n\r\n pts.push(this._x.tex);\r\n pts.push(this._y.tex);\r\n\r\n return `\\\\left(${pts.join(';')}\\\\right)`\r\n }\r\n\r\n get display(): string {\r\n let pts = [];\r\n\r\n pts.push(this._x.tex);\r\n pts.push(this._y.tex);\r\n\r\n return `(${pts.join(';')})`\r\n }\r\n\r\n get asVector(): Vector {\r\n return new Vector(this.x, this.y)\r\n }\r\n\r\n // ------------------------------------------\r\n // Creation / parsing functions\r\n // ------------------------------------------\r\n parse = (...values: unknown[]): Point => {\r\n // Initialize the value.\r\n this.zero();\r\n\r\n // Nothing is given\r\n if (values.length === 0) {\r\n return this;\r\n }\r\n\r\n // One element is given - might be already a point !\r\n if (values.length === 1) {\r\n // it's already a point - clone it\r\n if (values[0] instanceof Point) {\r\n this._x = values[0].x.clone()\r\n this._y = values[0].y.clone()\r\n return this\r\n }\r\n\r\n // Value is given as string, comma separated.\r\n if (typeof values[0] === 'string') {\r\n let xy = values[0].split(',')\r\n if (xy.length === 2) {\r\n this._x = new Fraction(xy[0]).reduce()\r\n this._y = new Fraction(xy[1]).reduce()\r\n return this\r\n }\r\n }\r\n\r\n // Value given as an object with {x: value, y: value}\r\n if(values[0] instanceof PointXY){\r\n this._x = new Fraction(values[0].x).reduce()\r\n this._y = new Fraction(values[0].y).reduce()\r\n return this\r\n } else {\r\n return this.zero()\r\n }\r\n }\r\n\r\n if (values.length === 2) {\r\n this._x = new Fraction(values[0]).reduce()\r\n this._y = new Fraction(values[1]).reduce()\r\n return this\r\n }\r\n\r\n return this;\r\n };\r\n\r\n clone = (): Point => {\r\n this._x = this._x.clone()\r\n this._y = this._y.clone()\r\n\r\n return this\r\n }\r\n\r\n zero = (): Point => {\r\n this._x = new Fraction(null);\r\n this._y = new Fraction(null);\r\n return this;\r\n }\r\n\r\n origin = (): Point => {\r\n this.zero();\r\n return this;\r\n }\r\n\r\n middleOf = (P1: Point, P2: Point): Point => {\r\n this._x = P1.x.clone().add(P2.x).divide(2);\r\n this._y = P1.y.clone().add(P2.y).divide(2);\r\n\r\n return this;\r\n }\r\n // ------------------------------------------\r\n // Display functions\r\n // ------------------------------------------\r\n texValues = (numberOfDigits: number): string => {\r\n let pts = [];\r\n\r\n pts.push(this._x.value.toFixed(numberOfDigits === undefined ? 2 : numberOfDigits));\r\n pts.push(this._y.value.toFixed(numberOfDigits === undefined ? 2 : numberOfDigits));\r\n\r\n return `\\\\left(${pts.join(';')}\\\\right)`\r\n }\r\n // ------------------------------------------\r\n // Mathematical operations\r\n // ------------------------------------------\r\n\r\n // ------------------------------------------\r\n // Vector functions\r\n // ------------------------------------------\r\n\r\n // ------------------------------------------\r\n // Static functions\r\n // ------------------------------------------\r\n static pmatrix = (a: any, b: any, c?: any): string => {\r\n if (c === undefined) {\r\n return `\\\\begin{pmatrix} ${a.tex ? a.tex : a} \\\\\\\\ ${b.tex ? b.tex : b} \\\\end{pmatrix}`;\r\n } else {\r\n return `\\\\begin{pmatrix} ${a.tex ? a.tex : a} \\\\\\\\ ${b.tex ? b.tex : b} \\\\\\\\ ${c.tex ? c.tex : c} \\\\end{pmatrix}`;\r\n }\r\n };\r\n\r\n distanceTo = (item:Point|Line): { value: number, fraction: Fraction, tex: string } => {\r\n let value = 0, fraction = new Fraction(), tex = ''\r\n\r\n if(item instanceof Line){\r\n return item.distanceTo(this)\r\n }else if(item instanceof Point){\r\n let V = new Vector(this, item)\r\n\r\n value = V.norm\r\n fraction = V.normSquare.sqrt()\r\n tex = V.normSquare.isSquare() ? fraction.tex : `\\\\sqrt{\\\\frac{ ${V.normSquare.numerator} }{ ${V.normSquare.denominator} }}`\r\n }\r\n return { value, fraction, tex }\r\n }\r\n\r\n get key(): string {\r\n return `${this.x.display};${this.y.display}`\r\n}\r\n isInListOfPoints = (list: Point[]): boolean => {\r\n const keyList = list.map(x=>x.key)\r\n\r\n return keyList.includes(this.key)\r\n }\r\n}\r\n","import {Point} from \"./point\";\r\nimport {Fraction} from \"../coefficients/fraction\";\r\nimport {Vector} from \"./vector\";\r\nimport {Line} from \"./line\";\r\nimport {Equation} from \"../algebra/equation\";\r\n\r\nexport interface remarquableLines {\r\n 'medians': {\r\n 'A': Line,\r\n 'B': Line,\r\n 'C': Line,\r\n 'intersection': Point\r\n },\r\n 'mediators': {\r\n 'AB': Line,\r\n 'AC': Line,\r\n 'BC': Line,\r\n 'intersection': Point\r\n },\r\n 'heights': {\r\n 'A': Line,\r\n 'B': Line,\r\n 'C': Line,\r\n 'intersection': Point\r\n },\r\n 'bisectors': {\r\n 'A': Line,\r\n 'B': Line,\r\n 'C': Line,\r\n 'intersection': Point\r\n }\r\n}\r\n\r\nexport class Triangle {\r\n private _A: Point;\r\n private _B: Point;\r\n private _C: Point;\r\n private _lines: {\r\n 'AB': Line,\r\n 'AC': Line,\r\n 'BC': Line\r\n };\r\n private _middles: {\r\n 'AB': Point,\r\n 'AC': Point,\r\n 'BC': Point\r\n };\r\n private _remarquables: remarquableLines;\r\n\r\n\r\n constructor(...values: unknown[]) {\r\n\r\n if (values.length > 0) {\r\n this.parse(...values);\r\n }\r\n return this;\r\n }\r\n\r\n // ------------------------------------------\r\n // Getter and setters\r\n // ------------------------------------------\r\n\r\n get A(): Point {\r\n return this._A;\r\n }\r\n\r\n get B(): Point {\r\n return this._B;\r\n }\r\n\r\n get C(): Point {\r\n return this._C;\r\n }\r\n\r\n get AB(): Vector {\r\n return this.getSegment('A', 'B');\r\n }\r\n\r\n get BA(): Vector {\r\n return this.getSegment('B', 'A');\r\n }\r\n\r\n get BC(): Vector {\r\n return this.getSegment('B', 'C');\r\n }\r\n\r\n get CB(): Vector {\r\n return this.getSegment('C', 'B');\r\n }\r\n\r\n get AC(): Vector {\r\n return this.getSegment('A', 'C');\r\n }\r\n\r\n get CA(): Vector {\r\n return this.getSegment('C', 'A');\r\n }\r\n\r\n get isRectangle(): boolean {\r\n if (this.AB.isNormalTo(this.BC)) {\r\n return true;\r\n }\r\n if (this.AB.isNormalTo(this.AC)) {\r\n return true;\r\n }\r\n if (this.BC.isNormalTo(this.AC)) {\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n get isEquilateral(): boolean {\r\n return this.AB.normSquare.isEqual(this.BC.normSquare) &&\r\n this.AB.normSquare.isEqual(this.AC.normSquare);\r\n }\r\n\r\n get isIsocele(): boolean {\r\n return this.AB.normSquare.isEqual(this.BC.normSquare) ||\r\n this.AB.normSquare.isEqual(this.AC.normSquare) ||\r\n this.BC.normSquare.isEqual(this.AC.normSquare)\r\n }\r\n\r\n get lines(): { 'AB': Line, 'BC': Line, 'AC': Line } {\r\n return this._lines;\r\n }\r\n\r\n get remarquables(): remarquableLines {\r\n return this._remarquables;\r\n }\r\n\r\n // ------------------------------------------\r\n // Creation / parsing functions\r\n // ------------------------------------------\r\n\r\n /**\r\n * Parse values to a triangle. Supported formats:\r\n * Point, Point, Point\r\n * x1, y1, x2, y2, x3, y3\r\n * TODO: Something else ?\r\n * @param values\r\n */\r\n parse = (...values: any): Triangle => {\r\n if (values.length === 6) {\r\n // Check if all values are number or fractions.\r\n let v = values.map((x: any) => new Fraction(x));\r\n return this.parse(\r\n new Point(v[0], v[1]),\r\n new Point(v[2], v[3]),\r\n new Point(v[4], v[5]),\r\n )\r\n } else if (values.length === 3) {\r\n // Possibilities:\r\n // - Three points (or part of points, only dict for example, or array (TODO: Add the array syntax for point)\r\n // - Three lines\r\n // - Three lines as text.\r\n if(values.filter((x:any) => typeof x === 'string').length===3) {\r\n return this.parse( ...values.map((x:string) => new Line(x)) )\r\n }else if(values.filter((x:any) => x instanceof Line).length===3) {\r\n // We have three lines\r\n this._lines = {\r\n 'AB': values[0],\r\n 'BC': values[1],\r\n 'AC': values[2]\r\n };\r\n\r\n // Get the intersection points -> build the triangle using these intersection points.\r\n let intersect = values[0].intersection(values[1]);\r\n if (intersect.hasIntersection) {\r\n this._B = intersect.point.clone();\r\n } else {\r\n return this;\r\n }\r\n intersect = values[1].intersection(values[2]);\r\n if (intersect.hasIntersection) {\r\n this._C = intersect.point.clone();\r\n } else {\r\n return this;\r\n }\r\n intersect = values[2].intersection(values[0]);\r\n if (intersect.hasIntersection) {\r\n this._A = intersect.point.clone();\r\n } else {\r\n return this;\r\n }\r\n }else {\r\n // At least, one of the value is not a point.\r\n if (values.filter((x: any) => (x instanceof Point)).length < 3) {\r\n return this.parse(\r\n new Point(values[0]),\r\n new Point(values[1]),\r\n new Point(values[2])\r\n )\r\n }\r\n\r\n // We have three points.\r\n this._A = values[0].clone();\r\n this._B = values[1].clone();\r\n this._C = values[2].clone();\r\n\r\n this._lines = {\r\n 'AB': new Line(this._A, this._B),\r\n 'BC': new Line(this._B, this._C),\r\n 'AC': new Line(this._A, this._C)\r\n };\r\n }\r\n } else if (values.length === 1) {\r\n if (values[0] instanceof Triangle) {\r\n return values[0].clone();\r\n }\r\n }\r\n\r\n this._updateTriangle();\r\n return this;\r\n }\r\n\r\n /**\r\n * Clone the Triangle class\r\n */\r\n clone = (): Triangle => {\r\n this._A = this._A.clone();\r\n this._B = this._B.clone();\r\n this._C = this._C.clone();\r\n\r\n this._lines = {\r\n 'AB': this._lines.AB.clone(),\r\n 'BC': this._lines.BC.clone(),\r\n 'AC': this._lines.AC.clone()\r\n }\r\n\r\n this._updateTriangle();\r\n return this;\r\n }\r\n\r\n\r\n // ------------------------------------------\r\n // Triangle operations and properties\r\n // ------------------------------------------\r\n\r\n /**\r\n * Generate the Line object for the three segments of the triangle\r\n */\r\n private _updateTriangle = () => {\r\n this._middles = {\r\n 'AB': new Point().middleOf(this._A, this._B),\r\n 'AC': new Point().middleOf(this._A, this._C),\r\n 'BC': new Point().middleOf(this._B, this._C)\r\n }\r\n\r\n this._remarquables = this._calculateRemarquableLines();\r\n }\r\n\r\n\r\n /**\r\n * Get the Point class for the given name\r\n * @param ptName\r\n */\r\n private getPointByName = (ptName: string): Point => {\r\n switch (ptName.toUpperCase()) {\r\n case 'A':\r\n return this._A;\r\n case 'B':\r\n return this._B;\r\n case 'C':\r\n return this._C;\r\n }\r\n\r\n // Something went wrong ! Return the first point\r\n return this._A;\r\n }\r\n /**\r\n * Get the vector for the segment given by name.\r\n * @param ptName1\r\n * @param ptName2\r\n */\r\n private getSegment = (ptName1: string, ptName2: string): Vector => {\r\n return new Vector(\r\n this.getPointByName(ptName1),\r\n this.getPointByName(ptName2)\r\n );\r\n }\r\n\r\n private _calculateRemarquableLines = (): remarquableLines => {\r\n let remarquables: remarquableLines = {\r\n 'medians': {\r\n 'A': new Line(this._A, this._middles.BC),\r\n 'B': new Line(this._B, this._middles.AC),\r\n 'C': new Line(this._C, this._middles.AB),\r\n 'intersection': null\r\n },\r\n 'mediators': {\r\n 'AB': new Line(this._middles.AB, new Vector(this._A, this._B).normal()),\r\n 'AC': new Line(this._middles.AC, new Vector(this._A, this._C).normal()),\r\n 'BC': new Line(this._middles.BC, new Vector(this._B, this._C).normal()),\r\n 'intersection': null\r\n },\r\n 'heights': {\r\n 'A': new Line(this._A, new Vector(this._B, this._C).normal()),\r\n 'B': new Line(this._B, new Vector(this._A, this._C).normal()),\r\n 'C': new Line(this._C, new Vector(this._A, this._B).normal()),\r\n 'intersection': null\r\n },\r\n 'bisectors': {\r\n 'A': this._calculateBisectors('A'),\r\n 'B': this._calculateBisectors('B'),\r\n 'C': this._calculateBisectors('C'),\r\n 'intersection': null\r\n }\r\n }\r\n\r\n // As it's a triangle, we assume the lines are intersecting and aren't parallel or superposed.\r\n remarquables.medians.intersection = remarquables.medians.A.intersection(remarquables.medians.B).point;\r\n remarquables.mediators.intersection = remarquables.mediators.AB.intersection(remarquables.mediators.BC).point;\r\n remarquables.heights.intersection = remarquables.heights.A.intersection(remarquables.heights.B).point;\r\n remarquables.bisectors.intersection = remarquables.bisectors.A.intersection(remarquables.bisectors.B).point;\r\n\r\n // Everything was calculated for the remarquable lines.\r\n return remarquables;\r\n }\r\n\r\n private _calculateBisectors = (pt: string): Line => {\r\n let tlines = this.lines, d1, d2;\r\n\r\n if(pt==='A'){\r\n d1 = tlines.AB;\r\n d2 = tlines.AC;\r\n }else if(pt==='B'){\r\n d1 = tlines.AB;\r\n d2 = tlines.BC;\r\n }else if(pt==='C'){\r\n d1 = tlines.BC;\r\n d2 = tlines.AC;\r\n }\r\n\r\n let b1 = new Line(new Equation(d1.equation.left.clone().multiply(d2.n.simplify().norm), d2.equation.left.clone().multiply(d1.n.simplify().norm)).reorder(true).simplify()),\r\n b2 = new Line(new Equation(d1.equation.left.clone().multiply(d2.n.simplify().norm), d2.equation.left.clone().multiply(d1.n.simplify().norm).opposed()).reorder(true).simplify());\r\n\r\n // Must determine which bisectors is in the triangle\r\n if(pt==='A'){\r\n return b1.hitSegment(this.B, this.C)?b1:b2;\r\n }\r\n if(pt==='B'){\r\n return b1.hitSegment(this.A, this.C)?b1:b2;\r\n }\r\n if(pt==='C'){\r\n return b1.hitSegment(this.B, this.A)?b1:b2;\r\n }\r\n\r\n // Default returns the first bisector\r\n return b1;\r\n }\r\n}","/**\r\n * Vector module contains everything necessary to handle 2d or 3d vectors.\r\n * @module Vector\r\n */\r\nimport {Fraction} from \"../coefficients/fraction\";\r\nimport {Numeric} from \"../numeric\";\r\nimport {Point} from \"./point\";\r\n\r\nexport class Vector {\r\n private _x: Fraction; // 1st component\r\n private _y: Fraction; // 2nd component\r\n\r\n constructor(...values: unknown[]) {\r\n this._x = new Fraction().zero();\r\n this._y = new Fraction().zero();\r\n\r\n if (values !== undefined) {\r\n this.parse(...values);\r\n }\r\n };\r\n\r\n // ------------------------------------------\r\n // Getter and setter\r\n // ------------------------------------------\r\n get x(): Fraction {\r\n return this._x;\r\n }\r\n\r\n set x(value: Fraction|number|string) {\r\n this._x = new Fraction(value);\r\n }\r\n\r\n get y(): Fraction {\r\n return this._y;\r\n }\r\n\r\n set y(value: Fraction|number|string) {\r\n this._y = new Fraction(value);\r\n }\r\n\r\n get normSquare(): Fraction {\r\n return this._x.clone().pow(2).add(this._y.clone().pow(2));\r\n }\r\n\r\n get norm(): number {\r\n return Math.sqrt(this.normSquare.value);\r\n }\r\n\r\n get tex(): string {\r\n return `\\\\begin{pmatrix}${this._x.tex} \\\\\\\\\\ ${this._y.tex} \\\\end{pmatrix}`\r\n }\r\n\r\n get asPoint(): Point {\r\n return new Point(this.x, this.y)\r\n }\r\n\r\n // ------------------------------------------\r\n // Creation / parsing functions\r\n // ------------------------------------------\r\n\r\n parse = (...values: any): Vector => {\r\n // TODO: Must be more strict about what is given and limit to two dimensional vectors.p\r\n // Maybe more than one value was given...\r\n // Initialize the vector\r\n this.zero();\r\n\r\n if (values.length === 0) {\r\n return this;\r\n }\r\n\r\n if (values.length === 1) {\r\n if (values[0] instanceof Vector) {\r\n return values[0].clone()\r\n } else {\r\n return this._parseString(values[0])\r\n }\r\n }\r\n\r\n if (values.length >= 2) {\r\n // Two points are given - skip the third value.\r\n if (values[0] instanceof Point && values[1] instanceof Point) {\r\n this._x = values[1].x.clone().subtract(values[0].x)\r\n this._y = values[1].y.clone().subtract(values[0].y)\r\n return this;\r\n }\r\n\r\n // Fractions or a number are give\r\n if (values[0] instanceof Fraction || !isNaN(values[0])) {\r\n this._x = new Fraction(values[0])\r\n }\r\n if (values[1] instanceof Fraction || !isNaN(values[1])) {\r\n this._y = new Fraction(values[1])\r\n }\r\n\r\n if(\r\n (typeof values[0] === 'object' && !isNaN(values[0].x) && !isNaN(values[0].x)) &&\r\n (typeof values[1] === 'object' && !isNaN(values[1].x) && !isNaN(values[1].x))\r\n ){\r\n this._x = new Fraction(+values[1].x-values[0].x)\r\n this._y = new Fraction(+values[1].y-values[0].y)\r\n }\r\n }\r\n\r\n return this;\r\n };\r\n\r\n clone = (): Vector => {\r\n let V = new Vector();\r\n\r\n if (this._x !== null) {\r\n V.x = this._x.clone();\r\n }\r\n if (this._y !== null) {\r\n V.y = this._y.clone();\r\n }\r\n return V;\r\n }\r\n\r\n reset = (): Vector => {\r\n this._x = null;\r\n this._y = null;\r\n return this;\r\n }\r\n\r\n zero = (): Vector => {\r\n this.reset();\r\n this._x = new Fraction(null);\r\n this._y = new Fraction(null);\r\n return this;\r\n }\r\n\r\n one = (): Vector => {\r\n this._x = new Fraction();\r\n this._y = new Fraction();\r\n return this;\r\n }\r\n\r\n private _parseString = (value: string): Vector => {\r\n // Split comma, semi colon or single space.\r\n let components = value.split(/[,;\\s]/g);\r\n\r\n // Validate the fraction values.\r\n this.x = new Fraction(components[0] || null);\r\n this.y = new Fraction(components[1] || null);\r\n return this;\r\n };\r\n\r\n // ------------------------------------------\r\n // Mathematical operations\r\n // ------------------------------------------\r\n opposed = (): Vector => {\r\n this._x.opposed();\r\n this._y.opposed();\r\n return this;\r\n }\r\n\r\n add = (V: Vector): Vector => {\r\n this._x.add(V.x);\r\n this._y.add(V.y);\r\n\r\n return this;\r\n }\r\n\r\n subtract = (V: Vector): Vector => {\r\n return this.add(V.clone().opposed());\r\n }\r\n\r\n scalarProductWithVector = (V: Vector): Fraction => {\r\n return Vector.scalarProduct(this, V)\r\n // return this._x.clone().multiply(V.x).add(this._y.clone().multiply(V.y));\r\n }\r\n\r\n determinantWithVector = (V: Vector): Fraction => {\r\n return Vector.determinant(this, V)\r\n }\r\n\r\n static scalarProduct = (v1: Vector, v2: Vector): Fraction => {\r\n return v1.x.clone().multiply(v2.x).add(v1.y.clone().multiply(v2.y));\r\n };\r\n\r\n static determinant = (v1: Vector, v2: Vector): Fraction => {\r\n return v1.x.clone().multiply(v2.y).subtract(v1.y.clone().multiply(v2.x))\r\n }\r\n\r\n normal = (): Vector => {\r\n let x = this.x.clone().opposed(), y = this.y.clone();\r\n this._x = y;\r\n this._y = x;\r\n return this;\r\n }\r\n\r\n isColinearTo = (v: Vector): boolean => {\r\n return this.determinantWithVector(v).isZero()\r\n }\r\n\r\n isNormalTo = (v: Vector): boolean => {\r\n return this.scalarProductWithVector(v).isZero()\r\n }\r\n\r\n get isNull(): boolean {\r\n return this.x.isZero() && this.y.isZero()\r\n }\r\n\r\n multiplyByScalar = (k: any): Vector => {\r\n let scalar = new Fraction(k);\r\n this._x.multiply(scalar);\r\n this._y.multiply(scalar);\r\n return this;\r\n }\r\n\r\n divideByScalar = (k: any): Vector => {\r\n return this.multiplyByScalar(new Fraction(k).invert());\r\n }\r\n // ------------------------------------------\r\n // Vector functions\r\n // ------------------------------------------\r\n\r\n simplify = (): Vector => {\r\n // Multiply by the lcm of denominators.\r\n return this.multiplyByScalar(Numeric.lcm(this._x.denominator, this._y.denominator))\r\n .divideByScalar(Numeric.gcd(this._x.numerator, this._y.numerator));\r\n }\r\n\r\n simplifyDirection = (): Vector => {\r\n let lcm = Numeric.lcm(this.x.denominator, this.y.denominator),\r\n gcd = Numeric.gcd(this.x.numerator, this.y.numerator);\r\n\r\n this.x.multiply(lcm).divide(gcd);\r\n this.y.multiply(lcm).divide(gcd);\r\n return this\r\n }\r\n\r\n angleWith = (V: Vector, sharp?: Boolean, radian?: Boolean): number => {\r\n let scalar = this.scalarProductWithVector(V).value,\r\n toDegree = radian ? 1 : 180 / Math.PI;\r\n if (sharp) {\r\n scalar = Math.abs(scalar);\r\n }\r\n\r\n return toDegree * Math.acos(scalar / (this.norm * V.norm));\r\n }\r\n}\r\n","export class Numeric{\r\n static round(value:number, decimals:number=2):number {\r\n return Number(Math.round(Number(value+'e'+decimals))+'e-'+decimals);\r\n }\r\n\r\n /**\r\n * Get the list of the nth first prime numbers.\r\n * @param nb : number of primes to choose from\r\n */\r\n static primes(nb?:number):number[]{\r\n let primesValues:number[] = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997, 1009, 1013, 1019, 1021, 1031, 1033, 1039, 1049, 1051, 1061, 1063, 1069, 1087, 1091, 1093, 1097, 1103, 1109, 1117, 1123, 1129, 1151, 1153, 1163, 1171, 1181, 1187, 1193, 1201, 1213, 1217, 1223, 1229, 1231, 1237, 1249, 1259, 1277, 1279, 1283, 1289, 1291, 1297, 1301, 1303, 1307, 1319, 1321, 1327, 1361, 1367, 1373, 1381, 1399, 1409, 1423, 1427, 1429, 1433, 1439, 1447, 1451, 1453, 1459, 1471, 1481, 1483, 1487, 1489, 1493, 1499, 1511, 1523, 1531, 1543, 1549, 1553, 1559, 1567, 1571, 1579, 1583, 1597, 1601, 1607, 1609, 1613, 1619, 1621, 1627, 1637, 1657, 1663, 1667, 1669, 1693, 1697, 1699, 1709, 1721, 1723, 1733, 1741, 1747, 1753, 1759, 1777, 1783, 1787, 1789, 1801, 1811, 1823, 1831, 1847, 1861, 1867, 1871, 1873, 1877, 1879, 1889, 1901, 1907, 1913, 1931, 1933, 1949, 1951, 1973, 1979, 1987, 1993, 1997, 1999, 2003, 2011, 2017, 2027, 2029, 2039, 2053, 2063, 2069, 2081, 2083, 2087, 2089, 2099, 2111, 2113, 2129, 2131, 2137, 2141, 2143, 2153, 2161, 2179, 2203, 2207, 2213, 2221, 2237, 2239, 2243, 2251, 2267, 2269, 2273, 2281, 2287, 2293, 2297, 2309, 2311, 2333, 2339, 2341, 2347, 2351, 2357, 2371, 2377, 2381, 2383, 2389, 2393, 2399, 2411, 2417, 2423, 2437, 2441, 2447, 2459, 2467, 2473, 2477, 2503, 2521, 2531, 2539, 2543, 2549, 2551, 2557, 2579, 2591, 2593, 2609, 2617, 2621, 2633, 2647, 2657, 2659, 2663, 2671, 2677, 2683, 2687, 2689, 2693, 2699, 2707, 2711, 2713, 2719, 2729, 2731, 2741, 2749, 2753, 2767, 2777, 2789, 2791, 2797, 2801, 2803, 2819, 2833, 2837, 2843, 2851, 2857, 2861, 2879, 2887, 2897, 2903, 2909, 2917, 2927, 2939, 2953, 2957, 2963, 2969, 2971, 2999, 3001, 3011, 3019, 3023, 3037, 3041, 3049, 3061, 3067, 3079, 3083, 3089, 3109, 3119, 3121, 3137, 3163, 3167, 3169, 3181, 3187, 3191, 3203, 3209, 3217, 3221, 3229, 3251, 3253, 3257, 3259, 3271, 3299, 3301, 3307, 3313, 3319, 3323, 3329, 3331, 3343, 3347, 3359, 3361, 3371, 3373, 3389, 3391, 3407, 3413, 3433, 3449, 3457, 3461, 3463, 3467, 3469, 3491, 3499, 3511, 3517, 3527, 3529, 3533, 3539, 3541, 3547, 3557, 3559, 3571, 3581, 3583, 3593, 3607, 3613, 3617, 3623, 3631, 3637, 3643, 3659, 3671, 3673, 3677, 3691, 3697, 3701, 3709, 3719, 3727, 3733, 3739, 3761, 3767, 3769, 3779, 3793, 3797, 3803, 3821, 3823, 3833, 3847, 3851, 3853, 3863, 3877, 3881, 3889, 3907, 3911, 3917, 3919, 3923, 3929, 3931, 3943, 3947, 3967, 3989, 4001, 4003, 4007, 4013, 4019, 4021, 4027, 4049, 4051, 4057, 4073, 4079, 4091, 4093, 4099, 4111, 4127, 4129, 4133, 4139, 4153, 4157, 4159, 4177, 4201, 4211, 4217, 4219, 4229, 4231, 4241, 4243, 4253, 4259, 4261, 4271, 4273, 4283, 4289, 4297, 4327, 4337, 4339, 4349, 4357, 4363, 4373, 4391, 4397, 4409, 4421, 4423, 4441, 4447, 4451, 4457, 4463, 4481, 4483, 4493, 4507, 4513, 4517, 4519, 4523, 4547, 4549, 4561, 4567, 4583, 4591, 4597, 4603, 4621, 4637, 4639, 4643, 4649, 4651, 4657, 4663, 4673, 4679, 4691, 4703, 4721, 4723, 4729, 4733, 4751, 4759, 4783, 4787, 4789, 4793, 4799, 4801, 4813, 4817, 4831, 4861, 4871, 4877, 4889, 4903, 4909, 4919, 4931, 4933, 4937, 4943, 4951, 4957, 4967, 4969, 4973, 4987, 4993, 4999, 5003, 5009, 5011, 5021, 5023, 5039, 5051, 5059, 5077, 5081, 5087, 5099, 5101, 5107, 5113, 5119, 5147, 5153, 5167, 5171, 5179, 5189, 5197, 5209, 5227, 5231, 5233, 5237, 5261, 5273, 5279, 5281, 5297, 5303, 5309, 5323, 5333, 5347, 5351, 5381, 5387, 5393, 5399, 5407, 5413, 5417, 5419, 5431, 5437, 5441, 5443, 5449, 5471, 5477, 5479, 5483, 5501, 5503, 5507, 5519, 5521, 5527, 5531, 5557, 5563, 5569, 5573, 5581, 5591, 5623, 5639, 5641, 5647, 5651, 5653, 5657, 5659, 5669, 5683, 5689, 5693, 5701, 5711, 5717, 5737, 5741, 5743, 5749, 5779, 5783, 5791, 5801, 5807, 5813, 5821, 5827, 5839, 5843, 5849, 5851, 5857, 5861, 5867, 5869, 5879, 5881, 5897, 5903, 5923, 5927, 5939, 5953, 5981, 5987, 6007, 6011, 6029, 6037, 6043, 6047, 6053, 6067, 6073, 6079, 6089, 6091, 6101, 6113, 6121, 6131, 6133, 6143, 6151, 6163, 6173, 6197, 6199, 6203, 6211, 6217, 6221, 6229, 6247, 6257, 6263, 6269, 6271, 6277, 6287, 6299, 6301, 6311, 6317, 6323, 6329, 6337, 6343, 6353, 6359, 6361, 6367, 6373, 6379, 6389, 6397, 6421, 6427, 6449, 6451, 6469, 6473, 6481, 6491, 6521, 6529, 6547, 6551, 6553, 6563, 6569, 6571, 6577, 6581, 6599, 6607, 6619, 6637, 6653, 6659, 6661, 6673, 6679, 6689, 6691, 6701, 6703, 6709, 6719, 6733, 6737, 6761, 6763, 6779, 6781, 6791, 6793, 6803, 6823, 6827, 6829, 6833, 6841, 6857, 6863, 6869, 6871, 6883, 6899, 6907, 6911, 6917, 6947, 6949, 6959, 6961, 6967, 6971, 6977, 6983, 6991, 6997, 7001, 7013, 7019, 7027, 7039, 7043, 7057, 7069, 7079, 7103, 7109, 7121, 7127, 7129, 7151, 7159, 7177, 7187, 7193, 7207, 7211, 7213, 7219, 7229, 7237, 7243, 7247, 7253, 7283, 7297, 7307, 7309, 7321, 7331, 7333, 7349, 7351, 7369, 7393, 7411, 7417, 7433, 7451, 7457, 7459, 7477, 7481, 7487, 7489, 7499, 7507, 7517, 7523, 7529, 7537, 7541, 7547, 7549, 7559, 7561, 7573, 7577, 7583, 7589, 7591, 7603, 7607, 7621, 7639, 7643, 7649, 7669, 7673, 7681, 7687, 7691, 7699, 7703, 7717, 7723, 7727, 7741, 7753, 7757, 7759, 7789, 7793, 7817, 7823, 7829, 7841, 7853, 7867, 7873, 7877, 7879, 7883, 7901, 7907, 7919, 7927, 7933, 7937, 7949, 7951, 7963, 7993, 8009, 8011, 8017, 8039, 8053, 8059, 8069, 8081, 8087, 8089, 8093, 8101, 8111, 8117, 8123, 8147, 8161, 8167, 8171, 8179, 8191, 8209, 8219, 8221, 8231, 8233, 8237, 8243, 8263, 8269, 8273, 8287, 8291, 8293, 8297, 8311, 8317, 8329, 8353, 8363, 8369, 8377, 8387, 8389, 8419, 8423, 8429, 8431, 8443, 8447, 8461, 8467, 8501, 8513, 8521, 8527, 8537, 8539, 8543, 8563, 8573, 8581, 8597, 8599, 8609, 8623, 8627, 8629, 8641, 8647, 8663, 8669, 8677, 8681, 8689, 8693, 8699, 8707, 8713, 8719, 8731, 8737, 8741, 8747, 8753, 8761, 8779, 8783, 8803, 8807, 8819, 8821, 8831, 8837, 8839, 8849, 8861, 8863, 8867, 8887, 8893, 8923, 8929, 8933, 8941, 8951, 8963, 8969, 8971, 8999, 9001, 9007, 9011, 9013, 9029, 9041, 9043, 9049, 9059, 9067, 9091, 9103, 9109, 9127, 9133, 9137, 9151, 9157, 9161, 9173, 9181, 9187, 9199, 9203, 9209, 9221, 9227, 9239, 9241, 9257, 9277, 9281, 9283, 9293, 9311, 9319, 9323, 9337, 9341, 9343, 9349, 9371, 9377, 9391, 9397, 9403, 9413, 9419, 9421, 9431, 9433, 9437, 9439, 9461, 9463, 9467, 9473, 9479, 9491, 9497, 9511, 9521, 9533, 9539, 9547, 9551, 9587, 9601, 9613, 9619, 9623, 9629, 9631, 9643, 9649, 9661, 9677, 9679, 9689, 9697, 9719, 9721, 9733, 9739, 9743, 9749, 9767, 9769, 9781, 9787, 9791, 9803, 9811, 9817, 9829, 9833, 9839, 9851, 9857, 9859, 9871, 9883, 9887, 9901, 9907, 9923, 9929, 9931, 9941, 9949, 9967, 9973];\r\n if(nb === undefined){\r\n return primesValues;\r\n }else{\r\n return primesValues.slice(0,Math.min(primesValues.length,nb));\r\n }\r\n }\r\n\r\n /**\r\n * Get the list of all dividers of a number.\r\n * @param value\r\n */\r\n static dividers(value:number):number[]{\r\n let D: number[];\r\n const maxV = Math.sqrt(Math.abs(value));\r\n\r\n // Initialize the list of dividers.\r\n D = [];\r\n\r\n for(let i=1; i<=maxV; i++){\r\n if(value%i===0){\r\n D.push(i);\r\n D.push(value/i);\r\n }\r\n }\r\n\r\n // Order numbers.\r\n D.sort(function(a, b){return a-b;});\r\n\r\n // Make sure the array of value is unique.\r\n return [...new Set(D)];\r\n }\r\n /**\r\n * Great Common Divisor\r\n * @param values : number values\r\n */\r\n static gcd(...values:number[]):number{\r\n // Define the gcd for two number\r\n let gcd2 = function(a:number,b:number):number{\r\n if(b===0){return a;}\r\n return gcd2(b, a%b);\r\n };\r\n\r\n let g:number = 1,\r\n i:number = 2;\r\n\r\n // Nothing is given\r\n if(values.length===0){return 1;}\r\n // Only one number is given\r\n if(values.length===1){\r\n // The first number is zero\r\n if(values[0]===0){return 1;}\r\n // Return the number\r\n return values[0];\r\n }\r\n\r\n // We have at least 2 numbers.\r\n g = gcd2(values[0],values[1]);\r\n\r\n // The gcd of the two first value is one ? It's already finished.\r\n if(g===1){return 1;}\r\n\r\n // The current gcd isn't one. Continue with all next values.\r\n for(i=2; i<values.length; i++){\r\n g = gcd2(g, values[i]);\r\n // Escape if gcd is already one.\r\n if(g===1){break;}\r\n }\r\n\r\n return Math.abs(g);\r\n }\r\n\r\n static divideNumbersByGCD(...values: number[]): number[]{\r\n let gcd = Numeric.gcd(...values)\r\n\r\n return values.map(x=>x/gcd)\r\n }\r\n /**\r\n * Least Common Multiple\r\n * @param values: list of numbers\r\n */\r\n static lcm(...values:number[]):number{\r\n return values.reduce(function(a,b){\r\n return Math.abs(a * b / Numeric.gcd(a, b));\r\n });\r\n }\r\n\r\n static pythagoricianTripletsWithTarget(target: number, targetIsSquare?:boolean): number[][] {\r\n // méthode inverse, à partir du triplet.\r\n const triplets = [],\r\n targetValue = targetIsSquare===true?+target:target**2\r\n for(let u = 0; u <= target; u++){\r\n for(let v = 0; v <=target; v++){\r\n if(u**2+v**2===targetValue){\r\n triplets.push([u, v, target])\r\n }\r\n }\r\n }\r\n\r\n return triplets\r\n }\r\n\r\n static numberCorrection(value: number, epsilonDigit:number = 1, epsilonNumberOfDigits: number = 10, number_of_digits: number = 8){\r\n return +value.toFixed(number_of_digits)\r\n //\r\n // // Must modify the number if it's like:\r\n // // a: 3.0000000000000003\r\n // // b: 3.9999999999999994\r\n // // remove the last character\r\n // // check if around n last characters are either 0 or 9\r\n // // if it is, 'round' the number.\r\n // function extractDecimalPart(valueToExtract: number, decimalLength: number){\r\n // let decimal = valueToExtract.toString()\r\n //\r\n // if (!decimal.includes('.')) {\r\n // return ''\r\n // }\r\n //\r\n // decimal = decimal.split('.')[1]\r\n // return decimal.substring(0, decimalLength)\r\n // }\r\n //\r\n // const epsilon = Number(`0.${\"0\".repeat(epsilonNumberOfDigits-1)}${epsilonDigit}`)\r\n // const decimal = extractDecimalPart(value, epsilonNumberOfDigits)\r\n // if(decimal===''){return value}\r\n //\r\n // const n9 = decimal.match(/9+$/g)\r\n // const n0 = decimal.match(/0+$/g)\r\n //\r\n // if (n9 && n9[0].length >= number_of_digits) {\r\n // // New tested values.\r\n // const mod = extractDecimalPart(value + epsilon, epsilonNumberOfDigits),\r\n // mod0 = mod.match(/0+$/g)\r\n //\r\n // if(mod0 && mod0[0].length>= number_of_digits){\r\n // return +((value+epsilon).toString().split(mod0[0])[0])\r\n // }\r\n // }\r\n //\r\n // if (n0 && n0[0].length >= number_of_digits) {\r\n // // New tested values.\r\n // const mod = extractDecimalPart(value - epsilon, epsilonNumberOfDigits),\r\n // mod9 = mod.match(/9+$/g)\r\n //\r\n // if(mod9 && mod9[0].length>= number_of_digits){\r\n // // The value can be changed. Remove all nines!\r\n // return +(value.toString().split(n0[0])[0])\r\n // }\r\n // }\r\n //\r\n // return value\r\n }\r\n\r\n static periodic(value: number):number{\r\n if(Number.isSafeInteger(value)){return 0}\r\n\r\n // Assume it's with decimal.\r\n let decimal = (value.toString()).split('.')[0]\r\n\r\n // The decimal part is limited\r\n if(decimal.length<10){return 0}\r\n\r\n // Find the periodic if it exists.\r\n }\r\n\r\n static decompose(value: number): number[][]{\r\n let dividers = Numeric.dividers(value),\r\n limit = Math.sqrt(value),\r\n arr = [],\r\n u, v\r\n\r\n while(dividers.length>0){\r\n u = dividers.shift()\r\n v = dividers.length>0?dividers.pop():+u\r\n\r\n arr.push([u,v])\r\n }\r\n\r\n return arr\r\n }\r\n}","import {Shutingyard, ShutingyardMode, ShutingyardType, tokenConstant} from \"./shutingyard\";\r\nimport {Fraction} from \"./coefficients/fraction\";\r\n\r\nexport class NumExp {\r\n private _rpn: { token: string, tokenType: string }[]\r\n private _expression: string\r\n private _isValid: boolean\r\n\r\n constructor(value: string, uniformize?:boolean) {\r\n this._expression = value\r\n try {\r\n this._rpn = new Shutingyard(ShutingyardMode.NUMERIC).parse(value, uniformize || uniformize===undefined).rpn\r\n }catch(e){\r\n this._rpn = null\r\n this._isValid = false\r\n }\r\n }\r\n\r\n get rpn(): { token: string; tokenType: string }[] {\r\n return this._rpn;\r\n }\r\n\r\n get isValid(): boolean {\r\n if(this._isValid===undefined){\r\n try {\r\n const v = this.evaluate({x: 0})\r\n }catch{\r\n this._isValid = false\r\n }\r\n }\r\n return this._isValid\r\n }\r\n\r\n set isValid(value: boolean){\r\n this._isValid = value\r\n }\r\n\r\n get expression(): string {\r\n return this._expression;\r\n }\r\n\r\n private _extractDecimalPart(value: number): string {\r\n let decimal = value.toString()\r\n\r\n if (!decimal.includes('.')) {\r\n return ''\r\n }\r\n\r\n decimal = decimal.split('.')[1]\r\n\r\n return decimal.substring(0, decimal.length - 2)\r\n }\r\n\r\n private _numberCorrection(value: number): number {\r\n // Must modify the number if it's like:\r\n // a: 3.0000000000000003\r\n // b: 3.9999999999999994\r\n // remove the last character\r\n // check if around n last characters are either 0 or 9\r\n // if it is, 'round' the number.\r\n\r\n const epsilon = 0.00000000000001,\r\n number_of_digits = 6\r\n\r\n const decimal = this._extractDecimalPart(value)\r\n if(decimal===''){return value}\r\n\r\n const n9 = decimal.match(/9+$/g)\r\n const n0 = decimal.match(/0+$/g)\r\n\r\n if (n9 && n9[0].length >= number_of_digits) {\r\n // New tested values.\r\n const mod = this._extractDecimalPart(value + epsilon),\r\n mod0 = mod.match(/0+$/g)\r\n\r\n if(mod0 && mod0[0].length>= number_of_digits){\r\n // The value can be changed. Remove all zeros!\r\n return +((value+epsilon).toString().split(mod0[0])[0])\r\n }\r\n }\r\n\r\n if (n0 && n0[0].length >= number_of_digits) {\r\n // New tested values.\r\n const mod = this._extractDecimalPart(value - epsilon),\r\n mod9 = mod.match(/9+$/g)\r\n\r\n if(mod9 && mod9[0].length>= number_of_digits){\r\n // The value can be changed. Remove all nines!\r\n return +(value.toString().split(n0[0])[0])\r\n }\r\n }\r\n\r\n return value\r\n }\r\n\r\n private _addToStack(stack:number[], value: number): void {\r\n stack.push(this._numberCorrection(value))\r\n }\r\n\r\n evaluate(values?: { [Key: string]: number }): number {\r\n const stack: number[] = []\r\n\r\n if(this._rpn===null){\r\n this._isValid = false\r\n return 0\r\n }\r\n\r\n this.isValid = true\r\n\r\n for (const element of this._rpn) {\r\n if (element.tokenType === ShutingyardType.COEFFICIENT) {\r\n // May be a numeric value or a Fraction.\r\n if (!isNaN(+element.token)) {\r\n this._addToStack(stack, +element.token)\r\n } else {\r\n this._addToStack(stack, new Fraction(element.token).value)\r\n }\r\n } else if (element.tokenType === ShutingyardType.VARIABLE) {\r\n if (values[element.token] !== undefined) {\r\n this._addToStack(stack, +values[element.token])\r\n }\r\n } else if (element.tokenType === ShutingyardType.CONSTANT) {\r\n this._addToStack(stack, tokenConstant[element.token])\r\n } else if (element.tokenType === ShutingyardType.OPERATION) {\r\n if (element.token === '*') {\r\n const b = stack.pop(),\r\n a = stack.pop()\r\n if(a === undefined || b === undefined){this.isValid = false}\r\n this._addToStack(stack, a * b)\r\n } else if (element.token === '/') {\r\n const b = stack.pop(),\r\n a = stack.pop()\r\n if(a === undefined || b === undefined){this.isValid = false}\r\n this._addToStack(stack, a / b)\r\n } else if (element.token === '+') {\r\n const b = stack.pop(),\r\n a = stack.pop()\r\n if(a === undefined || b === undefined){this.isValid = false}\r\n this._addToStack(stack, (+a) + (+b))\r\n } else if (element.token === '-') {\r\n const b = stack.pop(),\r\n a = stack.pop() || 0\r\n if(b === undefined){this.isValid = false}\r\n this._addToStack(stack, a - b)\r\n } else if (element.token === '^') {\r\n const b = stack.pop(),\r\n a = stack.pop()\r\n if(a === undefined || b === undefined){this.isValid = false}\r\n this._addToStack(stack, Math.pow(a, b))\r\n }\r\n } else if (element.tokenType === ShutingyardType.FUNCTION) {\r\n const a = stack.pop()\r\n if(a === undefined){this.isValid = false}\r\n if (element.token === 'sin') {\r\n this._addToStack(stack, Math.sin(a))\r\n } else if (element.token === 'cos') {\r\n this._addToStack(stack, Math.cos(a))\r\n } else if (element.token === 'tan') {\r\n this._addToStack(stack, Math.tan(a))\r\n } else if(element.token === 'sqrt') {\r\n this._addToStack(stack, Math.sqrt(a))\r\n }else if(element.token ==='nthrt') {\r\n // TODO: support nthrt in num. exp.\r\n let b = stack.pop()\r\n if(a%2===0 && b<0){\r\n this._addToStack(stack, NaN)\r\n }else {\r\n this._addToStack(stack, (b < 0 ? -1 : 1) * Math.pow(Math.abs(b), 1 / a))\r\n }\r\n } else if(element.token === 'ln'){\r\n this._addToStack(stack, Math.log(a))\r\n } else if(element.token === 'log') {\r\n this._addToStack(stack, Math.log10(a))\r\n }\r\n }\r\n }\r\n\r\n if (stack.length === 1) {\r\n return stack[0]\r\n } else {\r\n throw `There was a problem parsing: ${this._expression}`\r\n }\r\n }\r\n}\r\n","import {rndPolynom} from \"./rndPolynom\";\r\nimport {rndMonom} from \"./rndMonom\";\r\nimport {rndHelpers} from \"./rndHelpers\";\r\nimport {\r\n randomCoefficientConfig,\r\n randomGeometryLineConfig,\r\n randomGeometryPointConfig,\r\n randomMonomConfig,\r\n randomPolynomConfig\r\n} from \"./rndTypes\";\r\nimport {rndFraction} from \"./rndFraction\";\r\nimport {Polynom} from \"../algebra/polynom\";\r\nimport {Monom} from \"../algebra/monom\";\r\nimport {Fraction} from \"../coefficients/fraction\";\r\nimport {Line} from \"../geometry/line\";\r\nimport {rndGeometryLine} from \"./rndGeometryLine\";\r\nimport {Point} from \"../geometry/point\";\r\nimport {rndGeometryPoint} from \"./rndGeometryPoint\";\r\n\r\nexport * from \"./rndTypes\"\r\n\r\nexport namespace Random {\r\n export function polynom(config?: randomPolynomConfig): Polynom {\r\n return (new rndPolynom(config)).generate()\r\n }\r\n\r\n export function monom(config?: randomMonomConfig): Monom {\r\n return (new rndMonom(config)).generate()\r\n }\r\n\r\n export function fraction(config?: randomCoefficientConfig): Fraction {\r\n return (new rndFraction(config)).generate()\r\n }\r\n\r\n export function number(from: number, to: number): number {\r\n return rndHelpers.randomInt(from, to)\r\n }\r\n\r\n export function numberSym(max: number, allowZero?: boolean): number {\r\n return rndHelpers.randomIntSym(max, allowZero)\r\n }\r\n\r\n export function prime(max: number): number {\r\n return rndHelpers.randomPrime(max)\r\n }\r\n\r\n export function bool(percent?: number): boolean {\r\n return rndHelpers.randomBool(percent)\r\n }\r\n\r\n export function array(arr: any[], number?: number): any[] {\r\n return rndHelpers.randomArray(arr, number)\r\n }\r\n\r\n export function item(arr: any[]): any {\r\n return rndHelpers.randomItem(arr)\r\n }\r\n\r\n export function shuffle(arr: any[]): any[] {\r\n return rndHelpers.shuffleArray(arr)\r\n }\r\n\r\n export namespace Geometry {\r\n export function line(config?: randomGeometryLineConfig): Line {\r\n return (new rndGeometryLine(config).generate())\r\n }\r\n\r\n export function point(config?: randomGeometryPointConfig): Point {\r\n return (new rndGeometryPoint(config).generate())\r\n }\r\n\r\n }\r\n}","export class randomCore {\r\n protected _config: Object\r\n protected _defaultConfig: Object\r\n mergeConfig = (config: Object, defaultConfig: Object): Object => {\r\n if (config !== undefined) {\r\n return {...defaultConfig, ...config}\r\n }\r\n return defaultConfig\r\n }\r\n\r\n generate = (): unknown => {\r\n return undefined\r\n }\r\n\r\n config = (config: Object): randomCore => {\r\n this._config = this.mergeConfig(config, this._defaultConfig)\r\n return this\r\n }\r\n}","import {randomCore} from \"./randomCore\";\r\nimport {randomCoefficientConfig, randomMonomConfig, randomPolynomConfig} from \"./rndTypes\";\r\nimport {Random} from \"./random\";\r\nimport {Fraction} from \"../coefficients/fraction\";\r\n\r\n/**\r\n * Create a random monom based on a based configuration\r\n */\r\nexport class rndFraction extends randomCore {\r\n declare protected _config: randomCoefficientConfig\r\n declare protected _defaultConfig: randomCoefficientConfig\r\n\r\n constructor(userConfig?: randomCoefficientConfig) {\r\n super();\r\n\r\n this._defaultConfig = {\r\n negative: true,\r\n max: 10,\r\n reduced: true,\r\n zero: true,\r\n natural: false\r\n }\r\n\r\n this._config = this.mergeConfig(userConfig, this._defaultConfig)\r\n }\r\n\r\n generate = (): Fraction => {\r\n let Q = new Fraction()\r\n\r\n if(this._config.negative){\r\n Q.numerator = Random.numberSym(this._config.max, this._config.zero)\r\n }else {\r\n Q.numerator = Random.number(this._config.zero ? 0 : 1, this._config.max)\r\n }\r\n if(this._config.natural){\r\n Q.denominator = 1\r\n }else {\r\n let securityCount = 0\r\n while(Q.isRelative() && securityCount<10) {\r\n Q.denominator = Random.number(1, this._config.max)\r\n securityCount++\r\n }\r\n }\r\n\r\n return this._config.reduced?Q.reduce():Q\r\n }\r\n}\r\n","import {randomCore} from \"./randomCore\";\r\nimport {Random, randomGeometryLineConfig} from \"./random\";\r\nimport {Line} from \"../geometry/line\";\r\nimport {Vector} from \"../geometry/vector\";\r\nimport {Point} from \"../geometry/point\";\r\n\r\n/**\r\n * Create a random monom based on a based configuration\r\n */\r\nexport class rndGeometryLine extends randomCore {\r\n declare protected _config: randomGeometryLineConfig\r\n declare protected _defaultConfig: randomGeometryLineConfig\r\n\r\n constructor(userConfig?: randomGeometryLineConfig) {\r\n super();\r\n\r\n this._defaultConfig = {\r\n A: {\r\n x: Random.numberSym(10),\r\n y: Random.numberSym(10)\r\n },\r\n }\r\n\r\n // TODO: Strange that it raise an error\r\n // @ts-ignore\r\n this._config = this.mergeConfig(userConfig, this._defaultConfig)\r\n }\r\n\r\n generate = (): Line => {\r\n // The A point exists.\r\n const d = new Vector(\r\n Random.numberSym(10),\r\n Random.numberSym(10)\r\n )\r\n\r\n while (d.isNull) {\r\n d.x = Random.numberSym(10)\r\n d.y = Random.numberSym(10)\r\n }\r\n\r\n if (this._config.slope === 1) {\r\n if (d.x.sign() !== d.y.sign()) {\r\n d.y.opposed()\r\n }\r\n } else if (this._config.slope === -1) {\r\n if (d.x.sign() !== d.y.sign()) {\r\n d.y.opposed()\r\n }\r\n }\r\n\r\n return new Line(new Point(this._config.A.x, this._config.A.y), d)\r\n }\r\n}\r\n","import {randomCore} from \"./randomCore\";\r\nimport {Random, randomGeometryPointConfig} from \"./random\";\r\nimport {Point} from \"../geometry/point\";\r\nimport {Fraction} from \"../coefficients/fraction\";\r\n\r\n/**\r\n * Create a random monom based on a based configuration\r\n */\r\nexport class rndGeometryPoint extends randomCore {\r\n declare protected _config: randomGeometryPointConfig\r\n declare protected _defaultConfig: randomGeometryPointConfig\r\n\r\n constructor(userConfig?: randomGeometryPointConfig) {\r\n super();\r\n\r\n this._defaultConfig = {\r\n axis: true,\r\n fraction: false,\r\n max: 10\r\n }\r\n\r\n this._config = this.mergeConfig(userConfig, this._defaultConfig)\r\n }\r\n\r\n generate = (): Point => {\r\n let x: Fraction, y: Fraction,\r\n zeroX = this._config.axis === true || this._config.axis === 'x',\r\n zeroY = this._config.axis === true || this._config.axis === 'y'\r\n\r\n x = this._config.fraction ?\r\n Random.fraction({max: this._config.max, zero: zeroX}) :\r\n new Fraction(Random.numberSym(this._config.max, zeroX))\r\n\r\n y = this._config.fraction ?\r\n Random.fraction({max: this._config.max, zero: zeroY}) :\r\n new Fraction(Random.numberSym(this._config.max, zeroY))\r\n\r\n if (+this._config.quadrant === 1) {\r\n x.abs()\r\n y.abs()\r\n }\r\n if (+this._config.quadrant === 2) {\r\n if (x.isPositive()) {\r\n x.opposed()\r\n }\r\n if (y.isNegative()) {\r\n y.opposed()\r\n }\r\n }\r\n if (+this._config.quadrant === 3) {\r\n if (x.isPositive()) {\r\n x.opposed()\r\n }\r\n if (y.isPositive()) {\r\n y.opposed()\r\n }\r\n }\r\n if (+this._config.quadrant === 4) {\r\n if (x.isNegative()) {\r\n x.opposed()\r\n }\r\n if (y.isPositive()) {\r\n y.opposed()\r\n }\r\n }\r\n\r\n return new Point(x, y)\r\n }\r\n}\r\n","/**\r\n * Random helpers\r\n */\r\nimport {Numeric} from \"../numeric\";\r\n\r\nexport class rndHelpers {\r\n\r\n /**\r\n * Random boolean with a percent ratio\r\n * @param percent\r\n */\r\n static randomBool(percent:number=0.5):boolean{\r\n return Math.random()<percent;\r\n }\r\n\r\n /**\r\n * Random integer between two values.\r\n * @param a (number) : From this value to the second value. If the second is ommited, this value is the max value.\r\n * @param b (number) : To this value. If this is ommited.\r\n */\r\n static randomInt(a:number, b?:number):number{\r\n if(b===undefined){return this.randomInt(0,a);}\r\n\r\n return Math.floor(Math.random() * (b - a + 1) + a);\r\n }\r\n\r\n /**\r\n * Random integer between -max and max value.\r\n * @param max (number) : determine the limits.\r\n * @param zero (bool) : determine if zero is allowed or not.\r\n */\r\n static randomIntSym(max:number, zero?:boolean):number{\r\n if(zero===false){\r\n return this.randomBool()?this.randomInt(1,max):-this.randomInt(1,max);\r\n }else{\r\n return this.randomInt(-max, max);\r\n }\r\n }\r\n\r\n static randomPrime(max: number): number {\r\n let primes = Numeric.primes()\r\n if(max!==undefined){\r\n primes = primes.filter(x=>x<max)\r\n }\r\n return this.randomItem(primes)\r\n }\r\n\r\n static randomArray(arr: any[], number?:number):any[]{\r\n if(number===undefined){number = 1}\r\n\r\n // Return a clone array\r\n if(arr.length<=0){return Object.values(arr)}\r\n\r\n // Randomize the array and return the n first elements.\r\n return rndHelpers.shuffleArray(arr).slice(0,number);\r\n }\r\n\r\n static randomItem(arr: any[]): any{\r\n if(arr.length===0){return ''}\r\n return this.randomArray(arr, 1)[0]\r\n }\r\n\r\n static shuffleArray(arr: any[]): any[] {\r\n // The Fisher-Yates algorithm\r\n let shuffleArray = Object.values(arr)\r\n for (let i = shuffleArray.length - 1; i > 0; i--) {\r\n const j = Math.floor(Math.random() * (i + 1));\r\n const temp = shuffleArray[i];\r\n shuffleArray[i] = shuffleArray[j];\r\n shuffleArray[j] = temp;\r\n }\r\n\r\n return shuffleArray;\r\n }\r\n\r\n}","import {randomCore} from \"./randomCore\";\r\nimport {randomMonomConfig} from \"./rndTypes\";\r\nimport {Random} from \"./random\";\r\nimport {Monom} from \"../algebra/monom\";\r\n\r\n/**\r\n * Create a random monom based on a based configuration\r\n */\r\nexport class rndMonom extends randomCore {\r\n declare protected _config: randomMonomConfig\r\n declare protected _defaultConfig: randomMonomConfig\r\n\r\n constructor(userConfig?: randomMonomConfig) {\r\n super();\r\n\r\n this._defaultConfig = {\r\n letters: 'x',\r\n degree: 2,\r\n fraction: true,\r\n zero: false\r\n }\r\n\r\n this._config = this.mergeConfig(userConfig, this._defaultConfig)\r\n }\r\n\r\n generate = (): Monom => {\r\n // Create a monom instance\r\n let M = new Monom()\r\n\r\n // Generate the coefficient\r\n if (typeof this._config.fraction === \"boolean\") {\r\n M.coefficient = Random.fraction({\r\n zero: this._config.zero,\r\n reduced: true,\r\n natural: !this._config.fraction\r\n })\r\n } else {\r\n M.coefficient = Random.fraction(this._config.fraction)\r\n }\r\n\r\n // Calculate the degree of the monom\r\n if (this._config.letters.length > 1) {\r\n // Initialise each items...\r\n for (let L of this._config.letters.split('')) {\r\n M.setLetter(L, 0);\r\n }\r\n for (let i = 0; i < this._config.degree; i++) {\r\n const L = Random.item(this._config.letters.split(\"\"))\r\n M.setLetter(L, M.degree(L).clone().add(1))\r\n }\r\n } else {\r\n M.setLetter(this._config.letters, this._config.degree)\r\n }\r\n\r\n return M\r\n }\r\n}\r\n","import {randomCore} from \"./randomCore\";\r\nimport {randomPolynomConfig} from \"./rndTypes\";\r\nimport {rndMonom} from \"./rndMonom\";\r\nimport {Random} from \"./random\";\r\nimport {Polynom} from \"../algebra/polynom\";\r\nimport {Monom} from \"../algebra/monom\";\r\n\r\n/**\r\n * Random polynoms\r\n */\r\nexport class rndPolynom extends randomCore {\r\n declare protected _config: randomPolynomConfig\r\n declare protected _defaultConfig: randomPolynomConfig\r\n\r\n constructor(userConfig?: randomPolynomConfig) {\r\n super();\r\n\r\n // Default config for a random polynom\r\n this._defaultConfig = {\r\n letters: 'x',\r\n degree: 2,\r\n fraction: false,\r\n zero: false,\r\n unit: false,\r\n factorable: false,\r\n allowNullMonom: true,\r\n numberOfMonoms: 0,\r\n positive: true\r\n }\r\n\r\n // Merge config with initialiser\r\n this._config = this.mergeConfig(userConfig, this._defaultConfig)\r\n }\r\n\r\n generate = (): Polynom => {\r\n if(this._config.factorable && this._config.degree>1){\r\n return this.factorable()\r\n }\r\n\r\n // Create the polynom\r\n let P = new Polynom().empty(),\r\n M: Monom\r\n\r\n for (let i = this._config.degree; i >= 0; i--) {\r\n // Create monom of corresponding degree.\r\n M = new rndMonom({\r\n letters: this._config.letters,\r\n degree: i,\r\n fraction: this._config.fraction,\r\n zero: (i === this._config.degree) ? false : this._config.allowNullMonom\r\n }).generate()\r\n\r\n // If degree is the greatest and unit is true, set the monom value to one.\r\n if (this._config.unit && this._config.degree === i) {\r\n M.coefficient.one()\r\n }\r\n\r\n // Add to the polynom\r\n P.add(M)\r\n }\r\n\r\n // Make sure the first monom is positive.\r\n if(this._config.positive && P.monomByDegree().coefficient.isNegative()){\r\n P.monomByDegree().coefficient.opposed()\r\n }\r\n\r\n // If the number of monoms is greater than the allowed value, remove some of them... except the first one !\r\n if (this._config.numberOfMonoms > 0 && this._config.numberOfMonoms < P.length) {\r\n // Get the greatest degree monom\r\n let M = P.monomByDegree().clone()\r\n P.monoms = Random.array(P.monoms.slice(1), this._config.numberOfMonoms-1)\r\n P.add(M).reorder().reduce()\r\n }\r\n return P\r\n }\r\n\r\n factorable = (): Polynom => {\r\n let P = new Polynom().one()\r\n\r\n let _factorableConfig = {...this._config}\r\n _factorableConfig.degree = 1\r\n _factorableConfig.factorable = false\r\n\r\n for(let i=0; i<this._config.degree;i++){\r\n P.multiply(Random.polynom(_factorableConfig))\r\n }\r\n\r\n return P\r\n }\r\n}","import {Fraction} from \"../coefficients/fraction\";\r\n\r\nexport type randomCoefficientConfig = {\r\n negative?: boolean,\r\n max?: number,\r\n reduced?: boolean,\r\n zero?:boolean,\r\n natural?:boolean\r\n}\r\n\r\nexport type randomMonomConfig = {\r\n letters?: string,\r\n degree?: number,\r\n fraction?: boolean|randomCoefficientConfig,\r\n zero?: boolean\r\n}\r\n\r\nexport type randomPolynomConfig = randomMonomConfig & {\r\n unit?: boolean,\r\n factorable?: boolean,\r\n allowNullMonom?: boolean,\r\n numberOfMonoms?: number,\r\n positive?: boolean\r\n}\r\n\r\nexport type randomGeometryLineConfig = {\r\n A: { x: number | Fraction, y: number | Fraction },\r\n slope?: Fraction | string | number,\r\n}\r\n\r\n\r\nexport type randomGeometryPointConfig = {\r\n quadrant?: number,\r\n axis?: string | boolean,\r\n fraction?: boolean,\r\n max?: number\r\n}","export type tokenType = {\r\n [key: string]: {\r\n precedence: number,\r\n associative: string,\r\n type: string\r\n }\r\n}\r\n\r\nexport const tokenConstant: { [Key: string]: number } = {\r\n pi: Math.PI,\r\n e: Math.exp(1)\r\n}\r\n\r\nexport enum ShutingyardType {\r\n VARIABLE = 'variable',\r\n COEFFICIENT = 'coefficient',\r\n OPERATION = 'operation',\r\n CONSTANT = 'constant',\r\n FUNCTION = 'function',\r\n MONOM = 'monom'\r\n}\r\n\r\nexport enum ShutingyardMode {\r\n EXPRESSION = 'expression',\r\n POLYNOM = 'polynom',\r\n SET = 'set',\r\n NUMERIC = 'numeric'\r\n}\r\n\r\nexport type Token = { token: string, tokenType: string }\r\n\r\nexport class Shutingyard {\r\n readonly _mode: ShutingyardMode;\r\n private _rpn: Token[] = [];\r\n private _tokenConfig: tokenType;\r\n private _tokenConstant: { [Key: string]: number }\r\n private _tokenKeys: string[]\r\n private _uniformize: boolean;\r\n\r\n constructor(mode?: ShutingyardMode) {\r\n this._mode = typeof mode === 'undefined' ? ShutingyardMode.POLYNOM : mode;\r\n this.tokenConfigInitialization()\r\n }\r\n\r\n // Getter\r\n get rpn() {\r\n // console.log(this._rpn)\r\n return this._rpn;\r\n }\r\n\r\n get rpnToken() {\r\n return this._rpn.map(x => x.token)\r\n }\r\n\r\n /**\r\n * Determin if the token is a defined operation\r\n * Defined operations: + - * / ^ sin cos tan\r\n * @param token\r\n */\r\n // isOperation(token: string): boolean {\r\n // if (token[0].match(/[+\\-*/^]/g)) {\r\n // return true;\r\n // }\r\n // //\r\n // // if (token.match(/^sin|cos|tan/g)) {\r\n // // return true;\r\n // // }\r\n //\r\n // return false;\r\n // }\r\n\r\n tokenConfigInitialization(): tokenType {\r\n if (this._mode === ShutingyardMode.SET) {\r\n this._tokenConfig = {\r\n '&': {precedence: 3, associative: 'left', type: ShutingyardType.OPERATION},\r\n '|': {precedence: 3, associative: 'left', type: ShutingyardType.OPERATION},\r\n '!': {precedence: 4, associative: 'right', type: ShutingyardType.OPERATION},\r\n '-': {precedence: 2, associative: 'left', type: ShutingyardType.OPERATION}\r\n }\r\n this._uniformize = false;\r\n } else if (this._mode === ShutingyardMode.NUMERIC) {\r\n this._tokenConfig = {\r\n '^': {precedence: 4, associative: 'right', type: ShutingyardType.OPERATION},\r\n '*': {precedence: 3, associative: 'left', type: ShutingyardType.OPERATION},\r\n '/': {precedence: 3, associative: 'left', type: ShutingyardType.OPERATION},\r\n '+': {precedence: 2, associative: 'left', type: ShutingyardType.OPERATION},\r\n '-': {precedence: 2, associative: 'left', type: ShutingyardType.OPERATION},\r\n '%': {precedence: 3, associative: 'right', type: ShutingyardType.OPERATION},\r\n 'sin': {precedence: 4, associative: 'right', type: ShutingyardType.FUNCTION},\r\n 'cos': {precedence: 4, associative: 'right', type: ShutingyardType.FUNCTION},\r\n 'tan': {precedence: 4, associative: 'right', type: ShutingyardType.FUNCTION},\r\n 'sqrt': {precedence: 4, associative: 'right', type: ShutingyardType.FUNCTION},\r\n 'nthrt': {precedence: 4, associative: 'right', type: ShutingyardType.FUNCTION},\r\n 'ln': {precedence: 4, associative: 'right', type: ShutingyardType.FUNCTION},\r\n 'log': {precedence: 4, associative: 'right', type: ShutingyardType.FUNCTION},\r\n }\r\n this._uniformize = false\r\n } else if (this._mode === ShutingyardMode.EXPRESSION) {\r\n this._tokenConfig = {\r\n '^': {precedence: 4, associative: 'right', type: ShutingyardType.OPERATION},\r\n '*': {precedence: 3, associative: 'left', type: ShutingyardType.OPERATION},\r\n '/': {precedence: 3, associative: 'left', type: ShutingyardType.OPERATION},\r\n '+': {precedence: 2, associative: 'left', type: ShutingyardType.OPERATION},\r\n '-': {precedence: 2, associative: 'left', type: ShutingyardType.OPERATION},\r\n '%': {precedence: 3, associative: 'right', type: ShutingyardType.OPERATION},\r\n 'sin': {precedence: 4, associative: 'right', type: ShutingyardType.FUNCTION},\r\n 'cos': {precedence: 4, associative: 'right', type: ShutingyardType.FUNCTION},\r\n 'tan': {precedence: 4, associative: 'right', type: ShutingyardType.FUNCTION},\r\n 'sqrt': {precedence: 4, associative: 'right', type: ShutingyardType.FUNCTION},\r\n 'nthrt': {precedence: 4, associative: 'right', type: ShutingyardType.FUNCTION},\r\n }\r\n this._uniformize = true\r\n } else {\r\n this._tokenConfig = {\r\n '^': {precedence: 4, associative: 'right', type: ShutingyardType.OPERATION},\r\n '*': {precedence: 3, associative: 'left', type: ShutingyardType.OPERATION},\r\n '/': {precedence: 3, associative: 'left', type: ShutingyardType.OPERATION},\r\n '+': {precedence: 2, associative: 'left', type: ShutingyardType.OPERATION},\r\n '-': {precedence: 2, associative: 'left', type: ShutingyardType.OPERATION},\r\n }\r\n this._uniformize = true\r\n }\r\n\r\n this._tokenKeys = Object.keys(this._tokenConfig).sort((a, b) => b.length - a.length)\r\n return this._tokenConfig\r\n }\r\n\r\n /**\r\n * Get the next token to analyse.\r\n * @param expr (string) Expression to analyse\r\n * @param start (number) CUrrent position in the expr string.\r\n */\r\n NextToken(expr: string, start: number): [string, number, string] {\r\n let token: string, tokenType: string;\r\n token = '';\r\n tokenType = '';\r\n // Case of parenthesis or comma (generic items)\r\n if (expr[start] === '(') {\r\n token = '(';\r\n tokenType = '(';\r\n }\r\n // It's a closing parenthese\r\n else if (expr[start] === ')') {\r\n token = ')';\r\n tokenType = ')';\r\n }\r\n // It's an argument separator for a function\r\n else if (expr[start] === ',') {\r\n token = ',';\r\n tokenType = 'function-argument';\r\n } else {\r\n // Extract operation and function tokens\r\n for (let key of this._tokenKeys) {\r\n if (expr.substring(start, start + key.length) === key) {\r\n token += key;\r\n tokenType = this._tokenConfig[key].type\r\n break\r\n }\r\n }\r\n\r\n // Extract constant\r\n for (let key in tokenConstant) {\r\n if (expr.substring(start, start + key.length) === key) {\r\n token += key;\r\n tokenType = ShutingyardType.CONSTANT\r\n break\r\n }\r\n }\r\n\r\n if (token === '') {\r\n // No function found ! Might be a coefficient !\r\n if (expr[start].match(/[0-9]/)) {\r\n if (this._mode === ShutingyardMode.POLYNOM && false) {\r\n token = expr.substring(start).match(/^([0-9.,/]+)/)[0]\r\n } else {\r\n token = expr.substring(start).match(/^([0-9.]+)/)[0]\r\n }\r\n tokenType = ShutingyardType.COEFFICIENT\r\n } else if (expr[start].match(/[a-zA-Z]/)) {\r\n token = expr.substring(start).match(/^([a-zA-Z])/)[0]\r\n tokenType = ShutingyardType.VARIABLE\r\n } else {\r\n console.log('Unidentified token', expr[start], expr, start)\r\n token = expr[start]\r\n tokenType = ShutingyardType.MONOM\r\n }\r\n\r\n }\r\n }\r\n\r\n return [token, start + token.length, tokenType];\r\n }\r\n\r\n normalize(expr: string): string {\r\n if(expr.length===1){return expr}\r\n\r\n // Get the list of function token.\r\n let fnToken: string[] = [],\r\n kToken: string[] = []\r\n for (let token in this._tokenConfig) {\r\n if (this._tokenConfig[token].type === ShutingyardType.FUNCTION) {\r\n fnToken.push(token)\r\n }\r\n }\r\n // sort if from the lengthy to the smallest function\r\n fnToken.sort((a, b) => b.length - a.length)\r\n\r\n for (let token in tokenConstant) {\r\n kToken.push(token)\r\n }\r\n // sort if from the lengthy to the smallest function\r\n kToken.sort((a, b) => b.length - a.length)\r\n\r\n let normalizedExpr: string = \"\",\r\n i = 0,\r\n crtToken,\r\n nextToken\r\n\r\n while (i < expr.length - 1) {\r\n // Check if we have a function token.\r\n // The function MUST have an open parentheses\r\n let tokenIdx = 0\r\n while (tokenIdx < fnToken.length) {\r\n let token = fnToken[tokenIdx]\r\n if (expr.slice(i, i + token.length + 1) === token + '(') {\r\n normalizedExpr += token + '('\r\n i += token.length + 1\r\n\r\n // Restart the scan for the function token\r\n tokenIdx = 0\r\n } else {\r\n // scan for a next function token\r\n tokenIdx++\r\n }\r\n }\r\n\r\n // Check for a constant\r\n tokenIdx = 0\r\n while (tokenIdx < kToken.length) {\r\n let token = kToken[tokenIdx]\r\n if (expr.slice(i, i + token.length) === token) {\r\n // We have found a constant.\r\n // add it, but with remove the last letter\r\n normalizedExpr += token.slice(0, -1)\r\n i += token.length-1\r\n\r\n // Exit the loop\r\n break\r\n }\r\n tokenIdx++\r\n }\r\n\r\n // The function token are solved.\r\n crtToken = expr[i]\r\n nextToken = expr[i + 1]\r\n normalizedExpr += crtToken\r\n\r\n if (crtToken.match(/[a-zA-Z]/g)) {\r\n // Current element is a letter.\r\n // if the next element is a letter, a number or an opening parentheses, add the multiplication sign.\r\n if (nextToken?.match(/[a-zA-Z\\d(]/)) {\r\n normalizedExpr += '*'\r\n }\r\n } else if (crtToken.match(/\\d/)) {\r\n // Current element is a number.\r\n // if the next element is a letter or a parentheses, add the multiplication sign.\r\n if (nextToken?.match(/[a-zA-Z(]/)) {\r\n normalizedExpr += '*'\r\n }\r\n } else if (crtToken === ')') {\r\n // Current element is a closing parentheses.\r\n // if the next element is a letter, a number or an opening parentheses, add the multiplication sign\r\n if (nextToken?.match(/[a-zA-Z\\d(]/)) {\r\n normalizedExpr += '*'\r\n }\r\n }\r\n\r\n // Go to next token\r\n i++\r\n }\r\n\r\n // add the last token\r\n return normalizedExpr + (nextToken===undefined?'':nextToken)\r\n }\r\n\r\n // /**\r\n // * Sanitize an expression by adding missing common operation (multiplication between parentheseses)\r\n // * @param expr\r\n // * @constructor\r\n // */\r\n // Uniformizer(expr: string): string {\r\n // // TODO: Delete this old version\r\n // // Prefere \"normalize\", much more robust !\r\n // // Determiner if need to be uniformized\r\n // if (!this._uniformize) {\r\n // return expr\r\n // }\r\n //\r\n // // Generate the list of function token.\r\n // let fnToken: string[] = []\r\n // for (let token in this._tokenConfig) {\r\n // if (this._tokenConfig[token].type === ShutingyardType.FUNCTION) {\r\n // fnToken.push(token)\r\n // }\r\n // }\r\n // // sort if from the lengthy to the smallest function\r\n // fnToken.sort((a, b) => b.length - a.length)\r\n // let tokenRegExp = new RegExp(`(${fnToken.join('|')})`, 'g')\r\n // let functionTokenOrder = Array.from(expr.matchAll(tokenRegExp))\r\n //\r\n //\r\n // let expr2;\r\n //\r\n // // Replace all function by @\r\n // expr2 = expr.replace(tokenRegExp, '@')\r\n // // Add * before @ (functionn)\r\n // expr2 = expr2.replace(/([\\da-zA-Z])(@)/g, \"$1*$2\");\r\n //\r\n // // Replace missing multiplication between two parenthese\r\n // expr2 = expr2.replace(/\\)\\(/g, ')*(');\r\n //\r\n // // Replace missing multiplication between number or setLetter and parenthese.\r\n //\r\n // // 3x(x-4) => 3x*(x-4)\r\n // expr2 = expr2.replace(/([\\da-zA-Z])(\\()/g, \"$1*$2\");\r\n //\r\n // // (x-4)3x => (x-4)*3x\r\n // expr2 = expr2.replace(/(\\))([\\da-zA-Z])/g, \"$1*$2\");\r\n //\r\n // // Add multiplication between number and letters.\r\n // // 3x => 3*x\r\n // expr2 = expr2.replace(/([0-9])([a-zA-Z])/g, \"$1*$2\");\r\n // expr2 = expr2.replace(/([a-zA-Z])([0-9])/g, \"$1*$2\");\r\n //\r\n // // Remove letter between function token and it's parenthese.\r\n // // for (let token of fnToken) {\r\n // // // Remove\r\n // // expr2 = expr2.replace(new RegExp(token + '\\\\*', 'g'), token);\r\n // // }\r\n // // Add multiplication between letters ?\r\n // expr2 = expr2.replace(/([a-zA-Z])([a-zA-Z])/g, \"$1*$2\");\r\n // expr2 = expr2.replace(/([a-zA-Z])([a-zA-Z])/g, \"$1*$2\");\r\n //\r\n // // Restore operation auto formatting (prevent adding the multiplication star)\r\n // let exprAsArray = expr2.split('@')\r\n //\r\n // if (exprAsArray.length > 0) {\r\n // expr2 = \"\"\r\n // for (let idx in exprAsArray) {\r\n // }\r\n // for (let token of fnToken) {\r\n // // Remove\r\n //\r\n // // expr2 = expr2.replace(new RegExp(token + '\\\\*', 'g'), token);\r\n // }\r\n // }\r\n //\r\n // return expr2;\r\n // }\r\n\r\n /**\r\n * Parse an expression using the shutting yard tree algorithms\r\n * @param expr (string) Expression to analyse\r\n * Returns a RPN list of items.\r\n * @param uniformize\r\n */\r\n parse(expr: string, uniformize?: boolean): Shutingyard {\r\n let outQueue: { token: string, tokenType: string }[] = [], // Output queue\r\n opStack: { token: string, tokenType: string }[] = [], // Operation queue\r\n token: string = '',\r\n tokenPos: number = 0,\r\n tokenType: string = '',\r\n previousOpStatckLength = 0\r\n\r\n // Normalize the input if required.\r\n if (uniformize || this._uniformize) expr = this.normalize(expr)\r\n\r\n\r\n let securityLoopLvl1 = 50,\r\n securityLoopLvl2_default = 50,\r\n securityLoopLvl2;\r\n\r\n while (tokenPos < expr.length) {\r\n securityLoopLvl1--;\r\n if (securityLoopLvl1 === 0) {\r\n console.log('SECURITY LEVEL 1 EXIT');\r\n break;\r\n }\r\n\r\n // Get the next token and the corresponding new (ending) position\r\n [token, tokenPos, tokenType] = this.NextToken(expr, tokenPos);\r\n\r\n switch (tokenType) {\r\n case 'monom':\r\n case 'coefficient':\r\n case 'variable':\r\n case 'constant':\r\n outQueue.push({\r\n token,\r\n tokenType\r\n });\r\n break;\r\n case 'operation':\r\n previousOpStatckLength = opStack.length;\r\n //If the token is an operator, o1, then:\r\n if (opStack.length > 0) {\r\n let opTop = opStack[opStack.length - 1];\r\n\r\n securityLoopLvl2 = +securityLoopLvl2_default;\r\n\r\n //while there is an operator token o2, at the top of the operator stack and\r\n while (opTop.token in this._tokenConfig && (\r\n //either o1 is left-associative and its precedence is less than or equal to that of o2,\r\n (this._tokenConfig[token].associative === 'left' && this._tokenConfig[token].precedence <= this._tokenConfig[opTop.token].precedence)\r\n ||\r\n //or o1 is right associative, and has precedence less than that of o2,\r\n (this._tokenConfig[token].associative === 'right' && this._tokenConfig[token].precedence < this._tokenConfig[opTop.token].precedence)\r\n )\r\n ) {\r\n\r\n /* Security exit ! */\r\n securityLoopLvl2--;\r\n if (securityLoopLvl2 === 0) {\r\n console.log('SECURITY LEVEL 2 OPERATION EXIT');\r\n break;\r\n }\r\n\r\n // Add the operation to the queue\r\n outQueue.push((opStack.pop()) || {token: '', tokenType: 'operation'});\r\n\r\n // Get the next operation on top of the Stack.\r\n if (opStack.length === 0) {\r\n break;\r\n }\r\n opTop = opStack[opStack.length - 1];\r\n }\r\n }\r\n //at the end of iteration push o1 onto the operator stack\r\n opStack.push({token, tokenType});\r\n break;\r\n case 'function-argument':\r\n // TODO: check if the opStack exist.\r\n securityLoopLvl2 = +securityLoopLvl2_default;\r\n while (opStack[opStack.length - 1].token !== '(' && opStack.length > 0) {\r\n securityLoopLvl2--;\r\n if (securityLoopLvl2 === 0) {\r\n console.log('SECURITY LEVEL 2 FUNCTION ARGUMENT EXIT');\r\n break;\r\n }\r\n\r\n outQueue.push((opStack.pop()) || {token, tokenType});\r\n }\r\n break;\r\n case '(':\r\n opStack.push({token, tokenType});\r\n // Add an empty value if next element is negative.\r\n if (expr[tokenPos] === '-') {\r\n outQueue.push({token: '0', tokenType: 'coefficient'});\r\n }\r\n break;\r\n case ')':\r\n securityLoopLvl2 = +securityLoopLvl2_default;\r\n //Until the token at the top of the stack is a left parenthesis, pop operators off the stack onto the output queue.\r\n while (opStack[opStack.length - 1].token !== '(' && opStack.length > 1 /*Maybe zero !? */) {\r\n securityLoopLvl2--;\r\n if (securityLoopLvl2 === 0) {\r\n console.log('SECURITY LEVEL 2 CLOSING PARENTHESE EXIT');\r\n break;\r\n }\r\n\r\n outQueue.push((opStack.pop()) || {token, tokenType});\r\n }\r\n\r\n //Pop the left parenthesis from the stack, but not onto the output queue.\r\n opStack.pop();\r\n break;\r\n case 'function':\r\n opStack.push({token, tokenType});\r\n break;\r\n default:\r\n // In theory, everything should be handled.\r\n console.log(`SHUTING YARD: ${tokenType} : ${token} `);\r\n }\r\n\r\n // Output\r\n // console.log(outQueue.concat(opStack.reverse()).join(\" \"));\r\n }\r\n\r\n // console.log(outQueue.concat(opStack.reverse()));\r\n this._rpn = outQueue.concat(opStack.reverse());\r\n\r\n return this;\r\n }\r\n\r\n\r\n}\r\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","","// startup\n// Load entry module and return exports\n// This entry module is referenced by other modules so it can't be inlined\nvar __webpack_exports__ = __webpack_require__(607);\n",""],"names":[],"sourceRoot":""}
1
+ {"version":3,"file":"pimath.js","mappings":"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,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE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","sources":["webpack://pimath/./src/index.ts","webpack://pimath/./src/maths/algebra/equation.ts","webpack://pimath/./src/maths/algebra/linearSystem.ts","webpack://pimath/./src/maths/algebra/logicalset.ts","webpack://pimath/./src/maths/algebra/monom.ts","webpack://pimath/./src/maths/algebra/polynom.ts","webpack://pimath/./src/maths/algebra/rational.ts","webpack://pimath/./src/maths/algebra/study.ts","webpack://pimath/./src/maths/algebra/study/rationalStudy.ts","webpack://pimath/./src/maths/coefficients/fraction.ts","webpack://pimath/./src/maths/coefficients/nthRoot.ts","webpack://pimath/./src/maths/geometry/circle.ts","webpack://pimath/./src/maths/geometry/line.ts","webpack://pimath/./src/maths/geometry/point.ts","webpack://pimath/./src/maths/geometry/triangle.ts","webpack://pimath/./src/maths/geometry/vector.ts","webpack://pimath/./src/maths/numeric.ts","webpack://pimath/./src/maths/numexp.ts","webpack://pimath/./src/maths/randomization/random.ts","webpack://pimath/./src/maths/randomization/randomCore.ts","webpack://pimath/./src/maths/randomization/rndFraction.ts","webpack://pimath/./src/maths/randomization/rndGeometryLine.ts","webpack://pimath/./src/maths/randomization/rndGeometryPoint.ts","webpack://pimath/./src/maths/randomization/rndHelpers.ts","webpack://pimath/./src/maths/randomization/rndMonom.ts","webpack://pimath/./src/maths/randomization/rndPolynom.ts","webpack://pimath/./src/maths/randomization/rndTypes.ts","webpack://pimath/./src/maths/shutingyard.ts","webpack://pimath/webpack/bootstrap","webpack://pimath/webpack/before-startup","webpack://pimath/webpack/startup","webpack://pimath/webpack/after-startup"],"sourcesContent":["import {Numeric} from \"./maths/numeric\";\r\nimport {NumExp} from \"./maths/numexp\";\r\nimport {Shutingyard} from \"./maths/shutingyard\";\r\nimport {Random} from \"./maths/randomization/random\";\r\nimport {Fraction} from \"./maths/coefficients/fraction\";\r\nimport {NthRoot} from \"./maths/coefficients/nthRoot\";\r\nimport {Monom} from \"./maths/algebra/monom\";\r\nimport {Polynom} from \"./maths/algebra/polynom\";\r\nimport {Equation} from \"./maths/algebra/equation\";\r\nimport {LinearSystem} from \"./maths/algebra/linearSystem\";\r\nimport {Rational} from \"./maths/algebra/rational\";\r\nimport {Logicalset} from \"./maths/algebra/logicalset\";\r\nimport {Vector} from \"./maths/geometry/vector\";\r\nimport {Line} from \"./maths/geometry/line\";\r\nimport {Triangle} from \"./maths/geometry/triangle\";\r\nimport {Circle} from \"./maths/geometry/circle\";\r\nimport {Point} from \"./maths/geometry/point\";\r\n\r\n// Expose as global\r\nexport const PiMath = {\r\n ShutingYard: Shutingyard,\r\n Numeric: Numeric,\r\n NumExp: NumExp,\r\n Fraction: Fraction,\r\n Root: NthRoot,\r\n Monom: Monom,\r\n Polynom: Polynom,\r\n Equation: Equation,\r\n LinearSystem: LinearSystem,\r\n Rational: Rational,\r\n Logicalset: Logicalset,\r\n Random: Random,\r\n Geometry: {\r\n Vector: Vector,\r\n Point: Point,\r\n Line: Line,\r\n Triangle: Triangle,\r\n Circle: Circle\r\n }\r\n};\r\n\r\n(<any>window).Pi = PiMath\r\n","import {Polynom} from \"./polynom\";\r\nimport {literalType, Monom} from \"./monom\";\r\nimport {Numeric} from \"../numeric\";\r\nimport {Fraction} from \"../coefficients/fraction\";\r\nimport {NthRoot} from \"../coefficients/nthRoot\";\r\n\r\n/**\r\n * Equation is a class to manage equations...\r\n */\r\nexport interface ISolution {\r\n tex: string,\r\n display: string,\r\n value: number,\r\n exact: unknown\r\n}\r\n\r\nexport enum PARTICULAR_SOLUTION {\r\n real=\"\\\\mathbb{R}\",\r\n varnothing=\"\\\\varnothing\"\r\n}\r\n\r\nexport class Equation {\r\n private _polynom: Polynom; // Used to solve the equation // TODO: remove the private value ?\r\n\r\n // Undetermined texSolutions.\r\n private _varnothing: string = PARTICULAR_SOLUTION.varnothing;\r\n private _real: string = PARTICULAR_SOLUTION.real;\r\n\r\n /**\r\n * Create an Equation using two polynoms.\r\n * Markdown *support* is cool\r\n * @param equations\r\n */\r\n constructor(...equations: unknown[]) {\r\n // Default equation\r\n this._left = new Polynom().zero();\r\n this._right = new Polynom().zero();\r\n this._sign = '=';\r\n\r\n if (equations.length === 1) {\r\n if (equations[0] instanceof Equation) {\r\n return equations[0].clone();\r\n } else if (typeof equations[0] === 'string') {\r\n this.parse(equations[0]);\r\n }\r\n } else if (equations.length === 2) {\r\n if (equations[0] instanceof Polynom) {\r\n this.left = equations[0].clone()\r\n } else if (typeof equations[0] === 'string') {\r\n this.left = new Polynom(equations[0])\r\n }\r\n\r\n if (equations[1] instanceof Polynom) {\r\n this.right = equations[1].clone()\r\n } else if (typeof equations[1] === 'string') {\r\n this.right = new Polynom(equations[1])\r\n }\r\n } else {\r\n // Return default empty equation\r\n return this;\r\n }\r\n\r\n return this;\r\n }\r\n\r\n private _left: Polynom; // Left part of the equation\r\n\r\n get left(): Polynom {\r\n return this._left;\r\n }\r\n\r\n set left(value: Polynom) {\r\n this._left = value;\r\n }\r\n\r\n private _right: Polynom; // Right part of the equation\r\n\r\n get right(): Polynom {\r\n return this._right;\r\n }\r\n\r\n // ------------------------------------------\r\n // Getter and setter\r\n\r\n set right(value: Polynom) {\r\n this._right = value;\r\n }\r\n\r\n private _sign: string; // Signe of the equation, by default =\r\n\r\n get sign(): string {\r\n return this._sign;\r\n }\r\n\r\n set sign(value: string) {\r\n // Set the sign value as formatted.\r\n this._sign = this._formatSign(value);\r\n }\r\n\r\n private _solutions: ISolution[]\r\n\r\n // ------------------------------------------\r\n get solutions(): ISolution[] {\r\n return this._solutions\r\n }\r\n\r\n get isEquation() {\r\n return true;\r\n }\r\n\r\n get solution(): string {\r\n if (this._solutions.length === 1\r\n &&\r\n (\r\n this._solutions[0].tex === this._real\r\n || this._solutions[0].tex === this._varnothing\r\n || this._solutions[0].tex.includes('\\\\left')\r\n )\r\n ) {\r\n return `S = ${this._solutions[0]}`;\r\n }\r\n return `S = \\\\left{ ${this._solutions.map(x => x.tex).join(';')} \\\\right}`;\r\n }\r\n\r\n get isReal(): boolean {\r\n if (this._solutions === undefined) {\r\n this.solve();\r\n }\r\n return this._solutions[0].tex === this._real;\r\n }\r\n\r\n get isVarnothing(): boolean {\r\n if (this._solutions === undefined) {\r\n this.solve();\r\n }\r\n return this._solutions[0].tex === this._varnothing;\r\n }\r\n\r\n get signAsTex(): string {\r\n if (this._sign === '>=' || this._sign === '=>' || this._sign === 'geq') {\r\n return '\\\\geq';\r\n }\r\n if (this._sign === '<=' || this._sign === '=<' || this._sign === 'leq') {\r\n return '\\\\leq';\r\n }\r\n return this._sign;\r\n }\r\n\r\n get tex(): string {\r\n return `${this._left.tex}${this.signAsTex}${this._right.tex}`;\r\n }\r\n\r\n get display(): string {\r\n return `${this._left.display}${this.signAsTex}${this._right.display}`;\r\n }\r\n\r\n get raw(): string {\r\n return `${this._left.raw}${this.signAsTex}${this._right.raw}`;\r\n }\r\n\r\n get variables(): string[] {\r\n return [...new Set(this._right.variables.concat(this._left.variables))];\r\n }\r\n\r\n get numberOfVars(): number {\r\n return this.variables.length;\r\n }\r\n\r\n hasVariable = (letter: string): boolean => {\r\n return this.variables.includes(letter)\r\n }\r\n\r\n // ------------------------------------------\r\n // Creation / parsing functions\r\n\r\n // -----------------------------------------------\r\n private _randomizeDefaults: { [key: string]: number | string | boolean } = {\r\n degree: 2\r\n };\r\n\r\n get randomizeDefaults(): { [key: string]: number | string | boolean } {\r\n return this._randomizeDefaults;\r\n }\r\n\r\n set randomizeDefaults(value) {\r\n this._randomizeDefaults = value;\r\n }\r\n\r\n // ------------------------------------------\r\n parse = (equationString: string): Equation => {\r\n let pStr: string[], strSign: string | false;\r\n // Find the string separator\r\n strSign = this._findSign(equationString);\r\n\r\n if (strSign === false) {\r\n console.error('The equation is not valid (no sign found)');\r\n return;\r\n }\r\n\r\n // The StrSign is found\r\n pStr = equationString.split(strSign);\r\n\r\n return this.create(new Polynom(pStr[0]), new Polynom(pStr[1]), this._formatSign(strSign));\r\n };\r\n\r\n create = (left: Polynom, right: Polynom, sign?: string): Equation => {\r\n this._left = left;\r\n this._right = right;\r\n this._sign = this._formatSign(sign);\r\n return this;\r\n };\r\n\r\n clone = (): Equation => {\r\n return new Equation().create(this._left.clone(), this._right.clone(), this._sign + '');\r\n };\r\n\r\n // -----------------------------------------------\r\n // Equations generators and randomizers\r\n\r\n randomize = (opts?: {}, sign?: string): Equation => {\r\n // TODO: Generate equations randomly, using config.\r\n return new Equation().create(new Polynom(), new Polynom(), sign);\r\n };\r\n\r\n // -----------------------------------------------\r\n /**\r\n * Reorder will move all monoms containing a letter on the left, all the other on the right.\r\n */\r\n moveLeft = (): Equation => {\r\n this._left = this._left.clone().subtract(this._right)\r\n this._right.zero()\r\n return this;\r\n }\r\n\r\n reorder = (allLeft?: boolean): Equation => {\r\n // Move all monoms of degree greater than 0 to the left.\r\n // and all zero degree monoms to the right.\r\n this._left.subtract(this._right);\r\n this._right.zero();\r\n this._left.reorder()\r\n\r\n // we eant all left (so equal zero) : it's done !\r\n if (allLeft) return this\r\n\r\n // Fetch all zero degree monoms.\r\n this._left.monoms\r\n .filter(m=>m.degree().isZero())\r\n .forEach(m=> {\r\n const move = m.clone()\r\n this._left.subtract(move)\r\n this._right.subtract(move)\r\n })\r\n\r\n\r\n // Reorder the left and right polynoms\r\n this._left.reorder();\r\n this._right.reorder();\r\n return this;\r\n };\r\n\r\n /**\r\n * Multiply by the lcm denominator and divide by the gcm numerators.\r\n */\r\n simplify = (): Equation => {\r\n this.multiply(Numeric.lcm(...this._left.getDenominators(), ...this._right.getDenominators()));\r\n this.divide(Numeric.gcd(...this._left.getNumerators(), ...this._right.getNumerators()));\r\n return this;\r\n }\r\n\r\n\r\n // -----------------------------------------------\r\n // Equations operations\r\n\r\n /**\r\n * Reorder the polynom to have only one letter on the left, the rest on the right.\r\n * @param letter\r\n */\r\n isolate = (letter?: string): Equation | false => {\r\n // Determine if we can isolate the variables.\r\n\r\n // Both part of the equations must be of the first degree.\r\n //TODO: handle equations of degree two or more ?\r\n if (!this.degree(letter).isOne()) {\r\n return false;\r\n }\r\n\r\n // Modify the equation to isolate the asked variable.\r\n // TODO: must handle equations like 3xy+5y=4 => y = 4/(3x-5)\r\n if (this.isMultiVariable()) {\r\n return false;\r\n }\r\n\r\n // Isolate the letter.\r\n let mMove: Monom, cMove: Fraction;\r\n // Start by moving everything to the left.\r\n this._left.subtract(this._right);\r\n this._right.zero();\r\n let values = [...this._left.monoms]\r\n for (let m of values) {\r\n if (!m.hasLetter(letter)) {\r\n mMove = m.clone();\r\n this._left.subtract(mMove);\r\n this._right.subtract(mMove);\r\n }\r\n }\r\n\r\n // In theory, we should have only one item on the left.\r\n if (this._left.length !== 1) {\r\n return false;\r\n }\r\n cMove = this._left.monoms[0].coefficient.clone();\r\n this._left.divide(cMove);\r\n this._right.divide(cMove);\r\n return this;\r\n };\r\n\r\n replaceBy = (letter: string, P: Polynom): Equation => {\r\n this._left.replaceBy(letter, P)\r\n this._right.replaceBy(letter, P)\r\n return this;\r\n }\r\n\r\n /**\r\n * Multiple an equation by a fraction value.\r\n * @param value\r\n */\r\n multiply = (value: unknown): Equation => {\r\n\r\n // Make sure we have a fraction.\r\n let F: Fraction = new Fraction(value);\r\n\r\n // Multiply each part of the equation by the fraction\r\n this._left.multiply(F);\r\n this._right.multiply(F);\r\n\r\n // The sign of the inequation must be changed.\r\n if (this._sign !== '=' && F.sign() === -1) {\r\n this._reverseSign();\r\n }\r\n\r\n return this;\r\n };\r\n\r\n /**\r\n * divide an equation by a given value (transformed as a fraction)\r\n *\r\n * ```\r\n * 8x+10=6x \\vert 2\r\n * 4x+5=3x\r\n * ```\r\n *\r\n * |>Alternatively with $3x-4$ maybe it's working ?\r\n * $$\\frac{3x}{5}$$\r\n *\r\n * @param value\r\n * @returns {Equation}\r\n */\r\n divide = (value: unknown): Equation => {\r\n // Make sure we have a fraction.\r\n let F: Fraction = new Fraction(value);\r\n\r\n if (F.isZero()) {\r\n return this;\r\n } else {\r\n return this.multiply(F.invert());\r\n }\r\n }\r\n\r\n /**\r\n * Get the degree of the equation\r\n * @param letter\r\n */\r\n degree = (letter?: string): Fraction => {\r\n return Fraction.max(this._left.degree(letter), this._right.degree(letter));\r\n };\r\n\r\n /**\r\n * Determine if the equation contains more than one letter/variable.\r\n */\r\n isMultiVariable = (): boolean => {\r\n return this._left.isMultiVariable || this._right.isMultiVariable;\r\n };\r\n\r\n letters = (): string[] => {\r\n // @ts-ignore\r\n return [...new Set([...this._left.letters(), ...this._right.letters()])];\r\n }\r\n\r\n // -----------------------------------------------\r\n // Equations helpers\r\n // -----------------------------------------------\r\n\r\n // -----------------------------------------------\r\n solve = (): Equation => {\r\n // Initialise the variables:\r\n this._solutions = [];\r\n\r\n // TODO: consolidate solving equations (inequations vs equations)\r\n // TODO: work with not natural degrees ?\r\n this._polynom = this._left.clone().subtract(this._right);\r\n\r\n switch (this._polynom.degree().value) {\r\n case 0:\r\n case 1:\r\n this._solveDegree1();\r\n break;\r\n case 2:\r\n this._solveDegree2();\r\n break;\r\n default:\r\n this._solveDegree3plus();\r\n }\r\n\r\n // cleanup the solutions.\r\n this._solutions = Equation.makeSolutionsUnique(this._solutions)\r\n return this;\r\n };\r\n\r\n static makeSolutionsUnique(solutions: ISolution[], sorted?: boolean):ISolution[] {\r\n let solutionAsTex:string[] = [],\r\n uniqueSolutions = solutions.filter(sol=>{\r\n if(!solutionAsTex.includes(sol.tex)){\r\n solutionAsTex.push(sol.tex)\r\n return true\r\n }else{\r\n return false\r\n }\r\n })\r\n\r\n if(sorted===true){\r\n uniqueSolutions.sort((a, b)=>a.value-b.value)\r\n }\r\n return uniqueSolutions\r\n }\r\n\r\n test = (values: literalType): Boolean => {\r\n return this.left.evaluate(values).isEqual(this.right.evaluate(values))\r\n }\r\n\r\n isSameAs = (equ: Equation): Boolean => {\r\n let p1 = equ.clone().moveLeft().left,\r\n p2 = this.clone().moveLeft().left\r\n\r\n // They are the same.\r\n return p1.isEqual(p2) || p1.isOpposedAt(p2)\r\n }\r\n isLinearTo = (equ: Equation): Boolean => {\r\n // Move all left.\r\n let p1 = equ.clone().moveLeft().simplify().left,\r\n p2 = this.clone().moveLeft().simplify().left\r\n\r\n // They are the same.\r\n return p1.isEqual(p2) || p1.isOpposedAt(p2)\r\n }\r\n\r\n private _findSign = (equationString: string): string | false => {\r\n let strSign: string = '';\r\n\r\n if (equationString.includes('geq')) {\r\n return (equationString.includes('\\\\geq')) ? '\\\\geq' : 'geq';\r\n } else if (equationString.includes('leq')) {\r\n return (equationString.includes('\\\\leq')) ? '\\\\leq' : 'leq';\r\n } else if (equationString.includes('>=')) {\r\n return '>=';\r\n } else if (equationString.includes('=>')) {\r\n return '=>';\r\n } else if (equationString.includes('>')) {\r\n return '>';\r\n } else if (equationString.includes('<=')) {\r\n return '<=';\r\n } else if (equationString.includes('=<')) {\r\n return '=<';\r\n } else if (equationString.includes('<')) {\r\n return '<';\r\n } else if (equationString.includes('=')) {\r\n return '='\r\n }\r\n if (strSign === '') {\r\n console.log('Equation: parse string : sign not found');\r\n return false;\r\n }\r\n };\r\n\r\n // -----------------------------------------------\r\n // Equations solving algorithms\r\n\r\n private _formatSign = (signStr: string): string => {\r\n if (signStr === undefined) {\r\n return '=';\r\n }\r\n\r\n if (signStr.includes('geq')) {\r\n return '>=';\r\n } else if (signStr.includes('>=')) {\r\n return '>=';\r\n } else if (signStr.includes('=>')) {\r\n return '>=';\r\n } else if (signStr.includes('>')) {\r\n return '>';\r\n } else if (signStr.includes('leq')) {\r\n return '<=';\r\n } else if (signStr.includes('<=')) {\r\n return '<=';\r\n } else if (signStr.includes('=<')) {\r\n return '<=';\r\n } else if (signStr.includes('<')) {\r\n return '<';\r\n } else {\r\n return '='\r\n }\r\n };\r\n\r\n private _reverseSign = (): Equation => {\r\n if (this._sign === '=') {\r\n return this;\r\n }\r\n\r\n if (this._sign.includes('<')) {\r\n this._sign.replace('<', '>');\r\n return this;\r\n }\r\n if (this._sign.includes('>')) {\r\n this._sign.replace('>', '<');\r\n return this;\r\n }\r\n\r\n return this;\r\n };\r\n\r\n private isGreater = (): boolean => {\r\n if (this._sign.indexOf('>') !== -1) {\r\n return true;\r\n }\r\n return this._sign.indexOf('geq') !== -1;\r\n\r\n };\r\n\r\n private isStrictEqual = (): boolean => {\r\n return this._sign === '=';\r\n };\r\n\r\n private isAlsoEqual = (): boolean => {\r\n if (this._sign.indexOf('=') !== -1) {\r\n return true;\r\n }\r\n if (this._sign.indexOf('geq') !== -1) {\r\n return true;\r\n }\r\n if (this._sign.indexOf('leq') !== -1) {\r\n return true;\r\n }\r\n };\r\n\r\n private _solveDegree1 = (letter?: string): ISolution[] => {\r\n const m1 = this._polynom.monomByDegree(1, letter).coefficient,\r\n m0 = this._polynom.monomByDegree(0, letter).coefficient,\r\n v = m0.clone().opposed().divide(m1);\r\n let s: string, d: string;\r\n\r\n if (this.isStrictEqual()) {\r\n if (m1.value === 0) {\r\n // In this case, the coefficient of the x variable is zero.\r\n if (m0.value === 0) {\r\n this._solutions = [{\r\n tex: this._real,\r\n display: \"RR\",\r\n value: NaN,\r\n exact: false\r\n }];\r\n } else {\r\n this._solutions = [{\r\n tex: this._varnothing,\r\n display: \"O/\",\r\n value: NaN,\r\n exact: false\r\n }];\r\n }\r\n } else {\r\n this._solutions = [{\r\n tex: v.tex,\r\n display: v.display,\r\n value: v.value,\r\n exact: v\r\n }]\r\n }\r\n }\r\n else {\r\n if (m1.value === 0) {\r\n // In this case, the coefficient of the x variable is zero.\r\n if (m0.value === 0 && this.isAlsoEqual()) {\r\n s = '\\\\mathbb{R}';\r\n d = \"RR\"\r\n } else {\r\n if (m0.value > 0) {\r\n s = this.isGreater() ? this._real : this._varnothing;\r\n s = this.isGreater() ? \"RR\" : \"O/\";\r\n } else {\r\n s = !this.isGreater() ? this._real : this._varnothing;\r\n s = !this.isGreater() ? \"RR\" : \"O/\";\r\n }\r\n }\r\n } else {\r\n // Must handle the case if the m1 monom is negative.\r\n if ((this.isGreater() && m1.sign() === 1) || (!this.isGreater() && m1.sign() === -1)) {\r\n s = `\\\\left${this.isAlsoEqual() ? '[' : ']'}${v.tex};+\\\\infty\\\\right[`;\r\n d = `${this.isAlsoEqual() ? '[' : ']'}${v.tex};+oo[`;\r\n } else {\r\n s = `\\\\left]-\\\\infty;${v.tex} \\\\right${this.isAlsoEqual() ? ']' : '['}`;\r\n d = `]-oo;${v.tex}${this.isAlsoEqual() ? ']' : '['}`;\r\n }\r\n }\r\n this._solutions = [{\r\n tex: s,\r\n display: d,\r\n value: NaN,\r\n exact: false\r\n }];\r\n }\r\n\r\n return this._solutions;\r\n };\r\n\r\n private _solveDegree2 = (letter?: string): ISolution[] => {\r\n let aF = this._polynom.monomByDegree(2, letter).coefficient,\r\n bF = this._polynom.monomByDegree(1, letter).coefficient,\r\n cF = this._polynom.monomByDegree(0, letter).coefficient,\r\n delta: number, nthDelta: NthRoot,\r\n lcm = Numeric.lcm(aF.denominator, bF.denominator, cF.denominator),\r\n a = aF.multiply(lcm).value,\r\n b = bF.multiply(lcm).value,\r\n c = cF.multiply(lcm).value,\r\n realX1: number, realX2: number,\r\n sX1: string, sX2: string;\r\n\r\n delta = b * b - 4 * a * c;\r\n\r\n if (delta > 0) {\r\n realX1 = (-b - Math.sqrt(delta)) / (2 * a);\r\n realX2 = (-b + Math.sqrt(delta)) / (2 * a);\r\n\r\n if (delta > 1.0e5) {\r\n // The delta is too big to be parsed !\r\n let v1 = ((-b - Math.sqrt(delta)) / (2 * a)).toFixed(5),\r\n v2 = ((-b + Math.sqrt(delta)) / (2 * a)).toFixed(5)\r\n\r\n this._solutions = [\r\n {\r\n tex: v1,\r\n display: v1,\r\n value: realX1,\r\n exact: false\r\n },\r\n {\r\n tex: v2,\r\n display: v2,\r\n value: realX2,\r\n exact: false\r\n }\r\n ]\r\n } else {\r\n nthDelta = new NthRoot(delta).reduce();\r\n if (nthDelta.hasRadical()) {\r\n // -b +- coeff\\sqrt{radical}\r\n // -------------------------\r\n // 2a\r\n let gcd = Numeric.gcd(b, 2 * a, nthDelta.coefficient),\r\n am = a/gcd, bm = b/gcd\r\n nthDelta.coefficient = nthDelta.coefficient / gcd;\r\n\r\n if (a < 0) {\r\n am = -am\r\n bm = -bm\r\n }\r\n\r\n let tex1 = \"\", tex2 = \"\", display1 = \"\", display2 = \"\"\r\n\r\n tex1 = `${bm !== 0 ? ((-bm) + ' - ') : ''}${nthDelta.tex}`\r\n tex2 = `${bm !== 0 ? ((-bm) + ' + ') : ''}${nthDelta.tex}`\r\n display1 = `${bm !== 0 ? ((-bm) + ' - ') : ''}${nthDelta.display}`\r\n display2 = `${bm !== 0 ? ((-bm) + ' + ') : ''}${nthDelta.display}`\r\n\r\n if (am !== 1) {\r\n tex1 = `\\\\frac{ ${tex1} }{ ${2 * am} }`\r\n tex2 = `\\\\frac{ ${tex2} }{ ${2 * am} }`\r\n }\r\n\r\n this._solutions = [\r\n {\r\n tex: tex1,\r\n display: tex1,\r\n value: realX1,\r\n exact: false\r\n },\r\n {\r\n tex: tex2,\r\n display: tex2,\r\n value: realX2,\r\n exact: false\r\n },\r\n ]\r\n\r\n\r\n // if (b !== 0) {\r\n // if (2 * a / gcd === 1) {\r\n // this._solutions = [\r\n // {\r\n // tex: `${-b / gcd} - ${nthDelta.tex}`,\r\n // value: realX1,\r\n // exact: false // TODO: implement exact value with nthroot\r\n // },\r\n // {\r\n // tex: `${-b / gcd} + ${nthDelta.tex}`,\r\n // value: realX2,\r\n // exact: false\r\n // },\r\n //\r\n // ]\r\n // } else {\r\n // this._solutions = [\r\n // {\r\n // tex: `\\\\frac{${-b / gcd} - ${nthDelta.tex} }{ ${2 * a / gcd} }`,\r\n // value: realX1,\r\n // exact: false\r\n // },\r\n // {\r\n // tex: `\\\\frac{${-b / gcd} + ${nthDelta.tex} }{ ${2 * a / gcd} }`,\r\n // value: realX2,\r\n // exact: false\r\n // },\r\n // ]\r\n // }\r\n // } else {\r\n // if (2 * a / gcd === 1) {\r\n // this._solutions = [\r\n // {\r\n // tex: `- ${nthDelta.tex}`,\r\n // value: realX1,\r\n // exact: false\r\n // },\r\n // {\r\n // tex: `${nthDelta.tex}`,\r\n // value: realX2,\r\n // exact: false\r\n // },\r\n // ]\r\n // } else {\r\n // this._solutions = [\r\n // {\r\n // tex: `\\\\frac{- ${nthDelta.tex} }{ ${2 * a / gcd} }`,\r\n // value: realX1,\r\n // exact: false\r\n // },\r\n // {\r\n // tex: `\\\\frac{${nthDelta.tex} }{ ${2 * a / gcd} }`,\r\n // value: realX2,\r\n // exact: false\r\n // },\r\n // ]\r\n // }\r\n // }\r\n } else {\r\n // -b +- d / 2a\r\n const S1 = new Fraction(-b - nthDelta.coefficient, 2 * a).reduce(),\r\n S2 = new Fraction(-b + nthDelta.coefficient, 2 * a).reduce()\r\n this._solutions = [\r\n {\r\n tex: S1.frac,\r\n display: S1.display,\r\n value: realX1,\r\n exact: S1\r\n },\r\n {\r\n tex: S2.frac,\r\n display: S2.display,\r\n value: realX2,\r\n exact: S2\r\n }\r\n ]\r\n }\r\n }\r\n\r\n } else if (delta === 0) {\r\n const sol = new Fraction(-b, 2 * a).reduce()\r\n this._solutions = [{\r\n tex: sol.frac,\r\n display: sol.display,\r\n value: sol.value,\r\n exact: sol\r\n }];\r\n } else {\r\n this._solutions = [{\r\n tex: this._varnothing,\r\n display: \"O/\",\r\n value: NaN,\r\n exact: false\r\n }];\r\n }\r\n\r\n // Handle now the inequations.\r\n if (!this.isStrictEqual()) {\r\n if (this._solutions.length === 2) {\r\n sX1 = (realX1 < realX2) ? this._solutions[0].tex : this._solutions[1].tex;\r\n sX2 = (realX1 < realX2) ? this._solutions[1].tex : this._solutions[0].tex;\r\n\r\n if ((this.isGreater() && aF.sign() === 1) || (!this.isGreater() && aF.sign() === -1)) {\r\n this._solutions = [{\r\n tex: `\\\\left]-\\\\infty ; ${sX1}\\\\right${this.isAlsoEqual() ? ']' : '['} \\\\cup \\\\left${this.isAlsoEqual() ? '[' : ']'}${sX2};+\\\\infty\\\\right[`,\r\n display: `]-oo;${sX1}${this.isAlsoEqual() ? ']' : '['}uu${this.isAlsoEqual() ? '[' : ']'}${sX2};+oo[`,\r\n value: NaN,\r\n exact: false\r\n }\r\n ];\r\n } else {\r\n this._solutions = [{\r\n tex: `\\\\left${this.isAlsoEqual() ? '[' : ']'}${sX1} ; ${sX2}\\\\right${this.isAlsoEqual() ? ']' : '['}`,\r\n display: `${this.isAlsoEqual() ? '[' : ']'}${sX1};${sX2}${this.isAlsoEqual() ? ']' : '['}`,\r\n value: NaN,\r\n exact: false\r\n }]\r\n }\r\n } else if (this._solutions.length === 1 && this._solutions[0].tex !== this._varnothing) {\r\n if (!this.isAlsoEqual()) {\r\n if ((this.isGreater() && aF.sign() === 1) || (!this.isGreater() && aF.sign() === -1)) {\r\n this._solutions = [{\r\n tex: `\\\\left]-\\\\infty ; ${this._solutions[0].tex}\\\\right[ \\\\cup \\\\left]${this._solutions[0].tex};+\\\\infty\\\\right[`,\r\n display: `]-oo;${this._solutions[0].tex}[uu]${this._solutions[0].tex};+oo[`,\r\n value: NaN,\r\n exact: false\r\n }\r\n ];\r\n } else {\r\n this._solutions = [{\r\n tex: this._varnothing,\r\n display: \"O/\",\r\n value: NaN,\r\n exact: false\r\n }];\r\n }\r\n } else {\r\n if ((this.isGreater() && aF.sign() === 1) || (!this.isGreater() && aF.sign() === -1)) {\r\n this._solutions = [{\r\n tex: this._real,\r\n display: \"RR\",\r\n value: NaN,\r\n exact: false\r\n }];\r\n } else {\r\n // this._texSolutions = [ this._texSolutions[0] ];\r\n }\r\n }\r\n } else {\r\n if (this.isGreater()) {\r\n this._solutions = [{\r\n tex: aF.sign() === 1 ? this._real : this._varnothing,\r\n display: aF.sign() === 1 ? \"RR\" : \"O/\",\r\n value: NaN,\r\n exact: false\r\n }];\r\n } else {\r\n this._solutions = [{\r\n tex: aF.sign() === -1 ? this._real : this._varnothing,\r\n display: aF.sign() === -1 ? \"RR\" : \"O/\",\r\n value: NaN,\r\n exact: false\r\n }];\r\n }\r\n }\r\n }\r\n return this._solutions;\r\n };\r\n\r\n private _solveDegree3plus = (letter?: string): ISolution[] => {\r\n // Push everything to the left\r\n // factorize\r\n // solve each factors.\r\n let equ = this.clone().moveLeft()\r\n equ.left.factorize()\r\n\r\n this._solutions = []\r\n\r\n equ.left.factors.forEach(factor=>{\r\n if(factor.degree(letter).leq(2)) {\r\n let factorAsEquation = new Equation(factor, 0)\r\n factorAsEquation.solve()\r\n factorAsEquation.solutions.forEach(solution => {\r\n this._solutions.push(solution)\r\n })\r\n }else{\r\n console.log(factor.tex, ': cannot actually get the solution of this equation')\r\n }\r\n })\r\n\r\n // TODO: check equation resolution for more than degree 2\r\n // this._solutions = [{tex: 'solve x - not yet handled', value: NaN, exact: false}]; // ESLint remove system :(\r\n return this._solutions;\r\n };\r\n}","import {Equation, ISolution} from \"./equation\";\r\nimport {Monom} from \"./monom\";\r\nimport {Fraction} from \"../coefficients/fraction\";\r\nimport {Polynom} from \"./polynom\";\r\nimport {Numeric} from \"../numeric\";\r\n\r\n// TODO: Must check and rework\r\nexport class LinearSystem {\r\n // Stores the original equations\r\n private _equations: Equation[];\r\n // Determine the letters in the linear system, usually ['x', 'y']\r\n private _letters: string[];\r\n // Resolution steps contains each steps\r\n // letter : target letter\r\n // steps: {system: current LinearSystem, operations: [*3,/5] or [[*3,*2], [,*5], [*2,]]}\r\n private _resolutionSteps: {\r\n [key: string]: {\r\n equations: Equation[],\r\n operations: (string[])[]\r\n }[]\r\n };\r\n // Get the solution of the equation\r\n private _solutions: { [letter: string]: ISolution };\r\n\r\n constructor(...equationStrings: (string | Equation)[]) {\r\n // TODO: allow construction to accept an array of values (like a matrix) to build the equations\r\n this._equations = [];\r\n this._letters = 'xyz'.split('');\r\n\r\n if (equationStrings !== undefined && equationStrings.length > 0) {\r\n this.parse(...equationStrings);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n // ------------------------------------------\r\n // Getter and setter\r\n // ------------------------------------------\r\n get equations(): Equation[] {\r\n return this._equations;\r\n }\r\n\r\n set equations(value) {\r\n this._equations = value;\r\n }\r\n\r\n get letters(): string {\r\n return this._letters.join('')\r\n }\r\n\r\n set letters(value: string) {\r\n this._letters = value.split('');\r\n }\r\n\r\n get isSolvable(): boolean {\r\n let V = this.variables;\r\n\r\n // TODO: in some case, it is possible to resolve systems if there isn't the isSame number of vars and equations\r\n if (V.length !== this._equations.length) {\r\n return false;\r\n }\r\n\r\n //TODO: Must check if two equations isn't a linear combination of the others ?\r\n\r\n return true;\r\n }\r\n\r\n get variables(): string[] {\r\n return this._letters\r\n }\r\n\r\n get tex(): string {\r\n // Build the array of values.\r\n // Reorder\r\n // This clone the system :!!!\r\n //TODO: Avoid cloning this linear system\r\n let LS = this.clone().reorder(),\r\n letters = LS.variables\r\n\r\n return this.buildTex(LS.equations)\r\n }\r\n\r\n get solution(): string {\r\n let tex: string[] = [];\r\n\r\n if (this._solutions === undefined) {\r\n this.solve();\r\n }\r\n\r\n for (let letter in this._solutions) {\r\n if (this._solutions[letter].display === \"RR\") {\r\n return `\\\\left\\\\{ \\\\left(${this._letters.join(';')}\\\\right) \\\\big\\\\vert ${this.equations[0].tex} \\\\right\\\\}`;\r\n }\r\n if (this._solutions[letter].display === \"O/\") {\r\n return `\\\\varnothing`\r\n }\r\n\r\n tex.push(this._solutions[letter].tex);\r\n }\r\n return `\\\\left(${tex.join(';')}\\\\right)`;\r\n }\r\n\r\n get solutionAsDisplay(): string {\r\n let display: string[] = [];\r\n\r\n if (this._solutions === undefined) {\r\n this.solve();\r\n }\r\n\r\n for (let letter in this._solutions) {\r\n if (this._solutions[letter].display === \"RR\") {\r\n return `{(${this._letters.join(';')}) | ${this.equations[0].display} }`;\r\n }\r\n if (this._solutions[letter].display === \"O/\") {\r\n return \"O/\"\r\n }\r\n\r\n display.push(this._solutions[letter].display);\r\n }\r\n return `(${display.join(';')})`;\r\n }\r\n\r\n buildTex = (equations: Equation[], operators?: (string[])[]): string => {\r\n let equStr: string[],\r\n equArray: string[] = [],\r\n m: Monom,\r\n letters: string[] = []\r\n\r\n // Get the letters from the linear system\r\n for (let equ of equations) {\r\n letters = letters.concat(equ.letters())\r\n }\r\n letters = [...new Set(letters)]\r\n letters.sort()\r\n\r\n for (let i = 0; i < equations.length; i++) {\r\n let equ = equations[i]\r\n\r\n equStr = [];\r\n for (let L of letters) {\r\n m = equ.left.monomByLetter(L);\r\n\r\n if (equStr.length === 0) {\r\n equStr.push(m.isZero() ? '' : m.tex);\r\n } else {\r\n equStr.push(m.isZero() ? '' : ((m.coefficient.sign() === 1) ? '+' : '') + m.tex);\r\n }\r\n }\r\n\r\n // Add the equal sign\r\n equStr.push('=');\r\n\r\n // Add the right hand part of the equation (should be only a number, because it has been reordered)\r\n equStr.push(equ.right.tex);\r\n\r\n // Add the operations if existing\r\n if (operators !== undefined && operators[i] !== undefined) {\r\n // add extra space at the end of the equation\r\n equStr[equStr.length - 1] = equStr[equStr.length - 1] + ' \\\\phantom{\\\\quad}'\r\n for (let o of operators[i]) {\r\n equStr.push(`\\\\ \\\\cdot\\\\ ${o.startsWith('-') ? \"\\\\left(\" + o + \"\\\\right)\" : o}`)\r\n }\r\n }\r\n\r\n // Add to the list.\r\n equArray.push(equStr.join('&'));\r\n }\r\n\r\n let operatorsColumns = 0\r\n if (operators !== undefined && operators.length > 0) {\r\n operatorsColumns = operators[0].length\r\n }\r\n return `\\\\left\\\\{\\\\begin{array}{${\"r\".repeat(letters.length)}cl ${\"|l\".repeat(operatorsColumns)}}${equArray.join('\\\\\\\\\\ ')}\\\\end{array}\\\\right.`;\r\n }\r\n\r\n stepTex = (letter: string): string => {\r\n const steps = this._resolutionSteps[letter]\r\n\r\n if (steps === undefined) {\r\n return ''\r\n }\r\n\r\n // steps = { equations[], operations: [[],[]]\r\n let tex: string[] = []\r\n for (let i = 0; i < steps.length; i++) {\r\n tex.push(this.buildTex(steps[i].equations, steps[i].operations))\r\n }\r\n\r\n return `\\\\begin{aligned}&${tex.join('\\\\\\\\&')}\\\\end{aligned}`\r\n\r\n }\r\n\r\n\r\n get resolutionSteps(): { [p: string]: { equations: Equation[]; operations: string[][] }[] } {\r\n return this._resolutionSteps;\r\n }\r\n\r\n// ------------------------------------------\r\n // Creation / parsing functions\r\n\r\n // ------------------------------------------\r\n parse = (...equations: (string | Equation)[]): LinearSystem => {\r\n // make the original equations\r\n this._equations = equations.map(value => new Equation(value));\r\n // get the letters.\r\n this._findLetters();\r\n return this;\r\n };\r\n\r\n clone = (): LinearSystem => {\r\n return new LinearSystem().parse(...this._equations.map(equ => equ.clone()));\r\n };\r\n\r\n // ------------------------------------------\r\n reorder = (): LinearSystem => {\r\n for (let E of this._equations) {\r\n E.reorder();\r\n }\r\n return this;\r\n };\r\n\r\n\r\n // -----------------------------------------------\r\n // Equations solving algorithms\r\n\r\n solve = (withResolution?: boolean): LinearSystem => {\r\n // Solve it by linear\r\n this._solutions = {};\r\n this._resolutionSteps = {};\r\n\r\n // Reorder all equations.\r\n this.reorder();\r\n\r\n if (withResolution === undefined) {\r\n withResolution = false\r\n }\r\n\r\n for (let letter of this.variables) {\r\n this._solutions[letter] = this._solveOneLetter(letter, withResolution)\r\n }\r\n\r\n // TODO: LinearSystem - solve: optimization and handle undetermined and undefined systems.\r\n return this;\r\n };\r\n\r\n mergeEquations = (eq1: Equation, eq2: Equation, factor1: Fraction, factor2: Fraction): Equation => {\r\n // Set and clone the equations.\r\n\r\n let eq1multiplied = eq1.clone().multiply(new Fraction(factor1)),\r\n eq2multiplied = eq2.clone().multiply(new Fraction(factor2));\r\n\r\n // Add both equations together.\r\n eq1multiplied.left.add(eq2multiplied.left);\r\n eq1multiplied.right.add(eq2multiplied.right);\r\n\r\n return eq1multiplied;\r\n }\r\n\r\n private _findLetters = (): LinearSystem => {\r\n // Find all letters used.\r\n let variables: Set<string> = new Set();\r\n\r\n for (let equ of this._equations) {\r\n variables = new Set([...variables, ...equ.variables]);\r\n }\r\n\r\n this._letters = [...variables];\r\n this._letters.sort()\r\n return this;\r\n }\r\n\r\n private _linearReduction(eq1: Equation, eq2: Equation, letter: string): { merged: Equation, factors: Fraction[] } {\r\n // Get the monom for the particular letter.\r\n let c1 = eq1.left.monomByDegree(1, letter).coefficient.clone(),\r\n c2 = eq2.left.monomByDegree(1, letter).coefficient.clone().opposed();\r\n\r\n // Reduce c1 and c2 by the gcd\r\n const gcdN = Numeric.gcd(c1.numerator, c2.numerator),\r\n gcdD = Numeric.gcd(c1.denominator, c2.denominator)\r\n c1.divide(gcdN).multiply(gcdD)\r\n c2.divide(gcdN).multiply(gcdD)\r\n\r\n // if one value is -1, use 1 and make the other one opposed\r\n if (c2.isNegativeOne()) {\r\n c1.opposed()\r\n c2.opposed()\r\n } else if (c1.isNegativeOne()) {\r\n c1.opposed()\r\n c2.opposed()\r\n }\r\n\r\n return {\r\n merged: this.mergeEquations(eq1, eq2, c2, c1),\r\n factors: [c2, c1]\r\n }\r\n }\r\n\r\n /**\r\n * Linear reduction of the equations to have only one letter\r\n * @param letter letter to isolate\r\n * @private\r\n */\r\n private _solveOneLetter(letter: string, withResolution: boolean): ISolution {\r\n // list of equations.\r\n let LE: Equation[] = this.clone().equations,\r\n reducedEquations: Equation[] = [],\r\n lastIndex\r\n\r\n this._resolutionSteps[letter] = []\r\n\r\n // Reduce the equations.\r\n // Do it as long as there is more than one step, but no more than the number of equations.\r\n for (let L of this.variables) {\r\n // Reset the stack\r\n reducedEquations = [];\r\n\r\n // remove the setLetter from all equations using linear combinations\r\n if (L === letter) continue;\r\n\r\n if (withResolution) {\r\n this._resolutionSteps[letter].push({\r\n equations: LE.map(x => x.clone()),\r\n operations: [...new Array(LE.length)].map(x => [...new Array(LE.length - 1)].map(x => \"\"))\r\n })\r\n lastIndex = this._resolutionSteps[letter].length - 1\r\n }\r\n\r\n // Linear reduction.\r\n for (let i = 0; i < LE.length - 1; i++) {\r\n const result = this._linearReduction(LE[i], LE[i + 1], L)\r\n reducedEquations.push(result.merged)\r\n\r\n if (withResolution) {\r\n this._resolutionSteps[letter][lastIndex].operations[i][i] = result.factors[0].tex\r\n this._resolutionSteps[letter][lastIndex].operations[i + 1][i] = result.factors[1].tex\r\n }\r\n }\r\n\r\n LE = [...reducedEquations]\r\n }\r\n\r\n // Solve the equations\r\n // let E = this._resolutionSteps[this._resolutionSteps.length - 1].equations[0];\r\n let E = LE[0];\r\n E.solve()\r\n const solution = E.solutions[0]\r\n\r\n if (withResolution) {\r\n this._resolutionSteps[letter].push({\r\n equations: [LE[0]],\r\n operations: [[LE[0].left.monoms[0].coefficient.tex]]\r\n })\r\n\r\n let P: Polynom\r\n if (solution.exact instanceof Fraction || typeof solution.exact === \"string\") {\r\n P = new Polynom(solution.exact)\r\n } else {\r\n P = new Polynom(solution.value)\r\n }\r\n this._resolutionSteps[letter].push({\r\n equations: [new Equation(new Polynom(letter), P)],\r\n operations: []\r\n })\r\n\r\n }\r\n return E.solutions[0]\r\n }\r\n\r\n}\r\n","/**\r\n * Polynom module contains everything necessary to handle polynoms.\r\n * @module Logicalset\r\n */\r\n\r\nimport {Shutingyard, ShutingyardMode} from '../shutingyard';\r\n\r\n/**\r\n * Polynom class can handle polynoms, reorder, resolve, ...\r\n */\r\n export class Logicalset {\r\n private _rawString: string;\r\n private _rpn: { token: string, tokenType: string }[]\r\n\r\n /**\r\n *\r\n * @param {string} value (optional) Default polynom to parse on class creation\r\n */\r\n constructor(value: string) {\r\n this._rawString = value\r\n this.parse(value)\r\n return this;\r\n }\r\n\r\n get isLogicalset() {\r\n return true;\r\n };\r\n\r\n private parse = (value: string): Logicalset => {\r\n // TODO: Must format the value string to convert some items...\r\n\r\n // Parse the updated value to the shutingyard algorithm\r\n this._rpn = new Shutingyard(ShutingyardMode.SET).parse(value).rpn;\r\n\r\n return this;\r\n }\r\n\r\n evaluate(tokenSets: { [key: string]: unknown[] }, reference?: unknown[]): unknown[] {\r\n let varStack: (Set<unknown>)[] = []\r\n\r\n let referenceSet: Set<unknown>\r\n if (reference === undefined) {\r\n referenceSet = new Set()\r\n for (let key in tokenSets) {\r\n referenceSet = new Set([...referenceSet, ...tokenSets[key]])\r\n }\r\n } else {\r\n referenceSet = new Set(reference)\r\n }\r\n\r\n for (let token of this._rpn) {\r\n if (token.tokenType === 'variable') {\r\n // The variable has no token - assume it's empty.\r\n if (tokenSets[token.token] === undefined) {\r\n varStack.push(new Set())\r\n } else {\r\n varStack.push(new Set(tokenSets[token.token]));\r\n }\r\n\r\n } else {\r\n switch (token.token) {\r\n case '&':\r\n if (varStack.length >= 2) {\r\n let second = varStack.pop(),\r\n first = varStack.pop()\r\n\r\n varStack.push(new Set([...first].filter(x => second.has(x))))\r\n }\r\n break\r\n case '|':\r\n if (varStack.length >= 2) {\r\n let second = varStack.pop(),\r\n first = varStack.pop()\r\n varStack.push(new Set([...first, ...second]))\r\n }\r\n break\r\n case '-':\r\n if (varStack.length >= 2) {\r\n let second = varStack.pop(),\r\n first = varStack.pop()\r\n varStack.push(new Set([...first].filter(x => !second.has(x))))\r\n }\r\n break\r\n case '!':\r\n if (varStack.length >= 1) {\r\n let first = varStack.pop()\r\n\r\n varStack.push(new Set([...referenceSet].filter(x => !first.has(x))))\r\n }\r\n break\r\n }\r\n }\r\n }\r\n\r\n return [...varStack[0]].sort();\r\n }\r\n\r\n vennAB(): any[] {\r\n return this.evaluate({\r\n A: ['A', 'AB'],\r\n B: ['B', 'AB']\r\n },\r\n ['A', 'B', 'AB', 'E']\r\n )\r\n }\r\n\r\n vennABC(): any[] {\r\n return this.evaluate({\r\n A: ['A', 'AB', 'AC', 'ABC'],\r\n B: ['B', 'AB', 'BC', 'ABC'],\r\n C: ['C', 'AC', 'BC', 'ABC']\r\n },\r\n ['A', 'B', 'C', 'AB', 'AC', 'BC', 'E']\r\n )\r\n }\r\n\r\n get rpn(): { token: string, tokenType: string }[] {\r\n return this._rpn\r\n }\r\n\r\n get tex(): string {\r\n let varStack: { token: string, tokenType: string } [] = []\r\n\r\n for (let token of this._rpn) {\r\n if (token.tokenType === 'variable') {\r\n varStack.push(token);\r\n } else {\r\n switch (token.token) {\r\n case '&':\r\n if (varStack.length >= 2) {\r\n let second = varStack.pop(),\r\n first = varStack.pop()\r\n\r\n if (first.tokenType === 'mix') {\r\n first.token = `( ${first.token} )`\r\n }\r\n if (second.tokenType === 'mix') {\r\n second.token = `( ${second.token} )`\r\n }\r\n varStack.push({token: `${first.token} \\\\cap ${second.token}`, tokenType: 'mix'})\r\n }\r\n break\r\n case '|':\r\n if (varStack.length >= 2) {\r\n let second = varStack.pop(),\r\n first = varStack.pop()\r\n\r\n if (first.tokenType === 'mix') {\r\n first.token = `( ${first.token} )`\r\n }\r\n if (second.tokenType === 'mix') {\r\n second.token = `( ${second.token} )`\r\n }\r\n varStack.push({token: `${first.token} \\\\cup ${second.token}`, tokenType: 'mix'})\r\n }\r\n break\r\n case '-':\r\n if (varStack.length >= 2) {\r\n let second = varStack.pop(),\r\n first = varStack.pop()\r\n\r\n if (first.tokenType === 'mix') {\r\n first.token = `( ${first.token} )`\r\n }\r\n if (second.tokenType === 'mix') {\r\n second.token = `( ${second.token} )`\r\n }\r\n varStack.push({token: `${first.token} \\\\setminus ${second.token}`, tokenType: 'mix'})\r\n }\r\n break\r\n case '!':\r\n if (varStack.length >= 1) {\r\n let first = varStack.pop()\r\n varStack.push({token: `\\\\overline{ ${first.token} }`, tokenType: 'variable'})\r\n }\r\n break\r\n }\r\n }\r\n }\r\n\r\n return varStack[0].token\r\n }\r\n }","/***\r\n * Monom class\r\n */\r\nimport {Numeric} from \"../numeric\";\r\nimport {Shutingyard, ShutingyardType, Token} from \"../shutingyard\";\r\nimport {Fraction} from \"../coefficients/fraction\";\r\n\r\nexport type literalType = {\r\n [Key: string]: Fraction\r\n}\r\n\r\nexport class Monom {\r\n private _coefficient: Fraction;\r\n private _literal: literalType;\r\n\r\n /**\r\n * Create a Monom\r\n * Defined as \\\\(k \\\\cdot x^{n}\\\\), where \\\\( k,n \\in \\\\mathbb{Q}\\\\).\r\n * Examples: \\\\(3x^2\\\\) or \\\\(3/5x^2\\\\)\r\n * @param value (optional) string The value that should be parse. Can be a Monom, a Fraction, a string or a number. If nothing is provided, it will return the trivial monom (0).\r\n */\r\n constructor(value?: unknown) {\r\n this.zero();\r\n\r\n if (value !== undefined) {\r\n // A string is given - try to parse the value.\r\n this.parse(value);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n // ------------------------------------------\r\n // Getter and setter\r\n // ------------------------------------------\r\n /**\r\n * Get the coefficient \\\\(k\\\\) of the Monom \\\\(k\\\\cdot x^{n}\\\\)\r\n * @returns {Fraction}\r\n */\r\n get coefficient(): Fraction {\r\n return this._coefficient;\r\n }\r\n\r\n /**\r\n * Set the coefficient \\\\(k\\\\) value of the monom\r\n * @param {Fraction | number | string} F\r\n */\r\n set coefficient(F: Fraction | number | string) {\r\n this._coefficient = new Fraction(F);\r\n }\r\n\r\n /**\r\n * Get the literal part of \\\\(x^{n_1}y^{n_2}\\\\) as dictionary \\\\[\\\\begin{array}{ll}x&=n_1\\\\\\\\y&=n_2\\\\end{array}\\\\]\r\n * @returns {literalType}\r\n */\r\n get literal(): literalType {\r\n return this._literal;\r\n }\r\n\r\n /**\r\n * Get the literal square roots of the Monom.\r\n * TODO: remove this getter ? Is it used and is it correct ?\r\n * @returns {literalType}\r\n */\r\n get literalSqrt(): literalType {\r\n if (this.isLiteralSquare()) {\r\n let L: literalType = {}\r\n for (let key in this._literal) {\r\n L[key] = this._literal[key].clone().sqrt()\r\n }\r\n return L;\r\n } else {\r\n return this._literal;\r\n }\r\n }\r\n\r\n /**\r\n * Set the literal part of the monom. Must be a dictionary {x: Fraction, y: Fraction, ...}\r\n * @param {literalType} L\r\n */\r\n set literal(L: literalType) {\r\n this._literal = L;\r\n }\r\n\r\n /**\r\n * Set the literal part of the monom from a string\r\n * @param inputStr String like x^2y^3\r\n */\r\n set literalStr(inputStr: string) {\r\n // TODO : parse using shutingyard tree !\r\n\r\n // Match all x^n\r\n for (const v of [...inputStr.matchAll(/([a-z])\\^([+-]?[0-9]+)/g)]) {\r\n // Create the default letter entry if necessary.\r\n if (!(v[1] in this._literal)) {\r\n this._literal[v[1]] = new Fraction().zero();\r\n }\r\n\r\n // Add the new value.\r\n // TODO: actually, it adds only numeric value\r\n this._literal[v[1]].add(+v[2]);\r\n }\r\n\r\n // Match all x\r\n for (const v of [...inputStr.matchAll(/([a-z](?!\\^))/g)]) {\r\n // Match all single letters\r\n if (!(v[1] in this._literal)) {\r\n this._literal[v[1]] = new Fraction().zero();\r\n }\r\n\r\n // Add one to the value.\r\n this._literal[v[1]].add(1)\r\n }\r\n }\r\n\r\n // Getter helpers.\r\n /**\r\n * Get the variables letters\r\n */\r\n get variables(): string[] {\r\n let M = this.clone().clean();\r\n return Object.keys(M.literal)\r\n }\r\n\r\n // Display getter\r\n /**\r\n * This display getter is to be used in the polynom display getter\r\n */\r\n get display(): string {\r\n let L: string = '',\r\n letters = Object.keys(this._literal).sort()\r\n for (let letter of letters) {\r\n if (this._literal[letter].isNotZero()) {\r\n L += `${letter}`;\r\n if (this._literal[letter].isNotEqual(1)) {\r\n L += `^(${this._literal[letter].display})`;\r\n }\r\n }\r\n }\r\n\r\n if (L === '') {\r\n // No setLetter - means it's only a number !\r\n if (this._coefficient.value != 0) {\r\n return `${this._coefficient.display}`;\r\n } else {\r\n return '';\r\n }\r\n } else {\r\n if (this._coefficient.value === 1) {\r\n return L;\r\n } else if (this._coefficient.value === -1) {\r\n return `-${L}`;\r\n } else if (this._coefficient.value === 0) {\r\n return '0';\r\n } else {\r\n return `${this._coefficient.display}${L}`;\r\n }\r\n }\r\n }\r\n\r\n get dividers(): Monom[] {\r\n // Decompose only if the coefficient is a natural number\r\n if (!this.coefficient.isRelative()) {\r\n return [this.clone()]\r\n }\r\n\r\n\r\n // Decompose only if the power values are natural numbers.\r\n if (this.hasFractionCoefficient()) {\r\n return [this.clone()]\r\n }\r\n\r\n // Security : do not do this if greater than 10000\r\n if (this.coefficient.numerator > 1000000) {\r\n return [this.clone()]\r\n }\r\n\r\n const dividers = Numeric.dividers(Math.abs(this.coefficient.numerator))\r\n\r\n // Decompose the literals parts.\r\n let literals: literalType[] = [];\r\n for (let L in this.literal) {\r\n // L is the letter.\r\n literals = this._getLiteralDividers(literals, L)\r\n }\r\n\r\n const monomDividers: Monom[] = [];\r\n if (literals.length > 0 && dividers.length > 0) {\r\n for (let N of dividers) {\r\n for (let L of literals) {\r\n let M = new Monom();\r\n M.coefficient = new Fraction(N)\r\n M.literal = L\r\n monomDividers.push(M)\r\n }\r\n }\r\n } else if (dividers.length === 0) {\r\n for (let L of literals) {\r\n let M = new Monom();\r\n M.coefficient = new Fraction().one()\r\n M.literal = L\r\n monomDividers.push(M)\r\n }\r\n } else {\r\n for (let N of dividers) {\r\n let M = new Monom();\r\n M.coefficient = new Fraction(N)\r\n monomDividers.push(M)\r\n }\r\n }\r\n\r\n return monomDividers.length === 0 ? [new Monom().one()] : monomDividers;\r\n }\r\n\r\n private _getLiteralDividers(arr: literalType[], letter: string): literalType[] {\r\n let tmpList: { [key: string]: Fraction }[] = [];\r\n\r\n // Be default, this.literal[letter] should be a rational number.\r\n for (let d = 0; d <= this.literal[letter].value; d++) {\r\n if (arr.length === 0) {\r\n let litt: literalType = {}\r\n litt[letter] = new Fraction(d)\r\n tmpList.push(litt)\r\n } else {\r\n for (let item of arr) {\r\n let litt: literalType = {}\r\n for (let currentLetter in item) {\r\n litt[currentLetter] = item[currentLetter]\r\n }\r\n litt[letter] = new Fraction(d)\r\n tmpList.push(litt)\r\n }\r\n }\r\n }\r\n return tmpList;\r\n }\r\n\r\n /**\r\n * Display the monom, forcing the '+' sign to appear\r\n */\r\n get displayWithSign(): string {\r\n let d: String = this.display;\r\n return (d[0] !== '-' ? '+' : '') + d;\r\n }\r\n\r\n get texWithSign(): string {\r\n if (this.coefficient.isStrictlyPositive()) {\r\n return '+' + this.tex\r\n }\r\n\r\n return this.tex\r\n }\r\n\r\n get plotFunction(): string {\r\n\r\n let L: string = '',\r\n letters = Object.keys(this._literal).sort()\r\n\r\n for (let letter of letters) {\r\n if (this._literal[letter].isNotZero()) {\r\n L += (L===''?\"\":\"*\") + `${letter}`\r\n if (this._literal[letter].isNotEqual(1)) {\r\n L += `^(${this._literal[letter].display})`;\r\n }\r\n }\r\n }\r\n\r\n // No literal part\r\n if (L === '') {\r\n // No setLetter - means it's only a number !\r\n if (this._coefficient.value != 0) {\r\n return `${this._coefficient.display}`;\r\n } else {\r\n return '';\r\n }\r\n } else {\r\n if (this._coefficient.value === 1) {\r\n return L;\r\n } else if (this._coefficient.value === -1) {\r\n return `-${L}`;\r\n } else if (this._coefficient.value === 0) {\r\n return '0';\r\n } else {\r\n return `${this._coefficient.display}*${L}`;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Get the tex output of the monom\r\n */\r\n get tex(): string {\r\n // TODO: display with square root !\r\n let L: string = '',\r\n letters = Object.keys(this._literal).sort()\r\n\r\n for (let letter of letters) {\r\n if (this._literal[letter].isNotZero()) {\r\n L += `${letter}`;\r\n if (this._literal[letter].isNotEqual(1)) {\r\n L += `^{${this._literal[letter].tfrac}}`;\r\n }\r\n }\r\n }\r\n\r\n if (L === '') {\r\n // No setLetter - means it's only a number !\r\n if (this._coefficient.value != 0) {\r\n return `${this._coefficient.frac}`;\r\n } else {\r\n return '0';\r\n }\r\n } else {\r\n if (this._coefficient.value === 1) {\r\n return L;\r\n } else if (this._coefficient.value === -1) {\r\n return `-${L}`;\r\n } else if (this._coefficient.value === 0) {\r\n return '0';\r\n } else {\r\n return `${this._coefficient.frac}${L}`;\r\n }\r\n }\r\n }\r\n\r\n // ------------------------------------------\r\n // Creation / parsing functions\r\n // -----------------------------------------\r\n /**\r\n * Parse a string to a monom. The string may include fraction.\r\n * @param inputStr\r\n */\r\n parse = (inputStr: unknown): Monom => {\r\n\r\n if (typeof inputStr === 'string') {\r\n this._shutingYardToReducedMonom(inputStr)\r\n } else if (typeof inputStr === 'number') {\r\n this._coefficient = new Fraction(inputStr)\r\n this._literal = {}\r\n } else if (inputStr instanceof Fraction) {\r\n this._coefficient = inputStr.clone()\r\n this._literal = {}\r\n } else if (inputStr instanceof Monom) {\r\n this._coefficient = inputStr._coefficient.clone()\r\n this._literal = this.copyLiterals(inputStr.literal)\r\n }\r\n\r\n return this;\r\n };\r\n\r\n addToken = (stack: Monom[], element: Token): void => {\r\n\r\n let q1: Monom, q2: Monom, m: Monom, letter: string, pow: Fraction\r\n\r\n if (element.tokenType === ShutingyardType.COEFFICIENT) {\r\n stack.push(new Monom(new Fraction(element.token)))\r\n\r\n } else if (element.tokenType === ShutingyardType.VARIABLE) {\r\n let M = new Monom().one()\r\n M.setLetter(element.token, 1)\r\n stack.push(M.clone())\r\n\r\n } else if (element.tokenType === ShutingyardType.OPERATION) {\r\n switch (element.token) {\r\n case '-':\r\n // this should only happen for negative powers or for negative coefficient.\r\n q2 = (stack.pop()) || new Monom().zero()\r\n q1 = (stack.pop()) || new Monom().zero()\r\n\r\n stack.push(q1.subtract(q2))\r\n\r\n break;\r\n case '*':\r\n // Get the last element in the stack\r\n q2 = (stack.pop()) || new Monom().one()\r\n q1 = (stack.pop()) || new Monom().one()\r\n\r\n stack.push(q1.multiply(q2))\r\n break\r\n case '/':\r\n // Get the last element in the stack\r\n q2 = (stack.pop()) || new Monom().one()\r\n q1 = (stack.pop()) || new Monom().one()\r\n\r\n stack.push(q1.divide(q2))\r\n break\r\n case '^':\r\n // get the two last elements in the stack\r\n pow = (stack.pop().coefficient) || new Fraction().one()\r\n m = (stack.pop()) || new Monom().one()\r\n\r\n letter = m.variables[0]\r\n\r\n if (letter !== undefined) {\r\n m.setLetter(letter, pow)\r\n }\r\n\r\n stack.push(m)\r\n // this.multiply(m.clone())\r\n break\r\n }\r\n }\r\n }\r\n private _shutingYardToReducedMonom = (inputStr: string): Monom => {\r\n // Get the RPN array of the current expression\r\n const SY: Shutingyard = new Shutingyard().parse(inputStr);\r\n const rpn: { token: string, tokenType: string }[] = SY.rpn;\r\n\r\n let stack: Monom[] = [], m, pow, letter, q1, q2\r\n\r\n if (rpn.length === 0) {\r\n this.zero()\r\n return this\r\n } else if (rpn.length === 1) {\r\n const element = rpn[0]\r\n\r\n this.one()\r\n if (element.tokenType === 'coefficient') {\r\n this.coefficient = new Fraction(element.token)\r\n } else if (element.tokenType === 'variable') {\r\n this.setLetter(element.token, 1)\r\n }\r\n return this\r\n } else {\r\n // Reset the monom\r\n for (const element of rpn) {\r\n this.addToken(stack, element)\r\n }\r\n }\r\n\r\n this.one()\r\n this.multiply(stack[0])\r\n return this\r\n }\r\n /**\r\n * Clone the current Monom.\r\n */\r\n clone = (): Monom => {\r\n let F: Monom = new Monom();\r\n\r\n F.coefficient = this._coefficient.clone();\r\n\r\n // Copy the literal parts.\r\n for (let k in this._literal) {\r\n F.setLetter(k, this._literal[k].clone());\r\n }\r\n return F;\r\n };\r\n\r\n copyLiterals = (literal: literalType): literalType => {\r\n let L: literalType = {}\r\n\r\n for (let k in literal) {\r\n L[k] = literal[k].clone()\r\n }\r\n return L\r\n }\r\n\r\n makeSame = (M: Monom): Monom => {\r\n // Copy the literal parts.\r\n for (let k in M._literal) {\r\n this.setLetter(k, M._literal[k].clone());\r\n }\r\n return this\r\n }\r\n\r\n /**\r\n * Create a zero value monom\r\n */\r\n zero = (): Monom => {\r\n this._coefficient = new Fraction().zero();\r\n this._literal = {};\r\n return this;\r\n };\r\n\r\n /**\r\n * Create a one value monom\r\n */\r\n one = (): Monom => {\r\n this._coefficient = new Fraction().one();\r\n this._literal = {};\r\n return this;\r\n };\r\n\r\n /**\r\n * Clean the monom by removing each letters with a power of zero.\r\n */\r\n clean = (): Monom => {\r\n for (let letter in this._literal) {\r\n if (this._literal[letter].isZero()) {\r\n delete this._literal[letter];\r\n }\r\n }\r\n return this;\r\n };\r\n\r\n reduce = (): Monom => {\r\n this.clean()\r\n this.coefficient.reduce()\r\n return this\r\n }\r\n\r\n // ------------------------------------------\r\n // Mathematical operations\r\n // ------------------------------------------\r\n\r\n /**\r\n * Get the opposed\r\n * Returns a monom.\r\n */\r\n opposed = (): Monom => {\r\n this._coefficient.opposed();\r\n return this;\r\n };\r\n\r\n /**\r\n * Add all similar monoms. If they aren't similar, they are simply skipped.\r\n * @param M (Monom[]) The monoms to add.\r\n */\r\n add = (...M: Monom[]): Monom => {\r\n for (let m of M) {\r\n if (this.isSameAs(m)) {\r\n if (this.isZero()) {\r\n this.makeSame(m)\r\n }\r\n this._coefficient.add(m.coefficient);\r\n } else {\r\n console.log('Add monom: ' + this.display + ' is not similar with ', m.display);\r\n }\r\n }\r\n return this;\r\n };\r\n\r\n /**\r\n * Subtract multiple monoms\r\n * @param M (Monom[]) The monoms to subtract\r\n */\r\n subtract = (...M: Monom[]): Monom => {\r\n for (let m of M) {\r\n if (this.isSameAs(m)) {\r\n if (this.isZero()) {\r\n this.makeSame(m)\r\n }\r\n this._coefficient.add(m.clone().coefficient.opposed());\r\n } else {\r\n console.log('Subtract: Is not similar: ', m.display);\r\n }\r\n }\r\n return this;\r\n };\r\n\r\n /**\r\n * Multiple multiple monoms to the current monom\r\n * @param M (Monom[]) The monoms to multiply to.\r\n */\r\n multiply = (...M: Monom[]): Monom => {\r\n for (let m of M) {\r\n // Multiply the coefficient.\r\n this._coefficient.multiply(m.coefficient);\r\n\r\n // Multiply the literal parts.\r\n for (let letter in m.literal) {\r\n if (this._literal[letter] === undefined) {\r\n this._literal[letter] = m.literal[letter].clone()\r\n } else {\r\n this._literal[letter].add(m.literal[letter])\r\n }\r\n\r\n }\r\n }\r\n return this;\r\n };\r\n\r\n multiplyByNumber = (F: Fraction | number): Monom => {\r\n this._coefficient.multiply(F);\r\n return this;\r\n }\r\n\r\n /**\r\n * Divide the current monoms by multiple monoms\r\n * @param M (Monom[])\r\n */\r\n divide = (...M: Monom[]): Monom => {\r\n // Depending on the given value, choose the current item\r\n for (let v of M) {\r\n // Divide the coefficient\r\n this._coefficient.divide(v.coefficient);\r\n\r\n // Subtract the power values\r\n for (let letter in v.literal) {\r\n this._literal[letter] = (this._literal[letter] === undefined) ? v.literal[letter].clone().opposed() : this._literal[letter].subtract(v.literal[letter])\r\n\r\n // If the power of a particular setLetter is zero, delete it from the literal part..\r\n if (this._literal[letter].isZero()) {\r\n delete this._literal[letter];\r\n }\r\n }\r\n }\r\n return this;\r\n };\r\n\r\n /**\r\n * Get the pow of a monom.\r\n * @param nb (number) : Mathematical pow\r\n */\r\n pow = (nb: number|Fraction): Monom => {\r\n this._coefficient.pow(nb);\r\n for (let letter in this._literal) {\r\n this._literal[letter].multiply(nb)\r\n }\r\n return this;\r\n };\r\n\r\n /**\r\n * Get the nth-root of the monom\r\n * @param p\r\n */\r\n root = (p: number): Monom => {\r\n // TODO: determiner the nth root of a monom\r\n return this;\r\n }\r\n\r\n /**\r\n * Return the square root of a monom\r\n */\r\n sqrt = (): Monom => {\r\n if (this.isSquare()) {\r\n this._coefficient.sqrt();\r\n for (let letter in this._literal) {\r\n this._literal[letter].clone().divide(2)\r\n }\r\n }\r\n return this.root(2);\r\n }\r\n\r\n // ------------------------------------------\r\n // Compare functions\r\n // ------------------------------------------\r\n compare = (M: Monom, sign?: string): boolean => {\r\n // TODO: Build the compare systems.\r\n if (sign === undefined) {\r\n sign = '=';\r\n }\r\n\r\n\r\n switch (sign) {\r\n case '=':\r\n // To be equal, they must be the isSame\r\n if (!this.compare(M, 'same')) {\r\n return false;\r\n }\r\n\r\n // The literal parts are the isSame. The coefficient must be equal\r\n return this._coefficient.isEqual(M.coefficient);\r\n case 'same':\r\n // Get the list of all variables from both monoms.\r\n let M1: string[] = this.variables,\r\n M2: string[] = M.variables,\r\n K: string[] = M1.concat(M2.filter((item) => M1.indexOf(item) < 0));\r\n\r\n if(M1.length===0 && M2.length===0){return true}\r\n // To compare, both must be different than zero.\r\n if (!this.isZero() && !M.isZero()) {\r\n for (let key of K) {\r\n // The setLetter is not available in one of the monom\r\n if (this._literal[key] === undefined || M.literal[key] === undefined) {\r\n return false;\r\n }\r\n // The setLetter does not have the isSame power in each monoms.\r\n if (!this._literal[key].isEqual(M.literal[key])) {\r\n return false;\r\n }\r\n }\r\n }\r\n\r\n // All are positive check - the monoms are the sames.\r\n return true;\r\n default:\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Determine if the monom is null\r\n */\r\n isZero(): boolean {\r\n return this._coefficient.value === 0;\r\n }\r\n\r\n /**\r\n * Determine if the monom is one\r\n */\r\n isOne(): boolean {\r\n return this._coefficient.value === 1 && this.variables.length === 0;\r\n }\r\n\r\n /**\r\n * Determine if two monoms are equals\r\n * @param M\r\n */\r\n isEqual = (M: Monom): boolean => {\r\n return this.compare(M, '=');\r\n };\r\n\r\n /**\r\n * Determine if two monoms are similar\r\n * @param M\r\n */\r\n isSameAs = (M: Monom): boolean => {\r\n return this.compare(M, 'same');\r\n };\r\n\r\n isSquare = (): boolean => {\r\n if (!this.coefficient.isSquare()) {\r\n return false;\r\n }\r\n return this.isLiteralSquare();\r\n }\r\n\r\n isLiteralSquare = (): boolean => {\r\n for (let letter in this.literal) {\r\n // A literal square must have a natural power\r\n if (this.literal[letter].isRational()) {\r\n return false\r\n }\r\n\r\n // The natural power must be be even\r\n if (this.literal[letter].isEven()) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n hasFractionCoefficient = (): boolean => {\r\n for (let letter in this._literal) {\r\n if (this._literal[letter].isRational()) {\r\n return true\r\n }\r\n }\r\n\r\n return false\r\n }\r\n // ------------------------------------------\r\n // Misc monoms functions\r\n // -------------------------------------\r\n /**\r\n * Determine if a monom contains a setLetter in it's literal part\r\n * @param letter\r\n */\r\n hasLetter = (letter?: string): boolean => {\r\n // The letter was not found\r\n if (this._literal[letter === undefined ? 'x' : letter] === undefined) {\r\n return false\r\n }\r\n\r\n // The letter is found and is not zero !\r\n return this._literal[letter === undefined ? 'x' : letter].isNotZero();\r\n };\r\n\r\n /**\r\n * Set the power of a particular setLetter\r\n * @param letter (string) Letter to change\r\n * @param pow (number) Power of the setLetter (must be positive integer.\r\n */\r\n setLetter = (letter: string, pow: Fraction | number): void => {\r\n if (pow instanceof Fraction) {\r\n // Set the power of the letter to zero => remove it\r\n if (this.hasLetter(letter) && pow.isZero()) {\r\n delete this._literal[letter]\r\n }\r\n\r\n this._literal[letter] = pow.clone()\r\n } else {\r\n this.setLetter(letter, new Fraction(pow))\r\n }\r\n };\r\n\r\n /**\r\n * Get the degree of a monom. If no setLetter is given, the result will be the global degree.\r\n * @param letter (string) Letter to get to degree (power)\r\n */\r\n degree = (letter?: string): Fraction => {\r\n if (this.variables.length === 0) {\r\n return new Fraction().zero();\r\n }\r\n if (letter === undefined) {\r\n // Not setLetter given -> we get the global monom degree (sum of all the letters).\r\n return Object.values(this._literal).reduce((t, n) => t.clone().add(n));\r\n } else {\r\n // A setLetter is given -> get the corresponding power.\r\n return this._literal[letter] === undefined ? new Fraction().zero() : this._literal[letter].clone();\r\n }\r\n };\r\n\r\n /**\r\n * Evaluate a monom. Each setLetter must be assigned to a Fraction.\r\n * @param values Dictionary of <setLetter: Fraction>\r\n */\r\n evaluate = (values: literalType | Fraction | number): Fraction => {\r\n let r = this.coefficient.clone();\r\n\r\n if (typeof values === 'number' || values instanceof Fraction) {\r\n let tmpValues: literalType = {}\r\n tmpValues[this.variables[0]] = new Fraction(values)\r\n return this.evaluate(tmpValues);\r\n }\r\n\r\n if (typeof values === 'object') {\r\n if(this.variables.length===0){\r\n return this.coefficient\r\n }\r\n for (let L in this._literal) {\r\n if (values[L] === undefined) {\r\n return new Fraction().zero();\r\n }\r\n\r\n let value = new Fraction(values[L])\r\n\r\n r.multiply(value.pow(this._literal[L]))\r\n }\r\n }\r\n\r\n return r;\r\n };\r\n\r\n evaluateAsNumeric = (values: { [Key: string]: number } | number): number => {\r\n let r = this.coefficient.value\r\n\r\n if (typeof values === 'number') {\r\n let tmpValues: { [Key: string]: number } = {}\r\n tmpValues[this.variables[0]] = values\r\n return this.evaluateAsNumeric(tmpValues);\r\n }\r\n\r\n if (typeof values === 'object') {\r\n if (this.variables.length === 0) {\r\n return this.coefficient.value\r\n }\r\n for (let L in this._literal) {\r\n if (values[L] === undefined) {\r\n return 0;\r\n }\r\n\r\n r *= values[L] ** (this._literal[L].value)\r\n }\r\n }\r\n\r\n return r\r\n }\r\n\r\n /**\r\n * Derivative the monom\r\n * @param letter\r\n */\r\n derivative = (letter?: string): Monom => {\r\n // No setLetter given - assume it's the setLetter 'x'\r\n if (letter === undefined) {\r\n letter = 'x';\r\n }\r\n\r\n if (this.hasLetter(letter)) {\r\n let d = this._literal[letter].clone(),\r\n dM = this.clone();\r\n\r\n // Subtract one to the degree.\r\n dM._literal[letter].subtract(1)\r\n\r\n // Multiply the coefficient by the previous degree\r\n dM._coefficient.multiply(new Fraction(d.clone()));\r\n return dM;\r\n } else {\r\n return new Monom().zero();\r\n }\r\n };\r\n\r\n primitive = (letter?: string): Monom => {\r\n // TODO: derivative including the ln value => implies creating different monom system ?\r\n if (letter === undefined) {\r\n letter = 'x'\r\n }\r\n\r\n // Zero monom\r\n let M = this.clone(), degree\r\n\r\n if (M.hasLetter(letter)) {\r\n degree = M.degree(letter).clone().add(1)\r\n M.coefficient = M.coefficient.clone().divide(degree)\r\n M.setLetter(letter, degree)\r\n } else {\r\n // There is no letter.\r\n\r\n // The coefficient might be zero (=> x) or a number a (=> ax)\r\n if (M.coefficient.isZero()) {\r\n M.coefficient = new Fraction().one()\r\n }\r\n M.setLetter(letter, 1)\r\n }\r\n\r\n return M\r\n }\r\n // ----------------------------------------\r\n // Static functions\r\n // ----------------------------------------\r\n\r\n /**\r\n * Get the least common multiple of monoms\r\n * @param monoms Array of monoms\r\n */\r\n static lcm = (...monoms: Monom[]): Monom => {\r\n // All the monoms must be with natural powers...\r\n for (let m of monoms) {\r\n if (m.hasFractionCoefficient()) {\r\n return new Monom().zero()\r\n }\r\n }\r\n\r\n\r\n let M = new Monom(),\r\n coeffN: number[] = monoms.map(value => value.coefficient.numerator),\r\n coeffD: number[] = monoms.map(value => value.coefficient.denominator),\r\n n = Numeric.gcd(...coeffN),\r\n d = Numeric.lcm(...coeffD);\r\n\r\n // Get the coefficient.\r\n M.coefficient = new Fraction(n, d).reduce();\r\n\r\n // Set the literal parts - go through each monoms literal parts and get only the lowest degree of each letters.\r\n for (let m of monoms) {\r\n // Remove the inexistant letters from the resulting monom\r\n for (let letter in M.literal) {\r\n if (!(letter in m.literal)) {\r\n M.literal[letter].zero();\r\n }\r\n }\r\n for (let letter in m.literal) {\r\n if (M.literal[letter] === undefined && m.literal[letter].isStrictlyPositive()) {\r\n M.literal[letter] = m.literal[letter].clone();\r\n } else {\r\n M.literal[letter] = new Fraction(Math.min(m.literal[letter].value, M.literal[letter].value))\r\n }\r\n }\r\n }\r\n\r\n return M;\r\n };\r\n\r\n /**\r\n * Multiply two monoms and return a NEW monom.\r\n * @param monoms\r\n */\r\n static xmultiply = (...monoms: Monom[]): Monom => {\r\n let M = new Monom().one();\r\n\r\n for (let m of monoms) {\r\n M.multiply(m);\r\n }\r\n\r\n return M;\r\n };\r\n\r\n\r\n // TODO: The rest of the functions are not used or unnecessary ?\r\n /**\r\n * Determine if multiple monoms are similar\r\n * @param M\r\n */\r\n areSameAs = (...M: Monom[]): boolean => {\r\n let result: boolean = true;\r\n\r\n // Check all monoms if they are the isSame as the \"this\" one.\r\n for (let i = 0; i < M.length; i++) {\r\n if (!this.isSameAs(M[i])) {\r\n return false;\r\n }\r\n }\r\n\r\n // All check passed -> all the monoms are similar.\r\n return result;\r\n };\r\n\r\n /**\r\n * Determine if multiple monoms are equals\r\n * @param M\r\n */\r\n areEquals = (...M: Monom[]): boolean => {\r\n // They are not similar.\r\n if (!this.areSameAs(...M)) {\r\n return false;\r\n }\r\n\r\n // Check all coefficient. They must be equals.\r\n for (let m of M) {\r\n if (!this._coefficient.isEqual(m.coefficient)) {\r\n return false;\r\n }\r\n }\r\n\r\n // All checks passed.\r\n return true;\r\n };\r\n\r\n isDivisible = (div:Monom):boolean => {\r\n // For all variables (letters), the current monom must have a degree higher than the divider\r\n if(div.degree().isStrictlyPositive()) {\r\n for (let letter of div.variables) {\r\n if (!this.degree(letter).geq(div.degree(letter))) {\r\n return false\r\n }\r\n }\r\n }\r\n\r\n // If the coefficient is rational, we suppose we don't need to check the division by the coefficient.\r\n if(this.coefficient.isRational() || div.coefficient.isRational()){return true}\r\n\r\n return this.coefficient.clone().divide(div.coefficient).isRelative()\r\n }\r\n\r\n}\r\n","/**\r\n * Polynom module contains everything necessary to handle polynoms.*\r\n */\r\n\r\nimport {literalType, Monom} from './monom';\r\nimport {Shutingyard, ShutingyardType, Token} from '../shutingyard';\r\nimport {Numeric} from '../numeric';\r\nimport {Fraction} from \"../coefficients/fraction\";\r\nimport {Equation, ISolution} from \"./equation\";\r\nimport {Random} from \"../randomization/random\";\r\nimport {loadHighlighter} from \"typedoc/dist/lib/utils/highlighter\";\r\n\r\nexport type PolynomParsingType = string | Polynom | number | Fraction | Monom\r\n\r\nexport interface IEuclidian {\r\n quotient: Polynom,\r\n reminder: Polynom\r\n}\r\n\r\n/**\r\n * Polynom class can handle polynoms, reorder, resolve, ...\r\n * ```\r\n * let P = new Polynom('3x-4')\r\n * ```\r\n */\r\nexport class Polynom {\r\n private _dirty_factors: boolean\r\n private _dirty_zeroes: boolean\r\n private _euclidianCache: { [Key: string]: IEuclidian }\r\n private _factors: Polynom[];\r\n private _monoms: Monom[];\r\n private _rawString: string;\r\n private _texString: string;\r\n private _zeroes: ISolution[]\r\n\r\n /**\r\n *\r\n * @param {string} polynomString (optional) Default polynom to parse on class creation\r\n * @param values\r\n */\r\n constructor(polynomString?: PolynomParsingType, ...values: unknown[]) {\r\n this._monoms = [];\r\n this._factors = [];\r\n this.mark_as_dirty()\r\n\r\n if (polynomString !== undefined) {\r\n this.parse(polynomString, ...values);\r\n }\r\n return this;\r\n }\r\n\r\n get euclidianCache(): { [p: string]: IEuclidian } {\r\n return this._euclidianCache;\r\n }\r\n\r\n set euclidianCache(value: { [p: string]: IEuclidian }) {\r\n this._euclidianCache = value;\r\n }\r\n\r\n get dirty_zeroes(): boolean {\r\n return this._dirty_zeroes;\r\n }\r\n\r\n set dirty_zeroes(value: boolean) {\r\n this._dirty_zeroes = value;\r\n }\r\n\r\n // ------------------------------------------\r\n get dirty_factors(): boolean {\r\n return this._dirty_factors;\r\n }\r\n\r\n set dirty_factors(value: boolean) {\r\n this._dirty_factors = value;\r\n }\r\n\r\n // ------------------------------------------\r\n get monoms() {\r\n return this._monoms;\r\n }\r\n\r\n set monoms(M: Monom[]) {\r\n this._monoms = M;\r\n }\r\n\r\n get zeroes(): ISolution[] {\r\n return this.getZeroes()\r\n }\r\n\r\n get factors(): Polynom[] {\r\n return this.factorize()\r\n }\r\n\r\n set factors(value: Polynom[]) {\r\n this.mark_as_dirty()\r\n this._factors = value;\r\n }\r\n\r\n get texString(): string {\r\n return this._texString;\r\n }\r\n\r\n get texFactors(): string {\r\n this.factorize()\r\n\r\n if (this.factors.length <= 1) {\r\n return this.tex\r\n }\r\n\r\n // Build an array of texFactors with the number of similar items.\r\n let factorsCount: { [Key: string]: { degree: number, factor: Polynom } } = {}\r\n for (let f of this.factors) {\r\n if (factorsCount[f.tex] !== undefined) {\r\n factorsCount[f.tex].degree++\r\n } else {\r\n factorsCount[f.tex] = {\r\n degree: 1,\r\n factor: f\r\n }\r\n }\r\n }\r\n\r\n // First round to put the 'monom' first\r\n let simpleFactor = new Polynom().one()\r\n\r\n for (let item of Object.values(factorsCount).filter(item => item.factor.monoms.length === 1)) {\r\n simpleFactor.multiply(item.factor)\r\n }\r\n\r\n let tex = simpleFactor.isOne() ? '' : simpleFactor.tex\r\n\r\n // Loop through all factors that contains at least 2 monoms.\r\n for (let item of Object.values(factorsCount).filter(item => item.factor.monoms.length > 1)) {\r\n if (item.factor.length > 1) {\r\n tex += `\\\\left( ${item.factor.tex} \\\\right)${item.degree > 1 ? '^{ ' + item.degree + ' }' : ''}`\r\n }\r\n }\r\n\r\n return tex;\r\n }\r\n\r\n get displayFactors() {\r\n this.factorize()\r\n\r\n if (this.factors.length <= 1) {\r\n return this.display\r\n }\r\n\r\n // Build an array of texFactors with the number of similar items.\r\n let factorsCount: { [Key: string]: { degree: number, factor: Polynom } } = {}\r\n for (let f of this.factors) {\r\n if (factorsCount[f.display] !== undefined) {\r\n factorsCount[f.display].degree++\r\n } else {\r\n factorsCount[f.display] = {\r\n degree: 1,\r\n factor: f\r\n }\r\n }\r\n }\r\n\r\n // First round to put the 'monom' first\r\n let simpleFactor = new Polynom().one()\r\n\r\n for (let item of Object.values(factorsCount).filter(item => item.factor.monoms.length === 1)) {\r\n simpleFactor.multiply(item.factor)\r\n }\r\n\r\n let display = simpleFactor.isOne() ? '' : simpleFactor.display\r\n\r\n // Loop through all factors that contains at least 2 monoms.\r\n for (let item of Object.values(factorsCount).filter(item => item.factor.monoms.length > 1)) {\r\n if (item.factor.length > 1) {\r\n display += `(${item.factor.display})${item.degree > 1 ? '^(' + item.degree + ')' : ''}`\r\n }\r\n }\r\n\r\n return display;\r\n }\r\n\r\n get length() {\r\n // TODO: Must reduce the monoms list to remove the zero coefficient.\r\n return this._monoms.length;\r\n }\r\n\r\n get display(): string {\r\n return this.genDisplay();\r\n }\r\n\r\n get raw(): string {\r\n return this._rawString\r\n }\r\n\r\n get tex(): string {\r\n return this.genDisplay('tex');\r\n }\r\n\r\n get isMultiVariable(): boolean {\r\n const B = false;\r\n for (const m of this._monoms) {\r\n if (m.variables.length > 1) {\r\n return true;\r\n }\r\n }\r\n return B;\r\n }\r\n\r\n get variables(): string[] {\r\n let V: string[] = [];\r\n\r\n for (const m of this._monoms) {\r\n V = V.concat(m.variables);\r\n }\r\n\r\n // Remove duplicates.\r\n V = [...new Set(V)];\r\n V.sort()\r\n return V;\r\n }\r\n\r\n get numberOfVars(): number {\r\n return this.variables.length;\r\n }\r\n\r\n get plotFunction(): string {\r\n return this.genDisplay('tex', false, false, true)\r\n }\r\n\r\n mark_as_dirty = (): void => {\r\n this.dirty_factors = true\r\n this.dirty_zeroes = true\r\n this.euclidianCache = {}\r\n }\r\n\r\n addToken = (stack: Polynom[], element: Token): void => {\r\n switch (element.tokenType) {\r\n case ShutingyardType.COEFFICIENT:\r\n stack.push(new Polynom(element.token))\r\n break\r\n\r\n case ShutingyardType.VARIABLE:\r\n stack.push(new Polynom().add(new Monom(element.token)))\r\n break\r\n\r\n case ShutingyardType.CONSTANT:\r\n // TODO: add constant support to Polynom parsing.\r\n console.log('Actually, not supported - will be added later !')\r\n break\r\n\r\n case ShutingyardType.OPERATION:\r\n if (stack.length >= 2) {\r\n const b = stack.pop(),\r\n a = stack.pop()\r\n\r\n if (element.token === '+') {\r\n stack.push(a.add(b))\r\n } else if (element.token === '-') {\r\n stack.push(a.subtract(b))\r\n } else if (element.token === '*') {\r\n stack.push(a.multiply(b))\r\n } else if (element.token === '/') {\r\n if (b.degree().isStrictlyPositive()) {\r\n console.log('divide by a polynom -> should create a rational polynom !')\r\n } else {\r\n stack.push(a.divide(b.monoms[0].coefficient))\r\n\r\n }\r\n } else if (element.token === '^') {\r\n if (b.degree().isStrictlyPositive()) {\r\n console.error('Cannot elevate a polynom with another polynom !', a.tex, b.tex)\r\n } else {\r\n if (b.monoms[0].coefficient.isRelative()) {\r\n // Integer power\r\n stack.push(a.pow(b.monoms[0].coefficient.value))\r\n } else {\r\n // Only allow power if the previous polynom is only a monom, without coefficient.\r\n if (a.monoms.length === 1 && a.monoms[0].coefficient.isOne()) {\r\n for (let letter in a.monoms[0].literal) {\r\n a.monoms[0].literal[letter].multiply(b.monoms[0].coefficient)\r\n }\r\n stack.push(a)\r\n } else {\r\n console.error('Cannot have power with fraction')\r\n }\r\n }\r\n }\r\n }\r\n } else {\r\n if (element.token === '-') {\r\n stack.push(stack.pop().opposed())\r\n } else {\r\n throw \"Error parsing the polynom \" + this._rawString\r\n }\r\n }\r\n break\r\n\r\n case ShutingyardType.MONOM:\r\n // Should never appear.\r\n console.error('The monom token should not appear here')\r\n break;\r\n\r\n case ShutingyardType.FUNCTION:\r\n // Should never appear.\r\n console.error('The function token should not appear here - might be introduced later.')\r\n break;\r\n }\r\n }\r\n\r\n\r\n // ------------------------------------------\r\n // Creation / parsing functions\r\n\r\n // ------------------------------------------\r\n /**\r\n * Parse a string to a polynom.\r\n * @param inputStr\r\n * @param values: as string, numbers or fractions\r\n */\r\n parse = (inputStr: PolynomParsingType, ...values: unknown[]): Polynom => {\r\n // Reset the main variables.\r\n this._monoms = []\r\n this._factors = []\r\n this.mark_as_dirty()\r\n\r\n // TODO: allow to enter a liste of Fraction (a, b, c, ...) to make a polynom ax^n + bx^(n-1) + cx^(n-2) + ...\r\n if (typeof inputStr === 'string') {\r\n return this._parseString(inputStr, ...values)\r\n } else if (\r\n (typeof inputStr === 'number' || inputStr instanceof Fraction || inputStr instanceof Monom)\r\n && (values === undefined || values.length === 0)\r\n ) {\r\n this._monoms.push(new Monom(inputStr))\r\n } else if (inputStr instanceof Monom && values.length > 0) {\r\n this._monoms.push(new Monom(inputStr))\r\n values.forEach(m => {\r\n this._monoms.push(new Monom(m))\r\n })\r\n } else if (inputStr instanceof Polynom) {\r\n for (const m of inputStr.monoms) {\r\n this._monoms.push(m.clone())\r\n }\r\n }\r\n\r\n return this\r\n };\r\n\r\n /**\r\n * Clone the polynom\r\n */\r\n clone = (): Polynom => {\r\n const P = new Polynom();\r\n const M: Monom[] = [];\r\n\r\n for (const m of this._monoms) {\r\n M.push(m.clone());\r\n }\r\n\r\n P.monoms = M;\r\n\r\n return P;\r\n };\r\n\r\n /**\r\n * Set the polynom to zero.\r\n * @returns {this}\r\n */\r\n zero = (): Polynom => {\r\n this._monoms = [];\r\n this._monoms.push(new Monom().zero());\r\n this._rawString = '0';\r\n this.mark_as_dirty()\r\n return this;\r\n };\r\n\r\n one = (): Polynom => {\r\n this._monoms = [];\r\n this._monoms.push(new Monom().one());\r\n this._rawString = '1';\r\n this.mark_as_dirty()\r\n return this;\r\n }\r\n\r\n empty = (): Polynom => {\r\n this._monoms = [];\r\n this._rawString = '';\r\n this.mark_as_dirty()\r\n return this;\r\n };\r\n\r\n // ------------------------------------------\r\n opposed = (): Polynom => {\r\n this._monoms = this._monoms.map(m => m.opposed());\r\n this.mark_as_dirty()\r\n return this;\r\n };\r\n\r\n\r\n // ------------------------------------------\r\n // Mathematical operations\r\n\r\n add = (...values: unknown[]): Polynom => {\r\n this.mark_as_dirty()\r\n\r\n // @ts-ignore\r\n for (let value of values) {\r\n if (value instanceof Polynom) {\r\n this._monoms = this._monoms.concat(value.monoms);\r\n } else if (value instanceof Monom) {\r\n this._monoms.push(value.clone());\r\n } else if (Number.isSafeInteger(value)) {\r\n this._monoms.push(new Monom(value.toString()));\r\n } else {\r\n this._monoms.push(new Monom(value));\r\n }\r\n }\r\n\r\n return this.reduce();\r\n };\r\n\r\n subtract = (...values: unknown[]): Polynom => {\r\n this.mark_as_dirty()\r\n\r\n for (let value of values) {\r\n if (value instanceof Polynom) {\r\n this._monoms = this._monoms.concat(value.clone().opposed().monoms);\r\n } else if (value instanceof Monom) {\r\n this._monoms.push(value.clone().opposed());\r\n } else if (Number.isSafeInteger(value)) {\r\n this._monoms.push(new Monom(value.toString()).opposed());\r\n } else {\r\n this._monoms.push(new Monom(value).opposed());\r\n }\r\n }\r\n\r\n return this.reduce();\r\n };\r\n\r\n multiply = (value: unknown): Polynom => {\r\n this.mark_as_dirty()\r\n\r\n if (value instanceof Polynom) {\r\n return this.multiplyByPolynom(value);\r\n } else if (value instanceof Fraction) {\r\n return this.multiplyByFraction(value);\r\n } else if (value instanceof Monom) {\r\n return this.multiplyByMonom(value);\r\n } else if (Number.isSafeInteger(value) && typeof value === 'number') {\r\n return this.multiplyByInteger(value);\r\n }\r\n\r\n // Something went wrong...\r\n return this;\r\n }\r\n\r\n /**\r\n * Divide the current polynom by another polynom.\r\n * @param P\r\n * returns {quotient: Polynom, reminder: Polynom}\r\n */\r\n euclidian = (P: Polynom): IEuclidian => {\r\n\r\n if (this.euclidianCache[P.tex] !== undefined) {\r\n return this.euclidianCache[P.tex]\r\n }\r\n\r\n const letter: string = P.variables[0];\r\n const quotient: Polynom = new Polynom().zero();\r\n const reminder: Polynom = this.clone().reorder(letter);\r\n\r\n // There is no variable - means it's a number\r\n if (P.variables.length === 0) {\r\n let q = this.clone().divide(P)\r\n return {\r\n quotient: this.clone().divide(P),\r\n reminder: new Polynom().zero()\r\n }\r\n }\r\n\r\n // Get at least a letter\r\n\r\n const maxMP: Monom = P.monomByDegree(undefined, letter);\r\n const degreeP: Fraction = P.degree(letter);\r\n\r\n let newM: Monom;\r\n\r\n // Make the euclidian division of the two polynoms.\r\n let MaxIteration = this.degree(letter).clone().multiply(2);\r\n while (reminder.degree(letter).geq(degreeP) && MaxIteration.isPositive()) {\r\n MaxIteration.subtract(1)\r\n\r\n // Get the greatest monom divided by the max monom of the divider\r\n newM = reminder.monomByDegree(undefined, letter).clone().divide(maxMP);\r\n\r\n if (newM.isZero()) {\r\n break;\r\n }\r\n\r\n // Get the new quotient and reminder.\r\n quotient.add(newM);\r\n reminder.subtract(P.clone().multiply(newM));\r\n }\r\n\r\n quotient.reduce()\r\n reminder.reduce()\r\n return {quotient, reminder};\r\n };\r\n\r\n divide = (value: unknown): Polynom => {\r\n this.mark_as_dirty()\r\n\r\n if (value instanceof Fraction) {\r\n return this.divideByFraction(value);\r\n } else if (typeof value === 'number' && Number.isSafeInteger(value)) {\r\n return this.divideByInteger(value);\r\n } else if (value instanceof Monom) {\r\n return this.divide(new Polynom(value))\r\n } else if (value instanceof Polynom) {\r\n if (value.monoms.length === 1 && value.variables.length === 0) {\r\n return this.divideByFraction(value.monoms[0].coefficient)\r\n }else {\r\n let {quotient, reminder} = this.euclidian(value)\r\n if(reminder.isZero()){\r\n return quotient\r\n }else{\r\n console.log(`${this.tex} is not divideable by ${value.tex}`)\r\n return new Polynom().zero()\r\n }\r\n }\r\n }\r\n }\r\n\r\n pow = (nb: number): Polynom => {\r\n this.mark_as_dirty()\r\n\r\n if (!Number.isSafeInteger(nb)) {\r\n return this.zero();\r\n }\r\n if (nb < 0) {\r\n return this.zero();\r\n }\r\n if (nb === 0) {\r\n return new Polynom();\r\n }\r\n\r\n const P = this.clone();\r\n for (let i = 1; i < nb; i++) {\r\n this.multiply(P);\r\n }\r\n return this.reduce();\r\n };\r\n\r\n // ------------------------------------------\r\n /**\r\n * Compare the current coefficient with another coefficient\r\n * @param P\r\n * @param sign (string| default is =): authorized values: =, <, <=, >, >= with some variations.\r\n */\r\n compare = (P: Polynom, sign?: string): boolean => {\r\n if (sign === undefined) {\r\n sign = '='\r\n }\r\n\r\n // Create clone version to reduce them without altering the original polynoms.\r\n const cP1 = this.clone().reduce().reorder();\r\n const cP2 = P.clone().reduce().reorder();\r\n\r\n switch (sign) {\r\n case '=':\r\n // They must have the isSame length and the isSame degree\r\n if (cP1.length !== cP2.length || cP1.degree().isNotEqual(cP2.degree())) {\r\n return false;\r\n }\r\n\r\n // Check if the coefficients are the isSame.\r\n for (const i in cP1.monoms) {\r\n if (!cP1.monoms[i].isEqual(cP2.monoms[i])) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n case 'same':\r\n // They must have the isSame length and the isSame degree\r\n if (cP1.length !== cP2.length || cP1.degree() !== cP2.degree()) {\r\n return false;\r\n }\r\n\r\n for (const i in cP1.monoms) {\r\n if (!cP1.monoms[i].isSameAs(cP2.monoms[i])) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n default:\r\n return false;\r\n }\r\n };\r\n\r\n isZero(): boolean {\r\n return (this._monoms.length === 1 && this._monoms[0].coefficient.isZero()) || this._monoms.length === 0;\r\n }\r\n\r\n isOne(): boolean {\r\n return this._monoms.length === 1 && this._monoms[0].coefficient.isOne();\r\n }\r\n\r\n isEqual = (P: Polynom): boolean => {\r\n return this.compare(P, '=');\r\n };\r\n\r\n isSameAs = (P: Polynom): boolean => {\r\n return this.compare(P, 'same');\r\n };\r\n\r\n isOpposedAt = (P: Polynom): boolean => {\r\n return this.compare(P.clone().opposed(), '=');\r\n };\r\n\r\n isFactorized = (polynomString: string, soft?: boolean): boolean => {\r\n let P;\r\n\r\n // Check if polynom is complete...\r\n if (polynomString.split('(').length !== polynomString.split(')').length) {\r\n return false\r\n }\r\n\r\n // Try to build the polynom\r\n try {\r\n P = new Polynom(polynomString);\r\n } catch (e) {\r\n return false;\r\n }\r\n\r\n // Both polynom aren't the same (once developed and reduced => they cannot be equivalent)\r\n if (!this.isEqual(P)) {\r\n return false;\r\n }\r\n\r\n // Check if the provided (string) version is fully factorized.\r\n // Run a regex on the string.\r\n let polynomStringNormalized = polynomString.replaceAll('*', ''),\r\n polynomStringReduced = '' + polynomStringNormalized,\r\n factors: string[] = [];\r\n\r\n for (let x of polynomStringNormalized.matchAll(/\\(([a-z0-9+\\-]+)\\)(\\^[0-9]*)?/g)) {\r\n\r\n if (x[2] !== undefined) {\r\n // if there is an exponential value, add it multiple times\r\n for (let i = 0; i < +x[2].substring(1); i++) {\r\n factors.push(x[1])\r\n }\r\n } else {\r\n // no power - add it once.\r\n factors.push(x[1]);\r\n }\r\n\r\n // Remove the current polynom\r\n polynomStringReduced = polynomStringReduced.replaceAll(x[0], '');\r\n }\r\n if (polynomStringReduced !== '') {\r\n factors.push(polynomStringReduced);\r\n }\r\n let polyFactors = factors.map(x => new Polynom(x));\r\n\r\n // polyFactors contain all polynoms.\r\n let checkPolyFactors = polyFactors.filter(x=>x.degree().geq(1) && !x.commonMonom().isOne())\r\n\r\n // Some polynoms are not completely factorized.\r\n if(checkPolyFactors.length>0 && !soft){return false}\r\n if(checkPolyFactors.length>0 && soft){\r\n polyFactors = polyFactors.filter(x=>x.commonMonom().isOne())\r\n\r\n let FactorizedConstant = new Fraction().one()\r\n for(let p of checkPolyFactors){\r\n let k = p.commonMonom(),\r\n pFactor = p.clone().divide(k)\r\n\r\n if(k.degree().isZero()){\r\n FactorizedConstant.multiply(k.coefficient)\r\n polyFactors.push(pFactor.clone())\r\n }\r\n }\r\n }\r\n\r\n\r\n // Factorize the current polynom.\r\n this.factorize();\r\n\r\n // Compare the given factors with the generated factors\r\n let sign = 1,\r\n notFoundedFactors = []\r\n for (let f of this.factors) {\r\n // The factor is just a coefficient. Might be opposed\r\n if (f.degree().isZero()) {\r\n if (f.monoms[0].coefficient.isNegativeOne()) {\r\n sign = -sign\r\n }\r\n }\r\n\r\n let factorFound = false\r\n for (let i = 0; i < polyFactors.length; i++) {\r\n if (f.isEqual(polyFactors[i])) {\r\n polyFactors.splice(i, 1);\r\n factorFound = true\r\n break;\r\n } else if (f.isOpposedAt(polyFactors[i])) {\r\n polyFactors.splice(i, 1);\r\n sign = -sign;\r\n factorFound = true\r\n break;\r\n }\r\n }\r\n\r\n if (!factorFound) {\r\n notFoundedFactors.push(f.clone())\r\n }\r\n }\r\n\r\n // The polyfactors must be empty and the cumulative opposite factors must be 1.\r\n return (polyFactors.length === 0 && sign === 1);\r\n }\r\n\r\n\r\n // ------------------------------------------\r\n // Compare functions\r\n\r\n isReduced = (polynomString: string): Boolean => {\r\n // The polynom must be developed to be reduced.\r\n if (!this.isDeveloped(polynomString)) {\r\n return false\r\n }\r\n\r\n let P = new Polynom(polynomString)\r\n if (P.monoms.length > this.monoms.length) {\r\n return false\r\n }\r\n\r\n // TODO: Not ur the reduced systme checking is working properly !\r\n for (let m of P.monoms) {\r\n if (!m.coefficient.isReduced()) {\r\n return false\r\n }\r\n }\r\n\r\n return false\r\n }\r\n\r\n isDeveloped = (polynomString: string): Boolean => {\r\n let P: Polynom;\r\n\r\n // Start by removing the parenthis after a \"power\"\r\n let pString = polynomString.replaceAll(/\\^\\(([-0-9/]+)\\)/g, '$1')\r\n\r\n // There is at least one parenthese - it is not developed.\r\n if (pString.includes('(') || pString.includes(')')) {\r\n return false\r\n }\r\n\r\n // Try to build the polynom\r\n try {\r\n // Build the polynom\r\n P = new Polynom(polynomString);\r\n } catch (e) {\r\n return false;\r\n }\r\n\r\n // Both polynom aren't the same (once developed and reduced => they cannot be equivalent)\r\n if (!this.isEqual(P)) {\r\n return false;\r\n }\r\n\r\n // Check that everything is completely developed. Actually, there are no parentheses... so it is fully developed\r\n return true\r\n\r\n // // maybe it wasn't reduced and not ordered...\r\n // // compare polynom string.\r\n //\r\n // // normalize the string\r\n // let polynomStringNormalized = polynomString.replaceAll('[*\\s]', '')\r\n //\r\n // // Determine if it's the exact same string.\r\n // // TODO: Maybe it's enough to just make this test !a\r\n // return polynomStringNormalized === P.reduce().reorder().display\r\n }\r\n\r\n // -------------------------------------\r\n reduce = (): Polynom => {\r\n // Reduce the polynom\r\n let values = [...this._monoms],\r\n vars = [...this.variables]\r\n\r\n this._monoms = []\r\n\r\n let coeffs = values.filter(x => x.variables.length === 0)\r\n\r\n if (coeffs.length > 0) {\r\n this._monoms.push(coeffs.reduce((a, b) => a.add(b)))\r\n }\r\n\r\n // Build the new monoms\r\n for (let letter of vars) {\r\n // Monom with same letters, but might be of different degrees\r\n let M = values.filter(x => x.hasLetter(letter))\r\n\r\n while (M.length > 0) {\r\n // Take the first element\r\n const m = M.shift(), degree = m.degree(letter)\r\n\r\n for (let a of M.filter(x => x.degree(letter).isEqual(degree))) {\r\n m.add(a)\r\n }\r\n\r\n this._monoms.push(m)\r\n\r\n // Make the new array.\r\n M = M.filter(x => x.degree(letter).isNotEqual(degree))\r\n }\r\n // reduce the monom\r\n\r\n }\r\n\r\n // Remove all null monoms\r\n this._monoms = this._monoms.filter((m) => {\r\n return m.coefficient.value !== 0\r\n });\r\n\r\n // Reduce all monoms coefficient.\r\n for (const m of this._monoms) {\r\n m.coefficient.reduce();\r\n }\r\n\r\n if (this.length === 0) {\r\n return new Polynom().zero();\r\n }\r\n return this.reorder();\r\n };\r\n\r\n reorder = (letter: string = 'x', revert?: boolean): Polynom => {\r\n if(revert===undefined){revert = false}\r\n\r\n // TODO: Must handle multiple setLetter reorder system\r\n let otherLetters = this.variables.filter(x => x !== letter)\r\n this._monoms.sort(function (a, b) {\r\n let da = a.degree(letter).value,\r\n db = b.degree(letter).value\r\n\r\n // Values are different\r\n if (da !== db) return revert?da-db : db - da\r\n\r\n // if values are equals, check other letters - it must be revert in that case !\r\n if (otherLetters.length > 0) {\r\n for (let L of otherLetters) {\r\n let da = a.degree(L).value,\r\n db = b.degree(L).value\r\n\r\n // Values are different\r\n if (da !== db) return revert?da - db : db - da\r\n }\r\n }\r\n\r\n return 0\r\n // return b.degree(letter).clone().subtract(a.degree(letter)).value\r\n });\r\n\r\n return this;\r\n };\r\n\r\n degree = (letter?: string): Fraction => {\r\n let d: Fraction = new Fraction().zero();\r\n for (const m of this._monoms) {\r\n d = Fraction.max(m.degree(letter).value, d);\r\n }\r\n return d;\r\n };\r\n\r\n letters = (): string[] => {\r\n let L: string[] = [], S = new Set();\r\n\r\n for (let m of this._monoms) {\r\n S = new Set([...S, ...m.variables]);\r\n }\r\n\r\n // @ts-ignore\r\n return [...S];\r\n }\r\n\r\n /**\r\n * Replace a variable (letter) by a polynom.\r\n * @param letter\r\n * @param P\r\n */\r\n replaceBy = (letter: string, P: Polynom): Polynom => {\r\n this.mark_as_dirty()\r\n\r\n let pow: Fraction;\r\n const resultPolynom: Polynom = new Polynom().zero();\r\n\r\n for (const m of this.monoms) {\r\n if (m.literal[letter] === undefined || m.literal[letter].isZero()) {\r\n resultPolynom.add(m.clone());\r\n } else {\r\n // We have found a setLetter.\r\n // Get the power and reset it.\r\n pow = m.literal[letter].clone();\r\n delete m.literal[letter];\r\n\r\n // TODO: replaceBy works only with positive and natural pow\r\n resultPolynom.add(P.clone().pow(Math.abs(pow.numerator)).multiply(m));\r\n }\r\n }\r\n\r\n this._monoms = resultPolynom.reduce().reorder().monoms;\r\n return this;\r\n };\r\n\r\n // Evaluate a polynom.\r\n evaluate = (values: literalType | Fraction | number): Fraction => {\r\n const r = new Fraction().zero();\r\n\r\n this._monoms.forEach(monom => {\r\n //console.log('Evaluate polynom: ', monom.display, values, monom.evaluate(values).display);\r\n r.add(monom.evaluate(values));\r\n });\r\n\r\n return r;\r\n };\r\n\r\n evaluateAsNumeric = (values: { [Key: string]: number } | number): number => {\r\n let r = 0\r\n this._monoms.forEach(monom => {\r\n r += monom.evaluateAsNumeric(values)\r\n })\r\n\r\n return r\r\n }\r\n\r\n derivative = (letter?: string): Polynom => {\r\n let dP = new Polynom();\r\n\r\n for (let m of this._monoms) {\r\n dP.add(m.derivative(letter));\r\n }\r\n return dP;\r\n }\r\n // ------------------------------------------\r\n // Misc polynoms functions\r\n\r\n primitive = (letter?: string): Polynom => {\r\n let dP = new Polynom();\r\n\r\n for (let m of this._monoms) {\r\n dP.add(m.primitive(letter))\r\n }\r\n return dP\r\n }\r\n\r\n integrate = (a: Fraction | number, b: Fraction | number, letter?: string): Fraction => {\r\n const primitive = this.primitive(letter)\r\n\r\n if (letter === undefined) {\r\n letter = 'x'\r\n }\r\n\r\n let valuesA: literalType = {},\r\n valuesB: literalType = {}\r\n valuesA[letter] = new Fraction(a);\r\n valuesB[letter] = new Fraction(b);\r\n\r\n return primitive.evaluate(valuesB).subtract(primitive.evaluate(valuesA))\r\n }\r\n\r\n // -------------------------------------\r\n /**\r\n * Factorize a polynom and store the best results in factors.\r\n * @param maxValue Defines the greatest value to search to (default is 20).\r\n */\r\n factorize = (letter?: string): Polynom[] => {\r\n if (!this.dirty_factors) {\r\n return this._factors\r\n }\r\n\r\n let factors: Polynom[] = [];\r\n let P = this.clone().reorder()\r\n\r\n // Extract the common monom\r\n // 2x^3+6x^2 => 2x^2\r\n let M = P.commonMonom()\r\n // If the polynom starts with a negative monom, factorize it.\r\n if (P.monomByDegree().coefficient.isStrictlyNegative() && M.coefficient.isStrictlyPositive() && !M.isOne()) {\r\n M.opposed()\r\n }\r\n\r\n if (!M.isOne()) {\r\n let tempPolynom: Polynom = new Polynom(M)\r\n factors = [tempPolynom.clone()]\r\n P = P.euclidian(tempPolynom).quotient;\r\n }\r\n\r\n // Main loop\r\n let securityLoop = P.degree().clone().multiply(2).value,\r\n maxDegree = 1\r\n while (securityLoop >= 0) {\r\n securityLoop--\r\n if (P.monoms.length < 2) {\r\n // The polynom has only one monom => 7x^2\r\n // No need to continue.\r\n if (!P.isOne()) {\r\n factors.push(P.clone())\r\n P.one()\r\n }\r\n break\r\n } else if (P.degree(letter).isOne()) {\r\n // The polynom is a first degree polynom => 3x-5\r\n // No need to continue\r\n factors.push(P.clone())\r\n P.one()\r\n break\r\n } else {\r\n // Create the list of all \"potential\" polynom dividers.\r\n let allDividers: Polynom[] = this._getAllPotentialFactors(P, maxDegree, letter)\r\n maxDegree = P.degree(letter).value\r\n\r\n // Actually: 100ms\r\n while (allDividers.length > 0) {\r\n let div = allDividers[0]\r\n\r\n if (!P.isDividableBy(div)) {\r\n // Not dividable. Remove it from the list\r\n allDividers.shift()\r\n } else {\r\n // It's dividable - so make the division\r\n let result = P.euclidian(div)\r\n\r\n // Add the factor\r\n factors.push(div)\r\n\r\n // As it's dividable, get the quotient.\r\n P = result.quotient.clone()\r\n\r\n // filter all dividers that are no more suitable.\r\n allDividers = allDividers.filter(x => {\r\n let pX = P.monoms[0],\r\n pC = P.monoms[P.monoms.length - 1],\r\n dX = x.monoms[0],\r\n dC = x.monoms[x.monoms.length - 1]\r\n\r\n // Check last item (degree zero)\r\n if (!pC.isDivisible(dC)) {\r\n return false\r\n }\r\n\r\n // Check the first item (degree max)\r\n if (!pX.isDivisible(dX)) {\r\n return false\r\n }\r\n\r\n return true\r\n })\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Maybe there is still something in the Polynom (not everything was possible to factorize)\r\n if (!P.isOne()) {\r\n factors.push(P.clone())\r\n }\r\n\r\n // Save the factors\r\n this._factors = factors\r\n\r\n // The factors list is no more dirty\r\n this.dirty_factors = false\r\n\r\n return this._factors;\r\n }\r\n\r\n isDividableBy = (div: Polynom): boolean => {\r\n // Quick evaluation.\r\n if (div.degree().isOne()) {\r\n let zero = div.getZeroes()[0]\r\n\r\n if (zero.exact instanceof Fraction) {\r\n return this.evaluate(zero.exact).isZero()\r\n } else {\r\n return false\r\n }\r\n } else {\r\n this.euclidianCache[div.tex] = this.euclidian(div)\r\n return this.euclidianCache[div.tex].reminder.isZero()\r\n }\r\n }\r\n // TODO: get zeroes for more than first degree and for more than natural degrees\r\n getZeroes = (): ISolution[] => {\r\n if (this.dirty_zeroes) {\r\n let equ = new Equation(this.clone(), 0)\r\n equ.solve()\r\n this._zeroes = equ.solutions\r\n this.dirty_zeroes = false\r\n }\r\n\r\n return this._zeroes\r\n };\r\n\r\n // TODO: analyse the next functions to determine if they are useful or not...\r\n monomByDegree = (degree?: Fraction | number, letter?: string): Monom => {\r\n if (degree === undefined) {\r\n // return the highest degree monom.\r\n return this.monomByDegree(this.degree(letter), letter);\r\n }\r\n\r\n // Reduce the polynom.\r\n const M = this.clone().reduce();\r\n for (const m of M._monoms) {\r\n if (m.degree(letter).isEqual(degree)) {\r\n return m.clone();\r\n }\r\n }\r\n\r\n // Nothing was found - return the null monom.\r\n return new Monom().zero();\r\n };\r\n\r\n monomsByDegree = (degree?: number | Fraction, letter?: string): Monom[] => {\r\n if (degree === undefined) {\r\n // return the highest degree monom.\r\n return this.monomsByDegree(this.degree(letter));\r\n }\r\n\r\n // Reduce the polynom.\r\n let Ms: Monom[] = [];\r\n\r\n const M = this.clone().reduce();\r\n for (const m of M._monoms) {\r\n if (m.degree(letter) === degree) {\r\n Ms.push(m.clone())\r\n }\r\n }\r\n\r\n return Ms\r\n // Nothing was found - retur\r\n }\r\n\r\n // Used in LinearSystem.tex\r\n monomByLetter = (letter: string): Monom => {\r\n const M = this.clone().reduce();\r\n for (const m of M._monoms) {\r\n if (m.hasLetter(letter)) {\r\n return m.clone();\r\n }\r\n }\r\n\r\n return new Monom().zero();\r\n };\r\n\r\n // Next functions are used for for commonMonom, which is used in the factorize method.\r\n getDenominators = (): number[] => {\r\n const denominators: number[] = [];\r\n for (const m of this._monoms) {\r\n denominators.push(m.coefficient.denominator);\r\n }\r\n return denominators;\r\n };\r\n\r\n getNumerators = (): number[] => {\r\n const numerators: number[] = [];\r\n for (const m of this._monoms) {\r\n numerators.push(m.coefficient.numerator);\r\n }\r\n return numerators;\r\n };\r\n\r\n lcmDenominator = (): number => {\r\n return Numeric.lcm(...this.getDenominators());\r\n };\r\n // ------------------------------------------\r\n // Polynoms factorization functions\r\n\r\n gcdDenominator = (): number => {\r\n return Numeric.gcd(...this.getDenominators());\r\n };\r\n\r\n lcmNumerator = (): number => {\r\n return Numeric.lcm(...this.getNumerators());\r\n };\r\n\r\n gcdNumerator = (): number => {\r\n return Numeric.gcd(...this.getNumerators());\r\n };\r\n // ------------------------------------------\r\n // Polynoms helpers functions\r\n // -------------------------------------\r\n\r\n commonMonom = (): Monom => {\r\n let M = new Monom().one(), numerator: number, denominator: number, degree = this.degree();\r\n\r\n numerator = this.gcdNumerator();\r\n denominator = this.gcdDenominator();\r\n\r\n M.coefficient = new Fraction(numerator, denominator);\r\n for (let L of this.variables) {\r\n // Initialize the setLetter with the max degree\r\n M.setLetter(L, degree);\r\n for (let m of this._monoms) {\r\n M.setLetter(L, Fraction.min(m.degree(L), M.degree(L)));\r\n if (M.degree(L).isZero()) {\r\n break;\r\n }\r\n }\r\n }\r\n return M;\r\n }\r\n\r\n limitToInfinity = (letter?: string): Fraction => {\r\n const M = this.monomByDegree(undefined, letter),\r\n sign = M.coefficient.sign(),\r\n degree = M.degree(letter)\r\n\r\n if (degree.isStrictlyPositive()) {\r\n return sign === 1 ? (new Fraction()).infinite() : (new Fraction()).infinite().opposed()\r\n } else if (degree.isZero()) {\r\n return M.coefficient\r\n }\r\n\r\n // Any other cases\r\n return (new Fraction()).zero()\r\n }\r\n limitToNegativeInfinity = (letter?: string): Fraction => {\r\n const M = this.monomByDegree(undefined, letter),\r\n sign = M.coefficient.sign(),\r\n degree = M.degree(letter)\r\n\r\n if (degree.isStrictlyPositive()) {\r\n return sign === -1 ? (new Fraction()).infinite() : (new Fraction()).infinite().opposed()\r\n } else if (degree.isZero()) {\r\n return M.coefficient\r\n }\r\n\r\n // Any other cases\r\n return (new Fraction()).zero()\r\n }\r\n\r\n private _getAllPotentialFactors = (P: Polynom, maxDegree: number, letter: string): Polynom[] => {\r\n let m1 = P.monoms[0].dividers,\r\n m2 = P.monoms[P.monoms.length - 1].dividers\r\n\r\n let allDividers: Polynom[] = []\r\n m1.forEach(m1d => {\r\n // Get only polynom that has a degree less than a specific value\r\n if (m1d.degree(letter).leq(maxDegree)) {\r\n m2.forEach(m2d => {\r\n if (m1d.degree(letter).isNotEqual(m2d.degree(letter))) {\r\n allDividers.push(new Polynom(m1d, m2d))\r\n allDividers.push(new Polynom(m1d, m2d.clone().opposed()))\r\n }\r\n })\r\n }\r\n })\r\n\r\n return allDividers\r\n\r\n }\r\n\r\n private _parseString(inputStr: string, ...values: unknown[]): Polynom {\r\n if (values === undefined || values.length === 0) {\r\n inputStr = '' + inputStr;\r\n this._rawString = inputStr.trim().replaceAll(' ', '');\r\n\r\n // Parse the polynom using the shutting yard algorithm\r\n if (inputStr !== '' && !isNaN(Number(inputStr))) {\r\n this.empty();\r\n // It's a simple number.\r\n let m = new Monom(inputStr);\r\n // m.coefficient = new Fraction(inputStr);\r\n // m.literalStr = '';\r\n this.add(m);\r\n return this;\r\n }\r\n\r\n // Parse the string.\r\n return this.shutingYardToReducedPolynom(inputStr);\r\n } else if (/^[a-z]/.test(inputStr)) {\r\n // We assume the inputStr contains only letters.\r\n this.empty();\r\n\r\n let fractions = values.map(x => new Fraction(x));\r\n // Multiple setLetter version\r\n if (inputStr.length > 1) {\r\n // TODO: check that the number of values given correspond to the letters (+1 eventually)\r\n let letters = inputStr.split(''),\r\n i = 0;\r\n for (let F of fractions) {\r\n let m = new Monom();\r\n m.coefficient = F.clone();\r\n m.literalStr = letters[i] || '';\r\n this.add(m);\r\n i++;\r\n }\r\n }\r\n // Single setLetter version\r\n else {\r\n let n = fractions.length - 1;\r\n for (let F of fractions) {\r\n let m = new Monom()\r\n m.coefficient = F.clone();\r\n m.literalStr = `${inputStr}^${n}`\r\n this.add(m);\r\n n--;\r\n }\r\n }\r\n return this;\r\n } else {\r\n return this.zero();\r\n }\r\n }\r\n\r\n private genDisplay = (output?: string, forceSign?: boolean, wrapParentheses?: boolean, withAllMultSign?: boolean): string => {\r\n let P: string = '';\r\n\r\n for (const k of this._monoms) {\r\n if (k.coefficient.value === 0) {\r\n continue;\r\n }\r\n\r\n // The monom to be displayed\r\n let m\r\n if (withAllMultSign) {\r\n m = k.plotFunction\r\n } else {\r\n m = (output === 'tex') ? k.tex : k.display\r\n }\r\n\r\n P += `${(k.coefficient.sign() === 1 && (P !== '' || forceSign === true)) ? '+' : ''}${m}`;\r\n }\r\n\r\n if (wrapParentheses === true && this.length > 1) {\r\n if (output === 'tex') {\r\n P = `\\\\left( ${P} \\\\right)`;\r\n } else {\r\n P = `(${P})`;\r\n }\r\n }\r\n\r\n if (P === '') {\r\n P = '0';\r\n }\r\n return P;\r\n };\r\n\r\n /**\r\n * Main parse using a shutting yard class\r\n * @param inputStr\r\n */\r\n private shutingYardToReducedPolynom = (inputStr: string): Polynom => {\r\n // Get the RPN array of the current expression\r\n const SY: Shutingyard = new Shutingyard().parse(inputStr);\r\n const rpn: { token: string, tokenType: string }[] = SY.rpn;\r\n\r\n // New version for reducing shuting yard.\r\n this.zero()\r\n\r\n let stack: Polynom[] = [],\r\n monom: Monom = new Monom()\r\n\r\n // Loop through the\r\n for (const element of rpn) {\r\n this.addToken(stack, element);\r\n }\r\n\r\n if (stack.length === 1) {\r\n this.add(stack[0])\r\n }\r\n\r\n return this.reorder()\r\n }\r\n\r\n private multiplyByPolynom = (P: Polynom): Polynom => {\r\n const M: Monom[] = [];\r\n for (const m1 of this._monoms) {\r\n for (const m2 of P.monoms) {\r\n M.push(Monom.xmultiply(m1, m2));\r\n }\r\n }\r\n\r\n this._monoms = M;\r\n return this.reduce();\r\n };\r\n\r\n private multiplyByFraction = (F: Fraction): Polynom => {\r\n for (const m of this._monoms) {\r\n m.coefficient.multiply(F);\r\n }\r\n\r\n return this.reduce();\r\n };\r\n\r\n private multiplyByInteger = (nb: number): Polynom => {\r\n return this.multiplyByFraction(new Fraction(nb));\r\n };\r\n\r\n private multiplyByMonom = (M: Monom): Polynom => {\r\n for (const m of this._monoms) {\r\n m.multiply(M)\r\n }\r\n return this.reduce();\r\n };\r\n\r\n private divideByInteger = (nb: number): Polynom => {\r\n const nbF = new Fraction(nb);\r\n for (const m of this._monoms) {\r\n m.coefficient.divide(nbF);\r\n }\r\n return this;\r\n };\r\n\r\n private divideByFraction = (F: Fraction): Polynom => {\r\n for (const m of this._monoms) {\r\n m.coefficient.divide(F);\r\n }\r\n return this;\r\n };\r\n\r\n private _factorize2ndDegree = (letter: string): Polynom[] => {\r\n let P1: Polynom, P2: Polynom,\r\n a, b, c, delta, x1, x2, factor;\r\n\r\n // One variable only\r\n if (this.numberOfVars === 1) {\r\n a = this.monomByDegree(2, letter).coefficient;\r\n b = this.monomByDegree(1, letter).coefficient;\r\n c = this.monomByDegree(0, letter).coefficient;\r\n delta = b.clone().pow(2).subtract(a.clone().multiply(c).multiply(4));\r\n\r\n if (delta.isZero()) {\r\n x1 = b.clone().opposed().divide(a.clone().multiply(2))\r\n P1 = new Polynom(letter).subtract(x1.display).multiply(x1.denominator)\r\n P2 = new Polynom(letter).subtract(x1.display).multiply(x1.denominator)\r\n factor = a.divide(x1.denominator).divide(x1.denominator);\r\n\r\n if (!factor.isOne()) {\r\n // TODO: Update new Polynom to accept anything...\r\n return [new Polynom(factor.display), P1, P2]\r\n } else {\r\n return [P1, P2]\r\n }\r\n } else if (delta.isPositive() && delta.isSquare()) {\r\n x1 = b.clone().opposed()\r\n .add(delta.clone().sqrt())\r\n .divide(a.clone().multiply(2))\r\n x2 = b.clone().opposed()\r\n .subtract(delta.clone().sqrt())\r\n .divide(a.clone().multiply(2))\r\n\r\n // (2x+5)(3x-2)\r\n // 6x^2+11x-10\r\n // a = 6, b = 11, c = -10\r\n // delta = 121-4*6*(-10) = 361= 19^2\r\n // x1 = (-11 + 19) / 12 = 8/12 = 2/3\r\n // x2 = (-11 - 19) / 12 = -30/12 = -5/2\r\n factor = a.divide(x1.denominator).divide(x2.denominator);\r\n if (factor.isOne()) {\r\n return [\r\n new Polynom(letter).subtract(x1.display).multiply(x1.denominator),\r\n new Polynom(letter).subtract(x2.display).multiply(x2.denominator),\r\n ]\r\n } else {\r\n return [\r\n new Polynom(factor.display),\r\n new Polynom(letter).subtract(x1.display).multiply(x1.denominator),\r\n new Polynom(letter).subtract(x2.display).multiply(x2.denominator),\r\n ]\r\n\r\n }\r\n } else {\r\n // No solution possible - return the complete value.\r\n return [this.clone()]\r\n }\r\n } else {\r\n // If multiple variables, only handle perfect squares...\r\n a = this.monomByDegree(2, letter);\r\n b = this.monomByDegree(1, letter);\r\n c = this.monomByDegree(0, letter);\r\n\r\n\r\n if (a.isLiteralSquare() && c.isLiteralSquare()) {\r\n // Check the middle item is same as...\r\n if (b.clone().pow(2).isSameAs(a.clone().multiply(c))) {\r\n // Determine if the coefficient values matches.\r\n\r\n // Search 4 values (r, s, t, u) that matches:\r\n // (r X + s Y)(t X + u Y) = rt X^2 + (ru + st) XY + su Y^2\r\n\r\n let xPolynom = new Polynom('x', a.coefficient, b.coefficient, c.coefficient);\r\n let xFactors = xPolynom._factorize2ndDegree('x');\r\n\r\n let factors = [], xyzPolynom: Polynom;\r\n\r\n if (xFactors.length >= 2) {\r\n for (let p of xFactors) {\r\n if (p.degree().isZero()) {\r\n factors.push(p.clone())\r\n } else {\r\n xyzPolynom = p.clone();\r\n xyzPolynom.monoms[0].literal = a.literalSqrt\r\n xyzPolynom.monoms[1].literal = c.literalSqrt\r\n factors.push(xyzPolynom.clone())\r\n }\r\n }\r\n return factors\r\n }\r\n }\r\n }\r\n\r\n return [this.clone()]\r\n }\r\n }\r\n\r\n private _factorizeByGroups = (): Polynom[] => {\r\n // TODO: Factorize by groups.\r\n return [];\r\n }\r\n}\r\n","/**\r\n * Rational polynom module contains everything necessary to handle rational polynoms.\r\n * @module Polynom\r\n */\r\n\r\nimport {IEuclidian, Polynom} from \"./polynom\";\r\nimport {Fraction} from \"../coefficients/fraction\";\r\nimport {literalType} from \"./monom\";\r\nimport {PARTICULAR_SOLUTION} from \"./equation\";\r\nimport {RationalStudy} from \"./study/rationalStudy\";\r\nimport {StudyConfig} from \"./study\";\r\n\r\n/**\r\n * Rational class can handle rational polynoms\r\n */\r\nexport class Rational {\r\n private _denominator: Polynom;\r\n private _numerator: Polynom;\r\n private _rawString: string;\r\n\r\n /**\r\n *\r\n * @param numerator\r\n * @param denominator\r\n */\r\n constructor(numerator?: Polynom | string, denominator?: Polynom | string) {\r\n if (numerator instanceof Polynom) {\r\n this._numerator = numerator.clone()\r\n } else if (typeof numerator === 'string') {\r\n this._numerator = new Polynom(numerator)\r\n } else {\r\n this._numerator = new Polynom()\r\n }\r\n\r\n if (denominator instanceof Polynom) {\r\n this._denominator = denominator.clone()\r\n } else if (typeof denominator === 'string') {\r\n this._denominator = new Polynom(denominator)\r\n } else {\r\n this._denominator = new Polynom()\r\n }\r\n\r\n }\r\n\r\n get numerator(): Polynom {\r\n return this._numerator\r\n }\r\n\r\n get denominator(): Polynom {\r\n return this._denominator\r\n }\r\n\r\n get tex(): string {\r\n return `\\\\frac{ ${this._numerator.tex} }{ ${this._denominator.tex} }`;\r\n }\r\n\r\n get display(): string {\r\n return `(${this._numerator.display})/(${this._denominator.display})`;\r\n }\r\n\r\n get texFactors(): string {\r\n return `\\\\frac{ ${this._numerator.texFactors} }{ ${this._denominator.texFactors} }`\r\n }\r\n\r\n get plotFunction(): string {\r\n return `(${this._numerator.plotFunction})/(${this._denominator.plotFunction})`\r\n }\r\n\r\n clone = (): Rational => {\r\n return new Rational(\r\n this._numerator.clone(),\r\n this._denominator.clone()\r\n )\r\n }\r\n\r\n domain = (): string => {\r\n let zeroes = this._denominator.getZeroes();\r\n\r\n if (zeroes.length === 0 || zeroes[0].tex === PARTICULAR_SOLUTION.real) {\r\n return PARTICULAR_SOLUTION.varnothing\r\n } else if (zeroes[0].tex === PARTICULAR_SOLUTION.varnothing) {\r\n return PARTICULAR_SOLUTION.real\r\n } else {\r\n return '\\\\mathbb{R}\\\\setminus\\\\left\\\\{' +\r\n zeroes.map(x => x.tex).join(';') + '\\\\right\\\\}'\r\n }\r\n }\r\n\r\n amplify = (P: Polynom): Rational => {\r\n this._numerator.multiply(P);\r\n this._denominator.multiply(P);\r\n\r\n return this;\r\n }\r\n\r\n derivative = (letter?: string): Rational => {\r\n let N = this._numerator.clone(),\r\n D = this._denominator.clone(),\r\n dN = N.clone().derivative(letter),\r\n dD = D.clone().derivative(letter)\r\n\r\n this._numerator = dN.clone().multiply(D).subtract(N.clone().multiply(dD))\r\n this._denominator = D.clone().pow(2)\r\n\r\n return this\r\n }\r\n\r\n factorize = (letter?: string): Rational => {\r\n this._numerator.factorize(letter)\r\n this._denominator.factorize(letter)\r\n return this\r\n }\r\n\r\n simplify = (P: Polynom): Rational => {\r\n let NumeratorEuclidien = this._numerator.euclidian(P);\r\n if (!NumeratorEuclidien.reminder.isZero()) {\r\n return this;\r\n }\r\n\r\n let DenominatorEuclidien = this._denominator.euclidian(P);\r\n if (!DenominatorEuclidien.reminder.isZero()) {\r\n return this;\r\n }\r\n\r\n this._numerator = NumeratorEuclidien.quotient;\r\n this._denominator = DenominatorEuclidien.quotient;\r\n return this;\r\n }\r\n\r\n reduce = (): Rational => {\r\n this._numerator.factorize();\r\n for (let f of this._numerator.factors) {\r\n\r\n if(f.degree().isZero()){\r\n // Do the simplify only if the factor can divide the denominator\r\n if(this._denominator.commonMonom().coefficient.clone().divide(f.monomByDegree().coefficient).isNatural()){\r\n this.simplify(f);\r\n }\r\n }else {\r\n this.simplify(f);\r\n }\r\n }\r\n\r\n return this;\r\n }\r\n\r\n opposed = (): Rational => {\r\n this._numerator.opposed();\r\n return this;\r\n }\r\n\r\n add = (R: Rational): Rational => {\r\n // 1. Make sure both rational are at the same denominator\r\n // 2. Add the numerators.\r\n // 3. Simplify\r\n\r\n // Store the adding denominator\r\n let denominator = this._denominator.clone()\r\n\r\n // Amplif the main rational polynom by the adding denominator\r\n this.amplify(R._denominator)\r\n\r\n // Add to the numerator the adding value...\r\n this._numerator.add(R._numerator.clone().multiply(denominator));\r\n\r\n return this;\r\n }\r\n\r\n subtract = (R: Rational): Rational => {\r\n return this.add(R.clone().opposed())\r\n }\r\n\r\n euclidian = (): IEuclidian => {\r\n return this._numerator.euclidian(this._denominator)\r\n }\r\n\r\n // TODO : where and how is used limits ?\r\n limits = (value: Fraction | number, offset?: string, letter?: string): Fraction => {\r\n if (value === Infinity || value === -Infinity) {\r\n let {quotient, reminder} = this._numerator.clone().euclidian(this._denominator)\r\n\r\n // quotient is positive => it will be infinite.\r\n if (quotient.degree(letter).isStrictlyPositive()) {\r\n return value === Infinity ? quotient.limitToInfinity(letter) : quotient.limitToNegativeInfinity(letter)\r\n // return quotient.monomByDegree(undefined, letter).coefficient.sign()===1?(new Fraction()).infinite():(new Fraction()).infinite().opposed()\r\n } else {\r\n return quotient.monomByDegree(undefined, letter).coefficient\r\n }\r\n } else {\r\n let evalValues: literalType = {},\r\n evalValuesOffset: literalType = {},\r\n theLimit: Fraction | number,\r\n theSign: number,\r\n FR = this.clone().reduce()\r\n\r\n evalValues[letter === undefined ? 'x' : letter] = new Fraction(value)\r\n\r\n if (offset !== 'above' && offset !== 'below') {\r\n theLimit = FR._numerator.evaluate(evalValues)\r\n .divide(FR._denominator.evaluate(evalValues))\r\n\r\n return theLimit.isInfinity() ? theLimit.abs() : theLimit\r\n } else {\r\n if (offset === 'above') {\r\n evalValuesOffset[letter === undefined ? 'x' : letter] = (new Fraction(value)).add(0.000001)\r\n } else if (offset === 'below') {\r\n evalValuesOffset[letter === undefined ? 'x' : letter] = (new Fraction(value)).subtract(0.000001)\r\n }\r\n\r\n theLimit = FR._numerator.evaluate(evalValues)\r\n .divide(FR._denominator.evaluate(evalValues))\r\n theSign = FR._numerator.evaluate(evalValuesOffset)\r\n .divide(FR._denominator.evaluate(evalValuesOffset)).sign()\r\n\r\n if (theLimit.isInfinity()) {\r\n return theSign === 1 ? theLimit.abs() : theLimit.abs().opposed()\r\n } else {\r\n return theLimit\r\n }\r\n }\r\n }\r\n }\r\n\r\n evaluate = (values: literalType | Fraction | number): Fraction => {\r\n const r = new Fraction().zero();\r\n\r\n let N = this._numerator.evaluate(values),\r\n D = this._denominator.evaluate(values)\r\n\r\n return N.divide(D)\r\n };\r\n\r\n evaluateAsNumeric = (values: { [Key: string]: number } | number): number => {\r\n return this._numerator.evaluateAsNumeric(values) / this._denominator.evaluateAsNumeric(values)\r\n }\r\n\r\n study = (config?:StudyConfig|string): RationalStudy => {\r\n return new RationalStudy(this, config)\r\n }\r\n}\r\n","/**\r\n * Rational polynom module contains everything necessary to handle rational polynoms.\r\n * @module Polynom\r\n */\r\n\r\nimport {Rational} from \"./rational\";\r\nimport {ISolution} from \"./equation\";\r\nimport {Polynom} from \"./polynom\";\r\nimport {Fraction} from \"../coefficients/fraction\";\r\nimport {Point} from \"../geometry/point\";\r\nimport {NumExp} from \"../numexp\";\r\n\r\nexport type StudyableFunction = Rational\r\n\r\n\r\nexport enum ZEROTYPE {\r\n ZERO = 'z',\r\n DEFENCE = 'd',\r\n NOTHING = 't'\r\n}\r\n\r\nexport interface IZero extends ISolution {\r\n extrema: FUNCTION_EXTREMA,\r\n type: ZEROTYPE\r\n}\r\n\r\nexport enum ASYMPTOTE {\r\n VERTICAL = \"av\",\r\n HORIZONTAL = \"ah\",\r\n SLOPE = \"ao\",\r\n HOLE = \"hole\"\r\n}\r\n\r\nexport enum ASYMPTOTE_POSITION {\r\n \"LT\" = \"LT\",\r\n \"RT\" = \"RT\",\r\n \"LB\" = \"LB\",\r\n \"RB\" = \"RB\"\r\n}\r\n\r\nexport interface IAsymptote {\r\n deltaX: StudyableFunction\r\n display: string,\r\n fx: Polynom,\r\n limits: string,\r\n position: ASYMPTOTE_POSITION[]\r\n tableOfSign: ITableOfSigns,\r\n tex: string,\r\n type: ASYMPTOTE,\r\n zero: IZero,\r\n}\r\n\r\nexport enum FUNCTION_EXTREMA {\r\n MIN = \"min\",\r\n MAX = \"max\",\r\n FLAT = \"flat\",\r\n NOTHING = \"\"\r\n}\r\n\r\nexport interface IExtrema {\r\n tex: {\r\n x: string,\r\n y: string\r\n },\r\n type: FUNCTION_EXTREMA,\r\n value: {\r\n x: number,\r\n y: number\r\n }\r\n\r\n}\r\n\r\nexport interface ITableOfSigns {\r\n extremes: { [Key: string]: IExtrema },\r\n factors: Polynom[],\r\n fx: StudyableFunction,\r\n signs: (string[])[],\r\n tex: string\r\n type: TABLE_OF_SIGNS\r\n zeroes: IZero[],\r\n}\r\n\r\nexport enum TABLE_OF_SIGNS {\r\n SIGNS = \"signs\",\r\n GROWS = \"grows\",\r\n VARIATIONS = \"variatins\"\r\n}\r\n\r\nexport interface StudyConfig {\r\n asymptotes?: boolean,\r\n derivative?: boolean,\r\n domain?: boolean,\r\n name?: string,\r\n variable?: string,\r\n signs?: boolean,\r\n variations?: boolean\r\n}\r\n\r\n/**\r\n * The study class is a \"function study\" class that will get:\r\n * fx : get the function\r\n * domain : string\r\n * zeroes : Object (tex, IZero)\r\n * signs : table of signs + tex output using tkz-tab\r\n * av : vertical asymptotic\r\n * ah : horizontal asymptotic\r\n * ao : obliques\r\n * deltaX : position relative\r\n * dx : derivative\r\n * grows : growing table + tex output using tkz-tab\r\n * ddx : dérivée seconde\r\n * variations : variation table + tex output using tkz-tab\r\n */\r\nexport class Study {\r\n fx: StudyableFunction\r\n private _asymptotes: IAsymptote[]\r\n private _derivative: ITableOfSigns\r\n private _signs: ITableOfSigns\r\n private _variations: ITableOfSigns\r\n private _zeroes: IZero[]\r\n private _config: StudyConfig\r\n private _name: string\r\n\r\n constructor(fx: StudyableFunction, config?: StudyConfig | string) {\r\n this.fx = fx\r\n\r\n this._config = {\r\n name :'f',\r\n variable: 'x',\r\n domain :true,\r\n asymptotes :true,\r\n signs :true,\r\n derivative :true,\r\n variations :true,\r\n }\r\n\r\n if (config) {\r\n if (typeof config === 'string') {\r\n const d = config.split(',')\r\n this._config = {}\r\n let n = d.filter(x=>x.includes('(') && x.includes(')'))\r\n\r\n if(n.length===1){\r\n this._config.name = n[0].split('(')[0]\r\n this._config.variable = n[0].split('(')[1].split(')')[0]\r\n }\r\n this._config.domain = d.includes('d')\r\n this._config.asymptotes = d.includes('a')\r\n this._config.signs = d.includes('signs')\r\n this._config.derivative = d.includes('dx')\r\n this._config.variations = d.includes('ddx')\r\n } else {\r\n this._config = config\r\n }\r\n }\r\n\r\n this.makeStudy()\r\n return this\r\n }\r\n\r\n get name(): string {\r\n return this._config.name;\r\n }\r\n\r\n set name(value: string) {\r\n this._config.name = value;\r\n }\r\n\r\n get config(): StudyConfig {\r\n return this._config;\r\n }\r\n\r\n set config(value: StudyConfig) {\r\n this._config = value;\r\n }\r\n\r\n get zeroes(): IZero[] {\r\n return this._zeroes;\r\n }\r\n\r\n get domain(): string {\r\n return this.fx.domain()\r\n }\r\n\r\n get signs(): ITableOfSigns {\r\n return this._signs;\r\n }\r\n\r\n get asymptotes(): IAsymptote[] {\r\n return this._asymptotes;\r\n }\r\n\r\n get derivative(): ITableOfSigns {\r\n return this._derivative;\r\n }\r\n\r\n get texSigns(): string {\r\n return this._makeTexFromTableOfSigns(this._signs)\r\n }\r\n\r\n get texGrows(): string {\r\n return this._makeTexFromTableOfSigns(this._derivative)\r\n }\r\n\r\n get texVariations(): string {\r\n return this._makeTexFromTableOfSigns(this._variations)\r\n }\r\n\r\n makeStudy = (): void => {\r\n this._zeroes = this.makeZeroes()\r\n\r\n if (this._config.signs) this._signs = this.makeSigns()\r\n\r\n if (this._config.asymptotes) this._asymptotes = this.makeAsymptotes()\r\n\r\n if (this._config.derivative) this._derivative = this.makeDerivative()\r\n\r\n if (this._config.variations) this._variations = this.makeVariation()\r\n\r\n // Table of signs / derivative / variation\r\n if (this._config.signs) this._signs.tex = this.texSigns\r\n\r\n if (this._config.derivative) this._derivative.tex = this.texGrows\r\n\r\n if (this._config.variations) this._variations.tex = this.texVariations\r\n };\r\n\r\n indexOfZero = (zeroes: IZero[], zero: IZero | ISolution): number => {\r\n for (let i = 0; i < zeroes.length; i++) {\r\n if (zeroes[i].tex === zero.tex) {\r\n return i\r\n }\r\n }\r\n return -1\r\n };\r\n\r\n makeOneLineForSigns = (factor: Polynom, zeroes: IZero[], zeroSign: ZEROTYPE): string[] => {\r\n let oneLine: string[] = [],\r\n currentZero = factor.getZeroes().map(x => x.tex)\r\n\r\n // First +/- sign, before the first zero\r\n oneLine.push('')\r\n if (factor.degree().isZero()) {\r\n oneLine.push(factor.monoms[0].coefficient.sign() === 1 ? '+' : '-')\r\n } else {\r\n oneLine.push(factor.evaluate(zeroes[0].value - 1).sign() === 1 ? '+' : '-')\r\n }\r\n\r\n for (let i = 0; i < zeroes.length; i++) {\r\n // Add the zero if it's the current one\r\n oneLine.push(currentZero.includes(zeroes[i].tex) ? zeroSign : ZEROTYPE.NOTHING)\r\n\r\n // + / - sign after the current zero\r\n if (i < zeroes.length - 1) {\r\n oneLine.push(factor.evaluate((zeroes[i].value + zeroes[i + 1].value) / 2).sign() === 1 ? '+' : '-')\r\n } else if (i === zeroes.length - 1) {\r\n oneLine.push(factor.evaluate(zeroes[i].value + 1).sign() === 1 ? '+' : '-')\r\n }\r\n\r\n }\r\n oneLine.push('')\r\n\r\n return oneLine\r\n }\r\n\r\n makeSignsResult = (signs: (string[])[]): string[] => {\r\n\r\n // Initialize the result line with the first line of the signs table\r\n let resultLine: string[] = signs[0].map((x, index) => {\r\n if (index === 0 || index === signs[0].length - 1) {\r\n return ''\r\n }\r\n\r\n if (index % 2 === 0) {\r\n return 't'\r\n }\r\n\r\n return '+'\r\n })\r\n\r\n // Go through each lines (except the first)\r\n for (let current of signs) {\r\n\r\n for (let i = 0; i < current.length; i++) {\r\n if (i % 2 === 0) {\r\n // t, z or d\r\n if (resultLine[i] === 'd') {\r\n continue\r\n }\r\n if (current[i] !== 't') {\r\n resultLine[i] = current[i]\r\n }\r\n } else {\r\n // + or -\r\n if (current[i] === '-') {\r\n resultLine[i] = resultLine[i] === '+' ? '-' : '+'\r\n }\r\n }\r\n }\r\n }\r\n\r\n return resultLine\r\n }\r\n\r\n makeGrowsResult = (tos: ITableOfSigns): { growsLine: string[], extremes: { [Key: string]: IExtrema } } => {\r\n\r\n // Use the last line (=> resultLine) to grab the necessary information\r\n let signsAsArray = Object.values(tos.signs),\r\n resultLine = signsAsArray[signsAsArray.length - 1],\r\n growsLine: string[] = [],\r\n extremes: { [Key: string]: IExtrema } = {},\r\n zeroes = tos.zeroes\r\n\r\n // Get the extremes\r\n for (let i = 0; i < zeroes.length; i++) {\r\n\r\n // Get the corresponding item in the resultLine.\r\n let pos = 2 * i + 2\r\n if (resultLine[pos] === 'z') {\r\n\r\n // It's a zero. Get the coordinates\r\n let x: number, y: number, zero = zeroes[i].exact,\r\n pt: Point,\r\n xTex: string, yTex: string,\r\n pointType: FUNCTION_EXTREMA\r\n\r\n // TODO: NumExp should parse something that isn't yet plotFunction\r\n let exp = new NumExp(this.fx.plotFunction)\r\n\r\n if (zero instanceof Fraction) {\r\n let value: Fraction = zero,\r\n evalY = this.fx.evaluate(value)\r\n\r\n x = zero.value\r\n y = evalY.value\r\n xTex = zero.tex\r\n yTex = evalY.tex\r\n } else {\r\n x = zeroes[i].value\r\n y = exp.evaluate({x})\r\n\r\n xTex = x.toFixed(2)\r\n yTex = y.toFixed(2)\r\n }\r\n\r\n // Determine the type of the zero.\r\n if (resultLine[pos - 1] === resultLine[pos + 1]) {\r\n pointType = FUNCTION_EXTREMA.FLAT\r\n } else if (resultLine[pos - 1] === '+') {\r\n pointType = FUNCTION_EXTREMA.MAX\r\n } else {\r\n pointType = FUNCTION_EXTREMA.MIN\r\n\r\n }\r\n\r\n // Add the point to the list\r\n extremes[zeroes[i].tex] = {\r\n type: pointType,\r\n tex: {x: xTex, y: yTex},\r\n value: {x, y}\r\n }\r\n }\r\n }\r\n\r\n // Create the grows line, based on tkz-tab\r\n // \\tkzTabLine{ , + , z , - , d , - , z , + , }\r\n // \\tkzTabVar{ -/ , +/$3$ , -D+/ , -/$1$ , +/ }\r\n growsLine.push(resultLine[1] === '+' ? '-/' : '+/')\r\n for (let i = 1; i < resultLine.length - 1; i++) {\r\n if (resultLine[i] === \"z\") {\r\n let extr = extremes[zeroes[(i - 2) / 2].tex]\r\n\r\n growsLine.push(`${resultLine[i - 1]}/\\\\(${extr.type}(${extr.tex.x};${extr.tex.y})\\\\)`)\r\n } else if (resultLine[i] === 'd') {\r\n growsLine.push(`${resultLine[i - 1]}D${resultLine[i + 1] === '+' ? '-' : '+'}/`)\r\n }\r\n }\r\n growsLine.push(`${resultLine[resultLine.length - 2]}/`)\r\n\r\n return {growsLine, extremes}\r\n }\r\n\r\n makeVariationsResult = (tos: ITableOfSigns): { varsLine: string[], extremes: { [Key: string]: IExtrema } } => {\r\n // TODO: make variations result is not yet implemented.\r\n let extremes = {},\r\n varsLine: string[] = []\r\n return {varsLine, extremes}\r\n }\r\n\r\n makeZeroes(): IZero[] {\r\n return []\r\n };\r\n\r\n makeSigns(): ITableOfSigns {\r\n return {\r\n type: TABLE_OF_SIGNS.SIGNS,\r\n fx: null,\r\n factors: [],\r\n zeroes: [],\r\n signs: [],\r\n extremes: {},\r\n tex: ''\r\n }\r\n };\r\n\r\n makeAsymptotes(): IAsymptote[] {\r\n return []\r\n }\r\n\r\n makeDerivative(): ITableOfSigns {\r\n return {\r\n type: TABLE_OF_SIGNS.GROWS,\r\n fx: null,\r\n factors: [],\r\n zeroes: [],\r\n signs: [],\r\n extremes: {},\r\n tex: ''\r\n }\r\n }\r\n\r\n makeVariation(): ITableOfSigns {\r\n return {\r\n type: TABLE_OF_SIGNS.VARIATIONS,\r\n fx: null,\r\n factors: [],\r\n zeroes: [],\r\n signs: [],\r\n extremes: {},\r\n tex: ''\r\n }\r\n }\r\n\r\n drawCode = (): string => {\r\n // Function as string\r\n let code = `f(x)=${this.fx.plotFunction}`\r\n\r\n // Asymptotes\r\n let i: number = 1\r\n this.asymptotes.forEach(asymptote => {\r\n if (asymptote.type === ASYMPTOTE.VERTICAL) {\r\n code += `\\nav_${i}=line x=${asymptote.zero.value}->red,dash`\r\n i++\r\n } else if (asymptote.type === ASYMPTOTE.HORIZONTAL) {\r\n code += `\\nah=line y=${asymptote.fx.monoms[0].coefficient.value}->orange,dash`\r\n } else if (asymptote.type === ASYMPTOTE.SLOPE) {\r\n code += `\\nao=line y=${asymptote.fx.plotFunction}->red,dash`\r\n }\r\n i++\r\n })\r\n\r\n // Extremes\r\n for (let zero in this.derivative.extremes) {\r\n let extreme = this.derivative.extremes[zero]\r\n\r\n code += `\\nM_${i}(${extreme.value.x},${extreme.value.y})*`\r\n i++\r\n }\r\n\r\n // Zeroes\r\n this.zeroes.forEach(zero => {\r\n if (zero.type === ZEROTYPE.ZERO) {\r\n code += `\\nZ_${i}(${zero.value},0)*`\r\n i++\r\n }\r\n })\r\n\r\n return code\r\n }\r\n\r\n private _makeTexFromTableOfSigns = (tos: ITableOfSigns): string => {\r\n let factors = tos.factors.map(x => `\\\\(${x.tex}\\\\)/1`),\r\n factorsFx = `\\\\(${this._config.name}(${this._config.variable})\\\\)/1.2`,\r\n zeroes = tos.zeroes\r\n\r\n // Add the last lines \"label\"\r\n if (tos.type === TABLE_OF_SIGNS.GROWS) {\r\n factorsFx = `\\\\(${this._config.name}'(${this._config.variable})\\\\)/1.2,\\\\(f(x${this._config.variable})\\\\)/2`\r\n } else if (tos.type === TABLE_OF_SIGNS.VARIATIONS) {\r\n factorsFx = `\\\\(${this._config.name}''(${this._config.variable})\\\\)/1.2,\\\\(f(${this._config.variable})\\\\)/2`\r\n }\r\n\r\n // Create the tikzPicture header\r\n let tex = `\\\\begin{tikzpicture}\r\n\\\\tkzTabInit[lgt=3,espcl=2,deltacl=0]{/1.2,${factors.join(',')},/.1,${factorsFx} }{{\\\\scriptsize \\\\hspace{1cm} \\\\(-\\\\infty\\\\)},\\\\(${zeroes.map(x => x.tex).join('\\\\),\\\\(')}\\\\),{\\\\scriptsize \\\\hspace{-1cm} \\\\(+\\\\infty\\\\)}}`\r\n\r\n let pos\r\n for (pos = 0; pos < tos.factors.length; pos++) {\r\n tex += (`\\n\\\\tkzTabLine{${tos.signs[pos].join(',')}}`)\r\n }\r\n\r\n // Add the result line\r\n tex += (`\\n\\\\tkzTabLine{${tos.signs[pos].join(',')}}`)\r\n // Add the grows / vars line\r\n if (tos.type === TABLE_OF_SIGNS.GROWS) {\r\n tex += (`\\n\\\\tkzTabVar{${tos.signs[pos + 1].join(',')}}`)\r\n } else if (tos.type === TABLE_OF_SIGNS.VARIATIONS) {\r\n // TODO: Check variations table for as tex\r\n tex += (`\\n\\\\tkzTabVar{${tos.signs[pos + 1].join(',')}}`)\r\n }\r\n\r\n tex += `\\n\\\\end{tikzpicture}`\r\n\r\n return tex\r\n }\r\n}\r\n","/**\r\n * The study class is a \"function study\" class that will get:\r\n * fx : get the function\r\n * domain : string\r\n * zeroes : Object (tex, IZero)\r\n * signs : table of signs + tex output using tkz-tab\r\n * av : vertical asymptotic\r\n * ah : horizontal asymptotic\r\n * ao : obliques\r\n * deltaX : position relative\r\n * dx : derivative\r\n * grows : growing table + tex output using tkz-tab\r\n * ddx : dérivée seconde\r\n * variations : variation table + tex output using tkz-tab\r\n */\r\nimport {\r\n ASYMPTOTE,\r\n ASYMPTOTE_POSITION,\r\n FUNCTION_EXTREMA,\r\n IAsymptote,\r\n ITableOfSigns,\r\n IZero,\r\n Study,\r\n StudyableFunction, StudyConfig,\r\n TABLE_OF_SIGNS,\r\n ZEROTYPE\r\n} from \"../study\";\r\nimport {Rational} from \"../rational\";\r\nimport {Fraction} from \"../../coefficients/fraction\";\r\nimport {Polynom} from \"../polynom\";\r\n\r\nexport class RationalStudy extends Study {\r\n constructor(fx: StudyableFunction, config?: StudyConfig|string) {\r\n super(fx, config)\r\n\r\n return this\r\n }\r\n\r\n makeZeroes(): IZero[] {\r\n return this._getZeroes(this.fx)\r\n };\r\n\r\n makeSigns(): ITableOfSigns {\r\n return this._getSigns(this.fx, this.zeroes)\r\n };\r\n\r\n makeAsymptotes(): IAsymptote[] {\r\n const reduced: Rational = this.fx.clone().reduce()\r\n\r\n // Vertical\r\n let asymptotes: IAsymptote[] = []\r\n this.zeroes.filter(x => x.type === ZEROTYPE.DEFENCE).forEach(zero => {\r\n // Check if it's a hole or an asymptote\r\n let Ztype = ASYMPTOTE.VERTICAL,\r\n tex = `x=${zero.tex}`,\r\n display = `x=${zero.display}`\r\n\r\n // Check if it's a hole: the reduced polynom should not be null\r\n if (zero.exact instanceof Fraction) {\r\n if (reduced.denominator.evaluate(zero.exact).isNotZero()) {\r\n Ztype = ASYMPTOTE.HOLE\r\n tex = `(${zero.tex};${reduced.evaluate(zero.exact).tex})`\r\n display = `(${zero.display};${reduced.evaluate(zero.exact).display})`\r\n }\r\n } else {\r\n if (reduced.denominator.evaluate(zero.value).isNotZero()) {\r\n Ztype = ASYMPTOTE.HOLE\r\n tex = `(${zero.tex};${reduced.evaluate(zero.value).tex})`\r\n display = `(${zero.display};${reduced.evaluate(zero.value).display})`\r\n }\r\n }\r\n\r\n // Get the position before and after the asymptote.\r\n const delta = 0.000001\r\n let before = this.fx.evaluateAsNumeric(zero.value - delta),\r\n after = this.fx.evaluateAsNumeric(zero.value + delta),\r\n position: ASYMPTOTE_POSITION[] = [],\r\n pm = \"\"\r\n\r\n if (after < -10000) {\r\n position.push(ASYMPTOTE_POSITION.RB)\r\n pm += \"m\"\r\n } else if (after > 10000) {\r\n position.push(ASYMPTOTE_POSITION.RT)\r\n pm += \"p\"\r\n }\r\n\r\n if (before < -10000) {\r\n position.push(ASYMPTOTE_POSITION.LB)\r\n pm += \"m\"\r\n } else if (before > 10000) {\r\n position.push(ASYMPTOTE_POSITION.LT)\r\n pm += \"p\"\r\n }\r\n\r\n // Left and right are to infinity\r\n // TODO: handle the case were one side of the asymptote isn't infinity (not possible in rational study?!)\r\n if (pm === \"pp\") {\r\n pm = \"+\"\r\n } else if (pm === \"mm\") {\r\n pm = \"-\"\r\n } else {\r\n pm = `\\\\${pm}`\r\n }\r\n\r\n asymptotes.push({\r\n fx: null,\r\n type: Ztype,\r\n tex,\r\n display,\r\n zero: zero,\r\n limits: `\\\\lim_{x\\\\to${zero.tex} }\\\\ f(x) = ${pm}\\\\infty`,\r\n deltaX: null,\r\n tableOfSign: null,\r\n position\r\n })\r\n })\r\n\r\n // Sloped asymptote\r\n let NDegree = this.fx.numerator.degree(),\r\n DDegree = this.fx.denominator.degree()\r\n if (NDegree.isEqual(DDegree)) {\r\n let H = this.fx.numerator.monomByDegree().coefficient.clone().divide(this.fx.denominator.monomByDegree().coefficient),\r\n Htex = H.tex\r\n\r\n let {reminder} = reduced.euclidian(),\r\n deltaX = new Rational(reminder, reduced.denominator)\r\n\r\n // Determine the position above or below on the left / right of the asymptote.\r\n asymptotes.push({\r\n fx: new Polynom(H),\r\n type: ASYMPTOTE.HORIZONTAL,\r\n tex: `y=${Htex}`,\r\n display: `y=${H.display}`,\r\n zero: null,\r\n limits: `\\\\lim_{x\\\\to\\\\infty}\\\\ f(x) = ${Htex}`,\r\n deltaX,\r\n tableOfSign: this._getSigns(deltaX),\r\n position: this._getHorizontalAsymptoteRelativePositon(deltaX)\r\n })\r\n } else if (DDegree.greater(NDegree)) {\r\n asymptotes.push({\r\n fx: new Polynom('0'),\r\n type: ASYMPTOTE.HORIZONTAL,\r\n tex: `y=0`,\r\n display: `y=0`,\r\n zero: null,\r\n limits: `\\\\lim_{x\\\\to\\\\infty}\\\\ f(x) = ${0}`,\r\n deltaX: null,\r\n tableOfSign: null,\r\n position: this._getHorizontalAsymptoteRelativePositon(this.fx)\r\n })\r\n } else if (NDegree.value - 1 === DDegree.value) {\r\n // Calculate the slope\r\n let {quotient, reminder} = reduced.euclidian(),\r\n deltaX = new Rational(reminder, reduced.denominator)\r\n\r\n asymptotes.push({\r\n fx: quotient.clone(),\r\n type: ASYMPTOTE.SLOPE,\r\n tex: `y=${quotient.tex}`,\r\n display: `y=${quotient.display}`,\r\n zero: null,\r\n limits: ``,\r\n deltaX: new Rational(reminder, reduced.denominator),\r\n tableOfSign: this._getSigns(deltaX),\r\n position: this._getHorizontalAsymptoteRelativePositon(deltaX)\r\n })\r\n }\r\n\r\n return asymptotes\r\n };\r\n\r\n _getHorizontalAsymptoteRelativePositon(deltaX: Rational, delta: number = 1000000): ASYMPTOTE_POSITION[] {\r\n\r\n let position: ASYMPTOTE_POSITION[] = [],\r\n before = deltaX.evaluateAsNumeric(-delta),\r\n after = deltaX.evaluateAsNumeric(delta)\r\n\r\n if (before >= 0) {\r\n position.push(ASYMPTOTE_POSITION.LT)\r\n } else {\r\n position.push(ASYMPTOTE_POSITION.LB)\r\n }\r\n\r\n if (after >= 0) {\r\n position.push(ASYMPTOTE_POSITION.RT)\r\n } else {\r\n position.push(ASYMPTOTE_POSITION.RB)\r\n }\r\n\r\n return position\r\n }\r\n\r\n makeDerivative(): ITableOfSigns {\r\n let dx = this.fx.clone().derivative(),\r\n tos = this._getSigns(dx, this._getZeroes(dx), TABLE_OF_SIGNS.GROWS)\r\n\r\n let result = this.makeGrowsResult(tos)\r\n tos.signs.push(result.growsLine)\r\n tos.extremes = result.extremes\r\n return tos\r\n };\r\n\r\n makeVariation(): ITableOfSigns {\r\n // Get the zeroes, make signs.\r\n let dx = this.derivative.fx.clone().derivative(),\r\n tos = this._getSigns(dx, this._getZeroes(dx), TABLE_OF_SIGNS.VARIATIONS)\r\n\r\n let result = this.makeVariationsResult(tos)\r\n tos.signs.push(result.varsLine)\r\n tos.extremes = result.extremes\r\n return tos\r\n };\r\n\r\n private _getZeroes(fx: StudyableFunction) {\r\n // All zeroes.\r\n let zeroes: IZero[] = []\r\n\r\n fx.numerator.getZeroes().filter(x => !isNaN(x.value)).forEach(z => {\r\n // add the item\r\n zeroes.push({\r\n tex: z.tex,\r\n display: z.display,\r\n value: z.value,\r\n exact: z.exact,\r\n extrema: FUNCTION_EXTREMA.NOTHING,\r\n type: ZEROTYPE.ZERO\r\n })\r\n })\r\n\r\n fx.denominator.getZeroes().filter(x => !isNaN(x.value)).forEach(z => {\r\n let idx = this.indexOfZero(zeroes, z)\r\n\r\n if (idx !== -1) {\r\n zeroes[idx].type = ZEROTYPE.DEFENCE\r\n } else {\r\n // Add the item\r\n zeroes.push({\r\n tex: z.tex,\r\n display: z.display,\r\n value: z.value,\r\n exact: z.exact,\r\n extrema: FUNCTION_EXTREMA.NOTHING,\r\n type: ZEROTYPE.DEFENCE\r\n })\r\n }\r\n })\r\n\r\n // sort all zeroes\r\n zeroes.sort((a, b) => a.value - b.value)\r\n\r\n return zeroes\r\n }\r\n\r\n private _getSigns(fx: Rational, zeroes?: IZero[], typeOfTable?: TABLE_OF_SIGNS): ITableOfSigns {\r\n // Factorize the rational\r\n let signs: (string[])[] = [],\r\n factors: Polynom[] = []\r\n\r\n if (zeroes === undefined) {\r\n zeroes = this._getZeroes(fx)\r\n }\r\n\r\n fx.numerator.factors.forEach(factor => {\r\n signs.push(this.makeOneLineForSigns(factor, zeroes, ZEROTYPE.ZERO))\r\n factors.push(factor.clone())\r\n })\r\n\r\n fx.denominator.factors.forEach(factor => {\r\n signs.push(this.makeOneLineForSigns(factor, zeroes, ZEROTYPE.DEFENCE))\r\n factors.push(factor.clone())\r\n })\r\n\r\n signs.push(this.makeSignsResult(signs))\r\n\r\n return {\r\n type: typeOfTable,\r\n fx,\r\n factors,\r\n zeroes,\r\n signs,\r\n extremes: {},\r\n tex: ''\r\n }\r\n }\r\n}\r\n","import {Numeric} from \"../numeric\";\r\n\r\nexport type FractionParsingType = number | string | Fraction\r\n\r\n/**\r\n * The fraction class make possible to handle\r\n * TODO: Write the documentation correctly.\r\n * \\\\(\\frac{a}{b}\\\\) or \\\\[\\frac{a}{b}\\\\] values.\r\n */\r\nexport class Fraction {\r\n private _denominator: number;\r\n private _numerator: number;\r\n\r\n constructor(value?: unknown, denominatorOrPeriodic?: number) {\r\n this._numerator = 1;\r\n this._denominator = 1;\r\n\r\n if (value !== undefined) {\r\n this.parse(value, denominatorOrPeriodic);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n // ------------------------------------------\r\n // Getter and setter\r\n // ------------------------------------------\r\n\r\n get numerator(): number {\r\n return this._numerator;\r\n }\r\n\r\n set numerator(value: number) {\r\n this._numerator = value;\r\n }\r\n\r\n get denominator(): number {\r\n return this._denominator;\r\n }\r\n\r\n set denominator(value: number) {\r\n this._denominator = value;\r\n }\r\n\r\n get value(): number {\r\n return this._numerator / this._denominator;\r\n }\r\n\r\n // Display getter\r\n get tex(): string {\r\n if (this.isInfinity()) {\r\n return `${this.sign() === 1 ? '+' : '-'}\\\\infty`\r\n }\r\n\r\n if (this.isExact()) {\r\n if (this._denominator === 1) {\r\n return `${this._numerator}`;\r\n } else if (this._numerator < 0) {\r\n return `-\\\\frac{ ${-this._numerator} }{ ${this._denominator} }`;\r\n } else {\r\n return `\\\\frac{ ${this._numerator} }{ ${this._denominator} }`;\r\n }\r\n } else {\r\n return this.value.toFixed(3)\r\n }\r\n }\r\n\r\n get texWithSign():string {\r\n return this.isPositive() ? `+${this.tex}` : this.tex;\r\n }\r\n\r\n get display(): string {\r\n if (this.isExact()) {\r\n if (this._denominator === 1) {\r\n return `${this._numerator}`;\r\n } else {\r\n return `${this._numerator}/${this._denominator}`;\r\n }\r\n } else {\r\n return this.value.toFixed(3)\r\n }\r\n }\r\n\r\n // Helper function to display fractions\r\n get frac(): string {\r\n return this.tex;\r\n }\r\n\r\n get dfrac(): string {\r\n return this.tex.replace('\\\\frac', '\\\\dfrac');\r\n }\r\n\r\n get tfrac(): string {\r\n return this.tex.replace('\\\\frac', '\\\\tfrac')\r\n }\r\n\r\n static max = (...fractions: (Fraction | number)[]): Fraction => {\r\n let M = new Fraction(fractions[0])\r\n\r\n for (let m of fractions) {\r\n let compare = new Fraction(m)\r\n if (compare.greater(M)) {\r\n M = compare.clone()\r\n }\r\n }\r\n\r\n return M\r\n }\r\n\r\n static min = (...fractions: (Fraction | number)[]): Fraction => {\r\n let M = new Fraction(fractions[0])\r\n\r\n for (let m of fractions) {\r\n let compare = new Fraction(m)\r\n if (compare.lesser(M)) {\r\n M = compare.clone()\r\n }\r\n }\r\n\r\n return M\r\n }\r\n\r\n // ------------------------------------------\r\n // Creation / parsing functions\r\n\r\n static average = (...fractions: (Fraction | number)[]): Fraction => {\r\n let M = new Fraction().zero()\r\n\r\n for (let f of fractions) {\r\n M.add(f)\r\n }\r\n\r\n M.divide(fractions.length)\r\n\r\n return M\r\n }\r\n\r\n static unique = (fractions: Fraction[], sorted?: boolean): Fraction[] => {\r\n // TODO: make sure it's wokring -> test !\r\n let unique: { [Key: string]: boolean } = {},\r\n distinct: Fraction[] = []\r\n fractions.forEach(x => {\r\n if (!unique[x.clone().reduce().tex]) {\r\n distinct.push(x.clone())\r\n unique[x.tex] = true\r\n }\r\n })\r\n\r\n if (sorted) {\r\n return Fraction.sort(distinct)\r\n } else {\r\n return distinct\r\n }\r\n }\r\n\r\n static sort = (fractions: Fraction[], reverse?: boolean): Fraction[] => {\r\n // Todo make sure it's the correct order, not reverse -> make a test\r\n let sorted = fractions.sort((a, b) => a.value - b.value)\r\n\r\n if (reverse) {\r\n sorted.reverse()\r\n }\r\n\r\n return sorted\r\n }\r\n\r\n isApproximative = (): boolean => {\r\n return this._numerator.toString().length >= 15 && this._denominator.toString().length >= 15\r\n }\r\n\r\n isExact = (): boolean => {\r\n return !this.isApproximative()\r\n }\r\n\r\n // ------------------------------------------\r\n /**\r\n * Parse the value to get the numerator and denominator\r\n * @param value : number or string to parse to get the fraction\r\n * @param denominatorOrPeriodic (optional|number) : length of the periodic part: 2.333333 => 1 or denominator value\r\n */\r\n parse = (value: unknown, denominatorOrPeriodic?: number): Fraction => {\r\n let S: string[];\r\n\r\n // A null value means a zero fraction.\r\n if (value === null || value === \"\") {\r\n this._numerator = 0;\r\n this._denominator = 1;\r\n return this;\r\n }\r\n\r\n switch (typeof value) {\r\n case \"string\":\r\n // Split the string value in two parts: Numerator/Denominator\r\n S = value.split('/');\r\n\r\n // Security checks\r\n if (S.length > 2) throw value + \" has too many divide signs\";\r\n if (S.map(x => x === '' || isNaN(Number(x))).includes(true)) throw value + \" is not a valid number\"\r\n\r\n if (S.length === 1) {\r\n // No divide sign - it's a number\r\n return this.parse(+S[0]);\r\n } else if (S.length === 2) {\r\n // One divide signe\r\n // We check if the denominator is zero\r\n if (S[1] === '0') {\r\n this._numerator = NaN;\r\n this._denominator = 1;\r\n } else {\r\n this._numerator = +S[0];\r\n this._denominator = +S[1];\r\n }\r\n } else {\r\n // More than one divide sign ?\r\n // This is impossible\r\n this._numerator = NaN;\r\n this._denominator = 1;\r\n }\r\n break;\r\n case \"number\":\r\n if (Number.isSafeInteger(value)) {\r\n // The given value is an integer\r\n this._numerator = +value;\r\n\r\n if (denominatorOrPeriodic === undefined || !Number.isSafeInteger(denominatorOrPeriodic)) {\r\n this._denominator = 1;\r\n } else {\r\n this._denominator = +denominatorOrPeriodic;\r\n }\r\n } else {\r\n // The given value is a float number\r\n // Get the number of decimals after the float sign\r\n let [unit, decimal] = (value.toString()).split('.')\r\n let p: number = decimal?decimal.length:0;\r\n\r\n // Detect if the decimal part is periodic or not...\r\n\r\n\r\n // Transform the float number in two integer\r\n if (denominatorOrPeriodic === undefined) {\r\n this._numerator = value * Math.pow(10, p);\r\n this._denominator = Math.pow(10, p);\r\n } else if (Number.isSafeInteger(denominatorOrPeriodic)) {\r\n this._numerator = value * Math.pow(10, p) - Math.floor(value * Math.pow(10, p - denominatorOrPeriodic));\r\n this.denominator = Math.pow(10, p) - Math.pow(10, p - denominatorOrPeriodic)\r\n }\r\n\r\n this.reduce()\r\n }\r\n break;\r\n case \"object\":\r\n if (value instanceof Fraction) {\r\n this._numerator = +value.numerator;\r\n this._denominator = +value.denominator;\r\n }\r\n break;\r\n }\r\n return this;\r\n };\r\n\r\n // ------------------------------------------\r\n // Mathematical operations\r\n\r\n clone = (): Fraction => {\r\n let F = new Fraction();\r\n F.numerator = +this._numerator;\r\n F.denominator = +this._denominator;\r\n return F;\r\n };\r\n\r\n zero = (): Fraction => {\r\n this._numerator = 0;\r\n this._denominator = 1;\r\n return this;\r\n };\r\n\r\n one = (): Fraction => {\r\n this._numerator = 1;\r\n this._denominator = 1;\r\n return this;\r\n };\r\n\r\n infinite = (): Fraction => {\r\n this._numerator = Infinity;\r\n this._denominator = 1;\r\n return this;\r\n };\r\n\r\n invalid = (): Fraction => {\r\n this._numerator = NaN;\r\n this._denominator = 1;\r\n return this;\r\n };\r\n\r\n // ------------------------------------------\r\n opposed = (): Fraction => {\r\n this._numerator = -this._numerator;\r\n return this;\r\n };\r\n\r\n add = (F: Fraction | number): Fraction => {\r\n if (F instanceof Fraction) {\r\n let N: number = this._numerator,\r\n D: number = this._denominator;\r\n\r\n this._numerator = N * F.denominator + F.numerator * D;\r\n this._denominator = D * F.denominator;\r\n } else {\r\n return this.add(new Fraction(F))\r\n }\r\n\r\n return this.reduce();\r\n };\r\n\r\n subtract = (F: Fraction | number): Fraction => {\r\n if (F instanceof Fraction) {\r\n return this.add(F.clone().opposed());\r\n } else {\r\n return this.add(-F)\r\n }\r\n };\r\n\r\n multiply = (F: Fraction | number): Fraction => {\r\n // Parse the value.\r\n // If it's a fraction, return a clone of it\r\n // If it's an integer, return the fraction F/1\r\n let Q = new Fraction(F);\r\n\r\n this._numerator = this._numerator * Q.numerator;\r\n this._denominator = this._denominator * Q.denominator;\r\n\r\n return this.reduce();\r\n };\r\n\r\n xMultiply = (...values: (Fraction | number)[]): Fraction => {\r\n // Parse the value.\r\n // If it's a fraction, return a clone of it\r\n // If it's an integer, return the fraction F/1\r\n for(let value of values){\r\n let F = new Fraction(value)\r\n this._numerator = this._numerator * F.numerator;\r\n this._denominator = this._denominator * F.denominator;\r\n }\r\n\r\n return this;\r\n };\r\n\r\n divide = (F: Fraction | number): Fraction => {\r\n let Q = new Fraction(F);\r\n\r\n if (Q.numerator === 0) {\r\n return new Fraction().infinite();\r\n }\r\n\r\n let N: number = +this._numerator,\r\n D: number = +this._denominator;\r\n\r\n this._numerator = N * Q.denominator;\r\n this._denominator = D * Q.numerator;\r\n return this.reduce();\r\n };\r\n\r\n invert = (): Fraction => {\r\n let n = +this._numerator, d = +this._denominator;\r\n this._numerator = d;\r\n this._denominator = n;\r\n\r\n return this;\r\n }\r\n\r\n pow = (p: number | Fraction): Fraction => {\r\n // TODO: Fraction.pow with a value different than a safe integer !\r\n if (p instanceof Fraction) {\r\n return this.pow(p.value)\r\n }\r\n\r\n this.reduce();\r\n if (p < 0) {\r\n this.invert()\r\n }\r\n\r\n // Check if numerator and denominator are roots of...\r\n // othervise, convert to numeric.\r\n let controlNumerator = Math.floor(Math.pow(this._numerator, Math.abs(p))),\r\n controlDenominator = Math.floor(Math.pow(this._denominator, Math.abs(p)))\r\n\r\n if (controlNumerator ** Math.abs(p) === this._numerator\r\n &&\r\n controlDenominator ** Math.abs(p) === this._denominator) {\r\n\r\n this._numerator = this._numerator ** Math.abs(p);\r\n this._denominator = this._denominator ** Math.abs(p);\r\n } else {\r\n this._numerator = this._numerator ** Math.abs(p);\r\n this._denominator = this._denominator ** Math.abs(p);\r\n }\r\n\r\n return this;\r\n };\r\n\r\n root = (p: number): Fraction => {\r\n // TODO: nth - root of a fraction => this will return another type of coefficient.\r\n\r\n // Check if they are perfect roots..\r\n if (p === 0) {\r\n return this;\r\n }\r\n\r\n // If negative, invert the fraction\r\n if (p < 0) {\r\n this.invert()\r\n }\r\n\r\n let n = Math.pow(this._numerator, Math.abs(1 / p)),\r\n d = Math.pow(this._denominator, Math.abs(1 / p));\r\n\r\n this._numerator = Math.pow(this._numerator, Math.abs(1 / p));\r\n this._denominator = Math.pow(this._denominator, Math.abs(1 / p));\r\n return this;\r\n }\r\n\r\n sqrt = (): Fraction => {\r\n return this.root(2);\r\n }\r\n\r\n abs = (): Fraction => {\r\n this._numerator = Math.abs(this._numerator);\r\n this._denominator = Math.abs(this._denominator);\r\n return this;\r\n };\r\n\r\n // ------------------------------------------\r\n // Mathematical operations specific to fractions\r\n\r\n // ------------------------------------------\r\n reduce = (): Fraction => {\r\n let g = Numeric.gcd(this._numerator, this._denominator);\r\n this._numerator = this._numerator / g;\r\n this._denominator = this._denominator / g;\r\n\r\n if (this._denominator < 0) {\r\n this._denominator = -this._denominator;\r\n this._numerator = -this._numerator;\r\n }\r\n return this;\r\n };\r\n\r\n amplify = (k: number): Fraction => {\r\n if (Number.isSafeInteger(k)) {\r\n this._numerator *= k;\r\n this._denominator *= k;\r\n }\r\n return this;\r\n };\r\n\r\n\r\n // ------------------------------------------\r\n // Compare functions\r\n // ------------------------------------------\r\n /**\r\n * Compare the current coefficient with another coefficient\r\n * @param F (Coefficient) The coefficient to compare\r\n * @param sign (string| default is =): authorized values: =, <, <=, >, >= with some variations.\r\n */\r\n compare = (F: unknown, sign?: string): boolean => {\r\n if (sign === undefined) {\r\n sign = '=';\r\n }\r\n\r\n let compareFraction: Fraction\r\n if (F instanceof Fraction) {\r\n compareFraction = F.clone()\r\n } else {\r\n compareFraction = new Fraction(F)\r\n }\r\n\r\n switch (sign) {\r\n case '>':\r\n return this.value > compareFraction.value;\r\n case \">=\" || \"=>\" || \"geq\":\r\n return this.value >= compareFraction.value;\r\n case \"<\":\r\n return this.value < compareFraction.value;\r\n case \"<=\" || \"=>\" || \"leq\":\r\n return this.value <= compareFraction.value;\r\n case \"=\":\r\n // let F2: Fraction = compareFraction.clone().reduce(),\r\n // F1: Fraction = this.clone().reduce();\r\n // return (F1.numerator === F2.numerator && F1.denominator === F2.denominator);\r\n return this.value === compareFraction.value;\r\n case \"<>\":\r\n return this.value !== compareFraction.value;\r\n default:\r\n return false;\r\n }\r\n };\r\n /* Compare shortcuts */\r\n lesser = (than: Fraction | number): Boolean => {\r\n return this.compare(than, '<');\r\n };\r\n leq = (than: Fraction | number): Boolean => {\r\n return this.compare(than, '<=');\r\n };\r\n greater = (than: Fraction | number): Boolean => {\r\n return this.compare(than, '>');\r\n };\r\n geq = (than: Fraction | number): Boolean => {\r\n return this.compare(than, '>=');\r\n };\r\n isEqual = (than: Fraction | number): boolean => {\r\n return this.compare(than, '=');\r\n }\r\n isNotEqual = (than: Fraction | number): boolean => {\r\n return this.compare(than, '<>');\r\n }\r\n isOpposed = (p: Fraction): boolean => {\r\n return this.isEqual(p.clone().opposed());\r\n }\r\n isInverted = (p: Fraction): boolean => {\r\n return this.isEqual(new Fraction().one().divide(p.clone()));\r\n }\r\n isZero = (): boolean => {\r\n return this._numerator === 0;\r\n }\r\n isNotZero = (): boolean => {\r\n return this._numerator !== 0;\r\n }\r\n isOne = (): boolean => {\r\n return this._numerator === 1 && this._denominator === 1;\r\n }\r\n isNegativeOne = (): boolean => {\r\n return this._numerator === -1 && this._denominator === 1;\r\n }\r\n isPositive = (): boolean => {\r\n return this.sign() === 1;\r\n }\r\n isNegative = (): boolean => {\r\n return this.sign() === -1;\r\n }\r\n isStrictlyPositive = (): boolean => {\r\n return this.value > 0\r\n }\r\n isStrictlyNegative = (): Boolean => {\r\n return this.value < 0\r\n }\r\n isNaN = (): boolean => {\r\n return isNaN(this._numerator);\r\n }\r\n isInfinity = (): boolean => {\r\n return Math.abs(this._numerator) === Infinity;\r\n }\r\n isFinite = (): boolean => {\r\n return !this.isInfinity() && !this.isNaN();\r\n }\r\n isSquare = (): boolean => {\r\n return Math.sqrt(this._numerator) % 1 === 0 && Math.sqrt(this._denominator) % 1 === 0\r\n }\r\n isReduced = (): boolean => {\r\n return Math.abs(Numeric.gcd(this._numerator, this._denominator)) === 1\r\n }\r\n isNatural = (): boolean => {\r\n return this.isRelative() && this.isPositive()\r\n }\r\n isRelative = (): boolean => {\r\n return this.clone().reduce().denominator === 1\r\n }\r\n isRational = (): boolean => {\r\n return !this.isRelative()\r\n }\r\n isEven = (): boolean => {\r\n return this.isRelative() && this.value % 2 === 0\r\n }\r\n isOdd = (): boolean => {\r\n return this.isRelative() && this.value % 2 === 1\r\n }\r\n sign = (): number => {\r\n return (this._numerator * this._denominator >= 0) ? 1 : -1;\r\n };\r\n\r\n\r\n // TODO: The rest of the functions are not used or unnecessary ?\r\n /**\r\n * Simple function to determine if it's a fraction\r\n */\r\n areEquals = (...F: Fraction[]): boolean => {\r\n for (let i = 0; i < F.length; i++) {\r\n if (!this.isEqual(F[i])) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n };\r\n}","/**\r\n * NthRoot is something like \"a+b\\sqrt{3}\r\n */\r\nexport class NthRoot {\r\n private _radical: number;\r\n private _nth: number;\r\n private _coefficient: number;\r\n private _isValid:boolean;\r\n\r\n constructor(...values: number[]) {\r\n this._radical = 1;\r\n this._coefficient = 1;\r\n this._nth = 2;\r\n this._isValid = true;\r\n\r\n if(values !== undefined){\r\n this.parse(values[0], values[1], values[2])\r\n }\r\n }\r\n\r\n // ------------------------------------------\r\n // Getter and setter\r\n // ------------------------------------------\r\n get radical(): number {\r\n return this._radical;\r\n }\r\n\r\n set radical(value: number) {\r\n this._radical = value;\r\n }\r\n\r\n get nth(): number {\r\n return this._nth;\r\n }\r\n\r\n set nth(value: number) {\r\n if (Number.isSafeInteger(value) && value >= 2) {\r\n this._nth = value;\r\n } else {\r\n // Error setting the nth root.\r\n console.log('Error setting the nth root');\r\n this._nth = 2;\r\n }\r\n }\r\n\r\n get coefficient(): number {\r\n return this._coefficient;\r\n }\r\n\r\n set coefficient(value: number) {\r\n this._coefficient = value;\r\n }\r\n\r\n get tex(): string {\r\n let C: string;\r\n\r\n if (this._coefficient === 1) {\r\n C = '';\r\n } else if (this._coefficient === -1) {\r\n C = '-';\r\n } else {\r\n C = this._coefficient.toString();\r\n }\r\n\r\n if (this._radical === 1) {\r\n return `${this._coefficient}`;\r\n } else {\r\n if (this._nth === 2) {\r\n return `${C}\\\\sqrt{${this._radical}}`\r\n } else {\r\n return `${C}\\\\sqrt[${this._nth}]{${this._radical}}`\r\n }\r\n }\r\n }\r\n\r\n get display(): string {\r\n let C: string;\r\n\r\n if (this._coefficient === 1) {\r\n C = '';\r\n } else if (this._coefficient === -1) {\r\n C = '-';\r\n } else {\r\n C = this._coefficient.toString();\r\n }\r\n\r\n if (this._radical === 1) {\r\n return `${this._coefficient}`;\r\n } else {\r\n if (this._nth === 2) {\r\n return `${C}sqrt{${this._radical}}`\r\n } else {\r\n return `${C}root(${this._nth}){${this._radical}}`\r\n }\r\n }\r\n }\r\n\r\n get value(): number {\r\n return this._coefficient * Math.pow(this._radical, 1 / this._nth);\r\n }\r\n\r\n // ------------------------------------------\r\n // Creation / parsing functions\r\n // ------------------------------------------\r\n parse = (radical: number, nthroot?: number, coefficient?: number): NthRoot => {\r\n this._coefficient = (coefficient === undefined) ? 1 : coefficient;\r\n this._nth = (nthroot === undefined) ? 2 : nthroot;\r\n this._radical = (radical === undefined) ? 1 : radical;\r\n\r\n if(this._nth%2===0 && this._radical<0){\r\n this._isValid = false;\r\n }\r\n return this;\r\n };\r\n\r\n // ------------------------------------------\r\n // Mathematical operations\r\n // ------------------------------------------\r\n reduce = (): NthRoot => {\r\n // Max value to test.\r\n let V = Math.floor(Math.pow(this._radical, 1 / this._nth));\r\n while (V > 1) {\r\n if (this._radical % Math.pow(V, this._nth) === 0) {\r\n // It's dividable by V^n\r\n this._coefficient *= V;\r\n this._radical = this._radical / Math.pow(V, this._nth);\r\n\r\n // Redifine the new testing value (this is optimization)\r\n V = Math.floor(Math.pow(this._radical, 1 / this._nth));\r\n continue;\r\n }\r\n V--;\r\n }\r\n return this;\r\n };\r\n\r\n multiply = (N: NthRoot): NthRoot => {\r\n this._radical *= N.radical;\r\n return this.reduce();\r\n };\r\n\r\n // ------------------------------------------\r\n // Help functions\r\n // ------------------------------------------\r\n hasRadical = ():boolean => {\r\n return !(this._radical===1 || this._radical===0 || this._isValid===false)\r\n };\r\n}","import {Point} from \"./point\";\r\nimport {Line, LinePropriety} from \"./line\";\r\nimport {Vector} from \"./vector\";\r\nimport {Triangle} from \"./triangle\";\r\nimport {Numeric} from \"../numeric\";\r\nimport {Fraction} from \"../coefficients/fraction\";\r\nimport {Equation} from \"../algebra/equation\";\r\nimport {Polynom} from \"../algebra/polynom\";\r\nimport {Monom} from \"../algebra/monom\";\r\n\r\nexport class Circle {\r\n constructor(...values: unknown[]) {\r\n this._exists = false\r\n\r\n if (values !== undefined) {\r\n this.parse(...values)\r\n }\r\n }\r\n\r\n private _center: Point;\r\n\r\n get center(): Point {\r\n return this._center;\r\n }\r\n\r\n private _squareRadius: Fraction;\r\n\r\n get squareRadius(): Fraction {\r\n return this._squareRadius\r\n }\r\n\r\n private _cartesian: Equation;\r\n\r\n get cartesian(): Equation {\r\n return this._cartesian\r\n }\r\n\r\n private _exists: boolean;\r\n\r\n get exists(): boolean {\r\n return this._exists;\r\n }\r\n\r\n get radius(): { tex: string, display: string, value: number } {\r\n if (this._squareRadius.isSquare()) {\r\n return {\r\n tex: this._squareRadius.clone().sqrt().tex,\r\n display: this._squareRadius.clone().sqrt().display,\r\n value: this._squareRadius.clone().sqrt().value\r\n }\r\n } else {\r\n return {\r\n tex: `\\\\sqrt{${this._squareRadius.tex}}`,\r\n display: `sqrt(${this._squareRadius.display})`,\r\n value: this._squareRadius.clone().sqrt().value\r\n }\r\n }\r\n return this._squareRadius\r\n }\r\n\r\n get tex(): string {\r\n if (this._exists) {\r\n let cx, cy\r\n if (this._center.x.isZero()) {\r\n cx = 'x^2'\r\n } else {\r\n cx = `\\\\left(x${this._center.x.isNegative() ? '+' : '-'}${this._center.x.clone().abs().tex}\\\\right)^2`\r\n }\r\n if (this._center.y.isZero()) {\r\n cy = 'y^2'\r\n } else {\r\n cy = `\\\\left(y${this._center.y.isNegative() ? '+' : '-'}${this._center.y.clone().abs().tex}\\\\right)^2`\r\n }\r\n return `${cx}+${cy}=${this._squareRadius.tex}`\r\n } else {\r\n return `\\\\text{le cercle n'existe pas.}`\r\n }\r\n }\r\n\r\n get developed(): string {\r\n return this._cartesian.tex\r\n }\r\n\r\n get display(): string {\r\n if (this._exists) {\r\n let cx, cy\r\n if (this._center.x.isZero()) {\r\n cx = 'x^2'\r\n } else {\r\n cx = `(x${this._center.x.isNegative() ? '+' : '-'}${this._center.x.clone().abs().tex})^2`\r\n }\r\n if (this._center.y.isZero()) {\r\n cy = 'y^2'\r\n } else {\r\n cy = `(y${this._center.y.isNegative() ? '+' : '-'}${this._center.y.clone().abs().tex})^2`\r\n }\r\n return `${cx}+${cy}=${this._squareRadius.display}`\r\n } else {\r\n return `\\\\text{le cercle n'existe pas.}`\r\n }\r\n }\r\n\r\n /**\r\n * Get the relative position between circle and line. It corresponds to the number of intersection.\r\n * @param {Line} L\r\n * @returns {number}\r\n */\r\n relativePosition = (L: Line): number => {\r\n let distance = L.distanceTo(this.center), radius = Math.sqrt(this._squareRadius.value)\r\n\r\n if (distance.value - radius > 0.0000000001) {\r\n return 0 // external\r\n } else if (Math.abs(distance.value - radius) < 0.0000000001) {\r\n return 1 // tangent\r\n } else {\r\n return 2 // external\r\n }\r\n }\r\n\r\n lineIntersection = (L: Line): Point[] => {\r\n let intersectionPoints: Point[] = [], solX: Fraction\r\n\r\n if (this._cartesian === null) {\r\n return []\r\n }\r\n const equX = this._cartesian.clone(), lineX = L.equation.clone().isolate('x'),\r\n lineY = L.equation.clone().isolate('y')\r\n\r\n if (lineX instanceof Equation && lineY instanceof Equation) {\r\n equX.replaceBy('y', lineY.right).simplify()\r\n equX.solve()\r\n\r\n for (let x of equX.solutions) {\r\n if (x.exact === false && isNaN(x.value)) {\r\n continue\r\n }\r\n\r\n solX = new Fraction(x.exact === false ? x.value : x.exact)\r\n intersectionPoints.push(new Point(solX.clone(), lineY.right.evaluate(solX)))\r\n }\r\n }\r\n\r\n return intersectionPoints\r\n }\r\n\r\n tangents = (P: Point | Fraction): Line[] => {\r\n if (P instanceof Fraction) {\r\n return this._tangentsWithSlope(P)\r\n } else if (this.isPointOnCircle(P)) {\r\n return this._tangentsThroughOnePointOnTheCircle(P)\r\n } else if (this.center.distanceTo(P).value > this.radius.value) {\r\n //TODO: Must check it's outside the circle\r\n return this._tangentsThroughOnePointOutsideTheCircle(P)\r\n } else {\r\n console.log('No tangents as the point is inside !')\r\n }\r\n return []\r\n }\r\n\r\n isPointOnCircle = (P: Point): Boolean => {\r\n return this._cartesian.test({x: P.x, y: P.y})\r\n }\r\n\r\n getPointsOnCircle = (numberIsInteger?: boolean): Point[] => {\r\n if (numberIsInteger === undefined) {\r\n numberIsInteger = false\r\n }\r\n\r\n // It means searching for pythagorician triples that make a perfect square.\r\n // (x-4)^2 + (y+3)^2 = 15\r\n\r\n let triplets = Numeric.pythagoricianTripletsWithTarget(this._squareRadius.value, true)\r\n\r\n let points: Point[] = [], pt\r\n triplets.forEach(triplet => {\r\n // Allow positive / negative values\r\n // x-a = t => x = a + t\r\n // x-a = -t => x = a - t\r\n\r\n for (let k of [[1, 1], [-1, 1], [-1, -1], [1, -1]]) {\r\n pt = new Point(\r\n this.center.x.clone().add(k[0] * triplet[0]),\r\n this.center.y.clone().add(k[1] * triplet[1])\r\n )\r\n // Check if the point is not already in points.\r\n if (!pt.isInListOfPoints(points)) {\r\n points.push(pt)\r\n }\r\n }\r\n })\r\n return points\r\n }\r\n\r\n clone(): Circle {\r\n this._center = this._center.clone()\r\n this._squareRadius = this._squareRadius.clone()\r\n this._calculateCartesian()\r\n return this\r\n }\r\n\r\n private _tangentsThroughOnePointOnTheCircle = (P: Point): Line[] => {\r\n let CT = new Vector(this._center, P)\r\n return [new Line(P, CT, LinePropriety.Perpendicular)]\r\n }\r\n\r\n private _tangentsThroughOnePointOutsideTheCircle = (P: Point): Line[] => {\r\n // y = mx + h\r\n // px, py => h = -m px + py => mx - y -m.px + py = 0 =>\r\n // Centre: cx, cy, radius: r\r\n // (m.cx - cy -m.px + py)^2 = r^2 * (m^2 + 1)\r\n // (m(cx-py) - (cy - py))^2 = r^2 * (m^2 + 1)\r\n\r\n let cx_px = this.center.x.clone().subtract(P.x), cy_py = this.center.y.clone().subtract(P.y),\r\n polyLeft = new Polynom('x'), polyRight = new Polynom('x^2+1')\r\n\r\n polyLeft.multiply(cx_px).subtract(cy_py).pow(2)\r\n polyRight.multiply(this.squareRadius)\r\n\r\n let equ = new Equation(polyLeft, polyRight)\r\n equ.moveLeft().simplify().solve()\r\n\r\n return equ.solutions.map(sol => {\r\n // h = -m px + py\r\n let h, equ = new Equation('y', 'x')\r\n\r\n if (sol.exact instanceof Fraction) {\r\n h = P.x.clone().opposed().multiply(sol.exact).add(P.y)\r\n equ.right.multiply(sol.exact).add(h)\r\n } else {\r\n h = P.x.clone().opposed().multiply(sol.value).add(P.y)\r\n equ.right.multiply(sol.value).add(h)\r\n }\r\n\r\n return new Line(equ)\r\n })\r\n\r\n }\r\n\r\n private _tangentsWithSlope = (slope: Fraction): Line[] => {\r\n // d(C;t)=r => ac1+bc2 + x = +- sqrt(a^2 + b^2)*r\r\n // x = -ac1-bc2 +- sqrt(a^2 + b^2)*r\r\n // y = a/bx + h => ax-by + H = 0\r\n\r\n const a = slope.numerator, b = -slope.denominator, c1 = this._center.x.clone(), c2 = this._center.y.clone(),\r\n r = this._squareRadius\r\n\r\n let sq = this._squareRadius.clone().multiply(slope.numerator ** 2 + slope.denominator ** 2),\r\n x1 = c1.clone().multiply(a).opposed().subtract(c2.clone().multiply(b)).add(sq.clone().sqrt()),\r\n x2 = c1.clone().multiply(a).opposed().subtract(c2.clone().multiply(b)).subtract(sq.clone().sqrt())\r\n\r\n return [new Line(a, b, x1), new Line(a, b, x2)]\r\n }\r\n\r\n private _reset(): Circle {\r\n this._center = null\r\n this._squareRadius = null\r\n this._cartesian = null\r\n this._exists = false\r\n\r\n return this\r\n }\r\n\r\n private parse(...values: unknown[]): Circle {\r\n // Data can be given in these formats:\r\n // one value, a string -> make it an Equation\r\n // one value, an Equation\r\n // one value, a circle -> clone it\r\n // two values: two points (center and pointThrough)\r\n // two values: point and Fraction (center and radius)\r\n // three values: Point, Fraction, Boolean (center, square radius, true)\r\n\r\n this._reset()\r\n\r\n if (typeof values[0] === 'string') {\r\n this._parseEquation(new Equation(values[0]))\r\n } else if (values[0] instanceof Equation) {\r\n this._parseEquation(values[0])\r\n } else if (values[0] instanceof Circle) {\r\n this._parseCopyCircle(values[0])\r\n } else if (values[0] instanceof Point && values.length > 1) {\r\n if (values[1] instanceof Point) {\r\n if (values[2] instanceof Point) {\r\n this._parseThroughtThreePoints(values[0], values[1], values[2])\r\n } else {\r\n this._parseCenterAndPointThrough(values[0], values[1])\r\n }\r\n } else if (values[1] instanceof Fraction || typeof values[1] === 'number') {\r\n this._parseCenterAndRadius(values[0], values[1], (typeof values[2] === \"boolean\") ? values[2] : false)\r\n }\r\n }\r\n\r\n // Calculate once the different values.\r\n if (this._exists) {\r\n this._calculateCartesian()\r\n\r\n // If the square radius is zero or positive, the circle exists.\r\n if (this._squareRadius !== undefined && this._squareRadius.isNegative()) {\r\n this._exists = false\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n private _calculateCartesian() {\r\n this._cartesian = (new Equation(new Polynom(`(x-(${this._center.x.display}))^2+(y-(${this._center.y.display}))^2`), new Polynom(`${this._squareRadius.display}`))).moveLeft()\r\n }\r\n\r\n private _parseCopyCircle(circle: Circle): Circle {\r\n this._center = circle.center.clone()\r\n this._squareRadius = circle.squareRadius.clone()\r\n this._calculateCartesian()\r\n this._exists = circle.exists\r\n return this\r\n }\r\n\r\n private _parseCenterAndRadius(center: Point, radius: Fraction | number, square?: boolean): Circle {\r\n this._center = center.clone()\r\n\r\n if (square) {\r\n this._squareRadius = (new Fraction(radius))\r\n } else {\r\n this._squareRadius = new Fraction(radius).pow(2)\r\n }\r\n\r\n this._exists = true\r\n return this\r\n }\r\n\r\n private _parseCenterAndPointThrough(center: Point, pointThrough: Point): Circle {\r\n this._center = center.clone()\r\n this._squareRadius = new Vector(this._center, pointThrough).normSquare\r\n this._exists = true\r\n return this\r\n }\r\n\r\n private _parseEquation(equ: Equation): Circle {\r\n this._exists = false\r\n\r\n // Move everything to the left.\r\n equ.moveLeft()\r\n\r\n if (equ.degree('x').value === 2 && equ.degree('y').value === 2) {\r\n // Both must be of degree 2.\r\n let x2 = equ.left.monomByDegree(2, 'x'), y2 = equ.left.monomByDegree(2, 'y'), x1: Monom, y1: Monom, c: Monom\r\n\r\n // Both square monoms must have the same coefficient.\r\n if (x2.coefficient.isEqual(y2.coefficient)) {\r\n equ.divide(x2.coefficient)\r\n\r\n x1 = equ.left.monomByDegree(1, 'x')\r\n y1 = equ.left.monomByDegree(1, 'y')\r\n\r\n c = equ.left.monomByDegree(0)\r\n\r\n this._center = new Point(x1.coefficient.clone().divide(2).opposed(), y1.coefficient.clone().divide(2).opposed())\r\n\r\n this._squareRadius = c.coefficient.clone().opposed()\r\n .add(this._center.x.clone().pow(2))\r\n .add(this._center.y.clone().pow(2))\r\n\r\n this._calculateCartesian()\r\n this._exists = true\r\n } else {\r\n // The circle is not a valid circle\r\n this._center = null\r\n this._squareRadius = null\r\n this._exists = false\r\n }\r\n }\r\n return this\r\n }\r\n\r\n private _parseThroughtThreePoints(A: Point, B: Point, C: Point): Circle {\r\n let T = new Triangle(A, B, C), mAB = T.remarquables.mediators.AB.clone(),\r\n mAC = T.remarquables.mediators.AC.clone()\r\n this.parse(mAB.intersection(mAC).point, A)\r\n\r\n return this\r\n }\r\n\r\n}","/**\r\n * This class works for 2d line in a plane.\r\n */\r\n\r\nimport {Vector} from \"./vector\";\r\nimport {Point} from \"./point\";\r\nimport {Numeric} from \"../numeric\";\r\nimport {Fraction} from \"../coefficients/fraction\";\r\nimport {Equation} from \"../algebra/equation\";\r\nimport {Polynom} from \"../algebra/polynom\";\r\nimport {Random} from \"../randomization/random\";\r\nimport {LinearSystem} from \"../algebra/linearSystem\";\r\nimport {Monom} from \"../algebra/monom\";\r\n\r\nexport enum LinePropriety {\r\n None,\r\n Parallel = 'parallel',\r\n Perpendicular = 'perpendicular',\r\n Tangent = 'tangent'\r\n}\r\n\r\nexport class Line {\r\n // A line is defined as the canonical form\r\n static PERPENDICULAR = LinePropriety.Perpendicular\r\n static PARALLEL = LinePropriety.Parallel\r\n private _referencePropriety: LinePropriety\r\n private _referenceLine: Line\r\n private _reduceBeforeDisplay: boolean\r\n\r\n constructor(...values: unknown[]) {\r\n\r\n this._exists = false;\r\n this._reduceBeforeDisplay = true\r\n\r\n if (values.length > 0) {\r\n this.parse(...values);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n // ax + by + c = 0\r\n private _a: Fraction;\r\n\r\n get a(): Fraction {\r\n return this._a;\r\n }\r\n\r\n set a(value: Fraction) {\r\n this._a = value;\r\n }\r\n\r\n private _b: Fraction;\r\n\r\n get b(): Fraction {\r\n return this._b;\r\n }\r\n\r\n set b(value: Fraction) {\r\n this._b = value;\r\n }\r\n\r\n private _c: Fraction;\r\n\r\n get c(): Fraction {\r\n return this._c;\r\n }\r\n\r\n // ------------------------------------------\r\n // Getter and setter\r\n\r\n set c(value: Fraction) {\r\n this._c = value;\r\n }\r\n\r\n private _OA: Point;\r\n\r\n get OA(): Point {\r\n return this._OA;\r\n }\r\n\r\n set OA(value: Point) {\r\n this._OA = value;\r\n }\r\n\r\n private _d: Vector;\r\n\r\n get d(): Vector {\r\n return this._d;\r\n }\r\n\r\n set d(value: Vector) {\r\n this._d = value;\r\n }\r\n\r\n private _n: Vector;\r\n\r\n get n(): Vector {\r\n return this._n;\r\n }\r\n\r\n private _exists: boolean\r\n\r\n get exists(): boolean {\r\n return this._exists;\r\n }\r\n\r\n // ------------------------------------------\r\n get equation(): Equation {\r\n let equ = new Equation(new Polynom().parse('xy', this._a, this._b, this._c), new Polynom('0'))\r\n if(this._reduceBeforeDisplay) {\r\n return equ.simplify();\r\n }else{\r\n return equ\r\n }\r\n }\r\n\r\n get system(): { x: Equation, y: Equation } {\r\n let e1 = new Equation(\r\n new Polynom('x'),\r\n new Polynom(this._OA.x)\r\n .add(new Monom('k').multiplyByNumber(this._d.x))\r\n ),\r\n e2 = new Equation(\r\n new Polynom('y'),\r\n new Polynom(this._OA.y)\r\n .add(new Monom('k').multiplyByNumber(this._d.y))\r\n )\r\n\r\n return {x: e1, y: e2}\r\n }\r\n\r\n get tex(): { canonical: string, mxh: string, parametric: string, equation: string, system: string } {\r\n // canonical => ax + by + c = 0\r\n // mxh => y = -a/b x - c/b\r\n // parametric => (xy) = OA + k*d\r\n // equation => ax + by = -c\r\n\r\n let canonical = this.equation.clone().reorder(true);\r\n // Make sur the first item is positive.\r\n if (this._a.isNegative()) {\r\n canonical.multiply(-1);\r\n }\r\n\r\n let d = this._d.clone()\r\n if (this._reduceBeforeDisplay) {\r\n d.simplifyDirection()\r\n }\r\n\r\n return {\r\n canonical: canonical.tex,\r\n equation: canonical.clone().reorder().tex,\r\n mxh: this.slope.isInfinity() ? 'x=' + this.OA.x.tex : 'y=' + new Polynom().parse('x', this.slope, this.height).tex,\r\n parametric: `${Point.pmatrix('x', 'y')} = ${Point.pmatrix(this._OA.x, this._OA.y)} + k\\\\cdot ${Point.pmatrix(d.x, d.y)}`,\r\n system: `\\\\left\\\\{\\\\begin{aligned}\r\n x &= ${(new Polynom(this._OA.x)\r\n .add(new Monom(this._d.x).multiply(new Monom('k'))))\r\n .reorder('k', true)\r\n .tex}\\\\\\\\\\ \r\n y &= ${(new Polynom(this._OA.y)\r\n .add(new Monom(this._d.y).multiply(new Monom('k'))))\r\n .reorder('k', true)\r\n .tex}\r\n \\\\end{aligned}\\\\right.`\r\n }\r\n }\r\n\r\n get reduceBeforeDisplay(): boolean {\r\n return this._reduceBeforeDisplay;\r\n }\r\n\r\n set reduceBeforeDisplay(value: boolean) {\r\n this._reduceBeforeDisplay = value;\r\n }\r\n\r\n get display(): { canonical: string, mxh: string, parametric: string } {\r\n // canonical => ax + by + c = 0\r\n // mxh => y = -a/b x - c/b\r\n // parametric => (xy) = OA + k*d // not relevant in display mode.\r\n\r\n let canonical = this.equation;\r\n // Make sur the first item is positive.\r\n if (this._a.isNegative()) {\r\n canonical.multiply(-1);\r\n }\r\n\r\n return {\r\n canonical: canonical.display,\r\n mxh: this.slope.isInfinity() ? 'x=' + this.OA.x.display : 'y=' + new Polynom().parse('x', this.slope, this.height).display,\r\n parametric: \"\"\r\n }\r\n }\r\n\r\n get normal(): Vector {\r\n return new Vector(this._a, this._b);\r\n }\r\n\r\n get director(): Vector {\r\n return this._d.clone()\r\n }\r\n\r\n get slope(): Fraction {\r\n return this._a.clone().opposed().divide(this._b);\r\n }\r\n\r\n get height(): Fraction {\r\n return this._c.clone().opposed().divide(this._b);\r\n }\r\n\r\n randomPoint = (k?: number): Point => {\r\n // Return a random point on the line.\r\n return this._d\r\n .clone()\r\n .multiplyByScalar(Random.numberSym((k === undefined || k <= 1) ? 3 : k, false))\r\n .add(this._OA.asVector)\r\n .asPoint\r\n }\r\n randomNearPoint = (k?: number): Point => {\r\n let pt = this.randomPoint(k)\r\n\r\n let maxIterationTest = 10\r\n while (this.isOnLine(pt) && maxIterationTest > 0) {\r\n pt.x.add(Random.numberSym(1, false))\r\n pt.y.add(Random.numberSym(1, false))\r\n maxIterationTest--\r\n\r\n }\r\n return pt\r\n }\r\n\r\n// ------------------------------------------\r\n // Creation / parsing functions\r\n\r\n // ------------------------------------------\r\n /**\r\n * Parse data to a line\r\n * @param {any} values\r\n * @returns {Line}\r\n */\r\n parse = (...values: unknown[]): Line => {\r\n this._exists = false;\r\n\r\n // Nothing is given...\r\n if (values.length === 0) {\r\n return this\r\n }\r\n\r\n // One value only: already a line (clone it), an Equation, a string (as Equation)\r\n if (values.length === 1) {\r\n if (values[0] instanceof Line) {\r\n // Already a Line\r\n return values[0].clone()\r\n } else if (values[0] instanceof Equation) {\r\n // It's an Equation\r\n return this.parseEquation(values[0])\r\n } else if (typeof values[0] === \"string\") {\r\n // It's a string - create an Equation from it.\r\n try {\r\n let E = new Equation(values[0])\r\n return this.parse(E)\r\n } catch (e) {\r\n return this\r\n }\r\n }\r\n }\r\n\r\n if (values.length === 2) {\r\n if (values[0] instanceof Point && values[1] instanceof Vector) {\r\n return this.parseByPointAndVector(values[0], values[1]);\r\n } else if (values[0] instanceof Point && values[1] instanceof Point) {\r\n return this.parseByPointAndVector(values[0], new Vector(values[0], values[1]));\r\n } else if (values[0] instanceof Vector && values[1] instanceof Point) {\r\n return this.parseByPointAndNormal(values[1], values[0])\r\n }\r\n }\r\n\r\n if (values.length === 3) {\r\n if (\r\n (values[0] instanceof Fraction || typeof values[0] === 'number')\r\n &&\r\n (values[1] instanceof Fraction || typeof values[1] === 'number')\r\n &&\r\n (values[2] instanceof Fraction || typeof values[2] === 'number')\r\n ) {\r\n return this.parseByCoefficient(values[0], values[1], values[2]);\r\n } else if (\r\n values[0] instanceof Point && values[1] instanceof Vector\r\n ) {\r\n if (values[2] === LinePropriety.Perpendicular) {\r\n return this.parseByPointAndNormal(values[0], values[1])\r\n } else if (values[2] === LinePropriety.Parallel) {\r\n return this.parseByPointAndVector(values[0], values[1])\r\n }\r\n } else if (values[0] instanceof Point && values[1] instanceof Line) {\r\n if (values[2] === LinePropriety.Parallel || values[2] === null) {\r\n return this.parseByPointAndLine(values[0], values[1], LinePropriety.Parallel)\r\n } else {\r\n return this.parseByPointAndLine(values[0], values[1], LinePropriety.Perpendicular)\r\n }\r\n }\r\n }\r\n\r\n // TODO: Add the ability to create line from a normal vector\r\n console.log('Someting wrong happend while creating the line')\r\n return this;\r\n }\r\n\r\n parseEquation = (equ: Equation): Line => {\r\n // Reorder the eequation\r\n equ.reorder(true)\r\n\r\n // It must contain either x, y or both.\r\n let letters = new Set(equ.letters());\r\n\r\n // No 'x', no 'y' in the equations\r\n if (!(letters.has('x') || letters.has('y'))) {\r\n return this\r\n }\r\n\r\n // Another letter in the equation ?\r\n for (let elem of ['x', 'y']) {\r\n if (letters.has(elem)) {\r\n letters.delete(elem)\r\n }\r\n }\r\n\r\n if (letters.size > 0) {\r\n return this\r\n }\r\n\r\n // Everything should be ok now...\r\n return this.parseByCoefficient(equ.left.monomByLetter('x').coefficient, equ.left.monomByLetter('y').coefficient, equ.left.monomByDegree(0).coefficient)\r\n }\r\n parseByCoefficient = (a: Fraction | number, b: Fraction | number, c: Fraction | number): Line => {\r\n this._a = new Fraction(a);\r\n this._b = new Fraction(b);\r\n this._c = new Fraction(c);\r\n\r\n this._d = new Vector(this._b.clone(), this._a.clone().opposed());\r\n this._OA = new Point(new Fraction().zero(), this._c.clone());\r\n this._n = this._d.clone().normal();\r\n\r\n this._exists = true;\r\n return this;\r\n }\r\n\r\n parseByPointAndVector = (P: Point, d: Vector): Line => {\r\n // OX = OP + k*d\r\n // x = px + kdx * dy\r\n // y = py + kdy * dx\r\n // ------------------\r\n // dy * x = px * dy + kdxdy\r\n // dx * y = py * dx + kdxdy\r\n // ------------------\r\n // dy * x - dx * y = px * dy - py * dx\r\n // dy * x - dx * y - (px * dy - py * dx) = 0\r\n this.parseByCoefficient(\r\n d.y,\r\n d.x.clone().opposed(),\r\n P.x.clone().multiply(d.y).subtract(P.y.clone().multiply(d.x)).opposed()\r\n )\r\n\r\n // Choose the current values as point and direction vector instead of the automatic version.\r\n this._OA = P.clone();\r\n this._d = d.clone();\r\n this._n = this._d.clone().normal();\r\n\r\n this._exists = true;\r\n return this;\r\n }\r\n\r\n parseByPointAndNormal = (P: Point, n: Vector): Line => {\r\n return this.parseByCoefficient(\r\n n.x,\r\n n.y,\r\n P.x.clone().multiply(n.x)\r\n .add(P.y.clone().multiply(n.y)).opposed()\r\n )\r\n }\r\n\r\n parseByPointAndLine = (P: Point, L: Line, orientation?: LinePropriety): Line => {\r\n\r\n if (orientation === undefined) {\r\n orientation = LinePropriety.Parallel\r\n }\r\n\r\n if (orientation === LinePropriety.Parallel) {\r\n return this.parseByPointAndNormal(P, L.normal)\r\n } else if (orientation === LinePropriety.Perpendicular) {\r\n return this.parseByPointAndNormal(P, L.director)\r\n }\r\n\r\n this._exists = false\r\n return this\r\n }\r\n\r\n clone = (): Line => {\r\n this._a = this._a.clone();\r\n this._b = this._b.clone();\r\n this._c = this._c.clone();\r\n\r\n this._d = this._d.clone();\r\n this._OA = this._OA.clone();\r\n this._n = this._n.clone();\r\n\r\n this._exists = this.exists\r\n return this;\r\n }\r\n // ------------------------------------------\r\n // Mathematical operations\r\n // ------------------------------------------\r\n isOnLine = (pt: Point): Boolean => {\r\n return this._a.clone()\r\n .multiply(pt.x)\r\n .add(\r\n this._b.clone()\r\n .multiply(pt.y)\r\n )\r\n .add(this._c)\r\n .isZero()\r\n }\r\n\r\n isParallelTo = (line: Line): Boolean => {\r\n // Do they have the isSame direction ?\r\n return this.slope.isEqual(line.slope) && this.height.isNotEqual(line.height);\r\n }\r\n isSameAs = (line: Line): Boolean => {\r\n return this.slope.isEqual(line.slope) && this.height.isEqual(line.height);\r\n }\r\n isPerpendicularTo = (line: Line): Boolean => {\r\n return this.d.isNormalTo(line.d)\r\n }\r\n isVertical = (): Boolean => {\r\n return this.slope.isInfinity()\r\n }\r\n simplify = (): Line => {\r\n let lcm = Numeric.lcm(this._a.denominator, this._b.denominator, this._c.denominator),\r\n gcd = Numeric.gcd(this._a.numerator, this._b.numerator, this._c.numerator);\r\n\r\n this.parseByCoefficient(\r\n this._a.clone().multiply(lcm).divide(gcd),\r\n this._b.clone().multiply(lcm).divide(gcd),\r\n this._c.clone().multiply(lcm).divide(gcd),\r\n )\r\n\r\n return this\r\n }\r\n\r\n simplifyDirection = (): Line => {\r\n this._d.simplifyDirection()\r\n return this;\r\n }\r\n intersection = (line: Line): { point: Point, hasIntersection: boolean, isParallel: boolean, isSame: boolean } => {\r\n let Pt = new Point(), isParallel = false, isSame = false, hasIntersection = true;\r\n\r\n // this => ax+by+c = 0\r\n // line => dx+ey+f = 0\r\n //\r\n // aex + bey + ce = 0\r\n // dbx + bey + bf = 0\r\n // (ae-db)x + ce-bf = 0\r\n //\r\n // adx + bdy + cd = 0\r\n // adx + aey + af = 0\r\n // (bd-ae)y + (cd-af)\r\n //\r\n // x = (bf-ce)/(ae-db)\r\n // y = (af-cd)/(bd-ae)\r\n\r\n\r\n // Theres is no 'y'\r\n if (this._b.isZero() || line.b.isZero()) {\r\n // TODO : handle no y in the line canonical form\r\n }\r\n\r\n if (this.isParallelTo(line)) {\r\n Pt.x = null;\r\n Pt.y = null;\r\n isParallel = true;\r\n } else if (this.isSameAs(line)) {\r\n Pt.x = null;\r\n Pt.y = null;\r\n isSame = true;\r\n } else {\r\n Pt.x = this._b.clone().multiply(line.c).subtract(this._c.clone().multiply(line.b))\r\n .divide(this._a.clone().multiply(line.b).subtract(this._b.clone().multiply(line.a)));\r\n Pt.y = this._a.clone().multiply(line.c).subtract(this._c.clone().multiply(line.a))\r\n .divide(this._b.clone().multiply(line.a).subtract(this._a.clone().multiply(line.b)));\r\n }\r\n\r\n return {\r\n point: Pt,\r\n hasIntersection: !(isParallel || isSame),\r\n isParallel,\r\n isSame\r\n };\r\n }\r\n\r\n distanceTo(pt: Point): { value: number, fraction: Fraction, tex: string } {\r\n let numerator = pt.x.clone().multiply(this._a)\r\n .add(pt.y.clone().multiply(this._b))\r\n .add(this._c).abs(),\r\n d2 = this.normal.normSquare;\r\n\r\n // The denominator is null - shouldn't be possible\r\n if (d2.isZero()) {\r\n return {\r\n value: NaN,\r\n tex: 'Not a line',\r\n fraction: new Fraction().infinite()\r\n }\r\n }\r\n // The denominator is a perfect square - simplify the tex result\r\n let value = numerator.value / Math.sqrt(d2.value),\r\n F = numerator.clone().divide(d2.clone().sqrt());\r\n\r\n // The denominator is a perfect square.\r\n if (d2.isSquare()) {\r\n return {\r\n value,\r\n tex: F.tex,\r\n fraction: F\r\n }\r\n }\r\n // Complete answer...\r\n return {\r\n value,\r\n tex: `\\\\frac{${numerator.tex}}{\\\\sqrt{${d2.tex}}}`,\r\n fraction: F\r\n };\r\n }\r\n\r\n hitSegment(A: Point, B: Point): boolean {\r\n let iPt = this.intersection(\r\n new Line(A, B)\r\n )\r\n\r\n // There is an intersection point\r\n if (iPt.hasIntersection) {\r\n return iPt.point.x.value >= Math.min(A.x.value, B.x.value)\r\n && iPt.point.x.value <= Math.max(A.x.value, B.x.value)\r\n && iPt.point.y.value >= Math.min(A.y.value, B.y.value)\r\n && iPt.point.y.value <= Math.max(A.y.value, B.y.value)\r\n }\r\n return false;\r\n }\r\n\r\n getValueAtX = (value: Fraction | number): Fraction => {\r\n const equ = this.equation.clone().isolate('y'),\r\n F = new Fraction(value)\r\n\r\n if (equ instanceof Equation) {\r\n return equ.right.evaluate({x: F})\r\n }\r\n return\r\n }\r\n getValueAtY = (value: Fraction | number): Fraction => {\r\n const equ = this.equation.clone().isolate('x'),\r\n F = new Fraction(value)\r\n\r\n if (equ instanceof Equation) {\r\n return equ.right.evaluate({y: F})\r\n }\r\n return\r\n }\r\n\r\n // ------------------------------------------\r\n // Special functions\r\n // ------------------------------------------\r\n canonicalAsFloatCoefficient(decimals: number): string {\r\n if (decimals === undefined) {\r\n decimals = 2;\r\n }\r\n\r\n let ca = this._a.value,\r\n cb = this._b.value,\r\n cc = this._c.value,\r\n canonical = '';\r\n\r\n if (!this._a.isZero()) {\r\n if (this._a.isOne()) {\r\n canonical = 'x'\r\n } else if (this._a.clone().opposed().isOne()) {\r\n canonical = '-x'\r\n } else {\r\n canonical = this._a.value.toFixed(decimals) + 'x'\r\n }\r\n }\r\n\r\n if (!this._b.isZero()) {\r\n if (this._b.isPositive()) {\r\n canonical += '+'\r\n }\r\n canonical += this._b.value.toFixed(decimals) + 'y'\r\n }\r\n\r\n if (!this._c.isZero()) {\r\n if (this._c.isPositive()) {\r\n canonical += '+'\r\n }\r\n canonical += this._c.value.toFixed(decimals)\r\n }\r\n\r\n\r\n return canonical + '=0';\r\n }\r\n}","/**\r\n * Vector module contains everything necessary to handle 2d or 3d vectors.\r\n * @module Vector\r\n */\r\nimport {Line} from \"./line\";\r\nimport {Vector} from \"./vector\";\r\nimport {Fraction} from \"../coefficients/fraction\";\r\n\r\n/**\r\n * Helper class - a way to identify an object {x: number, y: number}\r\n */\r\nclass PointXY {\r\n x: number\r\n y: number\r\n}\r\n\r\nexport class Point {\r\n private _x: Fraction; // 1st component\r\n private _y: Fraction; // 2nd component\r\n private _exist: Boolean;\r\n\r\n constructor(...values: unknown[]) {\r\n this._x = new Fraction().zero();\r\n this._y = new Fraction().zero();\r\n\r\n if (values !== undefined) {\r\n this.parse(...values);\r\n }\r\n\r\n return this\r\n };\r\n\r\n // ------------------------------------------\r\n // Getter and setter\r\n // ------------------------------------------\r\n get x(): Fraction {\r\n return this._x;\r\n }\r\n\r\n set x(value: Fraction) {\r\n this._x = value;\r\n }\r\n\r\n get y(): Fraction {\r\n return this._y;\r\n }\r\n\r\n set y(value: Fraction) {\r\n this._y = value;\r\n }\r\n\r\n get tex(): string {\r\n let pts = [];\r\n\r\n pts.push(this._x.tex);\r\n pts.push(this._y.tex);\r\n\r\n return `\\\\left(${pts.join(';')}\\\\right)`\r\n }\r\n\r\n get display(): string {\r\n let pts = [];\r\n\r\n pts.push(this._x.tex);\r\n pts.push(this._y.tex);\r\n\r\n return `(${pts.join(';')})`\r\n }\r\n\r\n get asVector(): Vector {\r\n return new Vector(this.x, this.y)\r\n }\r\n\r\n // ------------------------------------------\r\n // Creation / parsing functions\r\n // ------------------------------------------\r\n parse = (...values: unknown[]): Point => {\r\n // Initialize the value.\r\n this.zero();\r\n\r\n // Nothing is given\r\n if (values.length === 0) {\r\n return this;\r\n }\r\n\r\n // One element is given - might be already a point !\r\n if (values.length === 1) {\r\n // it's already a point - clone it\r\n if (values[0] instanceof Point) {\r\n this._x = values[0].x.clone()\r\n this._y = values[0].y.clone()\r\n return this\r\n }\r\n\r\n // Value is given as string, comma separated.\r\n if (typeof values[0] === 'string') {\r\n let xy = values[0].split(',')\r\n if (xy.length === 2) {\r\n this._x = new Fraction(xy[0]).reduce()\r\n this._y = new Fraction(xy[1]).reduce()\r\n return this\r\n }\r\n }\r\n\r\n // Value given as an object with {x: value, y: value}\r\n if(values[0] instanceof PointXY){\r\n this._x = new Fraction(values[0].x).reduce()\r\n this._y = new Fraction(values[0].y).reduce()\r\n return this\r\n } else {\r\n return this.zero()\r\n }\r\n }\r\n\r\n if (values.length === 2) {\r\n this._x = new Fraction(values[0]).reduce()\r\n this._y = new Fraction(values[1]).reduce()\r\n return this\r\n }\r\n\r\n return this;\r\n };\r\n\r\n clone = (): Point => {\r\n this._x = this._x.clone()\r\n this._y = this._y.clone()\r\n\r\n return this\r\n }\r\n\r\n zero = (): Point => {\r\n this._x = new Fraction(null);\r\n this._y = new Fraction(null);\r\n return this;\r\n }\r\n\r\n origin = (): Point => {\r\n this.zero();\r\n return this;\r\n }\r\n\r\n middleOf = (P1: Point, P2: Point): Point => {\r\n this._x = P1.x.clone().add(P2.x).divide(2);\r\n this._y = P1.y.clone().add(P2.y).divide(2);\r\n\r\n return this;\r\n }\r\n // ------------------------------------------\r\n // Display functions\r\n // ------------------------------------------\r\n texValues = (numberOfDigits: number): string => {\r\n let pts = [];\r\n\r\n pts.push(this._x.value.toFixed(numberOfDigits === undefined ? 2 : numberOfDigits));\r\n pts.push(this._y.value.toFixed(numberOfDigits === undefined ? 2 : numberOfDigits));\r\n\r\n return `\\\\left(${pts.join(';')}\\\\right)`\r\n }\r\n // ------------------------------------------\r\n // Mathematical operations\r\n // ------------------------------------------\r\n\r\n // ------------------------------------------\r\n // Vector functions\r\n // ------------------------------------------\r\n\r\n // ------------------------------------------\r\n // Static functions\r\n // ------------------------------------------\r\n static pmatrix = (a: any, b: any, c?: any): string => {\r\n if (c === undefined) {\r\n return `\\\\begin{pmatrix} ${a.tex ? a.tex : a} \\\\\\\\ ${b.tex ? b.tex : b} \\\\end{pmatrix}`;\r\n } else {\r\n return `\\\\begin{pmatrix} ${a.tex ? a.tex : a} \\\\\\\\ ${b.tex ? b.tex : b} \\\\\\\\ ${c.tex ? c.tex : c} \\\\end{pmatrix}`;\r\n }\r\n };\r\n\r\n distanceTo = (item:Point|Line): { value: number, fraction: Fraction, tex: string } => {\r\n let value = 0, fraction = new Fraction(), tex = ''\r\n\r\n if(item instanceof Line){\r\n return item.distanceTo(this)\r\n }else if(item instanceof Point){\r\n let V = new Vector(this, item)\r\n\r\n value = V.norm\r\n fraction = V.normSquare.sqrt()\r\n tex = V.normSquare.isSquare() ? fraction.tex : `\\\\sqrt{\\\\frac{ ${V.normSquare.numerator} }{ ${V.normSquare.denominator} }}`\r\n }\r\n return { value, fraction, tex }\r\n }\r\n\r\n get key(): string {\r\n return `${this.x.display};${this.y.display}`\r\n}\r\n isInListOfPoints = (list: Point[]): boolean => {\r\n const keyList = list.map(x=>x.key)\r\n\r\n return keyList.includes(this.key)\r\n }\r\n}\r\n","import {Point} from \"./point\";\r\nimport {Fraction} from \"../coefficients/fraction\";\r\nimport {Vector} from \"./vector\";\r\nimport {Line} from \"./line\";\r\nimport {Equation} from \"../algebra/equation\";\r\n\r\nexport interface remarquableLines {\r\n 'medians': {\r\n 'A': Line,\r\n 'B': Line,\r\n 'C': Line,\r\n 'intersection': Point\r\n },\r\n 'mediators': {\r\n 'AB': Line,\r\n 'AC': Line,\r\n 'BC': Line,\r\n 'intersection': Point\r\n },\r\n 'heights': {\r\n 'A': Line,\r\n 'B': Line,\r\n 'C': Line,\r\n 'intersection': Point\r\n },\r\n 'bisectors': {\r\n 'A': Line,\r\n 'B': Line,\r\n 'C': Line,\r\n 'intersection': Point\r\n },\r\n externalBisectors: {\r\n 'A': Line,\r\n 'B': Line,\r\n 'C': Line,\r\n 'intersection': Point\r\n }\r\n}\r\n\r\nexport class Triangle {\r\n private _A: Point;\r\n private _B: Point;\r\n private _C: Point;\r\n private _lines: {\r\n 'AB': Line,\r\n 'AC': Line,\r\n 'BC': Line\r\n };\r\n private _middles: {\r\n 'AB': Point,\r\n 'AC': Point,\r\n 'BC': Point\r\n };\r\n private _remarquables: remarquableLines;\r\n\r\n\r\n constructor(...values: unknown[]) {\r\n\r\n if (values.length > 0) {\r\n this.parse(...values);\r\n }\r\n return this;\r\n }\r\n\r\n // ------------------------------------------\r\n // Getter and setters\r\n // ------------------------------------------\r\n\r\n get A(): Point {\r\n return this._A;\r\n }\r\n\r\n get B(): Point {\r\n return this._B;\r\n }\r\n\r\n get C(): Point {\r\n return this._C;\r\n }\r\n\r\n get AB(): Vector {\r\n return this.getSegment('A', 'B');\r\n }\r\n\r\n get BA(): Vector {\r\n return this.getSegment('B', 'A');\r\n }\r\n\r\n get BC(): Vector {\r\n return this.getSegment('B', 'C');\r\n }\r\n\r\n get CB(): Vector {\r\n return this.getSegment('C', 'B');\r\n }\r\n\r\n get AC(): Vector {\r\n return this.getSegment('A', 'C');\r\n }\r\n\r\n get CA(): Vector {\r\n return this.getSegment('C', 'A');\r\n }\r\n\r\n get isRectangle(): boolean {\r\n if (this.AB.isNormalTo(this.BC)) {\r\n return true;\r\n }\r\n if (this.AB.isNormalTo(this.AC)) {\r\n return true;\r\n }\r\n if (this.BC.isNormalTo(this.AC)) {\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n get isEquilateral(): boolean {\r\n return this.AB.normSquare.isEqual(this.BC.normSquare) &&\r\n this.AB.normSquare.isEqual(this.AC.normSquare);\r\n }\r\n\r\n get isIsocele(): boolean {\r\n return this.AB.normSquare.isEqual(this.BC.normSquare) ||\r\n this.AB.normSquare.isEqual(this.AC.normSquare) ||\r\n this.BC.normSquare.isEqual(this.AC.normSquare)\r\n }\r\n\r\n get lines(): { 'AB': Line, 'BC': Line, 'AC': Line } {\r\n return this._lines;\r\n }\r\n\r\n get remarquables(): remarquableLines {\r\n return this._remarquables;\r\n }\r\n\r\n // ------------------------------------------\r\n // Creation / parsing functions\r\n // ------------------------------------------\r\n\r\n /**\r\n * Parse values to a triangle. Supported formats:\r\n * Point, Point, Point\r\n * x1, y1, x2, y2, x3, y3\r\n * TODO: Something else ?\r\n * @param values\r\n */\r\n parse = (...values: any): Triangle => {\r\n if (values.length === 6) {\r\n // Check if all values are number or fractions.\r\n let v = values.map((x: any) => new Fraction(x));\r\n return this.parse(\r\n new Point(v[0], v[1]),\r\n new Point(v[2], v[3]),\r\n new Point(v[4], v[5]),\r\n )\r\n } else if (values.length === 3) {\r\n // Possibilities:\r\n // - Three points (or part of points, only dict for example, or array (TODO: Add the array syntax for point)\r\n // - Three lines\r\n // - Three lines as text.\r\n if(values.filter((x:any) => typeof x === 'string').length===3) {\r\n return this.parse( ...values.map((x:string) => new Line(x)) )\r\n }else if(values.filter((x:any) => x instanceof Line).length===3) {\r\n // We have three lines\r\n this._lines = {\r\n 'AB': values[0],\r\n 'BC': values[1],\r\n 'AC': values[2]\r\n };\r\n\r\n // Get the intersection points -> build the triangle using these intersection points.\r\n let intersect = values[0].intersection(values[1]);\r\n if (intersect.hasIntersection) {\r\n this._B = intersect.point.clone();\r\n } else {\r\n return this;\r\n }\r\n intersect = values[1].intersection(values[2]);\r\n if (intersect.hasIntersection) {\r\n this._C = intersect.point.clone();\r\n } else {\r\n return this;\r\n }\r\n intersect = values[2].intersection(values[0]);\r\n if (intersect.hasIntersection) {\r\n this._A = intersect.point.clone();\r\n } else {\r\n return this;\r\n }\r\n }else {\r\n // At least, one of the value is not a point.\r\n if (values.filter((x: any) => (x instanceof Point)).length < 3) {\r\n return this.parse(\r\n new Point(values[0]),\r\n new Point(values[1]),\r\n new Point(values[2])\r\n )\r\n }\r\n\r\n // We have three points.\r\n this._A = values[0].clone();\r\n this._B = values[1].clone();\r\n this._C = values[2].clone();\r\n\r\n this._lines = {\r\n 'AB': new Line(this._A, this._B),\r\n 'BC': new Line(this._B, this._C),\r\n 'AC': new Line(this._A, this._C)\r\n };\r\n }\r\n } else if (values.length === 1) {\r\n if (values[0] instanceof Triangle) {\r\n return values[0].clone();\r\n }\r\n }\r\n\r\n this._updateTriangle();\r\n return this;\r\n }\r\n\r\n /**\r\n * Clone the Triangle class\r\n */\r\n clone = (): Triangle => {\r\n this._A = this._A.clone();\r\n this._B = this._B.clone();\r\n this._C = this._C.clone();\r\n\r\n this._lines = {\r\n 'AB': this._lines.AB.clone(),\r\n 'BC': this._lines.BC.clone(),\r\n 'AC': this._lines.AC.clone()\r\n }\r\n\r\n this._updateTriangle();\r\n return this;\r\n }\r\n\r\n\r\n // ------------------------------------------\r\n // Triangle operations and properties\r\n // ------------------------------------------\r\n\r\n /**\r\n * Generate the Line object for the three segments of the triangle\r\n */\r\n private _updateTriangle = () => {\r\n this._middles = {\r\n 'AB': new Point().middleOf(this._A, this._B),\r\n 'AC': new Point().middleOf(this._A, this._C),\r\n 'BC': new Point().middleOf(this._B, this._C)\r\n }\r\n\r\n this._remarquables = this._calculateRemarquableLines();\r\n }\r\n\r\n\r\n /**\r\n * Get the Point class for the given name\r\n * @param ptName\r\n */\r\n private getPointByName = (ptName: string): Point => {\r\n switch (ptName.toUpperCase()) {\r\n case 'A':\r\n return this._A;\r\n case 'B':\r\n return this._B;\r\n case 'C':\r\n return this._C;\r\n }\r\n\r\n // Something went wrong ! Return the first point\r\n return this._A;\r\n }\r\n /**\r\n * Get the vector for the segment given by name.\r\n * @param ptName1\r\n * @param ptName2\r\n */\r\n private getSegment = (ptName1: string, ptName2: string): Vector => {\r\n return new Vector(\r\n this.getPointByName(ptName1),\r\n this.getPointByName(ptName2)\r\n );\r\n }\r\n\r\n private _calculateRemarquableLines = (): remarquableLines => {\r\n const bA= this._calculateBisectors('A'),\r\n bB= this._calculateBisectors('B'),\r\n bC= this._calculateBisectors('C')\r\n\r\n let remarquables: remarquableLines = {\r\n 'medians': {\r\n 'A': new Line(this._A, this._middles.BC),\r\n 'B': new Line(this._B, this._middles.AC),\r\n 'C': new Line(this._C, this._middles.AB),\r\n 'intersection': null\r\n },\r\n 'mediators': {\r\n 'AB': new Line(this._middles.AB, new Vector(this._A, this._B).normal()),\r\n 'AC': new Line(this._middles.AC, new Vector(this._A, this._C).normal()),\r\n 'BC': new Line(this._middles.BC, new Vector(this._B, this._C).normal()),\r\n 'intersection': null\r\n },\r\n 'heights': {\r\n 'A': new Line(this._A, new Vector(this._B, this._C).normal()),\r\n 'B': new Line(this._B, new Vector(this._A, this._C).normal()),\r\n 'C': new Line(this._C, new Vector(this._A, this._B).normal()),\r\n 'intersection': null\r\n },\r\n 'bisectors': {\r\n 'A': bA.internal,\r\n 'B': bB.internal,\r\n 'C': bB.internal,\r\n 'intersection': null\r\n },\r\n externalBisectors: {\r\n 'A': bA.external,\r\n 'B': bB.external,\r\n 'C': bC.external,\r\n 'intersection': null\r\n }\r\n }\r\n\r\n // As it's a triangle, we assume the lines are intersecting and aren't parallel or superposed.\r\n remarquables.medians.intersection = remarquables.medians.A.intersection(remarquables.medians.B).point;\r\n remarquables.mediators.intersection = remarquables.mediators.AB.intersection(remarquables.mediators.BC).point;\r\n remarquables.heights.intersection = remarquables.heights.A.intersection(remarquables.heights.B).point;\r\n remarquables.bisectors.intersection = remarquables.bisectors.A.intersection(remarquables.bisectors.B).point;\r\n\r\n // Everything was calculated for the remarquable lines.\r\n return remarquables;\r\n }\r\n\r\n private _calculateBisectors = (pt: string): { internal: Line, external: Line } => {\r\n let tlines = this.lines, d1, d2;\r\n\r\n if(pt==='A'){\r\n d1 = tlines.AB;\r\n d2 = tlines.AC;\r\n }else if(pt==='B'){\r\n d1 = tlines.AB;\r\n d2 = tlines.BC;\r\n }else if(pt==='C'){\r\n d1 = tlines.BC;\r\n d2 = tlines.AC;\r\n }\r\n\r\n let b1 = new Line(new Equation(d1.equation.left.clone().multiply(d2.n.simplify().norm), d2.equation.left.clone().multiply(d1.n.simplify().norm)).reorder(true).simplify()),\r\n b2 = new Line(new Equation(d1.equation.left.clone().multiply(d2.n.simplify().norm), d2.equation.left.clone().multiply(d1.n.simplify().norm).opposed()).reorder(true).simplify());\r\n\r\n // Must determine which bisectors is in the triangle\r\n if(pt==='A'){\r\n return b1.hitSegment(this.B, this.C)?{internal:b1, external: b2}:{internal:b2, external: b1};\r\n }\r\n if(pt==='B'){\r\n return b1.hitSegment(this.A, this.C)?{internal:b1, external: b2}:{internal:b2, external: b1};\r\n }\r\n if(pt==='C'){\r\n return b1.hitSegment(this.B, this.A)?{internal:b1, external: b2}:{internal:b2, external: b1};\r\n }\r\n\r\n // Default returns the first bisector\r\n return {internal:b1, external: b2}\r\n }\r\n}","/**\r\n * Vector module contains everything necessary to handle 2d or 3d vectors.\r\n * @module Vector\r\n */\r\nimport {Fraction} from \"../coefficients/fraction\";\r\nimport {Numeric} from \"../numeric\";\r\nimport {Point} from \"./point\";\r\n\r\nexport class Vector {\r\n private _x: Fraction; // 1st component\r\n private _y: Fraction; // 2nd component\r\n\r\n constructor(...values: unknown[]) {\r\n this._x = new Fraction().zero();\r\n this._y = new Fraction().zero();\r\n\r\n if (values !== undefined) {\r\n this.parse(...values);\r\n }\r\n };\r\n\r\n // ------------------------------------------\r\n // Getter and setter\r\n // ------------------------------------------\r\n get x(): Fraction {\r\n return this._x;\r\n }\r\n\r\n set x(value: Fraction|number|string) {\r\n this._x = new Fraction(value);\r\n }\r\n\r\n get y(): Fraction {\r\n return this._y;\r\n }\r\n\r\n set y(value: Fraction|number|string) {\r\n this._y = new Fraction(value);\r\n }\r\n\r\n get normSquare(): Fraction {\r\n return this._x.clone().pow(2).add(this._y.clone().pow(2));\r\n }\r\n\r\n get norm(): number {\r\n return Math.sqrt(this.normSquare.value);\r\n }\r\n\r\n get tex(): string {\r\n return `\\\\begin{pmatrix}${this._x.tex} \\\\\\\\\\ ${this._y.tex} \\\\end{pmatrix}`\r\n }\r\n\r\n get asPoint(): Point {\r\n return new Point(this.x, this.y)\r\n }\r\n\r\n // ------------------------------------------\r\n // Creation / parsing functions\r\n // ------------------------------------------\r\n\r\n parse = (...values: any): Vector => {\r\n // TODO: Must be more strict about what is given and limit to two dimensional vectors.p\r\n // Maybe more than one value was given...\r\n // Initialize the vector\r\n this.zero();\r\n\r\n if (values.length === 0) {\r\n return this;\r\n }\r\n\r\n if (values.length === 1) {\r\n if (values[0] instanceof Vector) {\r\n return values[0].clone()\r\n } else {\r\n return this._parseString(values[0])\r\n }\r\n }\r\n\r\n if (values.length >= 2) {\r\n // Two points are given - skip the third value.\r\n if (values[0] instanceof Point && values[1] instanceof Point) {\r\n this._x = values[1].x.clone().subtract(values[0].x)\r\n this._y = values[1].y.clone().subtract(values[0].y)\r\n return this;\r\n }\r\n\r\n // Fractions or a number are give\r\n if (values[0] instanceof Fraction || !isNaN(values[0])) {\r\n this._x = new Fraction(values[0])\r\n }\r\n if (values[1] instanceof Fraction || !isNaN(values[1])) {\r\n this._y = new Fraction(values[1])\r\n }\r\n\r\n if(\r\n (typeof values[0] === 'object' && !isNaN(values[0].x) && !isNaN(values[0].x)) &&\r\n (typeof values[1] === 'object' && !isNaN(values[1].x) && !isNaN(values[1].x))\r\n ){\r\n this._x = new Fraction(+values[1].x-values[0].x)\r\n this._y = new Fraction(+values[1].y-values[0].y)\r\n }\r\n }\r\n\r\n return this;\r\n };\r\n\r\n clone = (): Vector => {\r\n let V = new Vector();\r\n\r\n if (this._x !== null) {\r\n V.x = this._x.clone();\r\n }\r\n if (this._y !== null) {\r\n V.y = this._y.clone();\r\n }\r\n return V;\r\n }\r\n\r\n reset = (): Vector => {\r\n this._x = null;\r\n this._y = null;\r\n return this;\r\n }\r\n\r\n zero = (): Vector => {\r\n this.reset();\r\n this._x = new Fraction(null);\r\n this._y = new Fraction(null);\r\n return this;\r\n }\r\n\r\n one = (): Vector => {\r\n this._x = new Fraction();\r\n this._y = new Fraction();\r\n return this;\r\n }\r\n\r\n private _parseString = (value: string): Vector => {\r\n // Split comma, semi colon or single space.\r\n let components = value.split(/[,;\\s]/g);\r\n\r\n // Validate the fraction values.\r\n this.x = new Fraction(components[0] || null);\r\n this.y = new Fraction(components[1] || null);\r\n return this;\r\n };\r\n\r\n // ------------------------------------------\r\n // Mathematical operations\r\n // ------------------------------------------\r\n opposed = (): Vector => {\r\n this._x.opposed();\r\n this._y.opposed();\r\n return this;\r\n }\r\n\r\n add = (V: Vector): Vector => {\r\n this._x.add(V.x);\r\n this._y.add(V.y);\r\n\r\n return this;\r\n }\r\n\r\n subtract = (V: Vector): Vector => {\r\n return this.add(V.clone().opposed());\r\n }\r\n\r\n scalarProductWithVector = (V: Vector): Fraction => {\r\n return Vector.scalarProduct(this, V)\r\n // return this._x.clone().multiply(V.x).add(this._y.clone().multiply(V.y));\r\n }\r\n\r\n determinantWithVector = (V: Vector): Fraction => {\r\n return Vector.determinant(this, V)\r\n }\r\n\r\n static scalarProduct = (v1: Vector, v2: Vector): Fraction => {\r\n return v1.x.clone().multiply(v2.x).add(v1.y.clone().multiply(v2.y));\r\n };\r\n\r\n static determinant = (v1: Vector, v2: Vector): Fraction => {\r\n return v1.x.clone().multiply(v2.y).subtract(v1.y.clone().multiply(v2.x))\r\n }\r\n\r\n normal = (): Vector => {\r\n let x = this.x.clone().opposed(), y = this.y.clone();\r\n this._x = y;\r\n this._y = x;\r\n return this;\r\n }\r\n\r\n isColinearTo = (v: Vector): boolean => {\r\n return this.determinantWithVector(v).isZero()\r\n }\r\n\r\n isNormalTo = (v: Vector): boolean => {\r\n return this.scalarProductWithVector(v).isZero()\r\n }\r\n\r\n get isNull(): boolean {\r\n return this.x.isZero() && this.y.isZero()\r\n }\r\n\r\n multiplyByScalar = (k: any): Vector => {\r\n let scalar = new Fraction(k);\r\n this._x.multiply(scalar);\r\n this._y.multiply(scalar);\r\n return this;\r\n }\r\n\r\n divideByScalar = (k: any): Vector => {\r\n return this.multiplyByScalar(new Fraction(k).invert());\r\n }\r\n // ------------------------------------------\r\n // Vector functions\r\n // ------------------------------------------\r\n\r\n simplify = (): Vector => {\r\n // Multiply by the lcm of denominators.\r\n return this.multiplyByScalar(Numeric.lcm(this._x.denominator, this._y.denominator))\r\n .divideByScalar(Numeric.gcd(this._x.numerator, this._y.numerator));\r\n }\r\n\r\n simplifyDirection = (): Vector => {\r\n let lcm = Numeric.lcm(this.x.denominator, this.y.denominator),\r\n gcd = Numeric.gcd(this.x.numerator, this.y.numerator);\r\n\r\n this.x.multiply(lcm).divide(gcd);\r\n this.y.multiply(lcm).divide(gcd);\r\n return this\r\n }\r\n\r\n angleWith = (V: Vector, sharp?: Boolean, radian?: Boolean): number => {\r\n let scalar = this.scalarProductWithVector(V).value,\r\n toDegree = radian ? 1 : 180 / Math.PI;\r\n if (sharp) {\r\n scalar = Math.abs(scalar);\r\n }\r\n\r\n return toDegree * Math.acos(scalar / (this.norm * V.norm));\r\n }\r\n}\r\n","export class Numeric{\r\n static round(value:number, decimals:number=2):number {\r\n return Number(Math.round(Number(value+'e'+decimals))+'e-'+decimals);\r\n }\r\n\r\n /**\r\n * Get the list of the nth first prime numbers.\r\n * @param nb : number of primes to choose from\r\n */\r\n static primes(nb?:number):number[]{\r\n let primesValues:number[] = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997, 1009, 1013, 1019, 1021, 1031, 1033, 1039, 1049, 1051, 1061, 1063, 1069, 1087, 1091, 1093, 1097, 1103, 1109, 1117, 1123, 1129, 1151, 1153, 1163, 1171, 1181, 1187, 1193, 1201, 1213, 1217, 1223, 1229, 1231, 1237, 1249, 1259, 1277, 1279, 1283, 1289, 1291, 1297, 1301, 1303, 1307, 1319, 1321, 1327, 1361, 1367, 1373, 1381, 1399, 1409, 1423, 1427, 1429, 1433, 1439, 1447, 1451, 1453, 1459, 1471, 1481, 1483, 1487, 1489, 1493, 1499, 1511, 1523, 1531, 1543, 1549, 1553, 1559, 1567, 1571, 1579, 1583, 1597, 1601, 1607, 1609, 1613, 1619, 1621, 1627, 1637, 1657, 1663, 1667, 1669, 1693, 1697, 1699, 1709, 1721, 1723, 1733, 1741, 1747, 1753, 1759, 1777, 1783, 1787, 1789, 1801, 1811, 1823, 1831, 1847, 1861, 1867, 1871, 1873, 1877, 1879, 1889, 1901, 1907, 1913, 1931, 1933, 1949, 1951, 1973, 1979, 1987, 1993, 1997, 1999, 2003, 2011, 2017, 2027, 2029, 2039, 2053, 2063, 2069, 2081, 2083, 2087, 2089, 2099, 2111, 2113, 2129, 2131, 2137, 2141, 2143, 2153, 2161, 2179, 2203, 2207, 2213, 2221, 2237, 2239, 2243, 2251, 2267, 2269, 2273, 2281, 2287, 2293, 2297, 2309, 2311, 2333, 2339, 2341, 2347, 2351, 2357, 2371, 2377, 2381, 2383, 2389, 2393, 2399, 2411, 2417, 2423, 2437, 2441, 2447, 2459, 2467, 2473, 2477, 2503, 2521, 2531, 2539, 2543, 2549, 2551, 2557, 2579, 2591, 2593, 2609, 2617, 2621, 2633, 2647, 2657, 2659, 2663, 2671, 2677, 2683, 2687, 2689, 2693, 2699, 2707, 2711, 2713, 2719, 2729, 2731, 2741, 2749, 2753, 2767, 2777, 2789, 2791, 2797, 2801, 2803, 2819, 2833, 2837, 2843, 2851, 2857, 2861, 2879, 2887, 2897, 2903, 2909, 2917, 2927, 2939, 2953, 2957, 2963, 2969, 2971, 2999, 3001, 3011, 3019, 3023, 3037, 3041, 3049, 3061, 3067, 3079, 3083, 3089, 3109, 3119, 3121, 3137, 3163, 3167, 3169, 3181, 3187, 3191, 3203, 3209, 3217, 3221, 3229, 3251, 3253, 3257, 3259, 3271, 3299, 3301, 3307, 3313, 3319, 3323, 3329, 3331, 3343, 3347, 3359, 3361, 3371, 3373, 3389, 3391, 3407, 3413, 3433, 3449, 3457, 3461, 3463, 3467, 3469, 3491, 3499, 3511, 3517, 3527, 3529, 3533, 3539, 3541, 3547, 3557, 3559, 3571, 3581, 3583, 3593, 3607, 3613, 3617, 3623, 3631, 3637, 3643, 3659, 3671, 3673, 3677, 3691, 3697, 3701, 3709, 3719, 3727, 3733, 3739, 3761, 3767, 3769, 3779, 3793, 3797, 3803, 3821, 3823, 3833, 3847, 3851, 3853, 3863, 3877, 3881, 3889, 3907, 3911, 3917, 3919, 3923, 3929, 3931, 3943, 3947, 3967, 3989, 4001, 4003, 4007, 4013, 4019, 4021, 4027, 4049, 4051, 4057, 4073, 4079, 4091, 4093, 4099, 4111, 4127, 4129, 4133, 4139, 4153, 4157, 4159, 4177, 4201, 4211, 4217, 4219, 4229, 4231, 4241, 4243, 4253, 4259, 4261, 4271, 4273, 4283, 4289, 4297, 4327, 4337, 4339, 4349, 4357, 4363, 4373, 4391, 4397, 4409, 4421, 4423, 4441, 4447, 4451, 4457, 4463, 4481, 4483, 4493, 4507, 4513, 4517, 4519, 4523, 4547, 4549, 4561, 4567, 4583, 4591, 4597, 4603, 4621, 4637, 4639, 4643, 4649, 4651, 4657, 4663, 4673, 4679, 4691, 4703, 4721, 4723, 4729, 4733, 4751, 4759, 4783, 4787, 4789, 4793, 4799, 4801, 4813, 4817, 4831, 4861, 4871, 4877, 4889, 4903, 4909, 4919, 4931, 4933, 4937, 4943, 4951, 4957, 4967, 4969, 4973, 4987, 4993, 4999, 5003, 5009, 5011, 5021, 5023, 5039, 5051, 5059, 5077, 5081, 5087, 5099, 5101, 5107, 5113, 5119, 5147, 5153, 5167, 5171, 5179, 5189, 5197, 5209, 5227, 5231, 5233, 5237, 5261, 5273, 5279, 5281, 5297, 5303, 5309, 5323, 5333, 5347, 5351, 5381, 5387, 5393, 5399, 5407, 5413, 5417, 5419, 5431, 5437, 5441, 5443, 5449, 5471, 5477, 5479, 5483, 5501, 5503, 5507, 5519, 5521, 5527, 5531, 5557, 5563, 5569, 5573, 5581, 5591, 5623, 5639, 5641, 5647, 5651, 5653, 5657, 5659, 5669, 5683, 5689, 5693, 5701, 5711, 5717, 5737, 5741, 5743, 5749, 5779, 5783, 5791, 5801, 5807, 5813, 5821, 5827, 5839, 5843, 5849, 5851, 5857, 5861, 5867, 5869, 5879, 5881, 5897, 5903, 5923, 5927, 5939, 5953, 5981, 5987, 6007, 6011, 6029, 6037, 6043, 6047, 6053, 6067, 6073, 6079, 6089, 6091, 6101, 6113, 6121, 6131, 6133, 6143, 6151, 6163, 6173, 6197, 6199, 6203, 6211, 6217, 6221, 6229, 6247, 6257, 6263, 6269, 6271, 6277, 6287, 6299, 6301, 6311, 6317, 6323, 6329, 6337, 6343, 6353, 6359, 6361, 6367, 6373, 6379, 6389, 6397, 6421, 6427, 6449, 6451, 6469, 6473, 6481, 6491, 6521, 6529, 6547, 6551, 6553, 6563, 6569, 6571, 6577, 6581, 6599, 6607, 6619, 6637, 6653, 6659, 6661, 6673, 6679, 6689, 6691, 6701, 6703, 6709, 6719, 6733, 6737, 6761, 6763, 6779, 6781, 6791, 6793, 6803, 6823, 6827, 6829, 6833, 6841, 6857, 6863, 6869, 6871, 6883, 6899, 6907, 6911, 6917, 6947, 6949, 6959, 6961, 6967, 6971, 6977, 6983, 6991, 6997, 7001, 7013, 7019, 7027, 7039, 7043, 7057, 7069, 7079, 7103, 7109, 7121, 7127, 7129, 7151, 7159, 7177, 7187, 7193, 7207, 7211, 7213, 7219, 7229, 7237, 7243, 7247, 7253, 7283, 7297, 7307, 7309, 7321, 7331, 7333, 7349, 7351, 7369, 7393, 7411, 7417, 7433, 7451, 7457, 7459, 7477, 7481, 7487, 7489, 7499, 7507, 7517, 7523, 7529, 7537, 7541, 7547, 7549, 7559, 7561, 7573, 7577, 7583, 7589, 7591, 7603, 7607, 7621, 7639, 7643, 7649, 7669, 7673, 7681, 7687, 7691, 7699, 7703, 7717, 7723, 7727, 7741, 7753, 7757, 7759, 7789, 7793, 7817, 7823, 7829, 7841, 7853, 7867, 7873, 7877, 7879, 7883, 7901, 7907, 7919, 7927, 7933, 7937, 7949, 7951, 7963, 7993, 8009, 8011, 8017, 8039, 8053, 8059, 8069, 8081, 8087, 8089, 8093, 8101, 8111, 8117, 8123, 8147, 8161, 8167, 8171, 8179, 8191, 8209, 8219, 8221, 8231, 8233, 8237, 8243, 8263, 8269, 8273, 8287, 8291, 8293, 8297, 8311, 8317, 8329, 8353, 8363, 8369, 8377, 8387, 8389, 8419, 8423, 8429, 8431, 8443, 8447, 8461, 8467, 8501, 8513, 8521, 8527, 8537, 8539, 8543, 8563, 8573, 8581, 8597, 8599, 8609, 8623, 8627, 8629, 8641, 8647, 8663, 8669, 8677, 8681, 8689, 8693, 8699, 8707, 8713, 8719, 8731, 8737, 8741, 8747, 8753, 8761, 8779, 8783, 8803, 8807, 8819, 8821, 8831, 8837, 8839, 8849, 8861, 8863, 8867, 8887, 8893, 8923, 8929, 8933, 8941, 8951, 8963, 8969, 8971, 8999, 9001, 9007, 9011, 9013, 9029, 9041, 9043, 9049, 9059, 9067, 9091, 9103, 9109, 9127, 9133, 9137, 9151, 9157, 9161, 9173, 9181, 9187, 9199, 9203, 9209, 9221, 9227, 9239, 9241, 9257, 9277, 9281, 9283, 9293, 9311, 9319, 9323, 9337, 9341, 9343, 9349, 9371, 9377, 9391, 9397, 9403, 9413, 9419, 9421, 9431, 9433, 9437, 9439, 9461, 9463, 9467, 9473, 9479, 9491, 9497, 9511, 9521, 9533, 9539, 9547, 9551, 9587, 9601, 9613, 9619, 9623, 9629, 9631, 9643, 9649, 9661, 9677, 9679, 9689, 9697, 9719, 9721, 9733, 9739, 9743, 9749, 9767, 9769, 9781, 9787, 9791, 9803, 9811, 9817, 9829, 9833, 9839, 9851, 9857, 9859, 9871, 9883, 9887, 9901, 9907, 9923, 9929, 9931, 9941, 9949, 9967, 9973];\r\n if(nb === undefined){\r\n return primesValues;\r\n }else{\r\n return primesValues.slice(0,Math.min(primesValues.length,nb));\r\n }\r\n }\r\n\r\n /**\r\n * Get the list of all dividers of a number.\r\n * @param value\r\n */\r\n static dividers(value:number):number[]{\r\n let D: number[];\r\n const maxV = Math.sqrt(Math.abs(value));\r\n\r\n // Initialize the list of dividers.\r\n D = [];\r\n\r\n for(let i=1; i<=maxV; i++){\r\n if(value%i===0){\r\n D.push(i);\r\n D.push(value/i);\r\n }\r\n }\r\n\r\n // Order numbers.\r\n D.sort(function(a, b){return a-b;});\r\n\r\n // Make sure the array of value is unique.\r\n return [...new Set(D)];\r\n }\r\n /**\r\n * Great Common Divisor\r\n * @param values : number values\r\n */\r\n static gcd(...values:number[]):number{\r\n // Define the gcd for two number\r\n let gcd2 = function(a:number,b:number):number{\r\n if(b===0){return a;}\r\n return gcd2(b, a%b);\r\n };\r\n\r\n let g:number = 1,\r\n i:number = 2;\r\n\r\n // Nothing is given\r\n if(values.length===0){return 1;}\r\n // Only one number is given\r\n if(values.length===1){\r\n // The first number is zero\r\n if(values[0]===0){return 1;}\r\n // Return the number\r\n return values[0];\r\n }\r\n\r\n // We have at least 2 numbers.\r\n g = gcd2(values[0],values[1]);\r\n\r\n // The gcd of the two first value is one ? It's already finished.\r\n if(g===1){return 1;}\r\n\r\n // The current gcd isn't one. Continue with all next values.\r\n for(i=2; i<values.length; i++){\r\n g = gcd2(g, values[i]);\r\n // Escape if gcd is already one.\r\n if(g===1){break;}\r\n }\r\n\r\n return Math.abs(g);\r\n }\r\n\r\n static divideNumbersByGCD(...values: number[]): number[]{\r\n let gcd = Numeric.gcd(...values)\r\n\r\n return values.map(x=>x/gcd)\r\n }\r\n /**\r\n * Least Common Multiple\r\n * @param values: list of numbers\r\n */\r\n static lcm(...values:number[]):number{\r\n return values.reduce(function(a,b){\r\n return Math.abs(a * b / Numeric.gcd(a, b));\r\n });\r\n }\r\n\r\n static pythagoricianTripletsWithTarget(target: number, targetIsSquare?:boolean): number[][] {\r\n // méthode inverse, à partir du triplet.\r\n const triplets = [],\r\n targetValue = targetIsSquare===true?+target:target**2\r\n for(let u = 0; u <= target; u++){\r\n for(let v = 0; v <=target; v++){\r\n if(u**2+v**2===targetValue){\r\n triplets.push([u, v, target])\r\n }\r\n }\r\n }\r\n\r\n return triplets\r\n }\r\n\r\n static numberCorrection(value: number, epsilonDigit:number = 1, epsilonNumberOfDigits: number = 10, number_of_digits: number = 8){\r\n return +value.toFixed(number_of_digits)\r\n //\r\n // // Must modify the number if it's like:\r\n // // a: 3.0000000000000003\r\n // // b: 3.9999999999999994\r\n // // remove the last character\r\n // // check if around n last characters are either 0 or 9\r\n // // if it is, 'round' the number.\r\n // function extractDecimalPart(valueToExtract: number, decimalLength: number){\r\n // let decimal = valueToExtract.toString()\r\n //\r\n // if (!decimal.includes('.')) {\r\n // return ''\r\n // }\r\n //\r\n // decimal = decimal.split('.')[1]\r\n // return decimal.substring(0, decimalLength)\r\n // }\r\n //\r\n // const epsilon = Number(`0.${\"0\".repeat(epsilonNumberOfDigits-1)}${epsilonDigit}`)\r\n // const decimal = extractDecimalPart(value, epsilonNumberOfDigits)\r\n // if(decimal===''){return value}\r\n //\r\n // const n9 = decimal.match(/9+$/g)\r\n // const n0 = decimal.match(/0+$/g)\r\n //\r\n // if (n9 && n9[0].length >= number_of_digits) {\r\n // // New tested values.\r\n // const mod = extractDecimalPart(value + epsilon, epsilonNumberOfDigits),\r\n // mod0 = mod.match(/0+$/g)\r\n //\r\n // if(mod0 && mod0[0].length>= number_of_digits){\r\n // return +((value+epsilon).toString().split(mod0[0])[0])\r\n // }\r\n // }\r\n //\r\n // if (n0 && n0[0].length >= number_of_digits) {\r\n // // New tested values.\r\n // const mod = extractDecimalPart(value - epsilon, epsilonNumberOfDigits),\r\n // mod9 = mod.match(/9+$/g)\r\n //\r\n // if(mod9 && mod9[0].length>= number_of_digits){\r\n // // The value can be changed. Remove all nines!\r\n // return +(value.toString().split(n0[0])[0])\r\n // }\r\n // }\r\n //\r\n // return value\r\n }\r\n\r\n static periodic(value: number):number{\r\n if(Number.isSafeInteger(value)){return 0}\r\n\r\n // Assume it's with decimal.\r\n let decimal = (value.toString()).split('.')[0]\r\n\r\n // The decimal part is limited\r\n if(decimal.length<10){return 0}\r\n\r\n // Find the periodic if it exists.\r\n }\r\n\r\n static decompose(value: number): number[][]{\r\n let dividers = Numeric.dividers(value),\r\n limit = Math.sqrt(value),\r\n arr = [],\r\n u, v\r\n\r\n while(dividers.length>0){\r\n u = dividers.shift()\r\n v = dividers.length>0?dividers.pop():+u\r\n\r\n arr.push([u,v])\r\n }\r\n\r\n return arr\r\n }\r\n}","import {Shutingyard, ShutingyardMode, ShutingyardType, tokenConstant} from \"./shutingyard\";\r\nimport {Fraction} from \"./coefficients/fraction\";\r\n\r\nexport class NumExp {\r\n private _rpn: { token: string, tokenType: string }[]\r\n private _expression: string\r\n private _isValid: boolean\r\n\r\n constructor(value: string, uniformize?:boolean) {\r\n this._expression = value\r\n try {\r\n this._rpn = new Shutingyard(ShutingyardMode.NUMERIC).parse(value, uniformize || uniformize===undefined).rpn\r\n }catch(e){\r\n this._rpn = null\r\n this._isValid = false\r\n }\r\n }\r\n\r\n get rpn(): { token: string; tokenType: string }[] {\r\n return this._rpn;\r\n }\r\n\r\n get isValid(): boolean {\r\n if(this._isValid===undefined){\r\n try {\r\n const v = this.evaluate({x: 0})\r\n }catch{\r\n this._isValid = false\r\n }\r\n }\r\n return this._isValid\r\n }\r\n\r\n set isValid(value: boolean){\r\n this._isValid = value\r\n }\r\n\r\n get expression(): string {\r\n return this._expression;\r\n }\r\n\r\n private _extractDecimalPart(value: number): string {\r\n let decimal = value.toString()\r\n\r\n if (!decimal.includes('.')) {\r\n return ''\r\n }\r\n\r\n decimal = decimal.split('.')[1]\r\n\r\n return decimal.substring(0, decimal.length - 2)\r\n }\r\n\r\n private _numberCorrection(value: number): number {\r\n // Must modify the number if it's like:\r\n // a: 3.0000000000000003\r\n // b: 3.9999999999999994\r\n // remove the last character\r\n // check if around n last characters are either 0 or 9\r\n // if it is, 'round' the number.\r\n\r\n const epsilon = 0.00000000000001,\r\n number_of_digits = 6\r\n\r\n const decimal = this._extractDecimalPart(value)\r\n if(decimal===''){return value}\r\n\r\n const n9 = decimal.match(/9+$/g)\r\n const n0 = decimal.match(/0+$/g)\r\n\r\n if (n9 && n9[0].length >= number_of_digits) {\r\n // New tested values.\r\n const mod = this._extractDecimalPart(value + epsilon),\r\n mod0 = mod.match(/0+$/g)\r\n\r\n if(mod0 && mod0[0].length>= number_of_digits){\r\n // The value can be changed. Remove all zeros!\r\n return +((value+epsilon).toString().split(mod0[0])[0])\r\n }\r\n }\r\n\r\n if (n0 && n0[0].length >= number_of_digits) {\r\n // New tested values.\r\n const mod = this._extractDecimalPart(value - epsilon),\r\n mod9 = mod.match(/9+$/g)\r\n\r\n if(mod9 && mod9[0].length>= number_of_digits){\r\n // The value can be changed. Remove all nines!\r\n return +(value.toString().split(n0[0])[0])\r\n }\r\n }\r\n\r\n return value\r\n }\r\n\r\n private _addToStack(stack:number[], value: number): void {\r\n stack.push(this._numberCorrection(value))\r\n }\r\n\r\n evaluate(values?: { [Key: string]: number }): number {\r\n const stack: number[] = []\r\n\r\n if(this._rpn===null){\r\n this._isValid = false\r\n return 0\r\n }\r\n\r\n this.isValid = true\r\n\r\n for (const element of this._rpn) {\r\n if (element.tokenType === ShutingyardType.COEFFICIENT) {\r\n // May be a numeric value or a Fraction.\r\n if (!isNaN(+element.token)) {\r\n this._addToStack(stack, +element.token)\r\n } else {\r\n this._addToStack(stack, new Fraction(element.token).value)\r\n }\r\n } else if (element.tokenType === ShutingyardType.VARIABLE) {\r\n if (values[element.token] !== undefined) {\r\n this._addToStack(stack, +values[element.token])\r\n }\r\n } else if (element.tokenType === ShutingyardType.CONSTANT) {\r\n this._addToStack(stack, tokenConstant[element.token])\r\n } else if (element.tokenType === ShutingyardType.OPERATION) {\r\n if (element.token === '*') {\r\n const b = stack.pop(),\r\n a = stack.pop()\r\n if(a === undefined || b === undefined){this.isValid = false}\r\n this._addToStack(stack, a * b)\r\n } else if (element.token === '/') {\r\n const b = stack.pop(),\r\n a = stack.pop()\r\n if(a === undefined || b === undefined){this.isValid = false}\r\n this._addToStack(stack, a / b)\r\n } else if (element.token === '+') {\r\n const b = stack.pop(),\r\n a = stack.pop()\r\n if(a === undefined || b === undefined){this.isValid = false}\r\n this._addToStack(stack, (+a) + (+b))\r\n } else if (element.token === '-') {\r\n const b = stack.pop(),\r\n a = stack.pop() || 0\r\n if(b === undefined){this.isValid = false}\r\n this._addToStack(stack, a - b)\r\n } else if (element.token === '^') {\r\n const b = stack.pop(),\r\n a = stack.pop()\r\n if(a === undefined || b === undefined){this.isValid = false}\r\n this._addToStack(stack, Math.pow(a, b))\r\n }\r\n } else if (element.tokenType === ShutingyardType.FUNCTION) {\r\n const a = stack.pop()\r\n if(a === undefined){this.isValid = false}\r\n if (element.token === 'sin') {\r\n this._addToStack(stack, Math.sin(a))\r\n } else if (element.token === 'cos') {\r\n this._addToStack(stack, Math.cos(a))\r\n } else if (element.token === 'tan') {\r\n this._addToStack(stack, Math.tan(a))\r\n } else if(element.token === 'sqrt') {\r\n this._addToStack(stack, Math.sqrt(a))\r\n }else if(element.token ==='nthrt') {\r\n // TODO: support nthrt in num. exp.\r\n let b = stack.pop()\r\n if(a%2===0 && b<0){\r\n this._addToStack(stack, NaN)\r\n }else {\r\n this._addToStack(stack, (b < 0 ? -1 : 1) * Math.pow(Math.abs(b), 1 / a))\r\n }\r\n } else if(element.token === 'ln'){\r\n this._addToStack(stack, Math.log(a))\r\n } else if(element.token === 'log') {\r\n this._addToStack(stack, Math.log10(a))\r\n }\r\n }\r\n }\r\n\r\n if (stack.length === 1) {\r\n return stack[0]\r\n } else {\r\n throw `There was a problem parsing: ${this._expression}`\r\n }\r\n }\r\n}\r\n","import {rndPolynom} from \"./rndPolynom\";\r\nimport {rndMonom} from \"./rndMonom\";\r\nimport {rndHelpers} from \"./rndHelpers\";\r\nimport {\r\n randomCoefficientConfig,\r\n randomGeometryLineConfig,\r\n randomGeometryPointConfig,\r\n randomMonomConfig,\r\n randomPolynomConfig\r\n} from \"./rndTypes\";\r\nimport {rndFraction} from \"./rndFraction\";\r\nimport {Polynom} from \"../algebra/polynom\";\r\nimport {Monom} from \"../algebra/monom\";\r\nimport {Fraction} from \"../coefficients/fraction\";\r\nimport {Line} from \"../geometry/line\";\r\nimport {rndGeometryLine} from \"./rndGeometryLine\";\r\nimport {Point} from \"../geometry/point\";\r\nimport {rndGeometryPoint} from \"./rndGeometryPoint\";\r\n\r\nexport * from \"./rndTypes\"\r\n\r\nexport namespace Random {\r\n export function polynom(config?: randomPolynomConfig): Polynom {\r\n return (new rndPolynom(config)).generate()\r\n }\r\n\r\n export function monom(config?: randomMonomConfig): Monom {\r\n return (new rndMonom(config)).generate()\r\n }\r\n\r\n export function fraction(config?: randomCoefficientConfig): Fraction {\r\n return (new rndFraction(config)).generate()\r\n }\r\n\r\n export function number(from: number, to: number, exclude?: number[]): number {\r\n return rndHelpers.randomInt(from, to, exclude)\r\n }\r\n\r\n export function numberSym(max: number, allowZero?: boolean): number {\r\n return rndHelpers.randomIntSym(max, allowZero)\r\n }\r\n\r\n export function prime(max: number): number {\r\n return rndHelpers.randomPrime(max)\r\n }\r\n\r\n export function bool(percent?: number): boolean {\r\n return rndHelpers.randomBool(percent)\r\n }\r\n\r\n export function array(arr: any[], number?: number): any[] {\r\n return rndHelpers.randomArray(arr, number)\r\n }\r\n\r\n export function item(arr: any[]): any {\r\n return rndHelpers.randomItem(arr)\r\n }\r\n\r\n export function shuffle(arr: any[]): any[] {\r\n return rndHelpers.shuffleArray(arr)\r\n }\r\n\r\n export namespace Geometry {\r\n export function line(config?: randomGeometryLineConfig): Line {\r\n return (new rndGeometryLine(config).generate())\r\n }\r\n\r\n export function point(config?: randomGeometryPointConfig): Point {\r\n return (new rndGeometryPoint(config).generate())\r\n }\r\n\r\n }\r\n}","export class randomCore {\r\n protected _config: Object\r\n protected _defaultConfig: Object\r\n mergeConfig = (config: Object, defaultConfig: Object): Object => {\r\n if (config !== undefined) {\r\n return {...defaultConfig, ...config}\r\n }\r\n return defaultConfig\r\n }\r\n\r\n generate = (): unknown => {\r\n return undefined\r\n }\r\n\r\n config = (config: Object): randomCore => {\r\n this._config = this.mergeConfig(config, this._defaultConfig)\r\n return this\r\n }\r\n}","import {randomCore} from \"./randomCore\";\r\nimport {randomCoefficientConfig, randomMonomConfig, randomPolynomConfig} from \"./rndTypes\";\r\nimport {Random} from \"./random\";\r\nimport {Fraction} from \"../coefficients/fraction\";\r\n\r\n/**\r\n * Create a random monom based on a based configuration\r\n */\r\nexport class rndFraction extends randomCore {\r\n declare protected _config: randomCoefficientConfig\r\n declare protected _defaultConfig: randomCoefficientConfig\r\n\r\n constructor(userConfig?: randomCoefficientConfig) {\r\n super();\r\n\r\n this._defaultConfig = {\r\n negative: true,\r\n max: 10,\r\n reduced: true,\r\n zero: true,\r\n natural: false\r\n }\r\n\r\n this._config = this.mergeConfig(userConfig, this._defaultConfig)\r\n }\r\n\r\n generate = (): Fraction => {\r\n let Q = new Fraction()\r\n\r\n if(this._config.negative){\r\n Q.numerator = Random.numberSym(this._config.max, this._config.zero)\r\n }else {\r\n Q.numerator = Random.number(this._config.zero ? 0 : 1, this._config.max)\r\n }\r\n if(this._config.natural){\r\n Q.denominator = 1\r\n }else {\r\n let securityCount = 0\r\n while(Q.isRelative() && securityCount<10) {\r\n Q.denominator = Random.number(1, this._config.max)\r\n securityCount++\r\n }\r\n }\r\n\r\n return this._config.reduced?Q.reduce():Q\r\n }\r\n}\r\n","import {randomCore} from \"./randomCore\";\r\nimport {Random, randomGeometryLineConfig} from \"./random\";\r\nimport {Line} from \"../geometry/line\";\r\nimport {Vector} from \"../geometry/vector\";\r\nimport {Point} from \"../geometry/point\";\r\n\r\n/**\r\n * Create a random monom based on a based configuration\r\n */\r\nexport class rndGeometryLine extends randomCore {\r\n declare protected _config: randomGeometryLineConfig\r\n declare protected _defaultConfig: randomGeometryLineConfig\r\n\r\n constructor(userConfig?: randomGeometryLineConfig) {\r\n super();\r\n\r\n this._defaultConfig = {\r\n A: {\r\n x: Random.numberSym(10),\r\n y: Random.numberSym(10)\r\n },\r\n }\r\n\r\n // TODO: Strange that it raise an error\r\n // @ts-ignore\r\n this._config = this.mergeConfig(userConfig, this._defaultConfig)\r\n }\r\n\r\n generate = (): Line => {\r\n // The A point exists.\r\n const d = new Vector(\r\n Random.numberSym(10),\r\n Random.numberSym(10)\r\n )\r\n\r\n while (d.isNull) {\r\n d.x = Random.numberSym(10)\r\n d.y = Random.numberSym(10)\r\n }\r\n\r\n if (this._config.slope === 1) {\r\n if (d.x.sign() !== d.y.sign()) {\r\n d.y.opposed()\r\n }\r\n } else if (this._config.slope === -1) {\r\n if (d.x.sign() !== d.y.sign()) {\r\n d.y.opposed()\r\n }\r\n }\r\n\r\n return new Line(new Point(this._config.A.x, this._config.A.y), d)\r\n }\r\n}\r\n","import {randomCore} from \"./randomCore\";\r\nimport {Random, randomGeometryPointConfig} from \"./random\";\r\nimport {Point} from \"../geometry/point\";\r\nimport {Fraction} from \"../coefficients/fraction\";\r\n\r\n/**\r\n * Create a random monom based on a based configuration\r\n */\r\nexport class rndGeometryPoint extends randomCore {\r\n declare protected _config: randomGeometryPointConfig\r\n declare protected _defaultConfig: randomGeometryPointConfig\r\n\r\n constructor(userConfig?: randomGeometryPointConfig) {\r\n super();\r\n\r\n this._defaultConfig = {\r\n axis: true,\r\n fraction: false,\r\n max: 10\r\n }\r\n\r\n this._config = this.mergeConfig(userConfig, this._defaultConfig)\r\n }\r\n\r\n generate = (): Point => {\r\n let x: Fraction, y: Fraction,\r\n zeroX = this._config.axis === true || this._config.axis === 'x',\r\n zeroY = this._config.axis === true || this._config.axis === 'y'\r\n\r\n x = this._config.fraction ?\r\n Random.fraction({max: this._config.max, zero: zeroX}) :\r\n new Fraction(Random.numberSym(this._config.max, zeroX))\r\n\r\n y = this._config.fraction ?\r\n Random.fraction({max: this._config.max, zero: zeroY}) :\r\n new Fraction(Random.numberSym(this._config.max, zeroY))\r\n\r\n if (+this._config.quadrant === 1) {\r\n x.abs()\r\n y.abs()\r\n }\r\n if (+this._config.quadrant === 2) {\r\n if (x.isPositive()) {\r\n x.opposed()\r\n }\r\n if (y.isNegative()) {\r\n y.opposed()\r\n }\r\n }\r\n if (+this._config.quadrant === 3) {\r\n if (x.isPositive()) {\r\n x.opposed()\r\n }\r\n if (y.isPositive()) {\r\n y.opposed()\r\n }\r\n }\r\n if (+this._config.quadrant === 4) {\r\n if (x.isNegative()) {\r\n x.opposed()\r\n }\r\n if (y.isPositive()) {\r\n y.opposed()\r\n }\r\n }\r\n\r\n return new Point(x, y)\r\n }\r\n}\r\n","/**\r\n * Random helpers\r\n */\r\nimport {Numeric} from \"../numeric\";\r\n\r\nexport class rndHelpers {\r\n\r\n /**\r\n * Random boolean with a percent ratio\r\n * @param percent\r\n */\r\n static randomBool(percent: number = 0.5): boolean {\r\n return Math.random() < percent;\r\n }\r\n\r\n /**\r\n * Random integer between two values.\r\n * @param a (number) : From this value to the second value. If the second is ommited, this value is the max value.\r\n * @param b (number) : To this value. If this is ommited.\r\n */\r\n static randomInt(a: number, b?: number, exclude?: number[]): number {\r\n if (b === undefined) {\r\n if (a >= 0) {\r\n return this.randomInt(0, a);\r\n } else {\r\n return this.randomInt(a, 0);\r\n }\r\n }\r\n\r\n // Same start and end values\r\n if (a === b) {\r\n return a\r\n }\r\n\r\n // No exclusion\r\n if (exclude === undefined) {\r\n return Math.floor(Math.random() * (b - a + 1) + a);\r\n }\r\n\r\n // With exclusion\r\n if (Math.abs(b - a) <= exclude.length) {\r\n throw new Error('The number of excluded values is too high.')\r\n }\r\n\r\n let r = this.randomInt(a, b)\r\n while (exclude.includes(r)) {\r\n r = this.randomInt(a, b)\r\n }\r\n return r\r\n }\r\n\r\n /**\r\n * Random integer between -max and max value.\r\n * @param max (number) : determine the limits.\r\n * @param zero (bool) : determine if zero is allowed or not.\r\n */\r\n static randomIntSym(max: number, zero?: boolean): number {\r\n if (zero === false) {\r\n return this.randomBool() ? this.randomInt(1, max) : -this.randomInt(1, max);\r\n } else {\r\n return this.randomInt(-max, max);\r\n }\r\n }\r\n\r\n static randomPrime(max: number): number {\r\n let primes = Numeric.primes()\r\n if (max !== undefined) {\r\n primes = primes.filter(x => x < max)\r\n }\r\n return this.randomItem(primes)\r\n }\r\n\r\n static randomArray(arr: any[], number?: number): any[] {\r\n if (number === undefined) {\r\n number = 1\r\n }\r\n\r\n // Return a clone array\r\n if (arr.length <= 0) {\r\n return Object.values(arr)\r\n }\r\n\r\n // Randomize the array and return the n first elements.\r\n return rndHelpers.shuffleArray(arr).slice(0, number);\r\n }\r\n\r\n static randomItem(arr: any[]): any {\r\n if (arr.length === 0) {\r\n return ''\r\n }\r\n return arr[this.randomInt(0, arr.length - 1)]\r\n }\r\n\r\n static shuffleArray(arr: any[]): any[] {\r\n // The Fisher-Yates algorithm\r\n let shuffleArray = Object.values(arr)\r\n for (let i = shuffleArray.length - 1; i > 0; i--) {\r\n const j = Math.floor(Math.random() * (i + 1));\r\n const temp = shuffleArray[i];\r\n shuffleArray[i] = shuffleArray[j];\r\n shuffleArray[j] = temp;\r\n }\r\n\r\n return shuffleArray;\r\n }\r\n\r\n}","import {randomCore} from \"./randomCore\";\r\nimport {randomMonomConfig} from \"./rndTypes\";\r\nimport {Random} from \"./random\";\r\nimport {Monom} from \"../algebra/monom\";\r\n\r\n/**\r\n * Create a random monom based on a based configuration\r\n */\r\nexport class rndMonom extends randomCore {\r\n declare protected _config: randomMonomConfig\r\n declare protected _defaultConfig: randomMonomConfig\r\n\r\n constructor(userConfig?: randomMonomConfig) {\r\n super();\r\n\r\n this._defaultConfig = {\r\n letters: 'x',\r\n degree: 2,\r\n fraction: true,\r\n zero: false\r\n }\r\n\r\n this._config = this.mergeConfig(userConfig, this._defaultConfig)\r\n }\r\n\r\n generate = (): Monom => {\r\n // Create a monom instance\r\n let M = new Monom()\r\n\r\n // Generate the coefficient\r\n if (typeof this._config.fraction === \"boolean\") {\r\n M.coefficient = Random.fraction({\r\n zero: this._config.zero,\r\n reduced: true,\r\n natural: !this._config.fraction\r\n })\r\n } else {\r\n M.coefficient = Random.fraction(this._config.fraction)\r\n }\r\n\r\n // Calculate the degree of the monom\r\n if (this._config.letters.length > 1) {\r\n // Initialise each items...\r\n for (let L of this._config.letters.split('')) {\r\n M.setLetter(L, 0);\r\n }\r\n for (let i = 0; i < this._config.degree; i++) {\r\n const L = Random.item(this._config.letters.split(\"\"))\r\n M.setLetter(L, M.degree(L).clone().add(1))\r\n }\r\n } else {\r\n M.setLetter(this._config.letters, this._config.degree)\r\n }\r\n\r\n return M\r\n }\r\n}\r\n","import {randomCore} from \"./randomCore\";\r\nimport {randomPolynomConfig} from \"./rndTypes\";\r\nimport {rndMonom} from \"./rndMonom\";\r\nimport {Random} from \"./random\";\r\nimport {Polynom} from \"../algebra/polynom\";\r\nimport {Monom} from \"../algebra/monom\";\r\n\r\n/**\r\n * Random polynoms\r\n */\r\nexport class rndPolynom extends randomCore {\r\n declare protected _config: randomPolynomConfig\r\n declare protected _defaultConfig: randomPolynomConfig\r\n\r\n constructor(userConfig?: randomPolynomConfig) {\r\n super();\r\n\r\n // Default config for a random polynom\r\n this._defaultConfig = {\r\n letters: 'x',\r\n degree: 2,\r\n fraction: false,\r\n zero: false,\r\n unit: false,\r\n factorable: false,\r\n allowNullMonom: true,\r\n numberOfMonoms: 0,\r\n positive: true\r\n }\r\n\r\n // Merge config with initialiser\r\n this._config = this.mergeConfig(userConfig, this._defaultConfig)\r\n }\r\n\r\n generate = (): Polynom => {\r\n if(this._config.factorable && this._config.degree>1){\r\n return this.factorable()\r\n }\r\n\r\n // Create the polynom\r\n let P = new Polynom().empty(),\r\n M: Monom\r\n\r\n for (let i = this._config.degree; i >= 0; i--) {\r\n // Create monom of corresponding degree.\r\n M = new rndMonom({\r\n letters: this._config.letters,\r\n degree: i,\r\n fraction: this._config.fraction,\r\n zero: (i === this._config.degree) ? false : this._config.allowNullMonom\r\n }).generate()\r\n\r\n // If degree is the greatest and unit is true, set the monom value to one.\r\n if (this._config.unit && this._config.degree === i) {\r\n M.coefficient.one()\r\n }\r\n\r\n // Add to the polynom\r\n P.add(M)\r\n }\r\n\r\n // Make sure the first monom is positive.\r\n if(this._config.positive && P.monomByDegree().coefficient.isNegative()){\r\n P.monomByDegree().coefficient.opposed()\r\n }\r\n\r\n // If the number of monoms is greater than the allowed value, remove some of them... except the first one !\r\n if (this._config.numberOfMonoms > 0 && this._config.numberOfMonoms < P.length) {\r\n // Get the greatest degree monom\r\n let M = P.monomByDegree().clone()\r\n P.monoms = Random.array(P.monoms.slice(1), this._config.numberOfMonoms-1)\r\n P.add(M).reorder().reduce()\r\n }\r\n return P\r\n }\r\n\r\n factorable = (): Polynom => {\r\n let P = new Polynom().one()\r\n\r\n let _factorableConfig = {...this._config}\r\n _factorableConfig.degree = 1\r\n _factorableConfig.factorable = false\r\n\r\n for(let i=0; i<this._config.degree;i++){\r\n P.multiply(Random.polynom(_factorableConfig))\r\n }\r\n\r\n return P\r\n }\r\n}","import {Fraction} from \"../coefficients/fraction\";\r\n\r\nexport type randomCoefficientConfig = {\r\n negative?: boolean,\r\n max?: number,\r\n reduced?: boolean,\r\n zero?:boolean,\r\n natural?:boolean\r\n}\r\n\r\nexport type randomMonomConfig = {\r\n letters?: string,\r\n degree?: number,\r\n fraction?: boolean|randomCoefficientConfig,\r\n zero?: boolean\r\n}\r\n\r\nexport type randomPolynomConfig = randomMonomConfig & {\r\n unit?: boolean,\r\n factorable?: boolean,\r\n allowNullMonom?: boolean,\r\n numberOfMonoms?: number,\r\n positive?: boolean\r\n}\r\n\r\nexport type randomGeometryLineConfig = {\r\n A: { x: number | Fraction, y: number | Fraction },\r\n slope?: Fraction | string | number,\r\n}\r\n\r\n\r\nexport type randomGeometryPointConfig = {\r\n quadrant?: number,\r\n axis?: string | boolean,\r\n fraction?: boolean,\r\n max?: number\r\n}","export type tokenType = {\r\n [key: string]: {\r\n precedence: number,\r\n associative: string,\r\n type: string\r\n }\r\n}\r\n\r\nexport const tokenConstant: { [Key: string]: number } = {\r\n pi: Math.PI,\r\n e: Math.exp(1)\r\n}\r\n\r\nexport enum ShutingyardType {\r\n VARIABLE = 'variable',\r\n COEFFICIENT = 'coefficient',\r\n OPERATION = 'operation',\r\n CONSTANT = 'constant',\r\n FUNCTION = 'function',\r\n MONOM = 'monom'\r\n}\r\n\r\nexport enum ShutingyardMode {\r\n EXPRESSION = 'expression',\r\n POLYNOM = 'polynom',\r\n SET = 'set',\r\n NUMERIC = 'numeric'\r\n}\r\n\r\nexport type Token = { token: string, tokenType: string }\r\n\r\nexport class Shutingyard {\r\n readonly _mode: ShutingyardMode;\r\n private _rpn: Token[] = [];\r\n private _tokenConfig: tokenType;\r\n private _tokenConstant: { [Key: string]: number }\r\n private _tokenKeys: string[]\r\n private _uniformize: boolean;\r\n\r\n constructor(mode?: ShutingyardMode) {\r\n this._mode = typeof mode === 'undefined' ? ShutingyardMode.POLYNOM : mode;\r\n this.tokenConfigInitialization()\r\n }\r\n\r\n // Getter\r\n get rpn() {\r\n // console.log(this._rpn)\r\n return this._rpn;\r\n }\r\n\r\n get rpnToken() {\r\n return this._rpn.map(x => x.token)\r\n }\r\n\r\n /**\r\n * Determin if the token is a defined operation\r\n * Defined operations: + - * / ^ sin cos tan\r\n * @param token\r\n */\r\n // isOperation(token: string): boolean {\r\n // if (token[0].match(/[+\\-*/^]/g)) {\r\n // return true;\r\n // }\r\n // //\r\n // // if (token.match(/^sin|cos|tan/g)) {\r\n // // return true;\r\n // // }\r\n //\r\n // return false;\r\n // }\r\n\r\n tokenConfigInitialization(): tokenType {\r\n if (this._mode === ShutingyardMode.SET) {\r\n this._tokenConfig = {\r\n '&': {precedence: 3, associative: 'left', type: ShutingyardType.OPERATION},\r\n '|': {precedence: 3, associative: 'left', type: ShutingyardType.OPERATION},\r\n '!': {precedence: 4, associative: 'right', type: ShutingyardType.OPERATION},\r\n '-': {precedence: 2, associative: 'left', type: ShutingyardType.OPERATION}\r\n }\r\n this._uniformize = false;\r\n } else if (this._mode === ShutingyardMode.NUMERIC) {\r\n this._tokenConfig = {\r\n '^': {precedence: 4, associative: 'right', type: ShutingyardType.OPERATION},\r\n '*': {precedence: 3, associative: 'left', type: ShutingyardType.OPERATION},\r\n '/': {precedence: 3, associative: 'left', type: ShutingyardType.OPERATION},\r\n '+': {precedence: 2, associative: 'left', type: ShutingyardType.OPERATION},\r\n '-': {precedence: 2, associative: 'left', type: ShutingyardType.OPERATION},\r\n '%': {precedence: 3, associative: 'right', type: ShutingyardType.OPERATION},\r\n 'sin': {precedence: 4, associative: 'right', type: ShutingyardType.FUNCTION},\r\n 'cos': {precedence: 4, associative: 'right', type: ShutingyardType.FUNCTION},\r\n 'tan': {precedence: 4, associative: 'right', type: ShutingyardType.FUNCTION},\r\n 'sqrt': {precedence: 4, associative: 'right', type: ShutingyardType.FUNCTION},\r\n 'nthrt': {precedence: 4, associative: 'right', type: ShutingyardType.FUNCTION},\r\n 'ln': {precedence: 4, associative: 'right', type: ShutingyardType.FUNCTION},\r\n 'log': {precedence: 4, associative: 'right', type: ShutingyardType.FUNCTION},\r\n }\r\n this._uniformize = false\r\n } else if (this._mode === ShutingyardMode.EXPRESSION) {\r\n this._tokenConfig = {\r\n '^': {precedence: 4, associative: 'right', type: ShutingyardType.OPERATION},\r\n '*': {precedence: 3, associative: 'left', type: ShutingyardType.OPERATION},\r\n '/': {precedence: 3, associative: 'left', type: ShutingyardType.OPERATION},\r\n '+': {precedence: 2, associative: 'left', type: ShutingyardType.OPERATION},\r\n '-': {precedence: 2, associative: 'left', type: ShutingyardType.OPERATION},\r\n '%': {precedence: 3, associative: 'right', type: ShutingyardType.OPERATION},\r\n 'sin': {precedence: 4, associative: 'right', type: ShutingyardType.FUNCTION},\r\n 'cos': {precedence: 4, associative: 'right', type: ShutingyardType.FUNCTION},\r\n 'tan': {precedence: 4, associative: 'right', type: ShutingyardType.FUNCTION},\r\n 'sqrt': {precedence: 4, associative: 'right', type: ShutingyardType.FUNCTION},\r\n 'nthrt': {precedence: 4, associative: 'right', type: ShutingyardType.FUNCTION},\r\n }\r\n this._uniformize = true\r\n } else {\r\n this._tokenConfig = {\r\n '^': {precedence: 4, associative: 'right', type: ShutingyardType.OPERATION},\r\n '*': {precedence: 3, associative: 'left', type: ShutingyardType.OPERATION},\r\n '/': {precedence: 3, associative: 'left', type: ShutingyardType.OPERATION},\r\n '+': {precedence: 2, associative: 'left', type: ShutingyardType.OPERATION},\r\n '-': {precedence: 2, associative: 'left', type: ShutingyardType.OPERATION},\r\n }\r\n this._uniformize = true\r\n }\r\n\r\n this._tokenKeys = Object.keys(this._tokenConfig).sort((a, b) => b.length - a.length)\r\n return this._tokenConfig\r\n }\r\n\r\n /**\r\n * Get the next token to analyse.\r\n * @param expr (string) Expression to analyse\r\n * @param start (number) CUrrent position in the expr string.\r\n */\r\n NextToken(expr: string, start: number): [string, number, string] {\r\n let token: string, tokenType: string;\r\n token = '';\r\n tokenType = '';\r\n // Case of parenthesis or comma (generic items)\r\n if (expr[start] === '(') {\r\n token = '(';\r\n tokenType = '(';\r\n }\r\n // It's a closing parenthese\r\n else if (expr[start] === ')') {\r\n token = ')';\r\n tokenType = ')';\r\n }\r\n // It's an argument separator for a function\r\n else if (expr[start] === ',') {\r\n token = ',';\r\n tokenType = 'function-argument';\r\n } else {\r\n // Extract operation and function tokens\r\n for (let key of this._tokenKeys) {\r\n if (expr.substring(start, start + key.length) === key) {\r\n token += key;\r\n tokenType = this._tokenConfig[key].type\r\n break\r\n }\r\n }\r\n\r\n // Extract constant\r\n for (let key in tokenConstant) {\r\n if (expr.substring(start, start + key.length) === key) {\r\n token += key;\r\n tokenType = ShutingyardType.CONSTANT\r\n break\r\n }\r\n }\r\n\r\n if (token === '') {\r\n // No function found ! Might be a coefficient !\r\n if (expr[start].match(/[0-9]/)) {\r\n if (this._mode === ShutingyardMode.POLYNOM && false) {\r\n token = expr.substring(start).match(/^([0-9.,/]+)/)[0]\r\n } else {\r\n token = expr.substring(start).match(/^([0-9.]+)/)[0]\r\n }\r\n tokenType = ShutingyardType.COEFFICIENT\r\n } else if (expr[start].match(/[a-zA-Z]/)) {\r\n token = expr.substring(start).match(/^([a-zA-Z])/)[0]\r\n tokenType = ShutingyardType.VARIABLE\r\n } else {\r\n console.log('Unidentified token', expr[start], expr, start)\r\n token = expr[start]\r\n tokenType = ShutingyardType.MONOM\r\n }\r\n\r\n }\r\n }\r\n\r\n return [token, start + token.length, tokenType];\r\n }\r\n\r\n normalize(expr: string): string {\r\n if(expr.length===1){return expr}\r\n\r\n // Get the list of function token.\r\n let fnToken: string[] = [],\r\n kToken: string[] = []\r\n for (let token in this._tokenConfig) {\r\n if (this._tokenConfig[token].type === ShutingyardType.FUNCTION) {\r\n fnToken.push(token)\r\n }\r\n }\r\n // sort if from the lengthy to the smallest function\r\n fnToken.sort((a, b) => b.length - a.length)\r\n\r\n for (let token in tokenConstant) {\r\n kToken.push(token)\r\n }\r\n // sort if from the lengthy to the smallest function\r\n kToken.sort((a, b) => b.length - a.length)\r\n\r\n let normalizedExpr: string = \"\",\r\n i = 0,\r\n crtToken,\r\n nextToken\r\n\r\n while (i < expr.length - 1) {\r\n // Check if we have a function token.\r\n // The function MUST have an open parentheses\r\n let tokenIdx = 0\r\n while (tokenIdx < fnToken.length) {\r\n let token = fnToken[tokenIdx]\r\n if (expr.slice(i, i + token.length + 1) === token + '(') {\r\n normalizedExpr += token + '('\r\n i += token.length + 1\r\n\r\n // Restart the scan for the function token\r\n tokenIdx = 0\r\n } else {\r\n // scan for a next function token\r\n tokenIdx++\r\n }\r\n }\r\n\r\n // Check for a constant\r\n tokenIdx = 0\r\n while (tokenIdx < kToken.length) {\r\n let token = kToken[tokenIdx]\r\n if (expr.slice(i, i + token.length) === token) {\r\n // We have found a constant.\r\n // add it, but with remove the last letter\r\n normalizedExpr += token.slice(0, -1)\r\n i += token.length-1\r\n\r\n // Exit the loop\r\n break\r\n }\r\n tokenIdx++\r\n }\r\n\r\n // The function token are solved.\r\n crtToken = expr[i]\r\n nextToken = expr[i + 1]\r\n normalizedExpr += crtToken\r\n\r\n if (crtToken.match(/[a-zA-Z]/g)) {\r\n // Current element is a letter.\r\n // if the next element is a letter, a number or an opening parentheses, add the multiplication sign.\r\n if (nextToken?.match(/[a-zA-Z\\d(]/)) {\r\n normalizedExpr += '*'\r\n }\r\n } else if (crtToken.match(/\\d/)) {\r\n // Current element is a number.\r\n // if the next element is a letter or a parentheses, add the multiplication sign.\r\n if (nextToken?.match(/[a-zA-Z(]/)) {\r\n normalizedExpr += '*'\r\n }\r\n } else if (crtToken === ')') {\r\n // Current element is a closing parentheses.\r\n // if the next element is a letter, a number or an opening parentheses, add the multiplication sign\r\n if (nextToken?.match(/[a-zA-Z\\d(]/)) {\r\n normalizedExpr += '*'\r\n }\r\n }\r\n\r\n // Go to next token\r\n i++\r\n }\r\n\r\n // add the last token\r\n return normalizedExpr + (nextToken===undefined?'':nextToken)\r\n }\r\n\r\n // /**\r\n // * Sanitize an expression by adding missing common operation (multiplication between parentheseses)\r\n // * @param expr\r\n // * @constructor\r\n // */\r\n // Uniformizer(expr: string): string {\r\n // // TODO: Delete this old version\r\n // // Prefere \"normalize\", much more robust !\r\n // // Determiner if need to be uniformized\r\n // if (!this._uniformize) {\r\n // return expr\r\n // }\r\n //\r\n // // Generate the list of function token.\r\n // let fnToken: string[] = []\r\n // for (let token in this._tokenConfig) {\r\n // if (this._tokenConfig[token].type === ShutingyardType.FUNCTION) {\r\n // fnToken.push(token)\r\n // }\r\n // }\r\n // // sort if from the lengthy to the smallest function\r\n // fnToken.sort((a, b) => b.length - a.length)\r\n // let tokenRegExp = new RegExp(`(${fnToken.join('|')})`, 'g')\r\n // let functionTokenOrder = Array.from(expr.matchAll(tokenRegExp))\r\n //\r\n //\r\n // let expr2;\r\n //\r\n // // Replace all function by @\r\n // expr2 = expr.replace(tokenRegExp, '@')\r\n // // Add * before @ (functionn)\r\n // expr2 = expr2.replace(/([\\da-zA-Z])(@)/g, \"$1*$2\");\r\n //\r\n // // Replace missing multiplication between two parenthese\r\n // expr2 = expr2.replace(/\\)\\(/g, ')*(');\r\n //\r\n // // Replace missing multiplication between number or setLetter and parenthese.\r\n //\r\n // // 3x(x-4) => 3x*(x-4)\r\n // expr2 = expr2.replace(/([\\da-zA-Z])(\\()/g, \"$1*$2\");\r\n //\r\n // // (x-4)3x => (x-4)*3x\r\n // expr2 = expr2.replace(/(\\))([\\da-zA-Z])/g, \"$1*$2\");\r\n //\r\n // // Add multiplication between number and letters.\r\n // // 3x => 3*x\r\n // expr2 = expr2.replace(/([0-9])([a-zA-Z])/g, \"$1*$2\");\r\n // expr2 = expr2.replace(/([a-zA-Z])([0-9])/g, \"$1*$2\");\r\n //\r\n // // Remove letter between function token and it's parenthese.\r\n // // for (let token of fnToken) {\r\n // // // Remove\r\n // // expr2 = expr2.replace(new RegExp(token + '\\\\*', 'g'), token);\r\n // // }\r\n // // Add multiplication between letters ?\r\n // expr2 = expr2.replace(/([a-zA-Z])([a-zA-Z])/g, \"$1*$2\");\r\n // expr2 = expr2.replace(/([a-zA-Z])([a-zA-Z])/g, \"$1*$2\");\r\n //\r\n // // Restore operation auto formatting (prevent adding the multiplication star)\r\n // let exprAsArray = expr2.split('@')\r\n //\r\n // if (exprAsArray.length > 0) {\r\n // expr2 = \"\"\r\n // for (let idx in exprAsArray) {\r\n // }\r\n // for (let token of fnToken) {\r\n // // Remove\r\n //\r\n // // expr2 = expr2.replace(new RegExp(token + '\\\\*', 'g'), token);\r\n // }\r\n // }\r\n //\r\n // return expr2;\r\n // }\r\n\r\n /**\r\n * Parse an expression using the shutting yard tree algorithms\r\n * @param expr (string) Expression to analyse\r\n * Returns a RPN list of items.\r\n * @param uniformize\r\n */\r\n parse(expr: string, uniformize?: boolean): Shutingyard {\r\n let outQueue: { token: string, tokenType: string }[] = [], // Output queue\r\n opStack: { token: string, tokenType: string }[] = [], // Operation queue\r\n token: string = '',\r\n tokenPos: number = 0,\r\n tokenType: string = '',\r\n previousOpStatckLength = 0\r\n\r\n // Normalize the input if required.\r\n if (uniformize || this._uniformize) expr = this.normalize(expr)\r\n\r\n\r\n let securityLoopLvl1 = 50,\r\n securityLoopLvl2_default = 50,\r\n securityLoopLvl2;\r\n\r\n while (tokenPos < expr.length) {\r\n securityLoopLvl1--;\r\n if (securityLoopLvl1 === 0) {\r\n console.log('SECURITY LEVEL 1 EXIT');\r\n break;\r\n }\r\n\r\n // Get the next token and the corresponding new (ending) position\r\n [token, tokenPos, tokenType] = this.NextToken(expr, tokenPos);\r\n\r\n switch (tokenType) {\r\n case 'monom':\r\n case 'coefficient':\r\n case 'variable':\r\n case 'constant':\r\n outQueue.push({\r\n token,\r\n tokenType\r\n });\r\n break;\r\n case 'operation':\r\n previousOpStatckLength = opStack.length;\r\n //If the token is an operator, o1, then:\r\n if (opStack.length > 0) {\r\n let opTop = opStack[opStack.length - 1];\r\n\r\n securityLoopLvl2 = +securityLoopLvl2_default;\r\n\r\n //while there is an operator token o2, at the top of the operator stack and\r\n while (opTop.token in this._tokenConfig && (\r\n //either o1 is left-associative and its precedence is less than or equal to that of o2,\r\n (this._tokenConfig[token].associative === 'left' && this._tokenConfig[token].precedence <= this._tokenConfig[opTop.token].precedence)\r\n ||\r\n //or o1 is right associative, and has precedence less than that of o2,\r\n (this._tokenConfig[token].associative === 'right' && this._tokenConfig[token].precedence < this._tokenConfig[opTop.token].precedence)\r\n )\r\n ) {\r\n\r\n /* Security exit ! */\r\n securityLoopLvl2--;\r\n if (securityLoopLvl2 === 0) {\r\n console.log('SECURITY LEVEL 2 OPERATION EXIT');\r\n break;\r\n }\r\n\r\n // Add the operation to the queue\r\n outQueue.push((opStack.pop()) || {token: '', tokenType: 'operation'});\r\n\r\n // Get the next operation on top of the Stack.\r\n if (opStack.length === 0) {\r\n break;\r\n }\r\n opTop = opStack[opStack.length - 1];\r\n }\r\n }\r\n //at the end of iteration push o1 onto the operator stack\r\n opStack.push({token, tokenType});\r\n break;\r\n case 'function-argument':\r\n // TODO: check if the opStack exist.\r\n securityLoopLvl2 = +securityLoopLvl2_default;\r\n while (opStack[opStack.length - 1].token !== '(' && opStack.length > 0) {\r\n securityLoopLvl2--;\r\n if (securityLoopLvl2 === 0) {\r\n console.log('SECURITY LEVEL 2 FUNCTION ARGUMENT EXIT');\r\n break;\r\n }\r\n\r\n outQueue.push((opStack.pop()) || {token, tokenType});\r\n }\r\n break;\r\n case '(':\r\n opStack.push({token, tokenType});\r\n // Add an empty value if next element is negative.\r\n if (expr[tokenPos] === '-') {\r\n outQueue.push({token: '0', tokenType: 'coefficient'});\r\n }\r\n break;\r\n case ')':\r\n securityLoopLvl2 = +securityLoopLvl2_default;\r\n //Until the token at the top of the stack is a left parenthesis, pop operators off the stack onto the output queue.\r\n while (opStack[opStack.length - 1].token !== '(' && opStack.length > 1 /*Maybe zero !? */) {\r\n securityLoopLvl2--;\r\n if (securityLoopLvl2 === 0) {\r\n console.log('SECURITY LEVEL 2 CLOSING PARENTHESE EXIT');\r\n break;\r\n }\r\n\r\n outQueue.push((opStack.pop()) || {token, tokenType});\r\n }\r\n\r\n //Pop the left parenthesis from the stack, but not onto the output queue.\r\n opStack.pop();\r\n break;\r\n case 'function':\r\n opStack.push({token, tokenType});\r\n break;\r\n default:\r\n // In theory, everything should be handled.\r\n console.log(`SHUTING YARD: ${tokenType} : ${token} `);\r\n }\r\n\r\n // Output\r\n // console.log(outQueue.concat(opStack.reverse()).join(\" \"));\r\n }\r\n\r\n // console.log(outQueue.concat(opStack.reverse()));\r\n this._rpn = outQueue.concat(opStack.reverse());\r\n\r\n return this;\r\n }\r\n\r\n\r\n}\r\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","","// startup\n// Load entry module and return exports\n// This entry module is referenced by other modules so it can't be inlined\nvar __webpack_exports__ = __webpack_require__(607);\n",""],"names":[],"sourceRoot":""}