-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathBigFrac.js
129 lines (110 loc) · 3.01 KB
/
BigFrac.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
var Frac = function(a,b){
//a,b are big numbers
this.a = a;
this.b = b;
var abs = function(a){
if(a < 0n){
a = -a;
}
return a;
};
var gcd = function(a,b){
if(a === 0n || b === 0n){
return 1n;//to prevent bug
}
a = abs(a);
b = abs(b);
while(true){
if(a < b){//a must be bigger than a
var temp = a;
a = b;
b = temp
}
var c = a%b;
if(c === 0n){
return b;
}
a = c;
}
};
var tenToTheN = function(n){
var str = "";
for(var i = 0; i < n; i++){
str += 0;
}
return BigInt("1"+str);
};
var factorial = function(a){//gets a normal int and returns a bigint
var fact = BigInt(1);
while(a > 0){
fact *= BigInt(a);
a--;
}
return fact;
};
this.abs = abs;
this.gcd = gcd;
this.tenToTheN = tenToTheN;
this.factorial = factorial;
this.roundToNthDegree = function(n){
var at = this.a.toString();
var bt = this.b.toString();
var tlen = at.length < bt.length ? at.length : bt.length;//the smaller one
var dlen = tlen-n;//number of digits to be rounded
if(dlen <= 0){
return new Frac(this.a,this.b);//yup because it's immutable
}
return new Frac(BigInt(at.slice(0,-dlen)),BigInt(bt.slice(0,-dlen)));
};
this.simplify = function(){
var a = this.a;
var b = this.b;
if(a === 0n){
b = 1n;
}else{
var com = gcd(a,b);
a /= com;
b /= com;
}
return new Frac(a,b);
};
this.add = function(frac){
//var com = gcd(this.b,frac.b);
//console.log("adding,",this,frac);
//var lcoef = this.b/com;
//var rcoef = frac.b/com;
//var a = this.a*rcoef+frac.a*lcoef;
//var b = rcoef*this.b;
var a = this.a*frac.b+this.b*frac.a;
var b = this.b*frac.b;
return (new Frac(a,b));
};
this.subtract = function(frac){
frac = new Frac(-frac.a,frac.b);
return this.add(frac);
};
this.multiply = function(frac){
var a = frac.a*this.a;
var b = frac.b*this.b;
return (new Frac(a,b));
};
this.divide = function(frac){
frac = frac.invert();
return this.multiply(frac);
};
this.invert = function(){
return new Frac(this.a,this.b);
};
this.getDecimal = function(n){//get nth decimal
var str = (this.a*tenToTheN(n)/this.b).toString();
var int = str.slice(0,-n);
var digits = str.slice(-n);
return int+"."+digits;
};
this.multiplyBigint = function(n){
return new Frac(this.a*n,this.b);
};
this.divideBigint = function(n){
return new Frac(this.a,this.b*n);
};
};