"Christmas - the time to fix the computers of your loved ones" « Lord Wyrm

Zahl mit 10 mio-ziffern in c\c++

fresserettich 06.01.2004 - 22:22 9682 110 Thread rating
Posts

fresserettich

Here to stay
Registered: Jul 2002
Location: hier
Posts: 5374
muss eine zahl mit 10 mio ziffern in c\c++ darstellen
klar so einen datentyp gibt es nicht darauf hin habe ich mit einem freund zum diskutieren angefangen und er hat mal folgendes lösung erarbeitet könntet ihr des bitte mal überprüfen?

in einem byte(sind 8bits) kann man eine zahl mit einem wert von 256 speichern
2 bytes - 65536
3 bytes - 16777216
4 bytes - 4294967296
5 bytes - 1099511627776
.......................
128 bytes(immerhin schon 1024bits) kann eine zahl mit dem wertebereich bis 2 hoch 1024 gespeichert werden. das auszurechnen sprengt beinen taschenrechner so wie meinen kopf aber ihr könnt mir glauben
die zahl ist verdammt groß und hat glaub ich 320 stellen...
bei 65536byte könnten wir ein zahl mit 20480 zeichen darstellen...(als string zumindest *g*(freak))


ja genau auf die 33554432bytes den dann können wir eine zahl mit 10485760 zeichen darstellen(jaja als string nur)

damit haben wir eine 268435456bit zahl entdeckt :) mit der wir sogar mit 485760 zeichen über unser ziel hinausgesprungen sind!

um diese zahl zu speichern brauchen wir nur noch einen speicher von schlappen

33554432bytes(weil ein zeichen=ein byte) oder
32768kb oder
genau 32mb

wie ihr wahrscheinlich schon mitbekommen habt wird das ganze als string dargestellt

manalishi

tl;dr
Avatar
Registered: Feb 2001
Location: Feldkirch
Posts: 5977
10 mio dezimalziffern = 10^10000001 - 1 als größten wert

der logaritmus dualis davon wird durch acht dividiert und aufgerundet, schon hast du deinen speicherbedarf.

edit: wenn ich mich nicht grob vertan hab sollts so ausschaun:

ln(10^10000001 - 1)/ln(2) = ca. = ln(10^10000001)/ln(2) = 10000001 * ln(10)/ln(2) = 33219284 bit = ca. 4MB

edit2: wenn du für jede ziffer ein zeichen (sprich: ein byte) nimmst, so wirst du bei 10000000 ziffern wohl 10000000 bytes brauchen :))
Bearbeitet von manalishi am 06.01.2004, 22:42

Frys_Assassin

information keeper
Avatar
Registered: Oct 2001
Location: New New York
Posts: 2503
übrigens,
2^1024 = 179769313486231590772930519078902473361797697894230657273430081157732675805500963132708477322407536021120113879871393357658789768814416622492847430639474124377767893424865485276302219601246094119453082952085005768838150682342462881473913110540827237163350510684586298239947245938479716304835356329624224137216

sind 309 stellen ;)

daher kannst du mit 65536byte 158208 stellen darstellen
somit solltest du nach meiner rechnung mit 32mb bereits auf 81002496 =~ 81mio stellen kommen

dh für 10 mio ziffern brauchst eh nur lächerliche 4 mb (oder 3 disketten :))

edith: thx manalishi für die ownung, aber bestätigung meines ergebnisses. sein fehler im ansatz war bei der einfachen schlussrechnung :)

edith2: nö, mathematica ownung :)
Bearbeitet von Frys_Assassin am 06.01.2004, 22:46

adebar

Big d00d
Avatar
Registered: Dec 2001
Location: Kopf.
Posts: 275
[x] vote "Frys_Assassin" for Derive-0wner ;P

scnr

fresserettich

Here to stay
Registered: Jul 2002
Location: hier
Posts: 5374
ja ok so weit die theorie nur soll ich ja damit rechen können und wie wende ich auf einem string den log an?

adebar

Big d00d
Avatar
Registered: Dec 2001
Location: Kopf.
Posts: 275
Zitat von fresserettich
ja ok so weit die theorie nur soll ich ja damit rechen können und wie wende ich auf einem string den log an?

C/C++ is net so meine Sprache. Würd mich aber _stark_ wundern, wenn das gehen würd...

