"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 9681 110 Thread rating
Posts

fresserettich

Here to stay
Registered: Jul 2002
Location: hier
Posts: 5374
ich glaube mein freund hat es eh so gemeint
aber mal danke für den tipp wir werden versuchen einiges in asm zu schreiben um nochmal an geschwindigkeit zu gewinnen
überlegen auch ein riesiges long int array aufzubauen :D

Geigerzeiger

Addicted
Registered: Jan 2004
Location: anywhere
Posts: 449
Du sagst es atrox!

Ich hätte ne ähnliche Lösung:
Wenn du mit solchen monsterzahlen rechnest verwende 10er Potenzen:

So kannst du mit sehr großen Exponenten wie 10^1000 rechn
en.

zb. 2.5567*10^567 + 7.22456*10^890 = ...
Für diese Rechnung gibt es keinen so genauen Datentyp afaik.
Also rechnen wir nur mit Mantisse und Exponent.

Vielleicht wär dies ein Lösungweg, der den Umgang mit so großen Zahlen ermöglicht.

Ringding

Pilot
Avatar
Registered: Jan 2002
Location: Perchtoldsdorf/W..
Posts: 4300
Macht ja nicht den Fehler, es von Anfang an in Assembler zu schreiben. Ich behaupte, dass es schneller laufen wird, wenn's in C geschrieben ist und mit dem Intel Compiler compiliert wird, als wenn ihr da was in Assembler zusammenschustert (außer ihr gehört tatsächlich einer verschwindend kleinen Minderheit an, die in Assemblerprogrammierung außerordentlich kompetent ist)

fresserettich

Here to stay
Registered: Jul 2002
Location: hier
Posts: 5374
@geiger nur wir bräuchen halt eine genau zahl ist halt die frage ob wir dann auch nicht schnell mit den potenzen am ende sind
@ringding
wird sind sicher nicht die asm-profis hatten es ca. 2/3 des letzten schuljahres aber versuchen können wirs ja mal
außerdem werden wir unseren asm lehrer sicher mal nerven der ist eh immer sehr hilfbereit :)

Geigerzeiger

Addicted
Registered: Jan 2004
Location: anywhere
Posts: 449
@fressrettich ich habe nachgedacht:

wie wär es wenn du den compi elementar rechnen lasst also wie es wir in der volksschule glernt haben. Wann ma nämlich mit den mantissen und exponenten rechnen kannst ja an rechengang für + und - net zurückschrauben.
zb: 1.4567
+1.4567
----------
2.9134 ( Des wären de Mantissen)
Wannma do an algorithmus für elementare addition & subtraktion finden, dann würde des für n stellen funktionieren also auch für 8 mio.

I probier des verfahren moagn aus und schick da de .cpp

fresserettich

Here to stay
Registered: Jul 2002
Location: hier
Posts: 5374
@ringding wir haben leider den intel compiler nicht also werden wirs wohl mim vs machen müssen
@geiger ok wennst die zeit hat bin für jede hilfe dankbar wobei ich ehrlich gesagt nicht ganz weiß was du derzeit meinst werde aber bei gelegenheit alles nochmal in ruhe durchlesen
habe leider gerade stress mit der schule und habe daher nicht so viel zeit mich intensiv mit dem problem zu beschäftigen

Ringding

Pilot
Avatar
Registered: Jan 2002
Location: Perchtoldsdorf/W..
Posts: 4300
Für Linux gibt's den Intel Compiler gratis.

zimmski

Bloody Newbie
Registered: Jan 2004
Location: ask me
Posts: 13
jo hi erstmal

ok ich bin einer der fresserettich freundchen und bin eher der verrückte typ der schon ein paar mehr seiten über das thema geschrieben hat und ziemlich viel herumcodet...

das basis programm wird in c erstellt wo auch di arrays deklariert sind

meine idee war es zwei arrays zu erstellen:

ich nene sie string- und int-array

das string array ist einfach aufgebaut:

ein ascii-zeichen stellt eine ziffer da also di zahl 12345 ist ein char array mit 6 elemten('\0' darf nicht fehlen)

das int array ist ein bischen schieriger:

ein ascii-zeichen hat 8 bit mit. 8 bit kann man eine zahl bis 256 darstellen
hängt man jez zwei zeichen aneinander dann hat man 16bit also ne zahl mit bis zu 65536. und dann hängen wir einfach soviele zeichen an bis wir >10mil stellen haben
das ganze muss in asm programmiert werden da man direkt auf einzelne bits zugreifen kann...

mit dem string array kann man schnell ziffernsummebilden und anzeigen
mit dem int array jede grundrechnungsart schnell ausführen

darum also beide...

----

wir haben schon ein bischen diskutiert und sind auf di idee gekommen einen server zu machen und mehrer clients(so wie jede primzahl projekt hald)

das ganze funkz so:

der server hat immer eine adresse auf die zahl di gerade überprüft wird und eine liste von anderen primzahlen mit der überprüft werden müssen

ein client meldet sich beim server an.. und sagt das er nichts zu tun hat
daraufhin wird ihm di jetztige zahl zugeschickt(komprimiert oder unkomprimiert wies ma noch nich) und dann eine primzahl mit der er prüfen soll.

der client schickt ständig ein datenpacket mit seinem status:

rechne
nichts zu tun
lade

sollte der client abstürzen oder sonst was gibt er kein packet mehr ab und er wird aus der liste nach kurzer wartezeit entfernt(könnte ja ein aufhänger sein).

...
mach kurz pause schreib glei weider
.. wieder da

also der server und der client funkzen schon

ich hab daweil

ein programm geschrieben dass alle 64bit primzahlen rausfindet(ok nicht grad super ;) )
ein programm das eine zahl hochrechnet bis sie 11mil stellen hat das ganze hab ich mit einem string array gemacht

ich hab das programm sogar laufen lassen 2hoch1024 hat nicht mal 2 milisekunden gebraucht :p
dann hab ich es nochmal laufen lassen um eine vorbereitung für di primzahl zu haben di wir rechnen müssen(2hochN-1) das ganze hab ich dann schon bis ca 2hoch6mil gehapt und dann hab ich nen streit mit meinem vater gehabt und dann hat er mir den strom abgedreht .. für di zahl hab ich 15 stunden gebraucht... nicht schlecht aber zu langsam!

immerhin hab ich jez schon alle rechnungsarten für c und asm geschrieben für int und str-arrays...

stay tuned

:fresserettich: jamjam
Bearbeitet von zimmski am 12.01.2004, 10:50

FMFlash

tranceCoder
Avatar
Registered: Mar 2001
Location: Wien
Posts: 2037
Das ganze lässt sich allerdings auch viel einfacher mit Bitsets (C++) bewerkstelligen. Damit kannst du beliebig lange bit-ketten erstellen, verwalten und auslesen. Siehe cppreference.com
So musst du nicht mit int-arrays und strings arbeiten.

Damit eine 10mio stellen lange Primzahl zu berechnen hab ich allerdings noch nicht versucht ;)

jm2c

fresserettich

Here to stay
Registered: Jul 2002
Location: hier
Posts: 5374
erst mal willkommen auf oc.at zimmski :)
tja so siehst aus meine herrn
@flash danke für den link
@ringding hättest einen link zum compiler dann könnten wir des ganze saugen und mal ausprobieren :)

zimmski

Bloody Newbie
Registered: Jan 2004
Location: ask me
Posts: 13
@ FMFlash: thnx! von den befehl hab ich echt noch nie gehört .. und es funkz sogar damit *hui* danke nochmal! mal schaun was schneller geht der befehl in asm oder der hier ... i schau wenn i zeit hab... das int array ist ja nicht grade supi zum darstellen das string array dagegen schon und noch so ein paar sachen.. hab eh erklärt warum eben beide in dem oberen post :rolleyes:
Bearbeitet von zimmski am 12.01.2004, 18:39

Ringding

Pilot
Avatar
Registered: Jan 2002
Location: Perchtoldsdorf/W..
Posts: 4300

mat

Administrator
Legends never die
Avatar
Registered: Aug 2003
Location: nö
Posts: 25420
Zitat
..di zahl 12345 ist ein char array mit 6 elemten('\0' darf nicht fehlen)..

..ein ascii-zeichen hat 8 bit mit. 8 bit kann man eine zahl bis 256 darstellen. hängt man jez zwei zeichen aneinander dann hat man 16bit also ne zahl mit bis zu 65536..
aha!
Zitat
das ganze muss in asm programmiert werden da man direkt auf einzelne bits zugreifen kann
ich glaube das ist ~richtig
Zitat
mit dem int array jede grundrechnungsart schnell ausführen
auch noch bei multiplikation und division? ich glaube, dass deine theorie nicht aufgeht, weil 16 bit blöcke alleine zu wenig sind. ich kenn die lösung nicht, kann mich auch leider ATM nicht damit beschäftigen, geschweige den dass ichs überhaupt verstehen kann.. ich würde auf alle fälle auch noch mit dem exponenten arbeiten. ebenfalls ein sehr großes problem ist die synchronisation zwischen dem string und int array. versuch mal was "leichtes": wandle einen beliebigen string in ein int-array.. du wirst sehen, es ist nicht leicht. dennoch: man kanns nur mit probieren schaffen, also viel glück! :)

mat

atrox

in fairy dust... I trust!
Avatar
Registered: Sep 2002
Location: HTTP/1.1 404
Posts: 2782
für eine primzahl sind leider _alle_ 10 mio stellen wichtig, mit fließkomma-darstellungen scheitert man also noch vor dem start (man hat ja zb nur 20 kommastellen, und verschiebt dann das komma - fügt allso effektiv 0er ein).
ich würde die suche, nun da mehrere ideen zur darstellung bestehen, auf einen effizienten divisions-algorithmus konzentrieren. bzw in kombination mit einem effizienten primzahl-algorithmus.
Bearbeitet von atrox am 13.01.2004, 11:07

Geigerzeiger

Addicted
Registered: Jan 2004
Location: anywhere
Posts: 449
Das beste wäre wenn man die zahl irgendwie in lauter teilsummen zerlegen könnte um mit diesen zu rechnen.

Addition & Subtraktion san leicht:
zb: 35656464646...
+34355677788...
--------------------
vo hinten angefangt:
8+6 = 14 bleibt 1
1+8+4 = 13 bleibt wieder 1

usw....
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz