Sehr große Zahlen



  • Hallo,
    Ich muss hier leider mit sehr großen Zahlen 2^2000 und größer rechnen. Leider gibts dafür natürlich keinen fertigen Datentyp!

    Hat jeman eine Idee was ich da machen könnte?
    Falls es schon was gibt würd ich nur ungern das Rad neu erfinden. 😉

    Danke schonmal



  • Die meistgestellten Fragen Nr. 4.

    Was willst du mit den Zahlen anstellen?



  • Ich schreibe gerade an einem FEM Programm.
    Ich lese mit ABAQUS bzw. Hypermesh erstellte Meshs (inp) ein. Aus dem Elementen/Faces, die ja im File stehen, bestimme ich die Edges.
    Dann prüfe ich die Edges auf einzigartigkeit:
    Ein Beispiel:
    lineare Dreieckselemente (einfachster Fall):
    ich habe folgende Knoten mit den x-y Koordinaten:
    NR X Y
    1 0 0
    2 0 1
    3 1 1
    4 1 0
    und beispielhaft folgende faces/elemente:
    1,4,3
    1,3,2

    daraus ergeben sich dann folgende edges:
    1 4
    4 3
    3 1
    1 3
    3 2
    2 1

    wie man sieht taucht sowohl 3 1 als auch 1 3 als edge auf, aber sie darf natürlich später nur einmal vorkommen, also habe ich folgende Rechnung angestellt:
    23+21=10
    21+23=10
    und eine der edges gelöscht, nachdem ich die summe der Potenzen verglichen habe.

    Das war auch alles super und hat auch für komplexere Fälle wie quadratische Viereckselemente funktioniert.

    Leider ist beim Laden eines Modells ein Fehler aufgetreten, weil naja man kann sichs fast denken...
    ... viele Knoten, hohe Knotennummern und 2^2000 dann doch nicht mehr so ganz in ein int reinpasst. ^^

    Ich schau mir mal GMP an, vielleicht funktioniert das ja.

    Ich sag mal danke



  • Mit FEM kenn ich mich nicht aus, aber wenn ich dich richtig verstehe, versuchst du doch nur doppelte Elemente zu löschen, oder? Dann brauchst du dir eigentlich nur ne Ordnungsrelation zu überlegen.

    Sind alle zu vergleichenden Elemente n-elementige Tupel? Ich kann mit Namen wie "quadratische Viereckselemente" leider nichts anfangen. Aber wenn dem so ist, kannst du doch die Zahlen des Tupels aufsteigend sortieren und die Tupel dann lexikographisch sortieren.

    Wahrscheinlich habe ich aber dein Problem nicht richtig verstanden. Ist es viel Aufwand, dein Problem (nicht den kompletten Algorithmus, sondern nur den Teil, in dem du Duplikate rausfiltern willst) für einen Laien verständlich zu erklären?

    Edit: Wenn du aus der Faces-Menge F (was auch immer das ist) je zwei Elemente rausgreifst, ist die Kantenmenge { (F[i], F[j]), 0 ≤ i < j < F.size } ohne Duplikate. Aber auch hier hab ich wahrscheinlich das Problem nur nicht verstanden 😉



  • Noch ein Vorschlag: Wenn ich das richtig sehe, willst du mit deinen großen Zahlen gar nicht rechnen (nur die Addition der Potenzen bei der Erstellung). Dann kannst du z. B. ein Bitset nehmen und brauchst keine Implementierung aller möglichen Rechenoperationen.



  • Wie schon angedeutet: Sortieren und dann doppelte loeschen. Funktioniert auch mit Fliesskommazahlen.


Log in to reply