-- All science is either physics or stamp collecting
Zoek maar even op google naar BigInt.
edit:
vermoedelijk is dit ook wat PHP doet.
Een CPU kan gewoon geen berekeningen doen op types groter dan X bits (met X meestal 80 voor double of 64 voor long long). Om hier omheen te werken heb je een externe lib nodig die de bewerking op je groot getal in meerdere stappen oplost. Gevolg: een stuk trager dan gewoon berekenen.
[ Voor 63% gewijzigd door H!GHGuY op 28-01-2009 19:08 ]
ASSUME makes an ASS out of U and ME
[ Voor 6% gewijzigd door NMe op 28-01-2009 19:07 ]
'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.
Speel ook Balls Connect en Repeat
Waarvoor heb je zoiets groots nodig? (bezig met Fibonacci?
[Te koop: 3D printers] [Website] Agile tools: [Return: retrospectives] [Pokertime: planning poker]
[ Voor 7% gewijzigd door RobIII op 28-01-2009 19:14 ]
There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.
Je eigen tweaker.me redirect
Over mij
Floating point of niet maakt niet zo op, zolang je zelf de relatieve positie van de komma onthoudt kun je gewoon met integers (nouja, BigInts) rekenen.Onbekend schreef op woensdag 28 januari 2009 @ 19:08:
Wat wil je met dat getal doen? Berekeningen maken? Moet het nauwkeurig zijn (geen floating point)?
'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.
Als je alleen dit soort grote getallen hebt, wil je dan wel op de eenheid nauwkeurig een uitkomst weten?
En wil een gebruiker zo'n groot getal wel intypen?
Speel ook Balls Connect en Repeat
Onbekend schreef op woensdag 28 januari 2009 @ 19:17:
En wil een gebruiker zo'n groot getal wel intypen?
Zolang ze 't daarna maar op mijn rekening storten (en de bank garandeert dat er geen overflow optreedt zodat mijn saldo negatief wordt) is dat 't minste probleem
.oisyn schreef op woensdag 28 januari 2009 @ 19:20:
[...]
Maak daar maar cijfers van. Een getal is een waarde. Een cijfer is onderdeel van een getal in een bepaalde representatie.
Ah, onze huismierenneuker is ook weer aanwezig
[ Voor 31% gewijzigd door RobIII op 28-01-2009 19:22 ]
There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.
Je eigen tweaker.me redirect
Over mij
Maak daar maar cijfers vanVariable met 10^8 getallen
Ik doe m'n bestAh, onze huismierenneuker is ook weer aanwezig
[ Voor 19% gewijzigd door .oisyn op 28-01-2009 19:24 ]
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
Maar even samenvattend:
- Waarom zo'n groot getal: Moet een groot priemgetal uitrekenen
- Decimalen nodig: Ja, anders kan ik het niet controleren
Iig bedankt voor jullie reacties, ik ga wel ff googlen op de BinInt
-- All science is either physics or stamp collecting
Jasper91 schreef op woensdag 28 januari 2009 @ 19:37:
- Waarom zo'n groot getal: Moet een groot priemgetal uitrekenen
grootst bekende priem heeft ongeveer 18 miljoen digits, en jij wilt er 100 miljoen?
Verwijderd
Misschien een school-botnetwerk in elkaar gehaxored en nu op zoek naar de volgende grootste! Om zo eeuwige roem en rijkdom te vergaren!
Het nieuwe priemgetal omvat qua omvang 63 procent van het uieindelijk doel van het Great Internet Mersenne Prime Search-project. Dat is het vinden van een priemgetal met meer dan tien miljoen cijfers. De gelukkige die daarin slaagt, ontvangt 100.000 dollar. Een voormalige deelnemer van het project ontving in 2000 al 50.000 dollar voor het vinden van het eerste priemtal met meer dan één miljoen getallen.
Misschien moet je een aangepaste versie van de zeef van Eratosthenes maken o.i.d. Het is een flink getal waarmee de controleberekeningen het zwaar mee hebben.
Speel ook Balls Connect en Repeat
Verwijderd
GMP inderdaad. Linkje: http://gmplib.org/Floort schreef op woensdag 28 januari 2009 @ 19:52:
Probeer de GMP library. Ik heb de C++ bindings nog nooit gebruikt, maar de C versie werkt prima. Veel sneller is het niet te krijgen.
Een normaal decimal getal is radix-10. 271 betekent eigenlijk iets als 2 * 10^2 + 7 * 10^1 + 1 * 10^0, waarbij die 2, 7 en 10 coëfficienten genoemd worden.
Als je een radix-256 getal neemt, dan krijg je coëfficienten die tussen 0 en 255 liggen en die kan je dus perfect opslaan in een char. Je kan dan bijvoorbeeld een getal hebben als [17][233][191], en dat heeft dus als betekenis 17 * 256^2 + 233 * 256^1 + 191 * 256^0 (=1173951). Dat is de optimale manier om grote integers op te slaan op een computer.
Vervolgens moet je dus implementaties maken van optellen, aftrekken, vermenigvuldigen, delen, worteltrekken en wat je nog meer nodig hebt.
Optellen en aftrekken zijn simpele O(n) operaties. Vermenigvuldigen op de normale manier is een O(n^2) operatie en dat wordt dus onbruikbaar voor de getallen van het formaat waar jij mee wilt werken. Gelukkig is een vermenigvuldiging om te schrijven als een dubbele forward en een reverse fouriertransformatie en die zijn met een FFT te doen in O(n log n), waardoor je dus een vermenigvuldiging in O(n log n) kan doen.
Een deling en een wortel kan je met Newton's methode vrij snel uitrekenen.
Gelukkig hoef je dit niet meer zelf te implementeren als je een goede arbitrary precision library pakt
Met een vrij simpele optimalisatie is een vermenigvuldiging 'maar' O(n2-log 3). Als je twee getallen van twee digits vermenigvuldigd, zeg ab en cd waarbij elke letter een digit voorstelt, dan zou je dat normaal doen middels a*c*100 + (a*d+b*c)*10 + b*d. Met andere woorden, voor twee-digit getallen heb je 4 vermenigvuldigingen nodig, en dat is waar de O(n2) vandaan komt.eamelink schreef op woensdag 28 januari 2009 @ 20:22:
Optellen en aftrekken zijn simpele O(n) operaties. Vermenigvuldigen op de normale manier is een O(n^2) operatie en dat wordt dus onbruikbaar voor de getallen van het formaat waar jij mee wilt werken.
Echter, (a*d+b*c) kun je ook schrijven als (a+b)*(c+d) - a*d - b*d. Die laatste twee had je sowieso al nodig, dus er komt maar 1 vermenigvuldiging bij ipv 2. Wel natuurlijk extra optellingen en aftrekkingen, maar die zijn in O(n) te doen - bij getallen met heel veel digits is dit dus wel voordeliger. Dit heet trouwens Karatsuba vermenigvuldiging.
Er zijn natuurlijk ingewikkeldere algoritmen, zoals Toom-Cook of idd de FFT methode (die overigens niet O(n log n) maar O(n∙ln(n)∙ln(ln(n))) is, maar deze is dan iig nog vrij simpel te implementeren. Mijn eigen bignum lib werkt overigens met radix-4294967296. Waarom bytes gebruiken als de CPU net zo snel met dwords kan rekenen
[ Voor 2% gewijzigd door .oisyn op 28-01-2009 22:03 . Reden: euh nee niet Thomas Cook 8)7 ]
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
[ Voor 24% gewijzigd door Jaap-Jan op 28-01-2009 21:45 ]
| Last.fm | "Mr Bent liked counting. You could trust numbers, except perhaps for pi, but he was working on that in his spare time and it was bound to give in sooner or later." -Terry Pratchett
Weet niet hoe GMP enzo dat implementeren, maar het is altijd verdomd lastig om dingen als overflow dan goed af te handelen zonder terug te vallen op assembly. (Denk aan optellingen waarbij je de overflow flag wil hebben, en vermenigvuldigingen waarbij je eigenlijk zowel de hoge als lage dword wil benaderen maar eigenlijk geen conversie naar een 64-bit integer vooraf wil doen.)Jaap-Jan schreef op woensdag 28 januari 2009 @ 21:45:
Hij rekent met 32-bits getallen en niet met 8-bits zoals jij doet. Komt weinig hardwarekennis aan te pas, hoor
Overigens gebruik ik in mijn lib wel gewoon inline assembly. Of intrinsics, weet ik niet meer precies.
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
Ben ook wel benieuwd naar de performance verschillen tussen een PHP:GMP en een C++GMP implementatie
En als de TS met Linux werkt kan ie eventueel ook naar de Intel Kernel Math Library for Linux 10.1 kijken.
Off-topic: Inline assembly is niet voor iedereen weggelegd, maar het blijft inderdaad leuk & leerzaam; elke X jaar nieuwe CPU instructies en dus weer nieuwe optimalisaties, tweaken, etc
'Political Correctness is fascism pretending to be good manners.' - George Carlin