pimath 0.0.41 → 0.0.44
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintrc.js +23 -23
- package/dist/pi.js +326 -575
- package/dist/pi.js.map +1 -1
- package/dist/pi.min.js +1 -1
- package/dist/pi.min.js.map +1 -1
- package/docs/assets/highlight.css +78 -78
- package/docs/assets/icons.css +1043 -1043
- package/docs/assets/main.js +52 -52
- package/docs/assets/search.js +1 -1
- package/docs/assets/style.css +1388 -1388
- package/docs/classes/{algebra.Equation.html → Algebra.Equation.html} +25 -25
- package/docs/classes/algebra.Logicalset.html +4 -4
- package/docs/classes/algebra.Monom.html +113 -113
- package/docs/classes/algebra.Polynom.html +29 -29
- package/docs/classes/algebra.Rational.html +3 -3
- package/docs/classes/coefficients.Fraction.html +18 -18
- package/docs/classes/coefficients.Nthroot.html +2 -2
- package/docs/classes/geometry.Circle.html +2 -2
- package/docs/classes/geometry.Line.html +2 -2
- package/docs/classes/geometry.Triangle.html +16 -16
- package/docs/classes/numeric.Numeric.html +13 -13
- package/docs/classes/shutingyard.Shutingyard.html +17 -17
- package/docs/index.html +10 -10
- package/docs/modules/{algebra.html → Algebra.html} +0 -0
- package/docs/modules/{random.html → Random.html} +0 -0
- package/esm/index.d.ts +2 -2
- package/esm/index.js +2 -2
- package/esm/maths/algebra/equation.d.ts +2 -6
- package/esm/maths/algebra/equation.js +9 -49
- package/esm/maths/algebra/equation.js.map +1 -1
- package/esm/maths/algebra/polynom.d.ts +1 -4
- package/esm/maths/algebra/polynom.js +62 -120
- package/esm/maths/algebra/polynom.js.map +1 -1
- package/esm/maths/algebra/rational.d.ts +6 -16
- package/esm/maths/algebra/rational.js +29 -140
- package/esm/maths/algebra/rational.js.map +1 -1
- package/esm/maths/coefficients/fraction.d.ts +1 -3
- package/esm/maths/coefficients/fraction.js +5 -37
- package/esm/maths/coefficients/fraction.js.map +1 -1
- package/esm/maths/coefficients/{nthRoot.d.ts → nthroot.d.ts} +5 -5
- package/esm/maths/coefficients/{nthRoot.js → nthroot.js} +5 -5
- package/esm/maths/coefficients/{nthRoot.js.map → nthroot.js.map} +1 -1
- package/esm/maths/geometry/line.js +0 -8
- package/esm/maths/geometry/line.js.map +1 -1
- package/package.json +1 -1
- package/src/index.ts +2 -2
- package/src/maths/algebra/equation.ts +12 -58
- package/src/maths/algebra/polynom.ts +68 -128
- package/src/maths/algebra/rational.ts +98 -242
- package/src/maths/coefficients/fraction.ts +6 -44
- package/src/maths/coefficients/{nthRoot.ts → nthroot.ts} +5 -5
- package/tests/algebra/monom.test.ts +4 -1
- package/tests/coefficients/fraction.test.ts +1 -43
- package/tests/geometry/circle.test.ts +2 -4
- package/tests/algebra/equation.test.ts +0 -38
- package/tests/algebra/rationnal.test.ts +0 -68
|
@@ -2,28 +2,22 @@ import {Polynom} from "./polynom";
|
|
|
2
2
|
import {literalType, Monom} from "./monom";
|
|
3
3
|
import {Numeric} from "../numeric";
|
|
4
4
|
import {Fraction} from "../coefficients/fraction";
|
|
5
|
-
import {
|
|
5
|
+
import {Nthroot} from "../coefficients/nthroot";
|
|
6
6
|
|
|
7
7
|
/**
|
|
8
8
|
* Equation is a class to manage equations...
|
|
9
9
|
*/
|
|
10
|
-
|
|
10
|
+
interface ISolution {
|
|
11
11
|
tex: string,
|
|
12
12
|
value: number,
|
|
13
13
|
exact: unknown
|
|
14
14
|
}
|
|
15
15
|
|
|
16
|
-
export enum PARTICULAR_SOLUTION {
|
|
17
|
-
real="\\mathbb{R}",
|
|
18
|
-
varnothing="\\varnothing"
|
|
19
|
-
}
|
|
20
|
-
|
|
21
16
|
export class Equation {
|
|
22
17
|
private _polynom: Polynom; // Used to solve the equation // TODO: remove the private value ?
|
|
23
|
-
|
|
24
18
|
// Undetermined texSolutions.
|
|
25
|
-
private _varnothing: string =
|
|
26
|
-
private _real: string =
|
|
19
|
+
private _varnothing: string = '\\varnothing';
|
|
20
|
+
private _real: string = '\\mathbb{R}';
|
|
27
21
|
|
|
28
22
|
/**
|
|
29
23
|
* Create an Equation using two polynoms.
|
|
@@ -403,29 +397,9 @@ export class Equation {
|
|
|
403
397
|
default:
|
|
404
398
|
this._solveDegree3plus();
|
|
405
399
|
}
|
|
406
|
-
|
|
407
|
-
// cleanup the solutions.
|
|
408
|
-
this._solutions = Equation.makeSolutionsUnique(this._solutions)
|
|
409
400
|
return this;
|
|
410
401
|
};
|
|
411
402
|
|
|
412
|
-
static makeSolutionsUnique(solutions: ISolution[], sorted?: boolean):ISolution[] {
|
|
413
|
-
let solutionAsTex:string[] = [],
|
|
414
|
-
uniqueSolutions = solutions.filter(sol=>{
|
|
415
|
-
if(!solutionAsTex.includes(sol.tex)){
|
|
416
|
-
solutionAsTex.push(sol.tex)
|
|
417
|
-
return true
|
|
418
|
-
}else{
|
|
419
|
-
return false
|
|
420
|
-
}
|
|
421
|
-
})
|
|
422
|
-
|
|
423
|
-
if(sorted===true){
|
|
424
|
-
uniqueSolutions.sort((a, b)=>a.value-b.value)
|
|
425
|
-
}
|
|
426
|
-
return uniqueSolutions
|
|
427
|
-
}
|
|
428
|
-
|
|
429
403
|
test = (values: literalType): Boolean => {
|
|
430
404
|
return this.left.evaluate(values).isEqual(this.right.evaluate(values))
|
|
431
405
|
}
|
|
@@ -552,13 +526,12 @@ export class Equation {
|
|
|
552
526
|
}
|
|
553
527
|
} else {
|
|
554
528
|
this._solutions = [{
|
|
555
|
-
tex: v.
|
|
529
|
+
tex: v.display,
|
|
556
530
|
value: v.value,
|
|
557
531
|
exact: v
|
|
558
532
|
}]
|
|
559
533
|
}
|
|
560
|
-
}
|
|
561
|
-
else {
|
|
534
|
+
} else {
|
|
562
535
|
if (m1.value === 0) {
|
|
563
536
|
// In this case, the coefficient of the x variable is zero.
|
|
564
537
|
if (m0.value === 0 && this.isAlsoEqual()) {
|
|
@@ -592,7 +565,7 @@ export class Equation {
|
|
|
592
565
|
let aF = this._polynom.monomByDegree(2, letter).coefficient,
|
|
593
566
|
bF = this._polynom.monomByDegree(1, letter).coefficient,
|
|
594
567
|
cF = this._polynom.monomByDegree(0, letter).coefficient,
|
|
595
|
-
delta: number, nthDelta:
|
|
568
|
+
delta: number, nthDelta: Nthroot,
|
|
596
569
|
lcm = Numeric.lcm(aF.denominator, bF.denominator, cF.denominator),
|
|
597
570
|
a = aF.multiply(lcm).value,
|
|
598
571
|
b = bF.multiply(lcm).value,
|
|
@@ -621,7 +594,7 @@ export class Equation {
|
|
|
621
594
|
}
|
|
622
595
|
]
|
|
623
596
|
} else {
|
|
624
|
-
nthDelta = new
|
|
597
|
+
nthDelta = new Nthroot(delta).reduce();
|
|
625
598
|
if (nthDelta.hasRadical()) {
|
|
626
599
|
// -b +- coeff\sqrt{radical}
|
|
627
600
|
// -------------------------
|
|
@@ -723,6 +696,7 @@ export class Equation {
|
|
|
723
696
|
}];
|
|
724
697
|
}
|
|
725
698
|
|
|
699
|
+
|
|
726
700
|
// Handle now the inequations.
|
|
727
701
|
if (!this.isStrictEqual()) {
|
|
728
702
|
if (this._solutions.length === 2) {
|
|
@@ -789,29 +763,9 @@ export class Equation {
|
|
|
789
763
|
return this._solutions;
|
|
790
764
|
};
|
|
791
765
|
|
|
792
|
-
private _solveDegree3plus = (
|
|
793
|
-
//
|
|
794
|
-
//
|
|
795
|
-
// solve each factors.
|
|
796
|
-
let equ = this.clone().moveLeft()
|
|
797
|
-
equ.left.factorize()
|
|
798
|
-
|
|
799
|
-
this._solutions = []
|
|
800
|
-
|
|
801
|
-
equ.left.factors.forEach(factor=>{
|
|
802
|
-
if(factor.degree(letter).leq(2)) {
|
|
803
|
-
let factorAsEquation = new Equation(factor, 0)
|
|
804
|
-
factorAsEquation.solve()
|
|
805
|
-
factorAsEquation.solutions.forEach(solution => {
|
|
806
|
-
this._solutions.push(solution)
|
|
807
|
-
})
|
|
808
|
-
}else{
|
|
809
|
-
console.log(factor.tex, ': cannot actually get the solution of this equation')
|
|
810
|
-
}
|
|
811
|
-
})
|
|
812
|
-
|
|
813
|
-
// TODO: check equation resolution for more than degree 2
|
|
814
|
-
// this._solutions = [{tex: 'solve x - not yet handled', value: NaN, exact: false}]; // ESLint remove system :(
|
|
766
|
+
private _solveDegree3plus = (): ISolution[] => {
|
|
767
|
+
// TODO: try to resolve equations with a degree superior than 2.
|
|
768
|
+
this._solutions = [{tex: 'solve x - not yet handled', value: NaN, exact: false}]; // ESLint remove system :(
|
|
815
769
|
return this._solutions;
|
|
816
770
|
};
|
|
817
771
|
}
|
|
@@ -6,7 +6,6 @@ import {literalType, Monom} from './monom';
|
|
|
6
6
|
import {Shutingyard, ShutingyardType, Token} from '../shutingyard';
|
|
7
7
|
import {Numeric} from '../numeric';
|
|
8
8
|
import {Fraction} from "../coefficients/fraction";
|
|
9
|
-
import {Equation, ISolution} from "./equation";
|
|
10
9
|
|
|
11
10
|
export type PolynomParsingType = string | Polynom | number | Fraction | Monom
|
|
12
11
|
|
|
@@ -66,9 +65,6 @@ export class Polynom {
|
|
|
66
65
|
get texFactors(): string {
|
|
67
66
|
this.factorize()
|
|
68
67
|
|
|
69
|
-
if(this.factors.length===0){
|
|
70
|
-
return this.tex
|
|
71
|
-
}
|
|
72
68
|
let tex = ''
|
|
73
69
|
for (let f of this.factors) {
|
|
74
70
|
if (f.monoms.length > 1) {
|
|
@@ -777,7 +773,6 @@ export class Polynom {
|
|
|
777
773
|
}
|
|
778
774
|
|
|
779
775
|
let securityLoop = P.degree().clone().multiply(2).value
|
|
780
|
-
let result
|
|
781
776
|
// securityLoop = 0
|
|
782
777
|
|
|
783
778
|
while (securityLoop >= 0) {
|
|
@@ -796,8 +791,8 @@ export class Polynom {
|
|
|
796
791
|
for (let m1d of m1) {
|
|
797
792
|
for (let m2d of m2) {
|
|
798
793
|
// if(m1d.degree()===m2d.degree()){continue}
|
|
799
|
-
let dividerPolynom = new Polynom()
|
|
800
|
-
|
|
794
|
+
let dividerPolynom = new Polynom(),
|
|
795
|
+
result
|
|
801
796
|
dividerPolynom.monoms = [m1d.clone(), m2d.clone()]
|
|
802
797
|
result = P.euclidian(dividerPolynom)
|
|
803
798
|
|
|
@@ -818,104 +813,77 @@ export class Polynom {
|
|
|
818
813
|
}
|
|
819
814
|
}
|
|
820
815
|
|
|
821
|
-
if(!P.isOne()){factors.push(P.clone())}
|
|
822
|
-
|
|
823
816
|
this.factors = factors
|
|
824
817
|
return factors;
|
|
825
818
|
}
|
|
826
819
|
|
|
827
820
|
// TODO: get zeroes for more than first degree and for more than natural degrees
|
|
828
|
-
getZeroes = ():
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
// zeroes.push(new Fraction(x1.toFixed(3)).reduce());
|
|
895
|
-
// zeroes.push(new Fraction(x2.toFixed(3)).reduce());
|
|
896
|
-
// } else if (D.value === 0) {
|
|
897
|
-
// /*console.log('One zero for ', P.tex); */
|
|
898
|
-
// } else {
|
|
899
|
-
// console.log('No zero for ', P.tex);
|
|
900
|
-
// }
|
|
901
|
-
// } else {
|
|
902
|
-
// for (let z of P.getZeroes()) {
|
|
903
|
-
// // Check if the zero is already in the list.
|
|
904
|
-
// // if (z === false || z === true) {
|
|
905
|
-
// // continue;
|
|
906
|
-
// // }
|
|
907
|
-
// if (zeroesAsTex.indexOf(z.frac) === -1) {
|
|
908
|
-
// zeroes.push(z);
|
|
909
|
-
// zeroesAsTex.push(z.frac);
|
|
910
|
-
// }
|
|
911
|
-
// }
|
|
912
|
-
// }
|
|
913
|
-
// }
|
|
914
|
-
//
|
|
915
|
-
//
|
|
916
|
-
// return zeroes;
|
|
917
|
-
// }
|
|
918
|
-
// return Z;
|
|
821
|
+
getZeroes = (): (Fraction | boolean)[] => {
|
|
822
|
+
const Z: Fraction[] = [];
|
|
823
|
+
|
|
824
|
+
switch (this.degree().value) {
|
|
825
|
+
case 0:
|
|
826
|
+
if (this._monoms[0].coefficient.value === 0) {
|
|
827
|
+
return [true];
|
|
828
|
+
} else {
|
|
829
|
+
return [false];
|
|
830
|
+
}
|
|
831
|
+
case 1:
|
|
832
|
+
// There is only one monoms,
|
|
833
|
+
if (this._monoms.length === 1) {
|
|
834
|
+
return [new Fraction().zero()];
|
|
835
|
+
} else {
|
|
836
|
+
const P = this.clone().reduce().reorder();
|
|
837
|
+
return [P.monoms[1].coefficient.opposed().divide(P.monoms[0].coefficient)];
|
|
838
|
+
}
|
|
839
|
+
// TODO: Determine the zeros of an equation of second degree.
|
|
840
|
+
//case 2:
|
|
841
|
+
default:
|
|
842
|
+
// Make sure the polynom is factorized.
|
|
843
|
+
if (this._factors.length === 0) {
|
|
844
|
+
this.factorize()
|
|
845
|
+
}
|
|
846
|
+
|
|
847
|
+
let zeroes = [], zeroesAsTex = [];
|
|
848
|
+
for (let P of this._factors) {
|
|
849
|
+
if (P.degree().greater(2)) {
|
|
850
|
+
// TODO: Handle other polynom.
|
|
851
|
+
|
|
852
|
+
} else if (P.degree().value === 2) {
|
|
853
|
+
let A = P.monomByDegree(2).coefficient,
|
|
854
|
+
B = P.monomByDegree(1).coefficient,
|
|
855
|
+
C = P.monomByDegree(0).coefficient,
|
|
856
|
+
D = B.clone().pow(2).subtract(A.clone().multiply(C).multiply(4));
|
|
857
|
+
|
|
858
|
+
if (D.value > 0) {
|
|
859
|
+
/*console.log('Two zeroes for ', P.tex); */
|
|
860
|
+
let x1 = (-(B.value) + Math.sqrt(D.value)) / (2 * A.value),
|
|
861
|
+
x2 = (-(B.value) - Math.sqrt(D.value)) / (2 * A.value);
|
|
862
|
+
|
|
863
|
+
zeroes.push(new Fraction(x1.toFixed(3)).reduce());
|
|
864
|
+
zeroes.push(new Fraction(x2.toFixed(3)).reduce());
|
|
865
|
+
} else if (D.value === 0) {
|
|
866
|
+
/*console.log('One zero for ', P.tex); */
|
|
867
|
+
|
|
868
|
+
} else {
|
|
869
|
+
console.log('No zero for ', P.tex);
|
|
870
|
+
}
|
|
871
|
+
} else {
|
|
872
|
+
for (let z of P.getZeroes()) {
|
|
873
|
+
// Check if the zero is already in the list.
|
|
874
|
+
if (z === false || z === true) {
|
|
875
|
+
continue;
|
|
876
|
+
}
|
|
877
|
+
if (zeroesAsTex.indexOf(z.frac) === -1) {
|
|
878
|
+
zeroes.push(z);
|
|
879
|
+
zeroesAsTex.push(z.frac);
|
|
880
|
+
}
|
|
881
|
+
}
|
|
882
|
+
}
|
|
883
|
+
}
|
|
884
|
+
return zeroes;
|
|
885
|
+
}
|
|
886
|
+
return Z;
|
|
919
887
|
};
|
|
920
888
|
|
|
921
889
|
// TODO: analyse the next functions to determine if they are useful or not...
|
|
@@ -1027,34 +995,6 @@ export class Polynom {
|
|
|
1027
995
|
return M;
|
|
1028
996
|
}
|
|
1029
997
|
|
|
1030
|
-
limitToInfinity = (letter?: string): Fraction => {
|
|
1031
|
-
const M = this.monomByDegree(undefined, letter),
|
|
1032
|
-
sign = M.coefficient.sign(),
|
|
1033
|
-
degree = M.degree(letter)
|
|
1034
|
-
|
|
1035
|
-
if (degree.isStrictlyPositive()) {
|
|
1036
|
-
return sign === 1 ? (new Fraction()).infinite() : (new Fraction()).infinite().opposed()
|
|
1037
|
-
} else if (degree.isZero()) {
|
|
1038
|
-
return M.coefficient
|
|
1039
|
-
}
|
|
1040
|
-
|
|
1041
|
-
// Any other cases
|
|
1042
|
-
return (new Fraction()).zero()
|
|
1043
|
-
}
|
|
1044
|
-
limitToNegativeInfinity = (letter?: string): Fraction => {
|
|
1045
|
-
const M = this.monomByDegree(undefined, letter),
|
|
1046
|
-
sign = M.coefficient.sign(),
|
|
1047
|
-
degree = M.degree(letter)
|
|
1048
|
-
|
|
1049
|
-
if (degree.isStrictlyPositive()) {
|
|
1050
|
-
return sign === -1 ? (new Fraction()).infinite() : (new Fraction()).infinite().opposed()
|
|
1051
|
-
} else if (degree.isZero()) {
|
|
1052
|
-
return M.coefficient
|
|
1053
|
-
}
|
|
1054
|
-
|
|
1055
|
-
// Any other cases
|
|
1056
|
-
return (new Fraction()).zero()
|
|
1057
|
-
}
|
|
1058
998
|
private _parseString(inputStr: string, ...values: unknown[]): Polynom {
|
|
1059
999
|
if (values === undefined || values.length === 0) {
|
|
1060
1000
|
inputStr = '' + inputStr;
|