tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
11
ZUGRIFFE
1264
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    chris_de_luxe chris_de_luxe ist offline Rookie
    Registriert seit
    Feb 2006
    Beiträge
    7
    Hallo,

    ich brauche für ein Rätsel eine Fibonacci-Zahl jenseits der Millionen. Erst dachte ich an eine Schleife, merkte aber schnell das dies ewig dauert...
    Im Netz fand ich eine Formel. Diese errechnet die Fib-Zahl recht schnell. Diese habe ich dann auf BigInteger- und BigDecimal-Zahlen umgestellt, damit sie mit seeehr großen Zahlen umgehen kann.
    Naja, nur leider brauch sie nun auch wieder recht lange, teilweise sogar länger wie meine Schleife...

    Hat von euch jemand vielleicht eine Idee, wie ich meine Anwendung noch verbessern kann?

    Hier erstmal mein Code:

    Code :
    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
    
    /**
     * 
     */
    package de.xxx.shorty;
     
    import java.io.BufferedWriter;
    import java.io.File;
    import java.io.FileWriter;
    import java.io.IOException;
    import java.math.BigDecimal;
    import java.math.BigInteger;
    import java.math.MathContext;
     
    /**
     * @author chr1s <chr1s@xxx.de>
     *
     */
    public class CalculateLargeFib {
        
        
        public static BigInteger calcFib(int n) {
            
            BigInteger result = null;
                    
            double sqrtfive = Math.sqrt(5);
     
            BigDecimal termA = new BigDecimal((1+sqrtfive)/2);
            BigDecimal termB = new BigDecimal((1-sqrtfive)/2);
            
            System.out.println("termA: " + termA.toPlainString());
            System.out.println("termB: " + termB.toPlainString());
            
            termA = termA.pow(n);
            termB = termB.pow(n);
            
            System.out.println("TermA and TermB calculated!");
    //      System.out.println("termA: " + termA.toPlainString());
    //      System.out.println("termB: " + termB.toPlainString());
     
            BigDecimal factor = new BigDecimal(1 / sqrtfive); 
            System.out.println("factor: " + factor.toPlainString());
            
            BigDecimal x = termA.subtract(termB).multiply(factor);
            System.out.println("x: " + x.toPlainString());
            
            result = x.round(MathContext.UNLIMITED).toBigInteger();
            
            return result;
        }
        
        /**
         * @param args
         */
        public static void main(String[] args) {
            
            int n = Integer.parseInt(args[0]);
            String filename = "fibonacci_" + n +".txt";
            File myFile = new File(filename);
            
            BigInteger t = calcFib(n);
            
            try {
                BufferedWriter bw = new BufferedWriter(new FileWriter(myFile));
                bw.write(t.toString());
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            
            System.out.println(t.toString());
     
        }
     
    }
    Geändert von chris_de_luxe (21.01.12 um 12:17 Uhr) Grund: Anonymisierung
     

  2. #2
    Avatar von port29
    port29 port29 ist offline deus.Server
    Registriert seit
    Dec 2001
    Ort
    Karlsruhe, Germany, Germany
    Beiträge
    856
    Was dauert denn da so lange? Schau doch mal im Debug Modus nach, was da so lange dauert.
     

  3. #3
    chris_de_luxe chris_de_luxe ist offline Rookie
    Registriert seit
    Feb 2006
    Beiträge
    7
    BigDecimal.pow() braucht ewig, dh. ich hatte das ganze mit n=100000 über Nacht laufen - da hatte er gerade mal termA errechnet.
     

  4. #4
    Clash Clash ist offline Mitglied Gold
    Registriert seit
    Apr 2002
    Ort
    Stuttgart
    Beiträge
    101
    eventuell liegt esdaran dass ständig die ergebnisse mit system.print ausgegeben werden und dies die laufzeit beeinträchtigt..
     

  5. #5
    Avatar von port29
    port29 port29 ist offline deus.Server
    Registriert seit
    Dec 2001
    Ort
    Karlsruhe, Germany, Germany
    Beiträge
    856
    Ja klar.... wieso bin ich nicht darauf gekommen. Ja es liegt sicherlich an der Ausgabe, wieso bin ich da nicht drauf gekommen.

    Es liegt ganz sicher nicht an dem x^n, wobei x eine große Zahl ist.
     

  6. #6
    Registriert seit
    Jun 2002
    Ort
    Saarbrücken (Saarland)
    Beiträge
    9.885
    Blog-Einträge
    29
    Hallo,

    schau mal hier:
    Code java:
    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
    
    package de.tutorials.training;
     
    import java.math.BigInteger;
     
    public class Fibonacci {
        public static void main(String[] args) {
            for (int i = 0; i < 20; i++) {
                System.out.println(i + " " + fib(i));
            }
            System.out.println(fib(100000));
        }
     
        private static BigInteger fib(int iThFib) {
            // 0 1 2 3 4 5 6  7  8  9
            // 0 1 1 2 3 5 8 13 21 34
     
            if (iThFib < 0)
                throw new IllegalArgumentException(
                        "Negative values are not allowed! Given: " + iThFib);
     
            if (iThFib < 2) {
                return BigInteger.valueOf(iThFib);
            }
     
            BigInteger current = BigInteger.valueOf(1);
            BigInteger previous = BigInteger.valueOf(0);
            BigInteger result = null;
            for (int i = 2; i <= iThFib; i++) {
                result = current.add(previous);
                previous = current;
                current = result;
            }
            return result;
        }
    }

    Ausgabe:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    
    0 0
    1 1
    2 1
    3 2
    4 3
    5 5
    6 8
    7 13
    8 21
    9 34
    10 55
    11 89
    12 144
    13 233
    14 377
    15 610
    16 987
    17 1597
    18 2584
    19 4181
    2597406934722172416615503402127591541488048538651769658472477070395253454351127368626555677283671674475463758722307443211163839947387509103096569738218830449305228763853133492135302679278956701051276578271635608073050532200243233114383986516137827238124777453778337299916214634050054669860390862750996639366409211890125271960172105060300350586894028558103675117658251368377438684936413457338834365158775425371912410500332195991330062204363035213756525421823998690848556374080179251761629391754963458558616300762819916081109836526352995440694284206571046044903805647136346033000520852277707554446794723709030979019014860432846819857961015951001850608264919234587313399150133919932363102301864172536477136266475080133982431231703431452964181790051187957316766834979901682011849907756686456845066287392485603914047605199550066288826345877189410680370091879365001733011710028310473947456256091444932821374855573864080579813028266640270354294412104919995803131876805899186513425175959911520563155337703996941035518275274919959802257507902037798103089922984996304496255814045517000250299764322193462165366210841876745428298261398234478366581588040819003307382939500082132009374715485131027220817305432264866949630987914714362925554252624043999615326979876807510646819068792118299167964409178271868561702918102212679267401362650499784968843680975254700131004574186406448299485872551744746695651879126916993244564817673322257149314967763345846623830333820239702436859478287641875788572910710133700300094229333597292779191409212804901545976262791057055248158884051779418192905216769576608748815567860128818354354292307397810154785701328438612728620176653953444993001980062953893698550072328665131718113588661353747268458543254898113717660519461693791688442534259478126310388952047956594380715301911253964847112638900713362856910155145342332944128435722099628674611942095166100230974070996553190050815866991144544264788287264284501725332048648319457892039984893823636745618220375097348566847433887249049337031633826571760729778891798913667325190623247118037280173921572390822769228077292456662750538337500692607721059361942126892030256744356537800831830637593334502350256972906515285327194367756015666039916404882563967693079290502951488693413799125174856667074717514938979038653338139534684837808612673755438382110844897653836848318258836339917310455850905663846202501463131183108742907729262215943020429159474030610183981685506695026197376150857176119947587572212987205312060791864980361596092339594104118635168854883911918517906151156275293615849000872150192226511785315089251027528045151238603792184692121533829287136924321527332714157478829590260157195485316444794546750285840236000238344790520345108033282013803880708980734832620122795263360677366987578332625485944906021917368867786241120562109836985019729017715780112040458649153935115783499546100636635745448508241888279067531359950519206222976015376529797308588164873117308237059828489404487403932053592935976454165560795472477862029969232956138971989467942218727360512336559521133108778758228879597580320459608479024506385194174312616377510459921102486879496341706862092908893068525234805692599833377510390101316617812305114571932706629167125446512151746802548190358351688971707570677865618800822034683632101813026232996027599403579997774046244952114531588370357904483293150007246173417355805567832153454341170020258560809166294198637401514569572272836921963229511187762530753402594781448204657460288485500062806934811398276016855584079542162057543557291510641537592939022884356120792643705560062367986544382464373946972471945996555795505838034825597839682776084731530251788951718630722761103630509360074262261717363058613291544024695432904616258691774630578507674937487992329181750163484068813465534370997589353607405172909412697657593295156818624747127636468836551757018353417274662607306510451195762866349922848678780591085118985653555434958761664016447588028633629704046289097067736256584300235314749461233912068632146637087844699210427541569410912246568571204717241133378489816764096924981633421176857150311671040068175303192115415611958042570658693127276213710697472226029655524611053715554532499750843275200199214301910505362996007042963297805103066650638786268157658772683745128976850796366371059380911225428835839194121154773759981301921650952140133306070987313732926518169226845063443954056729812031546392324981793780469103793422169495229100793029949237507299325063050942813902793084134473061411643355614764093104425918481363930542369378976520526456347648318272633371512112030629233889286487949209737847861884868260804647319539200840398308008803869049557419756219293922110825766397681361044490024720948340326796768837621396744075713887292863079821849314343879778088737958896840946143415927131757836511457828935581859902923534388888846587452130838137779443636119762839036894595760120316502279857901545344747352706972851454599861422902737291131463782045516225447535356773622793648545035710208644541208984235038908770223039849380214734809687433336225449150117411751570704561050895274000206380497967960402617818664481248547269630823473377245543390519841308769781276565916764229022948181763075710255793365008152286383634493138089971785087070863632205869018938377766063006066757732427272929247421295265000706646722730009956124191409138984675224955790729398495608750456694217771551107346630456603944136235888443676215273928597072287937355966723924613827468703217858459948257514745406436460997059316120596841560473234396652457231650317792833860590388360417691428732735703986803342604670071717363573091122981306903286137122597937096605775172964528263757434075792282180744352908669606854021718597891166333863858589736209114248432178645039479195424208191626088571069110433994801473013100869848866430721216762473119618190737820766582968280796079482259549036328266578006994856825300536436674822534603705134503603152154296943991866236857638062351209884448741138600171173647632126029961408561925599707566827866778732377419444462275399909291044697716476151118672327238679208133367306181944849396607123345271856520253643621964198782752978813060080313141817069314468221189275784978281094367751540710106350553798003842219045508482239386993296926659221112742698133062300073465628498093636693049446801628553712633412620378491919498600097200836727876650786886306933418995225768314390832484886340318940194161036979843833346608676709431643653538430912157815543512852077720858098902099586449602479491970687230765687109234380719509824814473157813780080639358418756655098501321882852840184981407690738507369535377711880388528935347600930338598691608289335421147722936561907276264603726027239320991187820407067412272258120766729040071924237930330972132364184093956102995971291799828290009539147382437802779051112030954582532888721146170133440385939654047806199333224547317803407340902512130217279595753863158148810392952475410943880555098382627633127606718126171022011356181800775400227516734144169216424973175621363128588281978005788832454534581522434937268133433997710512532081478345067139835038332901313945986481820272322043341930929011907832896569222878337497354301561722829115627329468814853281922100752373626827643152685735493223028018101449649009015529248638338885664893002250974343601200814365153625369199446709711126951966725780061891215440222487564601554632812091945824653557432047644212650790655208208337976071465127508320487165271577472325887275761128357592132553934446289433258105028633583669291828566894736223508250294964065798630809614341696830467595174355313224362664207197608459024263017473392225291248366316428006552870975051997504913009859468071013602336440164400179188610853230764991714372054467823597211760465153200163085336319351589645890681722372812310320271897917951272799656053694032111242846590994556380215461316106267521633805664394318881268199494005537068697621855231858921100963441012933535733918459668197539834284696822889460076352031688922002021931318369757556962061115774305826305535862015637891246031220672933992617378379625150999935403648731423208873977968908908369996292995391977217796533421249291978383751460062054967341662833487341011097770535898066498136011395571584328308713940582535274056081011503907941688079197212933148303072638678631411038443128215994936824342998188719768637604496342597524256886188688978980888315865076262604856465004322896856149255063968811404400429503894245872382233543101078691517328333604779262727765686076177705616874050257743749983775830143856135427273838589774133526949165483929721519554793578923866762502745370104660909382449626626935321303744538892479216161188889702077910448563199514826630802879549546453583866307344423753319712279158861707289652090149848305435983200771326653407290662016775706409690183771201306823245333477966660525325490873601961480378241566071271650383582257289215708209369510995890132859490724306183325755201208090007175022022949742801823445413711916298449914722254196594682221468260644961839254249670903104007581488857971672246322887016438403908463856731164308169537326790303114583680575021119639905615169154708510459700542098571797318015564741406172334145847111268547929892443001391468289103679179216978616582489007322033591376706527676521307143985302760988478056216994659655461379174985659739227379416726495377801992098355427866179123126699374730777730569324430166839333011554515542656864937492128687049121754245967831132969248492466744261999033972825674873460201150442228780466124320183016108232183908654771042398228531316559685688005226571474428823317539456543881928624432662503345388199590085105211383124491861802624432195540433985722841341254409411771722156867086291742124053110620522842986199273629406208834754853645128123279609097213953775360023076765694208219943034648783348544492713539450224591334374664937701655605763384697062918725745426505879414630176639760457474311081556747091652708748125267159913793240527304613693961169892589808311906322510777928562071999459487700611801002296132304588294558440952496611158342804908643860880796440557763691857743754025896855927252514563404385217825890599553954627451385454452916761042969267970893580056234501918571489030418495767400819359973218711957496357095967825171096264752068890806407651445893132870767454169607107931692704285168093413311046353506242209810363216771910420786162184213763938194625697286781413636389620123976910465418956806197323148414224550071617215851321302030684176087215892702098879108938081045903397276547326416916845445627600759561367103584575649094430692452532085003091068783157561519847567569191284784654692558665111557913461272425336083635131342183905177154511228464455136016013513228948543271504760839307556100908786096663870612278690274831819331606701484957163004705262228238406266818448788374548131994380387613830128859885264201992286188208499588640888521352501457615396482647451025902530743172956899636499615707551855837165935367125448515089362904567736630035562457374779100987992499146967224041481601289530944015488942613783140087804311431741858071826185149051138744831358439067228949408258286021650288927228387426432786168690381960530155894459451808735197246008221529343980828254126128257157209350985382800738560472910941184006084485235377833503306861977724501886364070344973366473100602018128792886991861824418453968994777259482169137133647470453172979809245844361129618997595696240971845564020511432589591844724920942930301651488713079802102379065536525154780298059407529440513145807551537794861635879901158192019808879694967187448224156836463534326160242632934761634458163890163805123894184523973421841496889262398489648642093409816681494771155177009562669029850101513537599801272501241971119871526593747484778935488777815192931171431167444773882941064615028751327709474504763922874890662989841540259350834035142035136168819248238998027706666916342133424312054507359388616687691188185776118135771332483965209882085982391298606386822804754362408956522921410859852037330544625953261340234864689275060526893755148403298542086991221052597005628576707702567695300978970046408920009852106980295419699802138053295798159478289934443245491565327845223840551240445208226435420656313310702940722371552770504263482073984454889589248861397657079145414427653584572951329719091947694411910966797474262675590953832039169673494261360032263077428684105040061351052194413778158095005714526846009810352109249040027958050736436961021241137739717164869525493114805040126568351268829598413983222676377804500626507241731757395219796890754825199329259649801627068665658030178877405615167159731927320479376247375505855052839660294566992522173600874081212014209071041937598571721431338017425141582491824710905084715977249417049320254165239323233258851588893337097136310892571531417761978326033750109026284066415801371359356529278088456305951770081443994114674291850360748852366654744869928083230516815711602911836374147958492100860528981469547750812338896943152861021202736747049903930417035171342126923486700566627506229058636911882228903170510305406882096970875545329369434063981297696478031825451642178347347716471058423238594580183052756213910186997604305844068665712346869679456044155742100039179758348979935882751881524675930878928159243492197545387668305684668420775409821781247053354523194797398953320175988640281058825557698004397120538312459428957377696001857497335249965013509368925958021863811725906506436882127156815751021712900765992750370228283963962915973251173418586721023497317765969454283625519371556009143680329311962842546628403142444370648432390374906410811300792848955767243481200090309888457270907750873638873299642555050473812528975962934822878917619920725138309388288292510416837622758204081918933603653875284116785703720989718832986921927816629675844580174911809119663048187434155067790863948831489241504300476704527971283482211522202837062857314244107823792513645086677566622804977211397140621664116324756784216612961477109018826094677377686406176721484293894976671380122788941309026553511096118347012565197540807095384060916863936906673786627209429434264260402902158317345003727462588992622049877121178405563348492490326003508569099382392777297498413565614830788262363322368380709822346012274241379036473451735925215754757160934270935192901723954921426490691115271523338109124042812102893738488167358953934508930697715522989199698903885883275409044300321986834003470271220020159699371690650330547577095398748580670024491045504890061727189168031394528036165633941571334637222550477547460756055024108764382121688848916940371258901948490685379722244562009483819491532724502276218589169507405794983759821006604481996519360110261576947176202571702048684914616894068404140833587562118319210838005632144562018941505945780025318747471911604840677997765414830622179069330853875129298983009580277554145435058768984944179136535891620098725222049055183554603706533183176716110738009786625247488691476077664470147193074476302411660335671765564874440577990531996271632972009109449249216456030618827772947750764777446452586328919159107444252320082918209518021083700353881330983215894608680127954224752071924134648334963915094813097541433244209299930751481077919002346128122330161799429930618800533414550633932139339646861616416955220216447995417243171165744471364197733204899365074767844149929548073025856442942381787641506492878361767978677158510784235702640213388018875601989234056868423215585628508645525258377010620532224244987990625263484010774322488172558602233302076399933854152015343847725442917895130637050320444917797752370871958277976799686113626532291118629631164685159934660693460557545956063155830033697634000276685151293843638886090828376141157732003527565158745906567025439437931104838571313294490604926582363108949535090082673154497226396648088618041573977888472892174618974189721700770009862449653759012727015227634510874906948012210684952063002519011655963580552429180205586904259685261047412834518466736938580027700252965356366721619883672428226933950325930390994583168665542234654857020875504617520521853721567282679903418135520602999895366470106557900532129541336924472492212436324523042895188461779122338069674233980694887270587503389228395095135209123109258159006960395156367736067109050566299603571876423247920752836160805597697778756476767210521222327184821484446631261487584226092608875764331731023263768864822594691211032367737558122133470556805958008310127481673962019583598023967414489867276845869819376783757167936723213081586191045995058970991064686919463448038574143829629547131372173669836184558144505748676124322451519943362182916191468026091121793001864788050061351603144350076189213441602488091741051232290357179205497927970924502479940842696158818442616163780044759478212240873204124421169199805572649118243661921835714762891425805771871743688000324113008704819373962295017143090098476927237498875938639942530595331607891618810863505982444578942799346514915952884869757488025823353571677864826828051140885429732788197765736966005727700162592404301688659946862983717270595809808730901820120931003430058796552694788049809205484305467611034654748067290674399763612592434637719995843862812391985470202414880076880818848087892391591369463293113276849329777201646641727587259122354784480813433328050087758855264686119576962172239308693795757165821852416204341972383989932734803429262340722338155102209101262949249742423271698842023297303260161790575673111235465890298298313115123607606773968998153812286999642014609852579793691246016346088762321286205634215901479188632194659637483482564291616278532948239313229440231043277288768139550213348266388687453259281587854503890991561949632478855035090289390973718988003999026132015872678637873095678109625311008054489418857983565902063680699643165033912029944327726770869305240718416592070096139286401966725750087012218149733133695809600369751764951350040285926249203398111014953227533621844500744331562434532484217986108346261345897591234839970751854223281677187215956827243245910829019886390369784542622566912542747056097567984857136623679023878478161201477982939080513150258174523773529510165296934562786122241150783587755373348372764439838082000667214740034466322776918936967612878983488942094688102308427036452854504966759697318836044496702853190637396916357980928865719935397723495486787180416401415281489443785036291071517805285857583987711145474240156416477194116391354935466755593592608849200546384685403028080936417250583653368093407225310820844723570226809826951426162451204040711501448747856199922814664565893938488028643822313849852328452360667045805113679663751039248163336173274547275775636810977344539275827560597425160705468689657794530521602315939865780974801515414987097778078705357058008472376892422189750312758527140173117621279898744958406199843913365680297721208751934988504499713914285158032324823021340630312586072624541637765234505522051086318285359658520708173392709566445011404055106579055037417780393351658360904543047721422281816832539613634982525215232257690920254216409657452618066051777901592902884240599998882753691957540116954696152270401280857579766154722192925655963991820948894642657512288766330302133746367449217449351637104725732980832812726468187759356584218383594702792013663907689741738962252575782663990809792647011407580367850599381887184560094695833270775126181282015391041773950918244137561999937819240362469558235924171478702779448443108751901807414110290370706052085162975798361754251041642244867577350756338018895379263183389855955956527857227926155524494739363665533904528656215464288343162282921123290451842212532888101415884061619939195042230059898349966569463580186816717074818823215848647734386780911564660755175385552224428524049468033692299989300783900020690121517740696428573930196910500988278523053797637940257968953295112436166778910585557213381789089945453947915927374958600268237844486872037243488834616856290097850532497036933361942439802882364323553808208003875741710969289725499878566253048867033095150518452126944989251596392079421452606508516052325614861938282489838000815085351564642761700832096483117944401971780149213345335903336672376719229722069970766055482452247416927774637522135201716231722137632445699154022395494158227418930589911746931773776518735850032318014432883916374243795854695691221774098948611515564046609565094538115520921863711518684562543275047870530006998423140180169421109105925493596116719457630962328831271268328501760321771680400249657674186927113215573270049935709942324416387089242427584407651215572676037924765341808984312676941110313165951429479377670698881249643421933287404390485538222160837088907598277390184204138197811025854537088586701450623578513960109987476052535450100439353062072439709976445146790993381448994644609780957731953604938734950026860564555693224229691815630293922487606470873431166384205442489628760213650246991893040112513103835085621908060270866604873585849001704200923929789193938125116798421788115209259130435572321635660895603514383883939018953166274355609970015699780289236362349895374653428746875

    Gruß Tom
     
    Java rocks!
    How to become a good Java Programmer?
    Does IT in Java and .Net
    The only valid measurement of code quality: WTFs / minute
    Blog
    Xing
    Twitter

  7. #7
    chris_de_luxe chris_de_luxe ist offline Rookie
    Registriert seit
    Feb 2006
    Beiträge
    7
    Hey Folks,

    vielen Dank für die rege Diskussion.

    @ Thomas: Der iterative Ansatz war auch meine erste Umsetzung des ganzen. Wenn Du genau nur eine Zahl braucht, so wie in meinem Fall, ist dieser nicht der effizienteste.

    Ich habe mittlerweile den die Funktion BigDecimal.pow() analisiert. Im Grunde macht diese nichts andere, als eine For-Schleife zu durchlaufen. Deshalb habe ich diese nun für mich selbst implementiert als auch die Formel neu implementiert.
    Die neue Formel brauch nur noch ein mal pow(n) sodass diese Formel schon einmal doppelt so schnell arbeiten sollte wie die zuvor.
    Siehe auch http://de.wikipedia.org/wiki/Fibonac....C3.9Fe_Zahlen

    Die Formel wie ich sie zuvor implementiert habe, läuft schon seit Sonntag auf einem meiner DUAL-XEON Server. Die neue Formel seit gestern auf einem vergleichbaren Server.

    Ich habe mich die letzten Tage allgemein mit großen Zahlen befasst - wir dürfen nicht vergessen das die 1.500.000ste Fibonacci-Zahl eine SEEEEEHR große Zahl ist und da auch schon kleine Operationen sehr lange dauern können. Eventuell, und jetzt bitte keine Steine, ist Java für solch große Rechenoperationen nicht performant genug.

    Hier der neue Code:
    Code java:
    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
    
    /**
     * author:      chr1s <chr1s@xxx.de>
     * name:        CakculateLargeFib.class
     * description: Calculates a fibonacci number by formula
     * created:     20090308
     */
    package de.xxx.shorty;
     
    import java.io.BufferedWriter;
    import java.io.File;
    import java.io.FileWriter;
    import java.io.IOException;
    import java.math.BigDecimal;
    import java.math.BigInteger;
    import java.math.MathContext;
     
    public class CalculateLargeFib {
        
        private static double SQRTFIVE = Math.sqrt(5);
        
     
        /**
         * Implementation of Moivre-Binet formula. 
         */
        public static BigInteger calcFib(int n) {
            
            BigInteger result = null;
            
            BigDecimal termA = new BigDecimal((1+SQRTFIVE)/2);
            BigDecimal termB = new BigDecimal((1-SQRTFIVE)/2);
            
            //System.out.println("termA: " + termA.toPlainString());
            //System.out.println("termB: " + termB.toPlainString());
            
            termA = termA.pow(n);
            termB = termB.pow(n);
            
            System.out.println("  TermA and TermB calculated!");
    //      System.out.println("termA: " + termA.toPlainString());
    //      System.out.println("termB: " + termB.toPlainString());
     
            BigDecimal factor = new BigDecimal(1 / SQRTFIVE); 
            System.out.println("factor: " + factor.toPlainString());
            
            BigDecimal x = termA.subtract(termB).multiply(factor);
            System.out.println("x: " + x.toPlainString());
            
            result = x.round(MathContext.UNLIMITED).toBigInteger();
            
            return result;
        }
        
        /**
         * New Implementation of BigDecimal.pow(). So it is possible to get a feedback which
         * count of multiplications have done. Thats needed for very large numbers. 
         */
        public static BigDecimal powImpl (BigDecimal x, int n) {
            
            BigDecimal saveX = x;
            
            // i has to be 1!
            for (int i = 1; i < n; i++) {
                System.out.println(i);
                x=x.multiply(saveX);
            }
        
            return x;
        }
        
        /**
         * Implementation of approximation formula.
         * This formula has the big feature that it needs only one pow(n) and it has a very 
         * low deviation (<0.5). 
         */
        public static BigInteger calcLargeFib(int n) {
            BigInteger result = null;
            BigDecimal x = null;
            
            x = new BigDecimal((1+SQRTFIVE)/2);
            
            x = powImpl(x, n);
            x = x.multiply(new BigDecimal(1/SQRTFIVE));
            
            System.out.println(x);
            //x = x.add(new BigDecimal(0.5));
            System.out.println(x);
            
            result = x.round(MathContext.UNLIMITED).toBigInteger();
            
            return result;
        }
        
        /**
         * @param args
         *   */
        public static void main(String[] args) {
            
            int n = Integer.parseInt(args[0]);
            String filename = "fibonacci_" + n +".txt";
            File myFile = new File(filename);
            
            System.out.println("Start now to calculate the " + n + "th fibonacci-number.");
            
            //BigInteger t = calcFib(n);
            BigInteger t = calcLargeFib(n);
            
            
            
            
            try {
                BufferedWriter bw = new BufferedWriter(new FileWriter(myFile));
                bw.write(t.toString());
                bw.flush();
                bw.close();
                System.out.println("Wrote the number to " + filename);
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            
            System.out.println("Here is the number:\n" + t.toString());
            
        }
     
    }

    Liebe Grüße,
    Chr1s
    Geändert von chris_de_luxe (21.01.12 um 12:19 Uhr) Grund: anonymisierung
     

  8. #8
    Avatar von procurve
    procurve procurve ist offline Mitglied Gold
    Registriert seit
    Aug 2007
    Beiträge
    158
    Du nutzt die Formel von Moivre-Binet?

    Dort wird doch immer derselbe Term potenziert, da dmüsste es doch einen Ansatz geben, das optimieren zu können.
     

  9. #9
    Registriert seit
    Jun 2002
    Ort
    Saarbrücken (Saarland)
    Beiträge
    9.885
    Blog-Einträge
    29
    Hallo,

    wie lang ist denn lang?

    Also fib(1500000) dauert bei mir unter Java 6 mit -server und Core 2 Duo centrino vPro2,4 GHz ca. 3 min:
    http://nopaste.php-q.net/182299

    Deine Näherungsformel läuft bei mir in der gleichen Umgebung schon seit 6 min: (falls ich mich da nicht vertan habe...)
    Code java:
    1
    2
    3
    4
    5
    6
    
        static BigDecimal fibApprox(int iThFib){
            BigDecimal sqrtFive = BigDecimal.valueOf(Math.sqrt(5));
            BigDecimal oneOverSqrtFive = BigDecimal.ONE.divide(sqrtFive,MathContext.DECIMAL128);
            BigDecimal base = BigDecimal.ONE.add(sqrtFive).divide(BigDecimal.valueOf(2));
            return oneOverSqrtFive.multiply(base.pow(iThFib));
        }

    Bisher ohne Ergebnis....
    Ich glaub die einfache iterative Variante ist doch nicht so schlecht.

    Gruß Tom
     
    Java rocks!
    How to become a good Java Programmer?
    Does IT in Java and .Net
    The only valid measurement of code quality: WTFs / minute
    Blog
    Xing
    Twitter

  10. #10
    chris_de_luxe chris_de_luxe ist offline Rookie
    Registriert seit
    Feb 2006
    Beiträge
    7
    Hallo Thomas!

    Du hast absolut recht! Ich habe das ganze jetzt auch noch einmal Deinen Code genommen - es geht suuuuper schnell!
    Somit weiss ich nun, dass Groovy != Java ist... Hatte nämlich meinen iterativen Ansatz schnell mit Groovy geschrieben.

    Danke auch für die Zahl - aber ich will die selbst errechnen...!

    Lg,
    Chr1s
     

  11. #11
    chris_de_luxe chris_de_luxe ist offline Rookie
    Registriert seit
    Feb 2006
    Beiträge
    7
    Ach ja... ich hätte gerne ein Smiley das sich selbst in den Allerwertesten beißt...
     

  12. #12
    Avatar von procurve
    procurve procurve ist offline Mitglied Gold
    Registriert seit
    Aug 2007
    Beiträge
    158
    Ich könnte nur mit diesem hier dienen: klick mich

    Addition ist halt wesentlich "billiger", als Multiplikation.

    Die Potenzierung bei deinem Ansatz liesse sich aber recht einfach optimieren:
    x^(n+m) = x^n * x^m
    d.h. du berechnest z.b. x^2, daraus dann x^4, x^8,... spart einige Multiplikationen. Oder du gehst andersrum vor und nimmst dein n (> 1 mio) und zerlegst dieses in gleich große Summanden, die sich relativ schnell mit pow berechnen lassen.

    Egal, iterativ geht's anscheinend eh flotter, als du vorher angenommen hast.
     

Ähnliche Themen

  1. Fibonacci
    Von franzleitinger im Forum Java Grundlagen
    Antworten: 7
    Letzter Beitrag: 30.08.10, 12:45
  2. Fibonacci-Schleife als PSD
    Von mikkele im Forum Photoshop
    Antworten: 5
    Letzter Beitrag: 12.04.10, 02:29
  3. Antworten: 0
    Letzter Beitrag: 15.09.05, 00:52
  4. Fibonacci - Zahlenfolge
    Von Gambit050 im Forum C/C++
    Antworten: 5
    Letzter Beitrag: 21.10.04, 10:35
  5. Fibonacci und Komplexität
    Von PPhilipp im Forum Coders Talk
    Antworten: 5
    Letzter Beitrag: 04.01.04, 20:22