let w,h,g,el,ratio,my={};function numberzoomMain(mode){let version='0.793';this.mode=typeof mode!=='undefined'?mode:'int';w=600;h=150;my.opts={numsQ:true,ticksQ:true,fracsQ:false,fracType:''} let s="";my.imgHome=(document.domain=='localhost')?'/mathsisfun/images/style/':'/images/style/' s+='
';s+='
';s+='';s+='
';s+='';s+='';s+='';s+='
';s+='
';s+='
© 2021 MathsIsFun.com v'+version+'
';s+=optPopHTML();s+='
';document.write(s);el=document.getElementById('canvasId');ratio=2;el.width=w*ratio;el.height=h*ratio;el.style.width=w+"px";el.style.height=h+"px";g=el.getContext("2d");g.setTransform(ratio,0,0,ratio,0,0);this.zoomInQ=true;my.marksQ=false my.marks=[];my.t0=0;my.lt=40;my.wd=520;my.currX=w/2;my.mouseDownQ=false;my.shiftQ=false;window.addEventListener("keydown",onKey,false);window.addEventListener("keyup",function(ev){my.shiftQ=ev.shiftKey;},false);el.addEventListener("mousemove",function(ev){let bRect=el.getBoundingClientRect();my.currX=(ev.clientX-bRect.left)*(el.width/ratio/bRect.width);ev.preventDefault()},false);el.addEventListener("mousedown",function(ev){my.mouseDownQ=true;my.shiftQ=ev.shiftKey;},false);el.addEventListener("mouseup",function(ev){my.mouseDownQ=false;},false);el.addEventListener("touchmove",function(ev){let touch=ev.targetTouches[0];let bRect=el.getBoundingClientRect();my.currX=(touch.clientX-bRect.left)*(el.width/ratio/bRect.width);ev.preventDefault()},false);el.addEventListener("touchstart",function(ev){my.mouseDownQ=true;my.shiftQ=ev.shiftKey;},false);el.addEventListener("touchend",function(ev){my.mouseDownQ=false;},false);el.addEventListener("mousewheel",onMouseWheel,false);my.coords=new CoordsFull(my.wd,200,'-1','-10,','11','10',true);tickSparseness=0.04;currFrame=0;maxFrames=10000;my.zoomCount=0;my.moveCount=0;keyCount=0;redraw();animate();} function reset(){my.coords=new CoordsFull(my.wd,200,'-1','-10,','11','10',true);keyCount=0;my.marks=[];redraw();} function animate(){let edge=60 if(my.mouseDownQ){if(my.currXw-edge){let speed=1;if(my.currX0){my.zoomCount--;doZoom(1);} if(my.zoomCount<0){my.zoomCount++;doZoom(-1);} if(my.moveCount>0){my.moveCount--;doMove(1);} if(my.moveCount<0){my.moveCount++;doMove(-1);} requestAnimationFrame(animate);} function onKey(ev){keyCount++;let keyCode=ev.keyCode;let countQ=false switch(keyCode){case 38:case 104:case 87:my.zoomCount=-4;countQ=true;ev.preventDefault() break;case 40:case 98:case 83:my.zoomCount=4;countQ=true;ev.preventDefault() break;case 37:case 100:case 65:my.moveCount=-4;countQ=true;ev.preventDefault() break;case 39:case 102:case 68:my.moveCount=4;countQ=true;ev.preventDefault() break;case 16:break;case 48:case 96:reset() break;default:console.log("key",keyCode);keyCount--;} my.shiftQ=ev.shiftKey} function doZoom(dirn){let rel=(my.currX-my.lt)/my.wd;rel=Math.max(Math.min(rel,1),0);if(dirn>0){my.coords.scale(1.02,rel);}else{my.coords.scale(0.98,rel);} my.t0=performance.now();redraw();} function doMove(dirn){if(dirn>0){my.coords.moveRel(0.015);}else{my.coords.moveRel(-0.015);} my.t0=performance.now();redraw();} function ticksGet(){let majorTick=my.coords.xTickInterval(tickSparseness,true);let minorTick=my.coords.xTickInterval(tickSparseness,false);let minorTickEvery=majorTick.div(minorTick,0).getNumber();let majorNum=majorTick;let minorNum=majorNum.div(new Num(minorTickEvery.toString()),30);let curNum=my.coords.xStt;curNum=curNum.div(majorNum,0);curNum=curNum.sub(new Num("1"));curNum=curNum.mult(majorNum);let gap=num2pix(minorNum)-num2pix(new Num("0"));let textWd=majorNum.add(minorNum).fmt().length*9;let labelQ=(textWd0) continue;let tickPx=num2pix(tick);ticks.push({majorQ:minorTickNo==0,n:minorTickNo,px:tickPx,str:tick.fmt(10),wholeStr:tick.getWholeStr(),decStr:tick.getDecStr()});} curNum=curNum.add(majorNum);} return ticks;} function redraw(){g.clearRect(0,0,el.width,el.height);numLineDraw();document.getElementById('keycount').innerHTML='keys: '+keyCount;} function numLineDraw(){let ticks=ticksGet();let majorN=0 let lenSum=0 let decLenSum=0 for(let i=0;imaxV)maxV=v;if(v50){let lastChr=vStr.replace(/0+$/,'').slice(-1);let evenQ=Number(lastChr)%2==0;if(tick.decPart.length0){let numer=tick.decStr let denom='1'+'0'.repeat(numer.length) let fracStr='' numer=numer.replace(/^0+/,'');if(numer.length>0){if(denom.length<16){let hcfVal=hcf(numer,denom);if(hcfVal>1){numer=Number(numer)/hcfVal denom=Number(denom)/hcfVal}}else{} fracStr=fracHTML(numer,denom)} txtY=lblUpQ?12:40;txtDiv(tick.wholeStr+fracStr,xp,yLn+txtY)}else{g.fillText(vStr,xp,yLn+txtY);}}}else{g.lineWidth=1;tickHt=8;} if(my.opts.ticksQ){g.beginPath();g.moveTo(xp,yLn-tickHt);g.lineTo(xp,yLn+tickHt);g.stroke();} v+=1;} if(zeroPx==-999){if(maxV<0)zeroPx=w;if(minV>0)zeroPx=-1;} let lnStt=my.lt-25;let lnEnd=my.lt+my.wd+25;if(zeroPx>lnStt){g.strokeStyle='red';g.drawPipe(lnStt+10,yLn,Math.min(zeroPx,lnEnd-10),yLn,g.strokeStyle);} if(zeroPxlnStt?'red':'blue';g.beginPath();g.drawArrow(my.lt-35,yLn,30,2,45,25,Math.PI);g.fill();g.fillStyle=zeroPx>lnEnd?'red':'blue';g.beginPath();g.drawArrow(my.lt+my.wd+35,yLn,30,2,45,25,0);g.fill();if(my.marksQ){g.fillStyle='#aa0';g.strokeStyle=g.fillStyle;g.font='bold 17px Arial';g.lineWidth=2;for(let i=0;i0&&rel<1){let xp=my.lt+rel*my.wd;g.fillText(mark[1],xp,yLn-35);g.beginPath();g.moveTo(xp,yLn);g.lineTo(xp,yLn-30);g.stroke();g.drawArrow(xp,yLn,20,2,20,10,3*Math.PI/2);g.fill();}}}} function txtDiv(s,x,y){let div=document.createElement('div');div.innerHTML=s let wd=w div.style.position='absolute' div.style.width=wd+'px' div.style.left=x-wd/2+'px' div.style.top=y+'px' div.style.color='black' div.style.textAlign='center' let dad=document.getElementById('txts');dad.appendChild(div);} function num2pix(num){return(num.sub(my.coords.xStt).getNumber()/my.coords.xEnd.sub(my.coords.xStt).getNumber()*my.coords.width);} function pix2num(pix){return(my.coords.xStt.getNumber()+pix/my.coords.width*(my.coords.xEnd.getNumber()-my.coords.xStt.getNumber()));} function clearMarks(){my.marks=[];go();document.getElementById('clearBtn').style.visibility='hidden';} function onMouseWheel(ev){let delta=Math.max(-1,Math.min(1,(ev.wheelDelta||-ev.detail)));my.zoomCount-=delta*5;ev.preventDefault() return false;} function toggleZoomIn(){this.zoomInQ=!this.zoomInQ;let div=document.getElementById('zoom');if(this.zoomInQ){div.innerHTML='Zoom In';}else{div.innerHTML='Zoom Out';}} function numsToggle(){my.opts.numsQ=!my.opts.numsQ;btnToggle("numsBtn",my.opts.numsQ);redraw()} function ticksToggle(){my.opts.ticksQ=!my.opts.ticksQ btnToggle("ticksBtn",my.opts.ticksQ);redraw()} function fracsToggle(){my.opts.fracsQ=!my.opts.fracsQ btnToggle("fracsBtn",my.opts.fracsQ);redraw()} function btnToggle(btn,onq){console.log('btnToggle',btn,onq) if(onq){document.getElementById(btn).classList.add("hi");document.getElementById(btn).classList.remove("lo");}else{document.getElementById(btn).classList.add("lo");document.getElementById(btn).classList.remove("hi");}} function Point(x,y){this.x=x;this.y=y;} Point.prototype.set=function(x,y){this.x=x;this.y=y;};CanvasRenderingContext2D.prototype.drawArrow=function(x0,y0,totLen,shaftHt,headLen,headHt,angle,sweep,invertQ){let g=this;let pts=[[0,0],[-headLen,-headHt/2],[-headLen+sweep,-shaftHt/2],[-totLen,-shaftHt/2],[-totLen,shaftHt/2],[-headLen+sweep,shaftHt/2],[-headLen,headHt/2],[0,0]];if(invertQ){pts.push([0,-headHt/2],[-totLen,-headHt/2],[-totLen,headHt/2],[0,headHt/2]);} for(let i=0;i0){temp=this.xStt;this.xStt=this.xEnd;this.xEnd=temp;} let xSpan=this.xEnd.sub(this.xStt);if(xSpan.compare(new Num("0"))<=0)xSpan.setNum("0.1");xScale=xSpan.div(new Num(this.width.toString()),10);};CoordsFull.prototype.toXVal=function(pix){return(xStt.add(xScale.mult(new Num(pix.toString())))).getNumber();};CoordsFull.prototype.toXNum=function(pix){return(xStt.add(xScale.mult(new Num(pix.toString()))));};CoordsFull.prototype.xTickInterval=function(tickSparseness,majorQ){return this.tickInterval(this.xEnd.sub(this.xStt).mult(new Num(tickSparseness.toString())),majorQ);};CoordsFull.prototype.yTickInterval=function(tickSparseness,majorQ){return this.tickInterval(this.yEnd.sub(this.yStt).mult(new Num(tickSparseness.toString())),majorQ);};CoordsFull.prototype.tickInterval=function(span,majorQ){let mantissa=span.getSci()[0];let intervals=[[7,10,1],[3,1,1],[2,1,0.5],[1,1,0.1]];let interval=[] for(let i=0;i=interval[0]||i==intervals.length-1){break;}} let result=majorQ?interval[1]:interval[2] let num=new Num(result.toString());num=num.mult10(span.getSci()[1]+1);return num;};function Num(s,base){s=typeof s!=='undefined'?s:'';base=typeof base!=='undefined'?base:10;this.sign=1;this.digits="";this.dec=0;this.MAXDEC=20;this.baseDigits="0123456789ABCDEFGHJKLMNP";this.setNum(s,base);} Num.prototype.setNum=function(s,base){base=typeof base!=='undefined'?base:10;if(s==0){this.digits='0';return;} if(base==10){let digits=s;if(digits.charAt(0)=="-"){this.sign=-1;digits=digits.substring(1);}else{this.sign=1;} let eVal=0;let ePos=digits.indexOf("e");if(ePos>=0){eVal=(digits.substr(ePos+1))>>0;digits=digits.substr(0,ePos);} this.dec=digits.length-(digits.indexOf(".")+1);if(this.dec==digits.length){this.dec=0;} this.dec-=eVal;digits=digits.split(".").join("");digits=digits.replace(/^0+/,'');if(digits.length==0){this.sign=1;}else{let s1="";for(let i=0;i=0){s1+=digit;}} digits=s1;} this.digits=digits;}else{this.setFromBase(s,base);}};Num.prototype.setFromBase=function(numStr,base){let srcSign="";if(numStr.charAt(0)=="-"){srcSign="-";numStr=numStr.substring(1);} let baseDec=numStr.length-(numStr.indexOf(".")+1);if(baseDec==numStr.length){baseDec=0;} numStr=numStr.split(".").join("");numStr=numStr.replace(/^0+/,'');if(numStr.length==0){this.setNum("0");}else{let i=0;let len=numStr.length;let baseStr=base.toString();let digit=this.baseDigits.indexOf(numStr.charAt(i++).toUpperCase()).toString();let result=digit;while(i0){let divBy=this.fullPower(baseStr,baseDec);result=this.fullDivide(result,divBy,this.MAXDEC);} this.setNum(srcSign+result);}};Num.prototype.toBase=function(base,places){let parts=this.splitWholeFrac();let s=this.fullBaseWhole(parts[0],base);if(parts[1].length>0){s+="."+this.fullBaseFrac(parts[1],base,places);} if(this.sign==-1){if(s!="0"){s="-"+s;}} return s;};Num.prototype.getNumber=function(){return Number(this.fmt(10,0));};Num.prototype.mult10=function(n){let xNew=this.clone();xNew.dec=xNew.dec-n;if(xNew.dec<0){xNew.digits=xNew.digits+"0".repeat(-xNew.dec);xNew.dec=0;} return xNew;};Num.prototype.clone=function(){let ansNum=new Num();ansNum.digits=this.digits;ansNum.dec=this.dec;ansNum.sign=this.sign;return ansNum;};Num.prototype.mult=function(num){return this.multNums(this,num);};Num.prototype.fullMultiply=function(x,y){return this.multNums(new Num(x),new Num(y)).fmt();};Num.prototype.multNums=function(xNum,yNum){let N1=xNum.digits;let N2=yNum.digits;let ans="0";for(let i=N1.length-1;i>=0;i--){ans=this.fullAdd(ans,(this.fullMultiply1(N2,N1.charAt(i))+"0".repeat(N1.length-i-1)));} let ansNum=new Num(ans);ansNum.dec=xNum.dec+yNum.dec;ansNum.sign=xNum.sign*yNum.sign;return ansNum;};Num.prototype.fullMultiply1=function(x,y1){let carry="0";let ans="";for(let i=x.length-1;i>(-1);i--){let product=((x.charAt(i))>>0)*(y1>>0)+(carry>>0);let prodStr=product.toString();if(product<10){prodStr="0"+prodStr;} carry=prodStr.charAt(0);ans=prodStr.charAt(1)+ans;} if(carry!="0"){ans=carry+ans;} return ans;};Num.prototype.fullMultiplyInt=function(x,y){let xLen=x.length;let yLen=y.length;if(xLen==0)return "0";if(yLen==0)return "0";if(xLen+yLen<=9){return(parseInt(x)*parseInt(y)).toString();} let maxLen=Math.max(xLen,yLen);let split=Math.ceil(maxLen/2);if(xLen=0;i--){let temp=((xdig.charAt(i))>>0)+((ydig.charAt(i))>>0)+carry;if((temp>=0)&&(temp<20)){if(temp>9){carry=1;ans=temp-10+ans;}else{carry=0;ans=temp+ans;}}} if(carry==1){ans="1"+ans;} ansNum.setNum(ans);ansNum.sign=xNum.sign;ansNum.dec=maxdec;return ansNum;};Num.prototype.fullPower=function(x,n){return this.expNums(new Num(x),n).fmt();};Num.prototype.expNums=function(xNum,nInt){let n=nInt;let b2pow=0;while((n&1)==0){b2pow++;n>>=1;} let x=xNum.digits;let r=x;while((n>>=1)>0){x=this.fullMultiply(x,x);if((n&1)!=0){r=this.fullMultiply(r,x);}} while(b2pow-->0){r=this.fullMultiply(r,r);} let ansNum=new Num(r);ansNum.dec=xNum.dec*nInt;return ansNum;};Num.prototype.div=function(num,decimals){return this.divNums(this,num,decimals);};Num.prototype.fullDivide=function(x,y,decimals){return this.divNums(new Num(x),new Num(y),decimals).fmt();};Num.prototype.divNums=function(xNum,yNum,decimals){decimals=typeof decimals!=='undefined'?decimals:this.MAXDEC;if(xNum.digits.length==0){return new Num("0");} if(yNum.digits.length==0){return new Num("0");} let xDec=xNum.mult10(decimals);let fullDec=Math.max(xDec.dec,yNum.dec);let xdig=xDec.digits+"0".repeat(fullDec-xDec.dec);let ydig=yNum.digits+"0".repeat(fullDec-yNum.dec);xdig=xdig.replace(/^0+/,'');if(this.compareDigits(xdig,"0")==0){return new Num("0");} ydig=ydig.replace(/^0+/,'');if(this.compareDigits(ydig,"0")==0){return new Num("0");} let timestable=[];timestable.push("0");timestable.push(ydig);let tdig=ydig;for(let i=2;i<10;i++){tdig=this.fullAdd(tdig,ydig);timestable.push(tdig);} let ans="0";let xNew=xdig;let n=0;while(this.compareDigits(xNew,ydig)>=0){let col=1;while(this.compareDigits(xNew.substring(0,col),ydig)<0){col++;} let xCurr=xNew.substring(0,col);let mult=9;while(this.compareDigits(timestable[mult],xCurr)>0){mult--;} let fullmult=mult+""+"0".repeat(xNew.length-xCurr.length);ans=this.fullAdd(ans,fullmult);xNew=this.fullSubtract(xNew,this.fullMultiply(ydig,fullmult));if(n++>100){console.log("runaway code divNums");break;}} let ansNum=new Num(ans);ansNum.dec=decimals;ansNum.sign=xNum.sign*yNum.sign;return ansNum;};Num.prototype.sub=function(num){return this.subNums(this,num);};Num.prototype.fullSubtract=function(x,y){return this.subNums(new Num(x),new Num(y)).fmt();};Num.prototype.subNums=function(xNum,yNum){let ansNum=new Num();if(xNum.sign*yNum.sign==-1){ansNum=xNum.abs().add(yNum.abs());if(xNum.sign==-1){ansNum.sign*=-1;} return ansNum;} let maxdec=Math.max(xNum.dec,yNum.dec);let xdig=xNum.digits+"0".repeat(maxdec-xNum.dec);let ydig=yNum.digits+"0".repeat(maxdec-yNum.dec);let maxlen=Math.max(xdig.length,ydig.length);xdig="0".repeat(maxlen-xdig.length)+xdig;ydig="0".repeat(maxlen-ydig.length)+ydig;let sign=this.compareDigits(xdig,ydig);if(sign==0){return new Num("0");} if(sign==-1){let temp=xdig;xdig=ydig;ydig=temp;} let ans="";let isborrow=0;for(let i=xdig.length-1;i>=0;i--){let xPiece=(xdig.charAt(i))>>0;let yPiece=(ydig.charAt(i))>>0;if(isborrow==1){isborrow=0;xPiece=xPiece-1;} if(xPiece<0){xPiece=9;isborrow=1;} if(xPiecesigDigits){let cutDigit="";if(sigDigits>=0){s=this.digits.substr(0,sigDigits);cutDigit=this.digits.charAt(sigDigits);}else{s="";cutDigit="";} switch(roundType){case "5up":if(cutDigit>"5"||(cutDigit=="5"&&this.sign==1)){s=this.fullAdd(s,"1",10);} break;case "5down":if(cutDigit>"5"||(cutDigit=="5"&&this.sign==-1)){s=this.fullAdd(s,"1");} break;case "5away0":if(cutDigit>="5"){s=this.fullAdd(s,"1");} break;case "5to0":if(cutDigit>"5"){s=this.fullAdd(s,"1");} break;case "5even":if(cutDigit>"5"){s=this.fullAdd(s,"1");}else{if(cutDigit=="5"){if((parseInt(s.charAt(s.length-1))&1)!=0){s=this.fullAdd(s,"1");}}} break;case "5odd":if(cutDigit>"5"){s=this.fullAdd(s,"1");}else{if(cutDigit=="5"){if((parseInt(s.charAt(s.length-1))&1)==0){s=this.fullAdd(s,"1");}}} break;case "floor":if(sigDigits<0){decpos-=sigDigits;if(this.sign==-1){s="1";}else{s="";}}else{if(this.sign==-1){if(Strings.trimLeft(digits.substr(sigDigits),"0").length!=0){s=this.fullAdd(s,"1");}}} break;case "ceiling":if(sigDigits<0){decpos-=sigDigits;if(this.sign==1){s="1";}else{s="";}}else{if(this.sign==1){if(Strings.trimLeft(digits.substr(sigDigits),"0").length!=0){s=fullAdd(s,"1");}}} break;default:} if(s.length>sigDigits){if(sigDigits>0) s=s.substr(0,sigDigits);decpos++;} if(s.length==0){s="0";}else{if(decpos-sigDigits>0) s+="0".repeat(decpos-sigDigits);}}} let eVal=decpos-1;if(eStt>0&&Math.abs(eVal)>=eStt){let s1=s.substr(0,1)+"."+s.substr(1);s1=s1.replace(/0+$/,'');if(s1.charAt(s1.length-1)=="."){s1=s1.substr(0,s1.length-1);} if(eVal>0){s=s1+"e+"+eVal;}else{s=s1+"e"+eVal;}}else{if(decpos<0){s="0."+"0".repeat(-decpos)+s;}else if(decpos==0){s="0."+s;}else if(decpos>0){if(this.dec>=0){s=s.substr(0,decpos)+"."+s.substr(decpos,this.dec);}else{s=s+"0".repeat(-this.dec)+".";}} if(s.indexOf(".")>=0){s=s.replace(/0+$/,'');} if(s.charAt(s.length-1)=="."){s=s.substring(0,s.length-1);}} if(this.sign==-1){if(s!="0"){s="-"+s;}} this.dec=decWas;this.digits=digitsWas;return s;};Num.prototype.compare=function(yNum){return this.compareNums(this,yNum);};Num.prototype.compareNums=function(xNum,yNum){if(xNum.digits.length==0) xNum.sign=1;if(yNum.digits.length==0) yNum.sign=1;if(xNum.sign==1&&yNum.sign==-1){return 1;} if(xNum.sign==-1&&yNum.sign==1){return-1;} let maxdec=Math.max(xNum.dec,yNum.dec);let xdig=xNum.digits+strRepeat("0",maxdec-xNum.dec);let ydig=yNum.digits+strRepeat("0",maxdec-yNum.dec);let maxlen=Math.max(xdig.length,ydig.length);xdig=strRepeat("0",maxlen-xdig.length)+xdig;ydig=strRepeat("0",maxlen-ydig.length)+ydig;for(let i=0;iydig.charAt(i)){return 1*xNum.sign;}} return 0;};Num.prototype.compareDigits=function(x,y){if(x.length>y.length){return 1;} if(x.lengthy.charAt(i)){return 1;}} return 0;};Num.prototype.splitWholeFrac=function(){let s=this.digits;let decpos=s.length-this.dec;if(decpos<0){s="0".repeat(-decpos)+s;decpos=0;} if(this.dec<0){s=s+"0".repeat(-this.dec)+".";} let wholePart=s.substr(0,decpos);let fracPart=s.substr(decpos);if(fracPart.replace(/^0+/,'').length==0){fracPart="";}else{fracPart="0."+fracPart;} return[wholePart,fracPart];};Num.prototype.fullBaseWhole=function(d,base){let baseStr=base.toString();let dWhole=this.fullDivide(d,baseStr,0);let dRem=this.fullSubtract(d,this.fullMultiply(dWhole,baseStr));if(dWhole=="0"){return this.baseDigits.charAt(dRem>>0);}else{return this.fullBaseWhole(dWhole,base)+this.baseDigits.charAt(dRem>>0);}};Num.prototype.fullBaseFrac=function(d,base,places,level){level=typeof level!=='undefined'?level:0;let r=this.fullMultiply(d,base.toString());let parts=r.split(".");let wholePart=parts[0];if(parts.length==1||level>=places-1){return this.baseDigits.charAt(wholePart>>0);}else{let fracPart="0."+parts[1];return this.baseDigits.charAt(wholePart>>0)+this.fullBaseFrac(fracPart,base,places,level+1);}};Num.prototype.getSignStr=function(){if(this.sign==-1){return "-";}else{return "";}};Num.prototype.getWholeStr=function(){let s=this.digits;let decpos=s.length-this.dec;if(decpos<0){s="0".repeat(-decpos)+s;decpos=0;} if(this.dec<0){s=s+"0".repeat(-this.dec)+".";} return s.substr(0,decpos);};Num.prototype.getDecStr=function(){let s=this.digits;let decpos=s.length-this.dec;if(decpos<0){s="0".repeat(-decpos)+s;decpos=0;} if(this.dec<0){s=s+"0".repeat(-this.dec)+".";} return s.substr(decpos);};Num.prototype.fullProdSeq=function(n0,n1){if(n0==n1)return n1.toString();let nMid=((n1+n0)/2)<<0;return(this.fullMultiplyInt(this.fullProdSeq(n0,nMid),this.fullProdSeq(nMid+1,n1)));};Num.prototype.getSci=function(){let len=this.digits.length;let s=this.digits.substr(0,1)+"."+this.digits.substr(1);s=s.replace(/0+$/,'');if(s.charAt(s.length-1)=="."){s=s.substr(0,s.length-1);} if(this.sign==-1){s="-"+s;} return[s,len-this.dec-1];};Num.prototype.fullCombPerm=function(n,r,orderQ,replaceQ){let i=1;let s="";if(orderQ){if(replaceQ){s=this.fullPower(n.toString(),r);}else{if(r>n){s="";}else{s=this.fullProdSeq(n-r+1,n);}}}else{let tops=[];let bots=[];if(replaceQ){if(false){}else{for(i=n;i<=n+r-1;i++){tops.push(i);} for(i=2;i<=r;i++){bots.push(i);}}}else{if(r>n){s="";}else{if(rtrimToLen){let origLen=this.digits.length;this.digits=this.digits.substr(0,trimToLen);this.dec-=(origLen-this.digits.length);}};function strRepeat(chr,count){let s="";while(count>0){s+=chr;count-=1;} return s;} function toggleFullScreen(){if((document.fullScreenElement&&document.fullScreenElement!==null)||(!document.mozFullScreen&&!document.webkitIsFullScreen)){if(document.documentElement.requestFullScreen){document.documentElement.requestFullScreen();}else if(document.documentElement.mozRequestFullScreen){document.documentElement.mozRequestFullScreen();}else if(document.documentElement.webkitRequestFullScreen){document.documentElement.webkitRequestFullScreen(Element.ALLOW_KEYBOARD_INPUT);}}else{if(document.cancelFullScreen){document.cancelFullScreen();}else if(document.mozCancelFullScreen){document.mozCancelFullScreen();}else if(document.webkitCancelFullScreen){document.webkitCancelFullScreen();}}} CanvasRenderingContext2D.prototype.drawPipe=function(x0,y0,x1,y1,clr){let g=this;let alpha=[0.8,0.4,0.3,0.2,0.4,0.6,0.80];let size=alpha.length;for(let i=0;i'+b+'' return s;} function hcf(n1,n2){n1=n1<<0;n2=n2<<0;if(n1==0||n2==0)return 0;if(n1>n2){n1=n1+n2;n2=n1-n2;n1=n1-n2;} var remainder=n2%n1;while(remainder!=0){n2=n1;n1=remainder;remainder=n2%n1;} return n1;}