Knobi-Wan
Lt. Junior Grade
- Registriert
- März 2008
- Beiträge
- 355
Hi,
ich sitze seit einiger Zeit an einer Implementation des Miller-Rabin-Tests, sie hat jedoch noch nie funktioniert. Ich hab mir Definitionen von verschiedenen Seiten angesehen und auch einige ausprobiert, kein Ergebnis. Also frage ich hier mal nach, was ich falsch mache.
n=15 ist laut des Tests eine Primzahl, doch meiner Meinung nach ist das genau der Algorithmus, der auf Wikipedia beschrieben ist, bitte belehrt mich eines Besseren.
ich sitze seit einiger Zeit an einer Implementation des Miller-Rabin-Tests, sie hat jedoch noch nie funktioniert. Ich hab mir Definitionen von verschiedenen Seiten angesehen und auch einige ausprobiert, kein Ergebnis. Also frage ich hier mal nach, was ich falsch mache.
Code:
import util.LowerBoundRandom;
public class MillerRabin {
private boolean isProbablePrime = true;
public MillerRabin(final int n, final int k) { // n=possible prime, k=iterations
final int exponent = exponentTest(n);
final int factor = (int) ((n - 1) / (Math.pow(2, exponent)));
int[] base = new int[k];
baseLoop: for (int i = 0; i < k; i++) {
// ensures that a different base is used for every iteration
if (n > k) {
int j = 0;
while (j < i) {
if (base[i] == base[j]) {
base[i] = LowerBoundRandom.with(2, n - 1);
j = 0;
continue;
}
j++;
}
}
else {
base[i] = LowerBoundRandom.with(2, n - 1);
}
// actual algorithm
if (Math.pow(base[i], factor) % n == 1 % n) {
continue;
}
for (int r = 0; r < exponent; r++) {
if (Math.pow(base[i], factor * Math.pow(2, r)) % n == (-1 - Math.floor(-1.0 / n) * n)) {
continue baseLoop;
}
if (r == exponent - 1) {
break baseLoop;
}
}
}
}
private int exponentTest(final int n) { // computes s=max{r e N : 2^r divides (n-1)}
for (int r = (int) Math.floor((log2(n - 1))); r > 0; r--) {
if ((n - 1) % Math.pow(2, r) == 0) {
return r; // exponent of biggest power of two lower or equal n-1
}
}
return 0;
}
private int log2(final int n) {
return (int) (Math.log(n) / Math.log(2.0));
}
public static void main(final String[] args) {
MillerRabin m = new MillerRabin(15, 10);
System.out.println(m.isProbablePrime);
}
}
Code:
import java.util.Random;
public class LowerBoundRandom {
public static int with(final int min, final int max) { //returns random integer including lower and upper bound
Random random = new Random();
return random.nextInt(max - min + 1) + min;
}
}
n=15 ist laut des Tests eine Primzahl, doch meiner Meinung nach ist das genau der Algorithmus, der auf Wikipedia beschrieben ist, bitte belehrt mich eines Besseren.
Zuletzt bearbeitet: