Skip to content

Commit 79eb167

Browse files
committed
fraction: show all best approximations
1 parent cd48280 commit 79eb167

1 file changed

Lines changed: 34 additions & 3 deletions

File tree

‎fraction.js‎

Lines changed: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,10 @@ function addLine(p,q,pdq){
7474
" &#8773; "+pdq+"<br>";
7575
}
7676
function addFracLine(contFrac){
77+
var pq = getPQ(contFrac);
78+
addLine(pq[0],pq[1],pq[0]/pq[1]);
79+
}
80+
function getPQ(contFrac){
7781
var p = "0";
7882
var q = "1";
7983
for(var i=contFrac.length-1; i>=0; i--){
@@ -83,7 +87,16 @@ function addFracLine(contFrac){
8387
p = q;
8488
q = cur;
8589
}
86-
addLine(q,p,q/p);
90+
return [q,p];
91+
}
92+
function isBetter(p1,q1,p2,q2,a,b){
93+
var aq1 = mulStrInt(a,q1);
94+
var bp1 = mulStrInt(b,p1);
95+
var d1 = lessThan(aq1,bp1) ? subStrInt(bp1,aq1) : subStrInt(aq1,bp1);
96+
var aq2 = mulStrInt(a,q2);
97+
var bp2 = mulStrInt(b,p2);
98+
var d2 = lessThan(aq2,bp2) ? subStrInt(bp2,aq2) : subStrInt(aq2,bp2);
99+
return lessThan(mulStrInt(d1,q2), mulStrInt(d2,q1));
87100
}
88101

89102
function addContLine(contFrac){
@@ -122,14 +135,32 @@ function approxFrac(){
122135
}
123136

124137

138+
var origA = a;
139+
var origB = b;
125140
var contFrac = [];
126141
var fract;
142+
var step = 0;
127143
do{
128144
fract = divStrInt(a,b);
129-
contFrac.push(fract[0]);
130-
addFracLine(contFrac);
145+
var cur = fract[0];
146+
if(step == 0){
147+
contFrac.push(cur);
148+
addFracLine(contFrac);
149+
}else{
150+
var start = divStrInt(addStrInt(cur,"1"),"2")[0];
151+
for(var k=start; lessThan(k,cur) || k==cur; k=addStrInt(k,"1")){
152+
if(k==start && divStrInt(cur,"2")[1]=="0"){
153+
var pq1 = getPQ(contFrac.concat([k]));
154+
var pq2 = getPQ(contFrac);
155+
if(!isBetter(pq1[0],pq1[1],pq2[0],pq2[1],origA,origB)){ continue; }
156+
}
157+
addFracLine(contFrac.concat([k]));
158+
}
159+
contFrac.push(cur);
160+
}
131161
a=b;
132162
b=fract[1];
163+
step++;
133164
}while(fract[1]!="0");
134165

135166
addContLine("["+contFrac.toString().replace(",",";")+"]",1,0);

0 commit comments

Comments
 (0)