URL: https://www.overclockers.at/coding-stuff/zahl_mit_10_mio-ziffern_in_cc_103331/page_3 - zur Vollversion wechseln!
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
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.
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)
@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
@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
@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
Für Linux gibt's den Intel Compiler gratis.
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
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 jamjam
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
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
@ 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
http://www.intel.com/software/produ...clin/noncom.htm
Man muss sich aber registrieren.
aha!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..
ich glaube das ist ~richtigZitatdas ganze muss in asm programmiert werden da man direkt auf einzelne bits zugreifen kann
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!Zitatmit dem int array jede grundrechnungsart schnell ausführen
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.
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....
overclockers.at v4.thecommunity
© all rights reserved by overclockers.at 2000-2025