Offtopic Projekte
Kommentare Zurück zur Übersicht

Modulo mit extrem großen Zahlen

Diese Seite ist meinem Freund Erich P. gewidment.

Die Rechenopertation Modulo ermittelt den Rest einer ganzzahligen Division.
Beispiel einer einfachen Moduloperation: 7 mod 3 = 1
In menschlicher Sprache übersetzt bedeutet es:
Sieben gebrochen durch Drei ergibt Zwei plus Eins Rest.

Wofür braucht man das?

Die Anwendungen ist manigfaltig. Da wäre z. B. die Ermittlung von Primzahlen. Eine Primzahl lässt sich nur durch sich selbst und durch Eins divdieren. Jede Modulooperation die eine Null (nicht NULL) ausgibt, stellt einen untrüglichen Beweis für eine Nicht-Primzahl dar.
z. B. 6 mod 2 = 0. Sechs ist keine Primzahl weil sie sich ohne Rest durch 2 und 3 teilen lässt. Bei der Sieben, die eine Primzahl ist, bekommt nur einen Rest von Null, wenn man sie durch Eins oder Sieben teilt.
So braucht man auch Modulooperationen für die Validierung von IBAN Kontonummern.

Das Problem - extrem hohe natürlichen Zahlen

Aus irgend einem (für mich) unerklärlichen Grund liefert JavaScript in einem Browser bei extrem hohen natürlichen Zahlen ein falsches Ergebnis. Ich vermute es liegt am Integer-Save-Wert der 16 Stellen hat (bzw. 2^53-1 ).
In JavaScript wird die Modulooperation mit dem Prozentzeichen durchgeführt. z. B. 7 % 3 = 1.
Hier folgt eine Prüfung einer Modulooperation (die Werte können gerne verändert werden!) - sowohl mit dem JavaScript Ergebnis als auch mit meiner Lösung:

mod

Bitte geben Sie zwei natürliche Zahlen ein!

JavaScript Ergebnis
% =

Meine Lösung
meinMod(, ) =

Die Lösung

Natürlich ist es nicht zu 100% sicher, dass meine Lösung richtig ist. Aber meine Lösungsprüfungen auf unterschiedlichen online Modulo-Rechnern stimmen mit meinen Ergebenissen überein.
Mancherorts wird das JS Ergebnis angezeigt - anders wo ist mein Lösungsansatz stimmig.
Aber da der Taschenrechner auf meinem Linux-System die selbe Meinung vertritt wie ich, gehe ich davon aus, dass mein Lösungsansatz valide ist!

Hier die JavaScript Funktion:

function meinMod(x,y) {
  var teil = "";
  var nm = "";
  var langx = 0;
  do {
    teil = x.slice(0,4);
    x = x.slice(4);
    teil = nm + teil;
    nm = parseInt(teil) % parseInt(y);
    langx = x.length;
      if (langx <= 0) {return nm;};
    }
   while (langx >= 0)
 }

Der Divident (erste Zahl) macht mir keine Sorgen. Dieser wird in der Funktion sowieso in Blöcke zu vier Stellen aufgeschnitten. Sozusagen wird er wie ein String behandelt und ist damit fast keinen Grenzen unterworfen.
Zumindest so viel wie das <input type="text"> Element erlaubt. Der Divisor (zweite Zahl) aber ist die Schwachstelle in der Funktion. Bei meinen Tests ergaben sich Unregelmäßigkeiten, sobald dieser größer als der Integer-Save-Wert ist.
Deshalb ist die Funktion eher eine Diskussionsgrundlage als eine unumstößliche Wahrheit.

24. Jun 2024 - 14:37
Hier könnte dein Kommentar stehen!

Thomas Maier css4.at Logo
Thomas Maier Impressum OER: CC BY NC SA 2022-08-10