Rechnen mit BigIntegers ist wirklich eine Qual. Nachdem ich eine Weile überlegt hatte, ein DSL für BigInteger zu schreiben, aber "dank" der recht starren Java-Syntax keine wesentliche Verbesserung gegenüber den vorhandenen Klassen erzielen konnte (jedenfalls keine, die den zusätzlichen Wrapperklassen-Aufwand rechtfertigen würde), habe ich meine Strategie geändert und bin zur Umgekehrt Polnische Notation umgeschwenkt. Ich weiß, die ist etwas gewöhnungsbedürftig. Hier als erstes Ergebnis ein Vergleich von Code für den Lucas-Lehmer-Test.
Konventionell (von Lucas-Lehmer test for Mersenne numbers (Java) - LiteratePrograms ):
Und mit UPN:
Mir geht es erst einmal nur um die Syntax. Wenn ich daran weiterarbeite, kommt das Dingens auf Google Code. Das Beispiel funktioniert zwar schon, die Anzahl der verfügbaren Funktionen ist aber noch ziemlich beschränkt, und ich sehe auch noch einiges Optimierungspotential.
Natürlich kann man auch eine Erweiterung schreiben, die eine "normale" Infix-Eingabe zulässt (eventuell auch als zu parsenden String mit varargs á la printf), und hinter den Kulissen mittels Shuntingyard-Algorithmus in Postfix umwandelt.
Was meint ihr dazu?
[edit] Kleine Verbesserung in meinem Code.
Konventionell (von Lucas-Lehmer test for Mersenne numbers (Java) - LiteratePrograms ):
Java:
public static boolean lucasLehmer(int p) {
BigInteger s = BigInteger.valueOf(4);
BigInteger m = BigInteger.valueOf(2).pow(p).subtract(BigInteger.ONE);
for (int i = 0; i < p - 2; i++) {
s = s.multiply(s).subtract(BigInteger.valueOf(2)).mod(m);
}
return s.equals(BigInteger.ZERO);
}
Und mit UPN:
Java:
public static boolean lucasLehmerBIRPN(int p) {
BigInteger s = _(4);
BigInteger m = _(2, p, POW, DEC); // [2 p ^ --] -> (2^p)-1
for (int i = 0; i < p - 2; i++) {
s = _(s, SQUARE, 2, MINUS, m, MOD); //[s ² 2 - m %] -> (s²-2) % m
}
return s.equals(_(0));
}
Mir geht es erst einmal nur um die Syntax. Wenn ich daran weiterarbeite, kommt das Dingens auf Google Code. Das Beispiel funktioniert zwar schon, die Anzahl der verfügbaren Funktionen ist aber noch ziemlich beschränkt, und ich sehe auch noch einiges Optimierungspotential.
Natürlich kann man auch eine Erweiterung schreiben, die eine "normale" Infix-Eingabe zulässt (eventuell auch als zu parsenden String mit varargs á la printf), und hinter den Kulissen mittels Shuntingyard-Algorithmus in Postfix umwandelt.
Was meint ihr dazu?
[edit] Kleine Verbesserung in meinem Code.
Zuletzt bearbeitet: