//////////////////////////////////////////////////////////////////////////////////////// //  Ver.0.1 alpha4 // //////////////////////////////////////////////////////////////////////////////////////// /* [出力Debugは任意] ---------------汎用関数(局所,個所関数で構成される)------------------- NO汎用加算 Addb(A,B) →A+Bを返す NO汎用減算 Subb(A,B) →A-Bを返す NO汎用乗算 Mulb(A,B) →A*Bを返す NO汎用除算[余] Divb(A,B) →A/Bの商,余り NO汎用除算[∞] Dive(A,B,C) →A/Bを小数点以下C桁まで実行 ---------------局所関数(自然数のみを扱う)--------------------- OK自然数加算 Add_min(A,B,Debug) →A+Bを返す,Debug OK自然数減算 Sub_min(A,B,Debug) →A-Bを返す,Debug OK自然数乗算 Mul_min(A,B,Debug) →A*Bを返す,Debug NO自然数除算[余り] Divd_min(A,B,Debug) →A/Bの商,余り,Debug ---------------特殊関数(特殊計算を行う)------------------------- OK累乗 Invo(A,B,Debug) →A^Bを返す,Debug OK階乗 Fact(A,Debug) →A!を返す,Debug NO平方数 Root(A,B,Debug) →√(A)をB小数点以下桁計算し返す,Debug ---------------個所関数(細かい動作を行う)----------------------- OK小数点除去 DelDeci(A) →小数点を取り除いたA,後ろから数えた小数点の位置 OK10桁区切 OnCut(A) →10桁ごとに区切って出力 OK区切解除 UnCut(A) →10桁ごとの区切りを解除 */ //■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ //■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ //■ 局 所 関 数   局 所 関 数    局 所 関 数    局 所 関 数 ■ //■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ //■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ //■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ // 自然数加算 Add_min //////////////////////////////////////////////////////////////////////////////////////// function Add_min(A,B,Debug){ //Debug if(String(Debug)=="0"){ Start = new Date; var Debug_time = Start.getTime(); } if(A=="0"){ if(Debug=="0"){return B+",0,"+B.length;}else{return B;} } if(B=="0"){ if(Debug=="0"){return A+",0,"+A.length;}else{return A;} } if(A.length > B.length){var A_2=A;var B_2=B;} if(A.length < B.length){var A_2=B;var B_2=A;} if(A.length==B.length){var A_2=A;var B_2=B;} var Up=0; var C=""; //桁数揃え switch(A_2.length%15){ case 14: A_2="0" +A_2;break; case 13: A_2="00" +A_2;break; case 12: A_2="000" +A_2;break; case 11: A_2="0000" +A_2;break; case 10: A_2="00000" +A_2;break; case 9: A_2="000000" +A_2;break; case 8: A_2="0000000" +A_2;break; case 7: A_2="00000000" +A_2;break; case 6: A_2="000000000" +A_2;break; case 5: A_2="0000000000" +A_2;break; case 4: A_2="00000000000" +A_2;break; case 3: A_2="000000000000" +A_2;break; case 2: A_2="0000000000000" +A_2;break; case 1: A_2="00000000000000" +A_2; default: A_2=A_2; } switch(B_2.length%15){ case 14: B_2="0" +B_2;break; case 13: B_2="00" +B_2;break; case 12: B_2="000" +B_2;break; case 11: B_2="0000" +B_2;break; case 10: B_2="00000" +B_2;break; case 9: B_2="000000" +B_2;break; case 8: B_2="0000000" +B_2;break; case 7: B_2="00000000" +B_2;break; case 6: B_2="000000000" +B_2;break; case 5: B_2="0000000000" +B_2;break; case 4: B_2="00000000000" +B_2;break; case 3: B_2="000000000000" +B_2;break; case 2: B_2="0000000000000" +B_2;break; case 1: B_2="00000000000000" +B_2; default: B_2=B_2; } var limit = A_2.length/15; //加算 var addlim=1; while(addlim<=limit){ var A_X = A_2.substr(A_2.length-addlim*15,15); if(addlim*15 > B_2.length){ var B_X="0"; //Bが今後0,繰り上がりが0のとき計算を中止 if(Up==0){ C= A_2.substr(0,A_2.length-addlim*15+15)+C; //左側の0を除去 while(C.charAt(0)=="0" && C.length>1){ if(C.length>15){ C = parseFloat(C.substr(0,15))+C.substr(15,C.length-15); }else{ C = parseFloat(C); } } //Debug if(String(Debug)=="0"){ End = new Date; Debug_time = (End.getTime()-Debug_time)/1000; C+=","+Debug_time+","+C.length; } return C; } }else{ var B_X = B_2.substr(B_2.length-addlim*15,15); } var APB = parseFloat(A_X)+parseFloat(B_X)+Up; if(String(APB).length==16){ APB = String(APB).substr(1,15); Up=1; }else{ Up=0; } switch(String(APB).length%15){ case 14: APB="0" +APB;break; case 13: APB="00" +APB;break; case 12: APB="000" +APB;break; case 11: APB="0000" +APB;break; case 10: APB="00000" +APB;break; case 9: APB="000000" +APB;break; case 8: APB="0000000" +APB;break; case 7: APB="00000000" +APB;break; case 6: APB="000000000" +APB;break; case 5: APB="0000000000" +APB;break; case 4: APB="00000000000" +APB;break; case 3: APB="000000000000" +APB;break; case 2: APB="0000000000000" +APB;break; case 1: APB="00000000000000" +APB; default: APB=APB; } C = String(APB)+C; addlim++; } C = Up+C; //左側の0を除去 while(C.charAt(0)=="0" && C.length>1){ if(C.length>15){ C = parseFloat(C.substr(0,15))+C.substr(15,C.length-15); }else{ C = parseFloat(C); } } //Debug if(String(Debug)=="0"){ End = new Date; Debug_time = (End.getTime()-Debug_time)/1000; C+=","+Debug_time+","+C.length; } return C; } //■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ // 自然数減算 Sub_min //////////////////////////////////////////////////////////////////////////////////////// function Sub_min(A,B,Debug){ //Debug if(String(Debug)=="0"){ Start = new Date; var Debug_time = Start.getTime(); } if(A=="0"){ if(Debug=="0"){return B+",0,"+B.length;}else{return B;} } if(B=="0"){ if(Debug=="0"){return A+",0,"+A.length;}else{return A;} } if(A.length > B.length){ var A_2=A; var B_2=B; var Mark=""; } if(A.length < B.length){ var A_2=B; var B_2=A; var Mark="-"; } if(A.length==B.length){ if(A==B){ if(Debug=="0"){return "0,0,0";}else{return 0;} }else{ for(lengthno=0 ; lengthno= B.charAt(lengthno)){ var A_2=A; var B_2=B; var Mark=""; }else{ var A_2=B; var B_2=A; var Mark="-"; } } } } var Up=0; var C=""; //桁数揃え switch(A_2.length%15){ case 14: A_2="0" +A_2;break; case 13: A_2="00" +A_2;break; case 12: A_2="000" +A_2;break; case 11: A_2="0000" +A_2;break; case 10: A_2="00000" +A_2;break; case 9: A_2="000000" +A_2;break; case 8: A_2="0000000" +A_2;break; case 7: A_2="00000000" +A_2;break; case 6: A_2="000000000" +A_2;break; case 5: A_2="0000000000" +A_2;break; case 4: A_2="00000000000" +A_2;break; case 3: A_2="000000000000" +A_2;break; case 2: A_2="0000000000000" +A_2;break; case 1: A_2="00000000000000" +A_2; default: A_2=A_2; } switch(B_2.length%15){ case 14: B_2="0" +B_2;break; case 13: B_2="00" +B_2;break; case 12: B_2="000" +B_2;break; case 11: B_2="0000" +B_2;break; case 10: B_2="00000" +B_2;break; case 9: B_2="000000" +B_2;break; case 8: B_2="0000000" +B_2;break; case 7: B_2="00000000" +B_2;break; case 6: B_2="000000000" +B_2;break; case 5: B_2="0000000000" +B_2;break; case 4: B_2="00000000000" +B_2;break; case 3: B_2="000000000000" +B_2;break; case 2: B_2="0000000000000" +B_2;break; case 1: B_2="00000000000000" +B_2; default: B_2=B_2; } var limit = A_2.length/15; //減算 addlim=1; while(addlim<=limit){ var A_X = A_2.substr(A_2.length-addlim*15,15); if(addlim*15 > B_2.length && B_X.length>1){ B_X="0"; }else{ var B_X = B_2.substr(B_2.length-addlim*15,15); } var APB = parseFloat(A_X)-parseFloat(B_X)-Up; if(String(APB).charAt(0)=="-"){ ABP=APB*(-1); Up=1; }else{ Up=0; } switch(String(APB).length%15){ case 14: APB="0" +APB;break; case 13: APB="00" +APB;break; case 12: APB="000" +APB;break; case 11: APB="0000" +APB;break; case 10: APB="00000" +APB;break; case 9: APB="000000" +APB;break; case 8: APB="0000000" +APB;break; case 7: APB="00000000" +APB;break; case 6: APB="000000000" +APB;break; case 5: APB="0000000000" +APB;break; case 4: APB="00000000000" +APB;break; case 3: APB="000000000000" +APB;break; case 2: APB="0000000000000" +APB;break; case 1: APB="00000000000000" +APB; default: APB=APB; } C = String(APB)+C; addlim++; } //左側の0を除去 while(C.charAt(0)=="0" && C.length>1){ if(C.length>15){ C = parseFloat(C.substr(0,15))+C.substr(15,C.length-15); }else{ C = parseFloat(C); } } //Debug if(String(Debug)=="0"){ End = new Date; Debug_time = (End.getTime()-Debug_time)/1000; C+=","+Debug_time+","+C.length; } C=Mark+C; return C; } //■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ // 自然数乗算 Mul_min //////////////////////////////////////////////////////////////////////////////////////// function Mul_min(A,B,Debug){ //Debug if(String(Debug)=="0"){ Start = new Date; var Debug_time = Start.getTime(); } //6桁区切りの計算の最大数 var limitA = Math.ceil(A.length/8); var limitB = Math.ceil(B.length/7); var AB = "0"; var A_Loop=0; while(A_Loop3){ var Invo_Memory="1"; var Invo_length=0; var now_Invo=1; var Last_Invo=eval(B); var Math_Memory=String(A); var now_Math=String(A); var Invo_all = "1" while(now_Invo*2<=Last_Invo){ now_Invo = now_Invo*2; Invo_Memory+=","+now_Invo; Invo_length++; } End1= new Date; Debug+="最大累乗"+now_Invo+"-計算終了:"+((End1.getTime()-time)/1000)+"sec\n"; time=End1.getTime(); for(i=1;i<=Invo_length;i++){ now_Math=Mul_min(now_Math,now_Math,"1"); Math_Memory+=","+now_Math; } End2= new Date; Debug+=A+"^"+now_Invo+"-計算終了:"+((End2.getTime()-time)/1000)+"sec\n"; time=End2.getTime(); Invo_all=now_Math; var memori = ""+now_Math; Last_Invo-=eval(Invo_Memory.split(",")[Invo_length]); while(Last_Invo>0){ for(i=0;iLast_Invo){ Last_Invo-=eval(Invo_Memory.split(",")[i]); Invo_all = Mul_min(Invo_all,Math_Memory.split(",")[i],"1"); memori+="*"+Math_Memory.split(",")[i]; break; } } } } if(eval(B)==3){var Invo_all = Mul_min(A,Mul_min(A,A,"1"),"1");} if(eval(B)==2){var Invo_all = Mul_min(A,A,"1");} if(eval(B)==1){var Invo_all = A;} if(eval(B)==0){var Invo_all = 1;} End= new Date; Debug+="全ての乗算終了:"+((End.getTime()-time)/1000)+"sec\n"; time=(End.getTime()-Start)/1000; var C = Invo_all+",\n---Cost---\n"+Debug+"Total Cost:"+time+"sec"; return C; } //■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ //■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ //■ 個 所 関 数   個 所 関 数    個 所 関 数    個 所 関 数 ■ //■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ //■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ //■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ // 小数点除去 DelDeci //////////////////////////////////////////////////////////////////////////////////////// function DelDeci(Math_String){ //符号除去,Mark=除去した符号; if(Math_String.charAt(0)=="-"){ var Math_String_abs = Math_String.substr(1,Math_String.length-1); var Mark = "-"; }else{ var Math_String_abs = Math_String; var Mark = ""; } //小数点位置検索 //演算速度を上げるために小数点の有無をチェック if(!Math_String_abs.match(/\./)){var Decimal_Point_Position=0;var Math_String_NoPoint=Mark+Math_String_abs;}//存在しない場合 else{ //小数点が存在した場合の位置特定 var Decimal_Point_Position=Math_String_abs.length-1-Math_String_abs.indexOf(".",0); //小数点除去 var Math_String_NoPoint=Mark+Math_String_abs.replace(/\./,""); } //小数点を外した数,小数点の位置を返す var return_Point_String=Math_String_NoPoint+","+Decimal_Point_Position; return return_Point_String; } //■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ // 10桁区切 OnCut //////////////////////////////////////////////////////////////////////////////////////// function OnCut(String){ var limit = String.length%10; var String2=String.substr(limit-1,String.length); var String3=String.substr(0,limit-1); while(String3.length<9){ String3=" "+String3; } for(Cut=0;Cut