manalishi

tl;dr
Avatar
Registered: Feb 2001
Location: Feldkirch
Posts: 5977
auf bcd zahlen kannst du afaik keine echten mathematischen funktionen anwenden... nimm z.b. 0 + 1 ... du wirst 0 und 1 als ascii-code bytes im speicher haben, da kannst du nicht einfach die zwei chars addieren. da irgendwie fast alles auf verketteten additionen basiert, wirds logaritmieren nicht spielen imho

edit: wenn du meine rechnung nachvollziehst kommst du auf 3,96MB

fresserettich

Here to stay
Registered: Jul 2002
Location: hier
Posts: 5374
eben genau das ist der punkt :D :)
ich muss das ganze als string darstellen, die grundrechnungsarten als für einen string sind schnell geschrieben
deine rechnung stimmt keine frage aber nur wenn ich des ganze als int/float habe und den log anwenden kann
wieviel wird der string brauchen? oder reden wir jetzt völlig aneinander vorbei?

manalishi

tl;dr
Avatar
Registered: Feb 2001
Location: Feldkirch
Posts: 5977
schau, du musst so gut wie alles neu schreiben. wenn du z.b. eine klasse hast, die die zahl als bcd-zahl implementiert, dann braucht eine instanz davon nur für die zahl 10 millionen bytes.

dann werden die algoritmen implementiert.

so geht z.b. eine bcd addition (mit weniger stellen, eh klar)

25642
+
84647

das lsB (least significant byte) des ersten summanden muss mit dem des zweiten addiert werden. wenn dabei etwas größer 9 herauskommt, so muss eins als übertrag für die nächste stelle mitgegeben werden. in der digitaltechnik wird das als carry bezeichnet.
unter berücksichtigung des carrys wird dann das zweitletzte byte addiert usw.

ich hab sowas btw. in java schon fixfertig als bigint gesehen :)

fresserettich

Here to stay
Registered: Jul 2002
Location: hier
Posts: 5374
ja ist mir schon klar
aber wieviel speicherbedarf wird jetzt der string verschlingen? :D
Bearbeitet von fresserettich am 06.01.2004, 23:17

Ringding

Pilot
Avatar
Registered: Jan 2002
Location: Perchtoldsdorf/W..
Posts: 4300
GNU Multiprecision Library kann das auch (gmp).

Speicher wird halt so viel verbraucht wie intuitiv eh klar ist (nach manalishis Formel) für jeden Operanden + Ergebnis.

atrox

in fairy dust... I trust!
Avatar
Registered: Sep 2002
Location: HTTP/1.1 404
Posts: 2782
die einzige anwendung die ich gesehen hab, die tatsächlich 10 mio stellen braucht, war die suche nach primzahlen...

die derzeit größte bekannte primzahl (M40) hat 6.320.430 stellen (base=10), für die erste primzahl mit 10 mio stellen gibts einen preis zu gewinnen (USD 100.000). http://www.eff.org/awards/coop.html

übrigens: um die primalität der M40 zu prüfen, brauch ein P4 2ghz ca 20 tage.
Bearbeitet von atrox am 07.01.2004, 13:51

Ringding

Pilot
Avatar
Registered: Jan 2002
Location: Perchtoldsdorf/W..
Posts: 4300
Und da werden keine Kindergartenalgorithmen verwendet, sonst wären sie nämlich noch lang nicht so weit.

fresserettich

Here to stay
Registered: Jul 2002
Location: hier
Posts: 5374
hehe da atrox hat mich durschaut :D den mods auf oc.at kann man auch nix verheimlichen :D
@Ringding habe gerade einen link offen bezüglich der library die du meinst mal schauen vielleicht hilft uns das weiter :)
ps fyi die letzte primzahl also mit 6 mio stellen hat ein chemie-student geknackt ;)
um was geht es?
also:
ich hatte eine idee und habe einen freund um rat gefragt der sofort interesse zeigte, daraufhin hat sich ein weiter freund hinzugesellt
also wir 3 wollen einfach ein kleines projekt machen und spielen uns halt gern damit und haben halt eine kranke idee :D

Phobos

✝
Avatar
Registered: Jan 2003
Location: 1050
Posts: 2111
primzahlen mit 10 Mio stellen zu finden? :)
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz