新1000桁モード

 投稿者:しばっち  投稿日:2017年 7月16日(日)16時31分22秒
  十進BASICの1000桁モードでは根性足りなかったので、新たな1000桁モードを設定して、FACT(1億)やSUPER-FACT(1000万)等
を計算してみました。(※ご注意 それなりに計算時間がかかります)
ttmathライブラリーを使用しています。

LET MODE=0
SELECT CASE MODE
CASE 0
   LET T=TIME
   LET X=FACT(12)
   CALL POW(X,X,RESULT$) !'X^N
   PRINT RESULT$
   PRINT TIME-T
   !2.16136854137681821022184125634148248819277439276856614943668779759374015927471583106592012734245952019394970811589706056678555509602666892262853286963399272624718192094412355351855126976834619525882212314189739932773415168630756169900513658510182323332373473499827943602913845866193736546382782945259951879659321847521838639531976483388098572301935336416235494360371625249430543171712585820018204557600757659419294850500417373875788626819825199950337907403249688891357217862083761274130969418499307206106124775263607305819648633066733354877683318544283412749937741320358307160031045916238726656414998645969668486063799136387061569535403249857358744409290597217065826574844652429571085685396226665454889018425548129950363668417167709598931948788021370222023373478957578453869374042172871420547662647531104912996278899652524570542599912981658810875761529791724632424261687434245565068590484867082473812801455874989871262294862658856398056257782919304106334636474909267649153798992665460574519126362677282548109387566698144e+4157895294
   ! 6.00000000122236E-2
CASE 1
   LET T=TIME
   LET N=12
   CALL POWFACT(N,RESULT$) !' (N!)^(N!)
   PRINT RESULT$
   PRINT TIME-T
   !2.16136854137681821022184125634148248819277439276856614943668779759374015927471583106592012734245952019394970811589706056678555509602666892262853286963399272624718192094412355351855126976834619525882212314189739932773415168630756169900513658510182323332373473499827943602913845866193736546382782945259951879659321847521838639531976483388098572301935336416235494360371625249430543171712585820018204557600757659419294850500417373875788626819825199950337907403249688891357217862083761274130969418499307206106124775263607305819648633066733354877683318544283412749937741320358307160031045916238726656414998645969668486063799136387061569535403249857358744409290597217065826574844652429571085685396226665454889018425548129950363668417167709598931948788021370222023373478957578453869374042172871420547662647531104912996278899652524570542599912981658810875761529791724632424261687434245565068590484867082473812801455874989871262294862658856398056257782919304106334636474909267649153798992665460574519126362677282548109387566698144e+4157895294
   ! 5.99999999976717E-2
CASE 2
   LET T=TIME
   LET N=100000000
   CALL LFACT(N,RESULT$) !' 2 * 3 * 4 * 5 * 6 * 7 * 8 * 9 *...* (N-1) * N
   PRINT RESULT$
   PRINT TIME-T
   !1.617203794921462386338773185612804043292374530648735079789813462666737154407504386580500876929190785730659306997709526379072095316295179654167179073513009006634129337747061591098685297097001582503472866301385800430032150945662267422861318875599783688513582747708092357961161833291289737062618637215019469899671053443152756646656487690303084660412647294491564580376647772129380120207037940015370921432087635413424927860657596349753458123900398747077870811819146068196799068285805276780342699291909785817326004701598706171485200668534925511351721008280251885258366413790982774377048289170918554487709474512123782332682445769981037301850337091283801728542366418127850072350755894754427590475945724598891919272598883437250343540668568318110852233598880090166164148355169172329626842127353660159845036832550429220759703016224818725548782786942271616990913661405300333388635357873739104632007105374412990250693891528936041921842151622873513865541985938245791021807671861353403161524245569590956406240525270162218772164532514879e+756570556
   !  682.120000000003
CASE 3
   LET T=TIME
   LET N=10
   CALL DOUBLEFACT(N,RESULT$) !' (N!)!
   PRINT RESULT$
   PRINT TIME-T
   !9.05199383547993459066223334541125889552198008664676868116314684779771059925518196453479041306538539527348189982329395778742235835651919605262124430846948778576764869559997043450588358061928072056124053527199058676605381825380218545252893543490674379874682902832717881991350611759327438286087082893716928362722869514941184566224960239661223087820620654988693997209045226577413230551325238368145865183939219774507733773526942850610284588755921757033509597723710534792930741070551439957695535284309143461400603472683366857009617354558034731296338086943875630076158484363480326013561877788402404321547742395651713816120381647441147623336006797943428300341263884257264797238025712931763921792106198924511782304221981368602255187251376620790571651695312481368830266300012667706495970524334606110206318956844192728556930489510830894015380706494724588299721349272612934424245289039282358777312680822791908369313735461594023948162097772384089698577582027209192522851246823823690027225358916556410761710770943207249755384549728357e+22228103
   ! 24.3600000000006
CASE 4
   LET T=TIME
   LET N=10000000
   CALL SUPERFACT(N,RESULT$) !' 2! * 3! * 4! * 5! * 6! * 7! *...* (N-1)! * N!
   PRINT RESULT$
   PRINT TIME-T
   !7.57878063697632117934715725034689887850671089443406030271039160509233584481021403298076663336844755155915921583136881963888696144823115311974475153652320052328567687659313122147525926979022065775096814149543780943831056005639617612529134106891342492205025312880072030110524448270901118158556779555922457929864716128158926304472044534907981834912866729470185803624587740859802958368016614391696499517054601914699582368295366201916833259354724597499035431744478719547535112048420085182135883183139640075048794059050861979118486547704710303906662116743881780796260260607839867444471378390091965608185269472213075704781769727546420860395320469358545090857923155193441929471103031866923296551225088390710078737054395326253048465352243419256199723124194271758472079381545351720056285172965339286261523760459249713701343864777816002666323040324461827576855665076282487404193204553774230151726249949958799269190261940238395540732979558437696555627226806719086098708609655790391738629544475963536580065298185018462037113821528992e+317427983505213
   ! 519.520000000004
CASE 5
   LET T=TIME
   LET N=1000000
   CALL HYPERFACT(N,RESULT$) !' 2^2 * 3^3 * 4^4 * 5^5 * 6^6 * 7^7 *...* N^N
   PRINT RESULT$
   PRINT TIME-T
   !6.23843686069241708059018283397497948396261032852709731523416295394277029282373398540713998575786733916012178463248223335823564645677499951494357410270839598310702765729112864006872878210039192370858067631070477998029933192482095612942476222728193754789852046900542637350103218384857392408531746283262373870131749000590618579432431865685268475514639336933206256949748969056305754856297026364320874076956431488052821375046045014638177390507897654960469730334797389190814704272105505552145212856118896574432939226143059057550973687604971378550419066289193097660009196503168010347848334618250277928124959562240318573539372896774337790426664723720446835857225634766789091996454216139135180235792568662383244534617370354298146218164699181831236845991726175424266619170479398316619116762592250453383101685685868627057862815641617259768873342240171953069022117764243910963990193443081142526456850279800179901219903311799202766853622229530523474152006391596501481823711359357236984255316292254520259892322621873560620869753255813e+2891429379524
   ! 1174.98
CASE 6
   LET T=TIME
   LET N=100
   CALL ULTRAFACT(N,RESULT$) !' 2!^2! * 3!^3! * 4!^4! * 5!^5! *...* (N!)^(N!) (※勝手に定義しました)
   PRINT RESULT$
   PRINT TIME-T
   !3.307080960022281488149685181352176531550030000680108534032717033505076494123338098391176644134271120923715544294326669107069219167043537761730096895592066843656679310779891205726619124126162841982779761492884571376859784533052299617920561168804808615757107870620134900273753181513620811433142712532260956074341430989241833002971570815290974543714913248254203286851480130951709685133299150786700397824107119153942159169775818240783061500294959931370412314159465834265700234915886098417613309965099149322128100572876169863206201780236823398411259753726291735981632356338054952252766969178844309737447458012208298750966505513188884915009461058844365777426551026604473623309791600908689872794148411741116573428111446864855182302393146522821144797551410563113777231534035768396111470722190923370955356992550575488022965531058889991735748065665507261010356836086850738831636682033967132801946334926843099424816607830075479676752197329292022559261874282671751989524980904001955577795260859806643024209758925103865456149835089471e+14889769765873800652572367200821121336307811992644550853047524406583971799601810165018835448400401070603264427270304269629350367510485185954426320887983405520084
   ! 1.95000000000437
CASE 7
   CALL LMAX(RESULT$)
   PRINT RESULT$
END SELECT
END

EXTERNAL  SUB POW(X,N,RESULT$)
LET B$=REPEAT$(CHR$(0),3000)
CALL POW1000(ABS(X),ABS(N),B$)
FOR I=LEN(B$) TO 1 STEP -1
   IF B$(I:I)<="9" AND B$(I:I)>="0" THEN
      EXIT FOR
   END IF
NEXT I
LET RESULT$=B$(1:I)

SUB POW1000(X,N,Y$)
   ASSIGN ".\DLL\ipow1000_128.dll","ipow1000" !'指数部 128bit 仮数部 3392bit(1000桁)
   !' ASSIGN ".\DLL\ipow1000_256.dll","ipow1000" !'指数部 256bit 仮数部 3392bit(1000桁)
END SUB
END SUB

EXTERNAL  SUB LFACT(N,RESULT$)
LET B$=REPEAT$(CHR$(0),3000)
CALL FACT1000(ABS(N),B$)
FOR I=LEN(B$) TO 1 STEP -1
   IF B$(I:I)<="9" AND B$(I:I)>="0" THEN
      EXIT FOR
   END IF
NEXT I
LET RESULT$=B$(1:I)

SUB FACT1000(N,Y$)
   ASSIGN ".\DLL\ipow1000_256.dll","fact1000"
END SUB
END SUB

EXTERNAL  SUB SUPERFACT(N,RESULT$)
LET B$=REPEAT$(CHR$(0),3000)
CALL SUPERFACT1000(ABS(N),B$)
FOR I=LEN(B$) TO 1 STEP -1
   IF B$(I:I)<="9" AND B$(I:I)>="0" THEN
      EXIT FOR
   END IF
NEXT I
LET RESULT$=B$(1:I)

SUB SUPERFACT1000(N,Y$)
   ASSIGN ".\DLL\ipow1000_512.dll","superfact1000"
END SUB
END SUB

EXTERNAL  SUB HYPERFACT(N,RESULT$)
LET B$=REPEAT$(CHR$(0),3000)
CALL HYPERFACT1000(ABS(N),B$)
FOR I=LEN(B$) TO 1 STEP -1
   IF B$(I:I)<="9" AND B$(I:I)>="0" THEN
      EXIT FOR
   END IF
NEXT I
LET RESULT$=B$(1:I)

SUB HYPERFACT1000(N,Y$)
   ASSIGN ".\DLL\ipow1000_512.dll","hyperfact1000"
END SUB
END SUB

EXTERNAL  SUB ULTRAFACT(N,RESULT$)
LET B$=REPEAT$(CHR$(0),3000)
CALL ULTRAFACT1000(ABS(N),B$)
FOR I=LEN(B$) TO 1 STEP -1
   IF B$(I:I)<="9" AND B$(I:I)>="0" THEN
      EXIT FOR
   END IF
NEXT I
LET RESULT$=B$(1:I)

SUB ULTRAFACT1000(N,Y$)
   ASSIGN ".\DLL\ipow1000_1024.dll","ultrafact1000"
END SUB
END SUB

EXTERNAL  SUB DOUBLEFACT(N,RESULT$)
LET B$=REPEAT$(CHR$(0),3000)
CALL DOUBLEFACT1000(N,B$)
FOR I=LEN(B$) TO 1 STEP -1
   IF B$(I:I)<="9" AND B$(I:I)>="0" THEN
      EXIT FOR
   END IF
NEXT I
LET RESULT$=B$(1:I)

SUB DOUBLEFACT1000(N,Y$)
   ASSIGN ".\DLL\ipow1000_128.dll","doublefact1000"
END SUB
END SUB

EXTERNAL  SUB POWFACT(N,RESULT$)
LET B$=REPEAT$(CHR$(0),3000)
CALL POWFACT1000(ABS(N),B$)
FOR I=LEN(B$) TO 1 STEP -1
   IF B$(I:I)<="9" AND B$(I:I)>="0" THEN
      EXIT FOR
   END IF
NEXT I
LET RESULT$=B$(1:I)

SUB POWFACT1000(N,Y$)
   ASSIGN ".\DLL\ipow1000_128.dll","powfact1000"
END SUB
END SUB

EXTERNAL  SUB LMAX(RESULT$)
LET B$=REPEAT$(CHR$(0),3000)
CALL MAX1000(B$)
FOR I=LEN(B$) TO 1 STEP -1
   IF B$(I:I)<="9" AND B$(I:I)>="0" THEN
      EXIT FOR
   END IF
NEXT I
LET RESULT$=B$(1:I)

SUB MAX1000(Y$)
   ASSIGN ".\DLL\ipow1000_3072.dll","max1000"
END SUB
END SUB
------------------------------------------------------------------------------------------
                                              ipow1000.cpp

#include <ttmath/ttmath.h>
#include <string>
#include <boost/lexical_cast.hpp>
using namespace std;
using boost::lexical_cast;

typedef ttmath::Big<TTMATH_BITS(EXP), TTMATH_BITS(3392)> bigfloat;
typedef ttmath::UInt<1024> bigint;

bigfloat ipow(unsigned int x,unsigned int n)
{
    bigfloat a,v;
    a=x;
    v=1;
    while(n!=0) {
        if((n % 2)==1) v=v*a;
        a=a*a;
        n=n>>1;
    }
    return v;
}

bigfloat ipow(bigint x,bigint n)
{
    bigfloat a,v;
    a=x;
    v=1;
    while(n!=0) {
        if((n % 2)==1) v=v*a;
        a=a*a;
        n=n>>1;
    }
    return v;
}

bigint fact(unsigned int n)
{
    bigint a;
    unsigned int i;
    a=1;
    for(i=2;i<=n;i++) a*=i;
    return a;
}

bigfloat fact(bigint n)
{
    bigfloat a;
    bigint i;
    a=1;
    for(i=2;i<=n;i++) a*=i;
    return a;
}

bigfloat superfact(unsigned int n)
{
    bigfloat a,b;
    a=1;
    b=1;
    for(unsigned int i=2; i<=n; i++)
    {
        a*=i;
        b*=a;
    }
    return b;
}

bigfloat hyperfact(unsigned int n)
{
    bigfloat a;
    a=1;
    for(unsigned int i=2; i<=n; i++) a*=ipow(i,i);
    return a;
}

bigfloat ultrafact(unsigned int n)
{
    bigfloat a;
    bigint x;
    a=1;
    for(unsigned int i=2; i<=n; i++)
    {
        x=fact(i);
        a*=ipow(x,x);
    }
    return a;
}

bigfloat powfact(unsigned int n)
{
    bigfloat a;
    bigint x;
    x=fact(n);
    a=ipow(x,x);
    return a;
}

bigfloat doublefact(unsigned int n)
{
    bigfloat a;
    a=fact(fact(n));
    return a;
}

bigfloat multifact(unsigned int n,unsigned int m)
{
    bigfloat v;
    v=1;
    for(unsigned int i=n; i>=1; i-=m) v*=i;
    return v;
}

extern "C"  __declspec(dllexport)  void ipow1000(unsigned int x,unsigned int n,char *b)
{
    bigfloat y;
    string s;
    y=ipow(x,n);
    s=boost::lexical_cast<string>(y);
    strcpy(b,s.c_str());
}

extern "C"  __declspec(dllexport)  void fact1000(unsigned int n,char *b)
{
    bigfloat y;
    string s;
    y=fact((bigint)n);
    s=boost::lexical_cast<string>(y);
    strcpy(b,s.c_str());
}

extern "C"  __declspec(dllexport)  void multifact1000(unsigned int n,unsigned int m,char *b)
{
    bigfloat y;
    string s;
    y=multifact(n,m);
    s=boost::lexical_cast<string>(y);
    strcpy(b,s.c_str());
}

extern "C"  __declspec(dllexport)  void superfact1000(unsigned int n,char *b)
{
    bigfloat y;
    string s;
    y=superfact(n);
    s=boost::lexical_cast<string>(y);
    strcpy(b,s.c_str());
}

extern "C"  __declspec(dllexport)  void hyperfact1000(unsigned int n,char *b)
{
    bigfloat y;
    string s;
    y=hyperfact(n);
    s=boost::lexical_cast<string>(y);
    strcpy(b,s.c_str());
}

extern "C"  __declspec(dllexport)  void ultrafact1000(unsigned int n,char *b)
{
    bigfloat y;
    string s;
    y=ultrafact(n);
    s=boost::lexical_cast<string>(y);
    strcpy(b,s.c_str());
}

extern "C"  __declspec(dllexport)  void powfact1000(unsigned int n,char *b)
{
    bigfloat y;
    string s;
    y=powfact(n);
    s=boost::lexical_cast<string>(y);
    strcpy(b,s.c_str());
}

extern "C"  __declspec(dllexport)  void doublefact1000(unsigned int n,char *b)
{
    bigfloat y;
    string s;
    y=doublefact(n);
    s=boost::lexical_cast<string>(y);
    strcpy(b,s.c_str());
}

extern "C"  __declspec(dllexport)  void max1000(char *b)
{
    bigfloat y;
    string s;
    y.SetMax();
    s=boost::lexical_cast<string>(y);
    strcpy(b,s.c_str());
}

VC++2012にてコンパイルしました。下記よりダウンロードしてください。(math.zip)


ダウンロードパス:shibacchi

有効期限は本日より1ヶ月です。


 

戻る